]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: SVM: Macrofy GPR swapping in __svm_vcpu_run()
authorChang S. Bae <chang.seok.bae@intel.com>
Fri, 15 May 2026 17:27:33 +0000 (13:27 -0400)
committerPaolo Bonzini <pbonzini@redhat.com>
Sat, 30 May 2026 20:41:34 +0000 (22:41 +0200)
Convert the register save/restore sequences in the SVM entry into macros,
following the VMX code. Drop the now-redundant register offset defines.

No functional change intended.

Signed-off-by: Chang S. Bae <chang.seok.bae@intel.com>
Link: https://patch.msgid.link/20260512011502.53072-3-chang.seok.bae@intel.com/
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/svm/vmenter.S

index 6a91e1383e8f89d39ffcaf131f90b0d94da3583a..06a8cb58f18732d424de9e5d5ca916e05367e51c 100644 (file)
@@ -8,26 +8,6 @@
 #include "kvm-asm-offsets.h"
 #include "vmenter.h"
 
-/* Intentionally omit RAX as it's context switched by hardware */
-#define VCPU_RCX       (SVM_vcpu_arch_regs + __VCPU_REGS_RCX * WORD_SIZE)
-#define VCPU_RDX       (SVM_vcpu_arch_regs + __VCPU_REGS_RDX * WORD_SIZE)
-#define VCPU_RBX       (SVM_vcpu_arch_regs + __VCPU_REGS_RBX * WORD_SIZE)
-/* Intentionally omit RSP as it's context switched by hardware */
-#define VCPU_RBP       (SVM_vcpu_arch_regs + __VCPU_REGS_RBP * WORD_SIZE)
-#define VCPU_RSI       (SVM_vcpu_arch_regs + __VCPU_REGS_RSI * WORD_SIZE)
-#define VCPU_RDI       (SVM_vcpu_arch_regs + __VCPU_REGS_RDI * WORD_SIZE)
-
-#ifdef CONFIG_X86_64
-#define VCPU_R8                (SVM_vcpu_arch_regs + __VCPU_REGS_R8  * WORD_SIZE)
-#define VCPU_R9                (SVM_vcpu_arch_regs + __VCPU_REGS_R9  * WORD_SIZE)
-#define VCPU_R10       (SVM_vcpu_arch_regs + __VCPU_REGS_R10 * WORD_SIZE)
-#define VCPU_R11       (SVM_vcpu_arch_regs + __VCPU_REGS_R11 * WORD_SIZE)
-#define VCPU_R12       (SVM_vcpu_arch_regs + __VCPU_REGS_R12 * WORD_SIZE)
-#define VCPU_R13       (SVM_vcpu_arch_regs + __VCPU_REGS_R13 * WORD_SIZE)
-#define VCPU_R14       (SVM_vcpu_arch_regs + __VCPU_REGS_R14 * WORD_SIZE)
-#define VCPU_R15       (SVM_vcpu_arch_regs + __VCPU_REGS_R15 * WORD_SIZE)
-#endif
-
 #define SVM_vmcb01_pa  (SVM_vmcb01 + KVM_VMCB_pa)
 
 .section .noinstr.text, "ax"
@@ -108,23 +88,17 @@ SYM_FUNC_START(__svm_vcpu_run)
        mov SVM_current_vmcb(%_ASM_DI), %_ASM_AX
        mov KVM_VMCB_pa(%_ASM_AX), %_ASM_AX
 
-       /* Load guest registers. */
-       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
+       /*
+        * Load guest registers. Intentionally omit %_ASM_AX and %_ASM_SP as
+        * context switched by hardware
+        */
+       LOAD_REGS %_ASM_DI, SVM_vcpu_arch_regs, \
+                 %_ASM_CX, %_ASM_DX, %_ASM_BX, %_ASM_BP, %_ASM_SI
 #ifdef CONFIG_X86_64
-       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
+       LOAD_REGS %_ASM_DI, SVM_vcpu_arch_regs, \
+                 %r8, %r9, %r10, %r11, %r12, %r13, %r14, %r15
 #endif
-       mov VCPU_RDI(%_ASM_DI), %_ASM_DI
+       LOAD_REGS %_ASM_DI, SVM_vcpu_arch_regs, %_ASM_DI
 
        /* Clobbers EFLAGS.ZF */
        SVM_CLEAR_CPU_BUFFERS
@@ -135,22 +109,15 @@ SYM_FUNC_START(__svm_vcpu_run)
        /* Pop @svm to RAX while it's the only available register. */
        pop %_ASM_AX
 
-       /* Save all guest registers.  */
-       mov %_ASM_CX,   VCPU_RCX(%_ASM_AX)
-       mov %_ASM_DX,   VCPU_RDX(%_ASM_AX)
-       mov %_ASM_BX,   VCPU_RBX(%_ASM_AX)
-       mov %_ASM_BP,   VCPU_RBP(%_ASM_AX)
-       mov %_ASM_SI,   VCPU_RSI(%_ASM_AX)
-       mov %_ASM_DI,   VCPU_RDI(%_ASM_AX)
+       /*
+        * Save all guest registers. Intentionally omit %_ASM_AX and %_ASM_SP as
+        * context switched by hardware
+        */
+       STORE_REGS %_ASM_AX, SVM_vcpu_arch_regs, \
+                  %_ASM_CX, %_ASM_DX, %_ASM_BX, %_ASM_BP, %_ASM_SI, %_ASM_DI
 #ifdef CONFIG_X86_64
-       mov %r8,  VCPU_R8 (%_ASM_AX)
-       mov %r9,  VCPU_R9 (%_ASM_AX)
-       mov %r10, VCPU_R10(%_ASM_AX)
-       mov %r11, VCPU_R11(%_ASM_AX)
-       mov %r12, VCPU_R12(%_ASM_AX)
-       mov %r13, VCPU_R13(%_ASM_AX)
-       mov %r14, VCPU_R14(%_ASM_AX)
-       mov %r15, VCPU_R15(%_ASM_AX)
+       STORE_REGS %_ASM_AX, SVM_vcpu_arch_regs, \
+                  %r8, %r9, %r10, %r11, %r12, %r13, %r14, %r15
 #endif
 
        /* @svm can stay in RDI from now on.  */
@@ -193,21 +160,9 @@ SYM_FUNC_START(__svm_vcpu_run)
         * free.  RSP and RAX are exempt as they are restored by hardware
         * during VM-Exit.
         */
-       xor %ecx, %ecx
-       xor %edx, %edx
-       xor %ebx, %ebx
-       xor %ebp, %ebp
-       xor %esi, %esi
-       xor %edi, %edi
+       CLEAR_REGS %ecx, %edx, %ebx, %ebp, %esi, %edi
 #ifdef CONFIG_X86_64
-       xor %r8d,  %r8d
-       xor %r9d,  %r9d
-       xor %r10d, %r10d
-       xor %r11d, %r11d
-       xor %r12d, %r12d
-       xor %r13d, %r13d
-       xor %r14d, %r14d
-       xor %r15d, %r15d
+       CLEAR_REGS %r8d, %r9d, %r10d, %r11d, %r12d, %r13d, %r14d, %r15d
 #endif
 
        /* "Pop" @enter_flags.  */