Messages in this thread | | | From | Andy Lutomirski <> | Date | Sat, 21 Jul 2018 14:45:38 -0700 | Subject | Re: [PATCH 1/2] x86/entry/64: Do not clear %rbx under Xen |
| |
On Sat, Jul 21, 2018 at 12:49 PM, M. Vefa Bicakci <m.v.b@runbox.com> wrote: > Commit 3ac6d8c787b8 ("x86/entry/64: Clear registers for > exceptions/interrupts, to reduce speculation attack surface") unintendedly > broke Xen PV virtual machines by clearing the %rbx register at the end of > xen_failsafe_callback before the latter jumps to error_exit. > error_exit expects the %rbx register to be a flag indicating whether > there should be a return to kernel mode. > > This commit makes sure that the %rbx register is not cleared by > the PUSH_AND_CLEAR_REGS macro, when the macro in question is instantiated > by xen_failsafe_callback, to avoid the issue.
Seems like a genuine problem, but:
> diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S > index c7449f377a77..96e8ff34129e 100644 > --- a/arch/x86/entry/entry_64.S > +++ b/arch/x86/entry/entry_64.S > @@ -1129,7 +1129,7 @@ ENTRY(xen_failsafe_callback) > addq $0x30, %rsp > UNWIND_HINT_IRET_REGS > pushq $-1 /* orig_ax = -1 => not a system call */ > - PUSH_AND_CLEAR_REGS > + PUSH_AND_CLEAR_REGS clear_rbx=0 > ENCODE_FRAME_POINTER > jmp error_exit
The old code first set RBX to zero then, if frame pointers are on, sets it to some special non-zero value, then crosses its fingers and hopes for the best. Your patched code just skips the zeroing part, so RBX either contains the ENCODE_FRAME_POINTER result or is uninitialized.
How about actually initializing rbx to something sensible like, say, 1?
| |