[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 1/2] x86/svm: Remove regs param from asm-called functions


  • To: Xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
  • Date: Thu, 11 Aug 2022 20:59:04 +0100
  • Authentication-results: esa2.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none
  • Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Jan Beulich <JBeulich@xxxxxxxx>, Roger Pau Monné <roger.pau@xxxxxxxxxx>, Wei Liu <wl@xxxxxxx>
  • Delivery-date: Thu, 11 Aug 2022 19:59:47 +0000
  • Ironport-data: A9a23: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
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

A optimisation is going to want to conditionally have extra data on the stack
around VMExit.

We could alternative between `mov %rsp, %rdi` and `lea 8(%rsp), %rdi`, but it
is easier just to make the functions void and let the compiler do the (not
very) hard work.

Passing regs is a bit weird for HVM guests anyway, because the resulting
pointer is invariant (this isn't native exception handling where the regs
pointers *are* important), and all functions calculate `current` themselves
which is another invariant.

Finally, the compiler can merge the get_cpu_info() calculation which is common
to both `current` and guest_cpu_user_regs(), meaning the delta in C really is
just one `lea`, and not any more expensive than `mov`'s in ASM anyway.

No functional change.

Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
CC: Jan Beulich <JBeulich@xxxxxxxx>
CC: Roger Pau Monné <roger.pau@xxxxxxxxxx>
CC: Wei Liu <wl@xxxxxxx>
---
 xen/arch/x86/hvm/svm/entry.S     | 3 ---
 xen/arch/x86/hvm/svm/nestedsvm.c | 3 ++-
 xen/arch/x86/hvm/svm/svm.c       | 6 ++++--
 3 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/xen/arch/x86/hvm/svm/entry.S b/xen/arch/x86/hvm/svm/entry.S
index a60d759f7108..be4ce52bd81d 100644
--- a/xen/arch/x86/hvm/svm/entry.S
+++ b/xen/arch/x86/hvm/svm/entry.S
@@ -26,7 +26,6 @@ ENTRY(svm_asm_do_resume)
         GET_CURRENT(bx)
 .Lsvm_do_resume:
         call svm_intr_assist
-        mov  %rsp,%rdi
         call nsvm_vcpu_switch
         ASSERT_NOT_IN_ATOMIC
 
@@ -52,7 +51,6 @@ UNLIKELY_START(ne, nsvm_hap)
         jmp  .Lsvm_do_resume
 __UNLIKELY_END(nsvm_hap)
 
-        mov  %rsp, %rdi
         call svm_vmenter_helper
 
         clgi
@@ -132,7 +130,6 @@ __UNLIKELY_END(nsvm_hap)
          */
         stgi
 GLOBAL(svm_stgi_label)
-        mov  %rsp,%rdi
         call svm_vmexit_handler
         jmp  .Lsvm_do_resume
 
diff --git a/xen/arch/x86/hvm/svm/nestedsvm.c b/xen/arch/x86/hvm/svm/nestedsvm.c
index 9f5f35f16aff..77f754736023 100644
--- a/xen/arch/x86/hvm/svm/nestedsvm.c
+++ b/xen/arch/x86/hvm/svm/nestedsvm.c
@@ -1460,8 +1460,9 @@ nestedsvm_vcpu_vmexit(struct vcpu *v, struct 
cpu_user_regs *regs,
 }
 
 /* VCPU switch */
-void nsvm_vcpu_switch(struct cpu_user_regs *regs)
+void nsvm_vcpu_switch(void)
 {
+    struct cpu_user_regs *regs = guest_cpu_user_regs();
     struct vcpu *v = current;
     struct nestedvcpu *nv;
     struct nestedsvm *svm;
diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c
index 0849a9dc5f41..81f0cf55676b 100644
--- a/xen/arch/x86/hvm/svm/svm.c
+++ b/xen/arch/x86/hvm/svm/svm.c
@@ -1040,8 +1040,9 @@ static void noreturn cf_check svm_do_resume(void)
     reset_stack_and_jump(svm_asm_do_resume);
 }
 
-void svm_vmenter_helper(const struct cpu_user_regs *regs)
+void svm_vmenter_helper(void)
 {
+    const struct cpu_user_regs *regs = guest_cpu_user_regs();
     struct vcpu *curr = current;
     struct vmcb_struct *vmcb = curr->arch.hvm.svm.vmcb;
 
@@ -2570,8 +2571,9 @@ static struct hvm_function_table __initdata_cf_clobber 
svm_function_table = {
     },
 };
 
-void svm_vmexit_handler(struct cpu_user_regs *regs)
+void svm_vmexit_handler(void)
 {
+    struct cpu_user_regs *regs = guest_cpu_user_regs();
     uint64_t exit_reason;
     struct vcpu *v = current;
     struct vmcb_struct *vmcb = v->arch.hvm.svm.vmcb;
-- 
2.11.0




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.