On Thu, Nov 29, 2018 at 10:33:42AM -0600, Josh Poimboeuf wrote: > > can't we 'fix' that again? The alternative is moving that IRET-frame and > > fixing everything up, which is going to be fragile, ugly and such > > things more.
> This seems to work... That's almost too easy... nice! > diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S > index ce25d84023c0..184523447d35 100644 > --- a/arch/x86/entry/entry_64.S > +++ b/arch/x86/entry/entry_64.S > @@ -876,7 +876,7 @@ apicinterrupt IRQ_WORK_VECTOR > irq_work_interrupt smp_irq_work_interrupt > * @paranoid == 2 is special: the stub will never switch stacks. This is for > * #DF: if the thread stack is somehow unusable, we'll still get a useful > OOPS. > */ > -.macro idtentry sym do_sym has_error_code:req paranoid=0 shift_ist=-1 > +.macro idtentry sym do_sym has_error_code:req paranoid=0 shift_ist=-1 > create_gap=0 > ENTRY(\sym) > UNWIND_HINT_IRET_REGS offset=\has_error_code*8 > > @@ -891,6 +891,12 @@ ENTRY(\sym) > pushq $-1 /* ORIG_RAX: no syscall to > restart */ > .endif > > + .if \create_gap == 1 > + .rept 6 > + pushq 5*8(%rsp) > + .endr > + .endif > + > .if \paranoid == 1 > testb $3, CS-ORIG_RAX(%rsp) /* If coming from userspace, > switch stacks */ > jnz .Lfrom_usermode_switch_stack_\@ > @@ -1126,7 +1132,7 @@ apicinterrupt3 HYPERV_STIMER0_VECTOR \ > #endif /* CONFIG_HYPERV */ > > idtentry debug do_debug > has_error_code=0 paranoid=1 shift_ist=DEBUG_STACK > -idtentry int3 do_int3 has_error_code=0 > +idtentry int3 do_int3 > has_error_code=0 create_gap=1 > idtentry stack_segment do_stack_segment has_error_code=1 > > #ifdef CONFIG_XEN_PV