KVM: VMX: Let the compiler save/load RDX during vCPU-run
authorSean Christopherson <sean.j.christopherson@intel.com>
Fri, 25 Jan 2019 15:40:54 +0000 (07:40 -0800)
committerPaolo Bonzini <pbonzini@redhat.com>
Tue, 12 Feb 2019 12:12:17 +0000 (13:12 +0100)
Per commit c20363006af6 ("KVM: VMX: Let gcc to choose which registers
to save (x86_64)"), the only reason RDX is saved/loaded to/from the
stack is because it was specified as an input, i.e. couldn't be marked
as clobbered (ignoring the fact that "saving" it to a dummy output
would indirectly mark it as clobbered).

Now that RDX is no longer an input, clobber it.

Reviewed-by: Jim Mattson <jmattson@google.com>
Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/vmx/vmx.c

index b935ba3306aa6fbfbd3937a209f163550a3bc403..e9d81cd8421f71c0483db96e47bb6f1aeb1948a6 100644 (file)
@@ -6377,7 +6377,7 @@ static void __vmx_vcpu_run(struct kvm_vcpu *vcpu, struct vcpu_vmx *vmx)
 
        asm(
                /* Store host registers */
-               "push %%" _ASM_DX "; push %%" _ASM_BP ";"
+               "push %%" _ASM_BP " \n\t"
                "sub $%c[wordsize], %%" _ASM_SP "\n\t" /* placeholder for guest RCX */
                "push %%" _ASM_CX " \n\t"
                "sub $%c[wordsize], %%" _ASM_SP "\n\t" /* temporarily adjust RSP for CALL */
@@ -6481,7 +6481,7 @@ static void __vmx_vcpu_run(struct kvm_vcpu *vcpu, struct vcpu_vmx *vmx)
                "xor %%esi, %%esi \n\t"
                "xor %%edi, %%edi \n\t"
                "xor %%ebp, %%ebp \n\t"
-               "pop  %%" _ASM_BP "; pop  %%" _ASM_DX " \n\t"
+               "pop  %%" _ASM_BP " \n\t"
              : ASM_CALL_CONSTRAINT, "=S"((int){0})
              : "c"(vmx), "S"(evmcs_rsp),
                [launched]"i"(offsetof(struct vcpu_vmx, __launched)),
@@ -6509,10 +6509,10 @@ static void __vmx_vcpu_run(struct kvm_vcpu *vcpu, struct vcpu_vmx *vmx)
                [wordsize]"i"(sizeof(ulong))
              : "cc", "memory"
 #ifdef CONFIG_X86_64
-               , "rax", "rbx", "rdi"
+               , "rax", "rbx", "rdx", "rdi"
                , "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
 #else
-               , "eax", "ebx", "edi"
+               , "eax", "ebx", "edx", "edi"
 #endif
              );
 }