KVM: SVM: adjust register allocation for __svm_vcpu_run()
authorPaolo Bonzini <pbonzini@redhat.com>
Fri, 28 Oct 2022 21:30:07 +0000 (17:30 -0400)
committerPaolo Bonzini <pbonzini@redhat.com>
Wed, 9 Nov 2022 17:16:46 +0000 (12:16 -0500)
32-bit ABI uses RAX/RCX/RDX as its argument registers, so they are in
the way of instructions that hardcode their operands such as RDMSR/WRMSR
or VMLOAD/VMRUN/VMSAVE.

In preparation for moving vmload/vmsave to __svm_vcpu_run(), keep
the pointer to the struct vcpu_svm in %rdi.  In particular, it is now
possible to load svm->vmcb01.pa in %rax without clobbering the struct
vcpu_svm pointer.

No functional change intended.

Cc: stable@vger.kernel.org
Fixes: a149180fbcf3 ("x86: Add magic AMD return-thunk")
Reviewed-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/svm/vmenter.S

index f0ff411..531510a 100644 (file)
@@ -54,29 +54,29 @@ SYM_FUNC_START(__svm_vcpu_run)
        /* Save @vmcb. */
        push %_ASM_ARG1
 
-       /* Move @svm to RAX. */
-       mov %_ASM_ARG2, %_ASM_AX
+       /* Move @svm to RDI. */
+       mov %_ASM_ARG2, %_ASM_DI
+
+       /* "POP" @vmcb to RAX. */
+       pop %_ASM_AX
 
        /* Load guest registers. */
-       mov VCPU_RCX(%_ASM_AX), %_ASM_CX
-       mov VCPU_RDX(%_ASM_AX), %_ASM_DX
-       mov VCPU_RBX(%_ASM_AX), %_ASM_BX
-       mov VCPU_RBP(%_ASM_AX), %_ASM_BP
-       mov VCPU_RSI(%_ASM_AX), %_ASM_SI
-       mov VCPU_RDI(%_ASM_AX), %_ASM_DI
+       mov VCPU_RCX(%_ASM_DI), %_ASM_CX
+       mov VCPU_RDX(%_ASM_DI), %_ASM_DX
+       mov VCPU_RBX(%_ASM_DI), %_ASM_BX
+       mov VCPU_RBP(%_ASM_DI), %_ASM_BP
+       mov VCPU_RSI(%_ASM_DI), %_ASM_SI
 #ifdef CONFIG_X86_64
-       mov VCPU_R8 (%_ASM_AX),  %r8
-       mov VCPU_R9 (%_ASM_AX),  %r9
-       mov VCPU_R10(%_ASM_AX), %r10
-       mov VCPU_R11(%_ASM_AX), %r11
-       mov VCPU_R12(%_ASM_AX), %r12
-       mov VCPU_R13(%_ASM_AX), %r13
-       mov VCPU_R14(%_ASM_AX), %r14
-       mov VCPU_R15(%_ASM_AX), %r15
+       mov VCPU_R8 (%_ASM_DI),  %r8
+       mov VCPU_R9 (%_ASM_DI),  %r9
+       mov VCPU_R10(%_ASM_DI), %r10
+       mov VCPU_R11(%_ASM_DI), %r11
+       mov VCPU_R12(%_ASM_DI), %r12
+       mov VCPU_R13(%_ASM_DI), %r13
+       mov VCPU_R14(%_ASM_DI), %r14
+       mov VCPU_R15(%_ASM_DI), %r15
 #endif
-
-       /* "POP" @vmcb to RAX. */
-       pop %_ASM_AX
+       mov VCPU_RDI(%_ASM_DI), %_ASM_DI
 
        /* Enter guest mode */
        sti