qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Glauber Costa <glommer@redhat.com>
To: qemu-devel@nongnu.org
Cc: aliguori@us.ibm.com
Subject: [Qemu-devel] [PATCH] don't expose lm bit if kernel is not 64-bit capable.
Date: Tue,  3 Feb 2009 15:15:55 -0500	[thread overview]
Message-ID: <1233692155-14750-1-git-send-email-glommer@redhat.com> (raw)

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

             reply	other threads:[~2009-02-03 20:16 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-02-03 20:15 Glauber Costa [this message]
  -- strict thread matches above, loose matches on Subject: below --
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

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1233692155-14750-1-git-send-email-glommer@redhat.com \
    --to=glommer@redhat.com \
    --cc=aliguori@us.ibm.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).