On Tue, May 07, 2019 at 01:42:29PM -0400, Steven Rostedt wrote: > From: Peter Zijlstra <peterz@xxxxxxxxxxxxx> > > In order to allow breakpoints to emulate call functions, they need to push > the return address onto the stack. But because the breakpoint exception > frame is added to the stack when the breakpoint is hit, there's no room to > add the address onto the stack and return to the address of the emulated > called funtion. > > To handle this, copy the exception frame on entry of the breakpoint handler > and have leave a gap that can be used to add a return address to the stack > frame and return from the breakpoint to the emulated called function, > allowing for that called function to return back to the location after the > breakpoint was placed. This part is done by patch 1. > > The helper functions were also added: No longer "also" :-) > int3_emulate_push(): to push the address onto the gap in the stack > int3_emulate_jmp(): changes the location of the regs->ip to return there. > int3_emulate_call(): push the return address and change regs->ip > > Cc: Andy Lutomirski <luto@xxxxxxxxxx> > Cc: Nicolai Stange <nstange@xxxxxxx> > Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx> > Cc: Ingo Molnar <mingo@xxxxxxxxxx> > Cc: Borislav Petkov <bp@xxxxxxxxx> > Cc: "H. Peter Anvin" <hpa@xxxxxxxxx> > Cc: the arch/x86 maintainers <x86@xxxxxxxxxx> > Cc: Josh Poimboeuf <jpoimboe@xxxxxxxxxx> > Cc: Jiri Kosina <jikos@xxxxxxxxxx> > Cc: Miroslav Benes <mbenes@xxxxxxx> > Cc: Petr Mladek <pmladek@xxxxxxxx> > Cc: Joe Lawrence <joe.lawrence@xxxxxxxxxx> > Cc: Shuah Khan <shuah@xxxxxxxxxx> > Cc: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> > Cc: Tim Chen <tim.c.chen@xxxxxxxxxxxxxxx> > Cc: Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx> > Cc: Mimi Zohar <zohar@xxxxxxxxxxxxx> > Cc: Juergen Gross <jgross@xxxxxxxx> > Cc: Nick Desaulniers <ndesaulniers@xxxxxxxxxx> > Cc: Nayna Jain <nayna@xxxxxxxxxxxxx> > Cc: Masahiro Yamada <yamada.masahiro@xxxxxxxxxxxxx> > Cc: Joerg Roedel <jroedel@xxxxxxx> > Cc: "open list:KERNEL SELFTEST FRAMEWORK" <linux-kselftest@xxxxxxxxxxxxxxx> > Cc: stable@xxxxxxxxxxxxxxx > Fixes: b700e7f03df5 ("livepatch: kernel: add support for live patching") > Signed-off-by: Peter Zijlstra (Intel) <peterz@xxxxxxxxxxxxx> > [ Modified to only work for x86_64 ] > Signed-off-by: Steven Rostedt (VMware) <rostedt@xxxxxxxxxxx> > --- > arch/x86/include/asm/text-patching.h | 22 ++++++++++++++++++++++ > 1 file changed, 22 insertions(+) > > diff --git a/arch/x86/include/asm/text-patching.h b/arch/x86/include/asm/text-patching.h > index e85ff65c43c3..455bf9f88233 100644 > --- a/arch/x86/include/asm/text-patching.h > +++ b/arch/x86/include/asm/text-patching.h > @@ -39,4 +39,26 @@ extern int poke_int3_handler(struct pt_regs *regs); > extern void *text_poke_bp(void *addr, const void *opcode, size_t len, void *handler); > extern int after_bootmem; > > +static inline void int3_emulate_jmp(struct pt_regs *regs, unsigned long ip) > +{ > + regs->ip = ip; > +} > + > +#define INT3_INSN_SIZE 1 > +#define CALL_INSN_SIZE 5 > + > +#ifdef CONFIG_X86_64 > +static inline void int3_emulate_push(struct pt_regs *regs, unsigned long val) > +{ > + regs->sp -= sizeof(unsigned long); > + *(unsigned long *)regs->sp = val; > +} How this works isn't really obvious. A comment is probably warranted to explain the fact that the int3 entry code reserved some space on the stack. -- Josh