diff options
author | Ananth N Mavinakayanahalli <ananth@in.ibm.com> | 2013-03-22 20:46:27 +0530 |
---|---|---|
committer | Oleg Nesterov <oleg@redhat.com> | 2013-04-04 13:57:04 +0200 |
commit | 0908ad6e56b5a6e86745680bc324bdbfac64d0b6 (patch) | |
tree | dc403ef4b7ee5b912e7c097b2b8bb2e5260bc8ed /include/linux/uprobes.h | |
parent | f281769e81b49840f1857f6dfac049350e678350 (diff) | |
download | talos-op-linux-0908ad6e56b5a6e86745680bc324bdbfac64d0b6.tar.gz talos-op-linux-0908ad6e56b5a6e86745680bc324bdbfac64d0b6.zip |
uprobes: Add trap variant helper
Some architectures like powerpc have multiple variants of the trap
instruction. Introduce an additional helper is_trap_insn() for run-time
handling of non-uprobe traps on such architectures.
While there, change is_swbp_at_addr() to is_trap_at_addr() for reading
clarity.
With this change, the uprobe registration path will supercede any trap
instruction inserted at the requested location, while taking care of
delivering the SIGTRAP for cases where the trap notification came in
for an address without a uprobe. See [1] for a more detailed explanation.
[1] https://lists.ozlabs.org/pipermail/linuxppc-dev/2013-March/104771.html
This change was suggested by Oleg Nesterov.
Signed-off-by: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
Acked-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Diffstat (limited to 'include/linux/uprobes.h')
-rw-r--r-- | include/linux/uprobes.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/include/linux/uprobes.h b/include/linux/uprobes.h index 02b83db8e2c5..19612881399a 100644 --- a/include/linux/uprobes.h +++ b/include/linux/uprobes.h @@ -100,6 +100,7 @@ struct uprobes_state { extern int __weak set_swbp(struct arch_uprobe *aup, struct mm_struct *mm, unsigned long vaddr); extern int __weak set_orig_insn(struct arch_uprobe *aup, struct mm_struct *mm, unsigned long vaddr); extern bool __weak is_swbp_insn(uprobe_opcode_t *insn); +extern bool __weak is_trap_insn(uprobe_opcode_t *insn); extern int uprobe_register(struct inode *inode, loff_t offset, struct uprobe_consumer *uc); extern int uprobe_apply(struct inode *inode, loff_t offset, struct uprobe_consumer *uc, bool); extern void uprobe_unregister(struct inode *inode, loff_t offset, struct uprobe_consumer *uc); |