diff options
Diffstat (limited to 'arch/powerpc/kernel/uprobes.c')
| -rw-r--r-- | arch/powerpc/kernel/uprobes.c | 29 | 
1 files changed, 23 insertions, 6 deletions
| diff --git a/arch/powerpc/kernel/uprobes.c b/arch/powerpc/kernel/uprobes.c index bc77834dbf4..59f419b935f 100644 --- a/arch/powerpc/kernel/uprobes.c +++ b/arch/powerpc/kernel/uprobes.c @@ -31,6 +31,16 @@  #define UPROBE_TRAP_NR	UINT_MAX  /** + * is_trap_insn - check if the instruction is a trap variant + * @insn: instruction to be checked. + * Returns true if @insn is a trap variant. + */ +bool is_trap_insn(uprobe_opcode_t *insn) +{ +	return (is_trap(*insn)); +} + +/**   * arch_uprobe_analyze_insn   * @mm: the probed address space.   * @arch_uprobe: the probepoint information. @@ -43,12 +53,6 @@ int arch_uprobe_analyze_insn(struct arch_uprobe *auprobe,  	if (addr & 0x03)  		return -EINVAL; -	/* -	 * We currently don't support a uprobe on an already -	 * existing breakpoint instruction underneath -	 */ -	if (is_trap(auprobe->ainsn)) -		return -ENOTSUPP;  	return 0;  } @@ -188,3 +192,16 @@ bool arch_uprobe_skip_sstep(struct arch_uprobe *auprobe, struct pt_regs *regs)  	return false;  } + +unsigned long +arch_uretprobe_hijack_return_addr(unsigned long trampoline_vaddr, struct pt_regs *regs) +{ +	unsigned long orig_ret_vaddr; + +	orig_ret_vaddr = regs->link; + +	/* Replace the return addr with trampoline addr */ +	regs->link = trampoline_vaddr; + +	return orig_ret_vaddr; +} |