Commit | Line | Data |
---|---|---|
40e084a5 RB |
1 | /* |
2 | * This file is subject to the terms and conditions of the GNU General Public | |
3 | * License. See the file "COPYING" in the main directory of this archive | |
4 | * for more details. | |
5 | */ | |
6 | #ifndef __ASM_UPROBES_H | |
7 | #define __ASM_UPROBES_H | |
8 | ||
9 | #include <linux/notifier.h> | |
10 | #include <linux/types.h> | |
11 | ||
12 | #include <asm/break.h> | |
13 | #include <asm/inst.h> | |
14 | ||
15 | /* | |
16 | * We want this to be defined as union mips_instruction but that makes the | |
17 | * generic code blow up. | |
18 | */ | |
19 | typedef u32 uprobe_opcode_t; | |
20 | ||
21 | /* | |
22 | * Classic MIPS (note this implementation doesn't consider microMIPS yet) | |
23 | * instructions are always 4 bytes but in order to deal with branches and | |
24 | * their delay slots, we treat instructions as having 8 bytes maximum. | |
25 | */ | |
26 | #define MAX_UINSN_BYTES 8 | |
27 | #define UPROBE_XOL_SLOT_BYTES 128 /* Max. cache line size */ | |
28 | ||
29 | #define UPROBE_BRK_UPROBE 0x000d000d /* break 13 */ | |
30 | #define UPROBE_BRK_UPROBE_XOL 0x000e000d /* break 14 */ | |
31 | ||
32 | #define UPROBE_SWBP_INSN UPROBE_BRK_UPROBE | |
33 | #define UPROBE_SWBP_INSN_SIZE 4 | |
34 | ||
35 | struct arch_uprobe { | |
36 | unsigned long resume_epc; | |
37 | u32 insn[2]; | |
38 | u32 ixol[2]; | |
39 | union mips_instruction orig_inst[MAX_UINSN_BYTES / 4]; | |
40 | }; | |
41 | ||
42 | struct arch_uprobe_task { | |
43 | unsigned long saved_trap_nr; | |
44 | }; | |
45 | ||
46 | extern int arch_uprobe_analyze_insn(struct arch_uprobe *aup, | |
47 | struct mm_struct *mm, unsigned long addr); | |
48 | extern int arch_uprobe_pre_xol(struct arch_uprobe *aup, struct pt_regs *regs); | |
49 | extern int arch_uprobe_post_xol(struct arch_uprobe *aup, struct pt_regs *regs); | |
50 | extern bool arch_uprobe_xol_was_trapped(struct task_struct *tsk); | |
51 | extern int arch_uprobe_exception_notify(struct notifier_block *self, | |
52 | unsigned long val, void *data); | |
53 | extern void arch_uprobe_abort_xol(struct arch_uprobe *aup, | |
54 | struct pt_regs *regs); | |
55 | extern unsigned long arch_uretprobe_hijack_return_addr( | |
56 | unsigned long trampoline_vaddr, struct pt_regs *regs); | |
57 | ||
58 | #endif /* __ASM_UPROBES_H */ |