Commit 0e62fd795726640dfe89538a45a8bd18d149fa50

Authored by aurel32
1 parent 1609cd44

linux-user: Safety belt for h2g

h2g can only work on 64-bit hosts if the provided address is mappable to
the guest range. Neglecting this was already the source for several
bugs. Instrument the macro so that it will trigger earlier in the
future (at least as long as we have this kind of mapping mechanism).

Based on a patch from Jan Kiszka <jan.kiszka@web.de>

Signed-off-by: Kirill A. Shutemov <kirill@shutemov.name>
Acked-by: Edgar E. Iglesias <edgar.iglesias@gmail.com>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5955 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 9 additions and 1 deletions
cpu-all.h
... ... @@ -621,6 +621,9 @@ static inline void stfq_be_p(void *ptr, float64 v)
621 621 /* MMU memory access macros */
622 622  
623 623 #if defined(CONFIG_USER_ONLY)
  624 +#include <assert.h>
  625 +#include "qemu-types.h"
  626 +
624 627 /* On some host systems the guest address space is reserved on the host.
625 628 * This allows the guest address space to be offset to a convenient location.
626 629 */
... ... @@ -629,7 +632,12 @@ static inline void stfq_be_p(void *ptr, float64 v)
629 632  
630 633 /* All direct uses of g2h and h2g need to go away for usermode softmmu. */
631 634 #define g2h(x) ((void *)((unsigned long)(x) + GUEST_BASE))
632   -#define h2g(x) ((target_ulong)((unsigned long)(x) - GUEST_BASE))
  635 +#define h2g(x) ({ \
  636 + unsigned long __ret = (unsigned long)(x) - GUEST_BASE; \
  637 + /* Check if given address fits target address space */ \
  638 + assert(__ret == (abi_ulong)__ret); \
  639 + (abi_ulong)__ret; \
  640 +})
633 641  
634 642 #define saddr(x) g2h(x)
635 643 #define laddr(x) g2h(x)
... ...