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@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
GET_CURRENT(bx)
.Lsvm_do_resume:
call svm_intr_assist
- mov %rsp,%rdi
call nsvm_vcpu_switch
ASSERT_NOT_IN_ATOMIC
jmp .Lsvm_do_resume
__UNLIKELY_END(nsvm_hap)
- mov %rsp, %rdi
call svm_vmenter_helper
clgi
*/
stgi
GLOBAL(svm_stgi_label)
- mov %rsp,%rdi
call svm_vmexit_handler
jmp .Lsvm_do_resume
}
/* 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;
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;
return &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;