Patchwork [2/6] Use TARGET_VIRT_ADDR_SPACE_BITS in h2g_valid.

login
register
mail settings
Submitter Richard Henderson
Date March 10, 2010, 10:36 p.m.
Message ID <e1b9c1c5bdc7c52db0412eff18a254c80dd48b9b.1268265556.git.rth@twiddle.net>
Download mbox | patch
Permalink /patch/47295/
State New
Headers show

Comments

Richard Henderson - March 10, 2010, 10:36 p.m.
Previously, only 32-bit guests had a proper check for the
validity of the virtual address.  Extend that check to 64-bit
guests with a restricted virtual address space.

Signed-off-by: Richard Henderson <rth@twiddle.net>
---
 cpu-all.h |   16 +++++++++++-----
 1 files changed, 11 insertions(+), 5 deletions(-)

Patch

diff --git a/cpu-all.h b/cpu-all.h
index 9823c24..68848e9 100644
--- a/cpu-all.h
+++ b/cpu-all.h
@@ -634,16 +634,22 @@  extern int have_guest_base;
 
 /* All direct uses of g2h and h2g need to go away for usermode softmmu.  */
 #define g2h(x) ((void *)((unsigned long)(x) + GUEST_BASE))
+
+#if HOST_LONG_BITS <= TARGET_VIRT_ADDR_SPACE_BITS
+#define h2g_valid(x) 1
+#else
+#define h2g_valid(x) ({ \
+    unsigned long __guest = (unsigned long)(x) - GUEST_BASE; \
+    __guest < (1ul << TARGET_VIRT_ADDR_SPACE_BITS); \
+})
+#endif
+
 #define h2g(x) ({ \
     unsigned long __ret = (unsigned long)(x) - GUEST_BASE; \
     /* Check if given address fits target address space */ \
-    assert(__ret == (abi_ulong)__ret); \
+    assert(h2g_valid(x)); \
     (abi_ulong)__ret; \
 })
-#define h2g_valid(x) ({ \
-    unsigned long __guest = (unsigned long)(x) - GUEST_BASE; \
-    (__guest == (abi_ulong)__guest); \
-})
 
 #define saddr(x) g2h(x)
 #define laddr(x) g2h(x)