1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * arch/arm/include/asm/kprobes.h 4 * 5 * Copyright (C) 2006, 2007 Motorola Inc. 6 */ 7 8 #ifndef _ARM_KPROBES_H 9 #define _ARM_KPROBES_H 10 11 #include <asm-generic/kprobes.h> 12 13 #ifdef CONFIG_KPROBES 14 #include <linux/types.h> 15 #include <linux/ptrace.h> 16 #include <linux/notifier.h> 17 18 #define __ARCH_WANT_KPROBES_INSN_SLOT 19 #define MAX_INSN_SIZE 2 20 21 #define flush_insn_slot(p) do { } while (0) 22 #define kretprobe_blacklist_size 0 23 24 typedef u32 kprobe_opcode_t; 25 struct kprobe; 26 #include <asm/probes.h> 27 28 #define arch_specific_insn arch_probes_insn 29 30 struct prev_kprobe { 31 struct kprobe *kp; 32 unsigned int status; 33 }; 34 35 /* per-cpu kprobe control block */ 36 struct kprobe_ctlblk { 37 unsigned int kprobe_status; 38 struct prev_kprobe prev_kprobe; 39 }; 40 41 void arch_remove_kprobe(struct kprobe *); 42 int kprobe_fault_handler(struct pt_regs *regs, unsigned int fsr); 43 44 /* optinsn template addresses */ 45 extern __visible kprobe_opcode_t optprobe_template_entry[]; 46 extern __visible kprobe_opcode_t optprobe_template_val[]; 47 extern __visible kprobe_opcode_t optprobe_template_call[]; 48 extern __visible kprobe_opcode_t optprobe_template_end[]; 49 extern __visible kprobe_opcode_t optprobe_template_sub_sp[]; 50 extern __visible kprobe_opcode_t optprobe_template_add_sp[]; 51 extern __visible kprobe_opcode_t optprobe_template_restore_begin[]; 52 extern __visible kprobe_opcode_t optprobe_template_restore_orig_insn[]; 53 extern __visible kprobe_opcode_t optprobe_template_restore_end[]; 54 55 #define MAX_OPTIMIZED_LENGTH 4 56 #define MAX_OPTINSN_SIZE \ 57 ((unsigned long)optprobe_template_end - \ 58 (unsigned long)optprobe_template_entry) 59 #define RELATIVEJUMP_SIZE 4 60 61 struct arch_optimized_insn { 62 /* 63 * copy of the original instructions. 64 * Different from x86, ARM kprobe_opcode_t is u32. 65 */ 66 #define MAX_COPIED_INSN DIV_ROUND_UP(RELATIVEJUMP_SIZE, sizeof(kprobe_opcode_t)) 67 kprobe_opcode_t copied_insn[MAX_COPIED_INSN]; 68 /* detour code buffer */ 69 kprobe_opcode_t *insn; 70 /* 71 * We always copy one instruction on ARM, 72 * so size will always be 4, and unlike x86, there is no 73 * need for a size field. 74 */ 75 }; 76 77 #endif /* CONFIG_KPROBES */ 78 #endif /* _ARM_KPROBES_H */ 79