Il 27/04/2014 13:40, Toralf Förster ha scritto:
On 04/27/2014 12:45 PM, Paolo Bonzini wrote:
Il 27/04/2014 12:30, Toralf Förster ha scritto:
Signed-off-by: Toralf Förster <[email protected]>
---
 arch/x86/kvm/x86.c | 23 ++++++++++-------------
 1 file changed, 10 insertions(+), 13 deletions(-)

diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 8b8fc0b..93cf454 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -5680,20 +5680,17 @@ int kvm_hv_hypercall(struct kvm_vcpu *vcpu)
     kvm_x86_ops->get_cs_db_l_bits(vcpu, &cs_db, &cs_l);
     longmode = is_long_mode(vcpu) && cs_l == 1;

-    if (!longmode) {
-        param = ((u64)kvm_register_read(vcpu, VCPU_REGS_RDX) << 32) |
-            (kvm_register_read(vcpu, VCPU_REGS_RAX) & 0xffffffff);
-        ingpa = ((u64)kvm_register_read(vcpu, VCPU_REGS_RBX) << 32) |
-            (kvm_register_read(vcpu, VCPU_REGS_RCX) & 0xffffffff);
-        outgpa = ((u64)kvm_register_read(vcpu, VCPU_REGS_RDI) << 32) |
-            (kvm_register_read(vcpu, VCPU_REGS_RSI) & 0xffffffff);
-    }
 #ifdef CONFIG_X86_64
-    else {
-        param = kvm_register_read(vcpu, VCPU_REGS_RCX);
-        ingpa = kvm_register_read(vcpu, VCPU_REGS_RDX);
-        outgpa = kvm_register_read(vcpu, VCPU_REGS_R8);
-    }
+    param = kvm_register_read(vcpu, VCPU_REGS_RCX);
+    ingpa = kvm_register_read(vcpu, VCPU_REGS_RDX);
+    outgpa = kvm_register_read(vcpu, VCPU_REGS_R8);
+#else
+    param = ((u64)kvm_register_read(vcpu, VCPU_REGS_RDX) << 32) |
+        (kvm_register_read(vcpu, VCPU_REGS_RAX) & 0xffffffff);
+    ingpa = ((u64)kvm_register_read(vcpu, VCPU_REGS_RBX) << 32) |
+        (kvm_register_read(vcpu, VCPU_REGS_RCX) & 0xffffffff);
+    outgpa = ((u64)kvm_register_read(vcpu, VCPU_REGS_RDI) << 32) |
+        (kvm_register_read(vcpu, VCPU_REGS_RSI) & 0xffffffff);
 #endif

     code = param & 0xffff;


No, wait, it's only superfluous in the sense that you don't need
longmode for !CONFIG_X86_64.  It's definitely needed for CONFIG_X86_64,
because the guest can run in 32-bit mode.

Paolo


Ah, so the following would work, but looks too ugly, right ? :


#ifdef CONFIG_X86_64
        if (!longmode) {
#endif
                param = ((u64)kvm_register_read(vcpu, VCPU_REGS_RDX) << 32) |
                        (kvm_register_read(vcpu, VCPU_REGS_RAX) & 0xffffffff);
                ingpa = ((u64)kvm_register_read(vcpu, VCPU_REGS_RBX) << 32) |
                        (kvm_register_read(vcpu, VCPU_REGS_RCX) & 0xffffffff);
                outgpa = ((u64)kvm_register_read(vcpu, VCPU_REGS_RDI) << 32) |
                        (kvm_register_read(vcpu, VCPU_REGS_RSI) & 0xffffffff);
#ifdef CONFIG_X86_64
        }
        else {
                param = kvm_register_read(vcpu, VCPU_REGS_RCX);
                ingpa = kvm_register_read(vcpu, VCPU_REGS_RDX);
                outgpa = kvm_register_read(vcpu, VCPU_REGS_R8);
        }
#endif


Yep. :) Note that GCC correctly reports no warning, because it looks through is_long_mode. In the end, #ifdef in the code can just be removed. Please compile-test it on 32-bit though (well, I will too before committing but...).

Paolo
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to