]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: x86/xen: Don't truncate RAX when handling hypercall from protected guest
authorSean Christopherson <seanjc@google.com>
Fri, 29 May 2026 22:21:46 +0000 (15:21 -0700)
committerSean Christopherson <seanjc@google.com>
Wed, 3 Jun 2026 12:34:46 +0000 (05:34 -0700)
Don't truncate RAX when handling a Xen hypercall for a guest with protected
state, as KVM's ABI is to assume the guest is in 64-bit for such cases
(the guest leaving garbage in 63:32 after a transition to 32-bit mode is
far less likely than 63:32 being necessary to complete the hypercall).

Fixes: b5aead0064f3 ("KVM: x86: Assume a 64-bit hypercall for guests with protected state")
Reviewed-by: David Woodhouse <dwmw@amazon.co.uk>
Link: https://patch.msgid.link/20260529222223.870923-4-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/xen.c

index 6d9be74bb673c477e12067cf9ab739ada4a0cb01..895095dc684e5fe2d1723966dc4a8976d9786081 100644 (file)
@@ -1678,15 +1678,14 @@ int kvm_xen_hypercall(struct kvm_vcpu *vcpu)
        bool handled = false;
        u8 cpl;
 
-       input = (u64)kvm_register_read(vcpu, VCPU_REGS_RAX);
-
        /* Hyper-V hypercalls get bit 31 set in EAX */
-       if ((input & 0x80000000) &&
+       if ((kvm_rax_read(vcpu) & 0x80000000) &&
            kvm_hv_hypercall_enabled(vcpu))
                return kvm_hv_hypercall(vcpu);
 
        longmode = is_64_bit_hypercall(vcpu);
        if (!longmode) {
+               input = (u32)kvm_rax_read(vcpu);
                params[0] = (u32)kvm_rbx_read(vcpu);
                params[1] = (u32)kvm_rcx_read(vcpu);
                params[2] = (u32)kvm_rdx_read(vcpu);
@@ -1696,6 +1695,7 @@ int kvm_xen_hypercall(struct kvm_vcpu *vcpu)
        }
        else {
 #ifdef CONFIG_X86_64
+               input = (u64)kvm_rax_read(vcpu);
                params[0] = (u64)kvm_rdi_read(vcpu);
                params[1] = (u64)kvm_rsi_read(vcpu);
                params[2] = (u64)kvm_rdx_read(vcpu);