qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH] don't expose lm bit if kernel is not 64-bit capable.
@ 2009-02-03 15:04 Glauber Costa
  2009-02-03 15:44 ` Alexander Graf
                   ` (3 more replies)
  0 siblings, 4 replies; 13+ messages in thread
From: Glauber Costa @ 2009-02-03 15:04 UTC (permalink / raw)
  To: qemu-devel; +Cc: aliguori

If the kernel is not 64-bit capable (even if the host
machine is) do not expose the lm bit in guest cpuid.

Signed-off-by: Glauber Costa <glommer@redhat.com>
---
 target-i386/helper.c |    6 +++++-
 1 files changed, 5 insertions(+), 1 deletions(-)

diff --git a/target-i386/helper.c b/target-i386/helper.c
index a28ab93..997e4e1 100644
--- a/target-i386/helper.c
+++ b/target-i386/helper.c
@@ -24,6 +24,7 @@
 #include <inttypes.h>
 #include <signal.h>
 #include <assert.h>
+#include <sys/utsname.h>
 
 #include "cpu.h"
 #include "exec-all.h"
@@ -1520,13 +1521,16 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index,
 
         if (kvm_enabled()) {
             uint32_t h_eax, h_edx;
+            struct utsname utsname;
+
+            uname(&utsname);
 
             host_cpuid(0x80000001, &h_eax, NULL, NULL, &h_edx);
 
             /* disable CPU features that the host does not support */
 
             /* long mode */
-            if ((h_edx & 0x20000000) == 0 /* || !lm_capable_kernel */)
+            if ((h_edx & 0x20000000) == 0  || strcmp(utsname.machine, "x86_64"))
                 *edx &= ~0x20000000;
             /* syscall */
             if ((h_edx & 0x00000800) == 0)
-- 
1.5.6.5

^ permalink raw reply related	[flat|nested] 13+ messages in thread
* [Qemu-devel] [PATCH] don't expose lm bit if kernel is not 64-bit capable.
@ 2009-02-03 20:15 Glauber Costa
  0 siblings, 0 replies; 13+ messages in thread
From: Glauber Costa @ 2009-02-03 20:15 UTC (permalink / raw)
  To: qemu-devel; +Cc: aliguori

If the kernel is not 64-bit capable (even if the host
machine is) do not expose the lm bit in guest cpuid.

This patch do the verification inside the host_cpuid
function, for clarity. This way we can encapsulate all
forms of masking in there, and replace with other approaches
if they seem suitable in the future.

Cons are we're calling a syscall multiple times, but this
is hardly the hot path of anything.

Signed-off-by: Glauber Costa <glommer@redhat.com>
---
 target-i386/helper.c |   13 ++++++++++---
 1 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/target-i386/helper.c b/target-i386/helper.c
index a28ab93..327d8fc 100644
--- a/target-i386/helper.c
+++ b/target-i386/helper.c
@@ -24,6 +24,7 @@
 #include <inttypes.h>
 #include <signal.h>
 #include <assert.h>
+#include <sys/utsname.h>
 
 #include "cpu.h"
 #include "exec-all.h"
@@ -1375,6 +1376,7 @@ static void host_cpuid(uint32_t function, uint32_t *eax, uint32_t *ebx,
 {
 #if defined(CONFIG_KVM)
     uint32_t vec[4];
+    struct utsname utsname;
 
 #ifdef __x86_64__
     asm volatile("cpuid"
@@ -1399,11 +1401,16 @@ static void host_cpuid(uint32_t function, uint32_t *eax, uint32_t *ebx,
 	*ebx = vec[1];
     if (ecx)
 	*ecx = vec[2];
-    if (edx)
-	*edx = vec[3];
+    if (edx) {
+        uname(&utsname);
+        if (strcmp(utsname.machine, "x86_64"))
+            vec[3] &= ~0x20000000;
+    	*edx = vec[3];
+    }
 #endif
 }
 
+
 void cpu_x86_cpuid(CPUX86State *env, uint32_t index,
                    uint32_t *eax, uint32_t *ebx,
                    uint32_t *ecx, uint32_t *edx)
@@ -1526,7 +1533,7 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index,
             /* disable CPU features that the host does not support */
 
             /* long mode */
-            if ((h_edx & 0x20000000) == 0 /* || !lm_capable_kernel */)
+            if ((h_edx & 0x20000000) == 0) 
                 *edx &= ~0x20000000;
             /* syscall */
             if ((h_edx & 0x00000800) == 0)
-- 
1.5.6.5

^ permalink raw reply related	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2009-02-04  8:09 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-02-03 15:04 [Qemu-devel] [PATCH] don't expose lm bit if kernel is not 64-bit capable Glauber Costa
2009-02-03 15:44 ` Alexander Graf
2009-02-03 15:52   ` Glauber Costa
2009-02-03 17:58     ` Anthony Liguori
2009-02-03 19:35 ` Avi Kivity
2009-02-03 19:37 ` Avi Kivity
2009-02-03 20:00   ` Glauber Costa
2009-02-03 21:14     ` Anthony Liguori
2009-02-03 21:35       ` Glauber Costa
2009-02-03 21:42         ` Anthony Liguori
2009-02-04  8:10       ` Avi Kivity
2009-02-03 19:37 ` Avi Kivity
  -- strict thread matches above, loose matches on Subject: below --
2009-02-03 20:15 Glauber Costa

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).