mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 12:42:02 +00:00
sparc64/kprobes: Remove jprobe implementation
Remove arch dependent setjump/longjump functions and unused fields in kprobe_ctlblk for jprobes from arch/sparc. Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org> Acked-by: Thomas Gleixner <tglx@linutronix.de> Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: David S. Miller <davem@davemloft.net> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: linux-arch@vger.kernel.org Cc: sparclinux@vger.kernel.org Link: https://lore.kernel.org/lkml/152942459795.15209.9736720668494241853.stgit@devbox Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
8a4b11a21e
commit
e9bf11a5a6
@ -44,7 +44,6 @@ struct kprobe_ctlblk {
|
||||
unsigned long kprobe_status;
|
||||
unsigned long kprobe_orig_tnpc;
|
||||
unsigned long kprobe_orig_tstate_pil;
|
||||
struct pt_regs jprobe_saved_regs;
|
||||
struct prev_kprobe prev_kprobe;
|
||||
};
|
||||
|
||||
|
@ -441,53 +441,6 @@ out:
|
||||
exception_exit(prev_state);
|
||||
}
|
||||
|
||||
/* Jprobes support. */
|
||||
int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs)
|
||||
{
|
||||
struct jprobe *jp = container_of(p, struct jprobe, kp);
|
||||
struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
|
||||
|
||||
memcpy(&(kcb->jprobe_saved_regs), regs, sizeof(*regs));
|
||||
|
||||
regs->tpc = (unsigned long) jp->entry;
|
||||
regs->tnpc = ((unsigned long) jp->entry) + 0x4UL;
|
||||
regs->tstate |= TSTATE_PIL;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void __kprobes jprobe_return(void)
|
||||
{
|
||||
struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
|
||||
register unsigned long orig_fp asm("g1");
|
||||
|
||||
orig_fp = kcb->jprobe_saved_regs.u_regs[UREG_FP];
|
||||
__asm__ __volatile__("\n"
|
||||
"1: cmp %%sp, %0\n\t"
|
||||
"blu,a,pt %%xcc, 1b\n\t"
|
||||
" restore\n\t"
|
||||
".globl jprobe_return_trap_instruction\n"
|
||||
"jprobe_return_trap_instruction:\n\t"
|
||||
"ta 0x70"
|
||||
: /* no outputs */
|
||||
: "r" (orig_fp));
|
||||
}
|
||||
|
||||
extern void jprobe_return_trap_instruction(void);
|
||||
|
||||
int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs)
|
||||
{
|
||||
u32 *addr = (u32 *) regs->tpc;
|
||||
struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
|
||||
|
||||
if (addr == (u32 *) jprobe_return_trap_instruction) {
|
||||
memcpy(regs, &(kcb->jprobe_saved_regs), sizeof(*regs));
|
||||
preempt_enable_no_resched();
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* The value stored in the return address register is actually 2
|
||||
* instructions before where the callee will return to.
|
||||
* Sequences usually look something like this
|
||||
|
Loading…
Reference in New Issue
Block a user