| Subject | Re: [patch V4 part 1 08/36] x86/doublefault: Remove memmove() call | From | Alexandre Chartre <> | Date | Wed, 6 May 2020 15:47:03 +0200 |
| |
On 5/5/20 3:16 PM, Thomas Gleixner wrote: > Use of memmove() in #DF is problematic considered tracing and other > instrumentation. > > Remove the memmove() call and simply write out what needs doing; this > even clarifies the code, win-win! The code copies from the espfix64 > stack to the normal task stack, there is no possible way for that to > overlap. > > Survives selftests/x86, specifically sigreturn_64. > > Suggested-by: Borislav Petkov <bp@alien8.de> > Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> > Signed-off-by: Thomas Gleixner <tglx@linutronix.de> > Acked-by: Andy Lutomirski <luto@kernel.org> > Link: https://lkml.kernel.org/r/20200220121727.GB507@zn.tnic > --- > arch/x86/kernel/traps.c | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-)
Reviewed-by: Alexandre Chartre <alexandre.chartre@oracle.com>
alex.
> --- a/arch/x86/kernel/traps.c > +++ b/arch/x86/kernel/traps.c > @@ -278,6 +278,7 @@ dotraplinkage void do_double_fault(struc > regs->ip == (unsigned long)native_irq_return_iret) > { > struct pt_regs *gpregs = (struct pt_regs *)this_cpu_read(cpu_tss_rw.x86_tss.sp0) - 1; > + unsigned long *p = (unsigned long *)regs->sp; > > /* > * regs->sp points to the failing IRET frame on the > @@ -285,7 +286,11 @@ dotraplinkage void do_double_fault(struc > * in gpregs->ss through gpregs->ip. > * > */ > - memmove(&gpregs->ip, (void *)regs->sp, 5*8); > + gpregs->ip = p[0]; > + gpregs->cs = p[1]; > + gpregs->flags = p[2]; > + gpregs->sp = p[3]; > + gpregs->ss = p[4]; > gpregs->orig_ax = 0; /* Missing (lost) #GP error code */ > > /* >
|