OSDN Git Service

target-i386: fix abort on bad PML4E/PDPTE/PDE/PTE addresses
authorLuiz Capitulino <lcapitulino@redhat.com>
Tue, 28 May 2013 18:19:22 +0000 (14:19 -0400)
committerLuiz Capitulino <lcapitulino@redhat.com>
Fri, 31 May 2013 13:02:24 +0000 (09:02 -0400)
commitfbc2ed9518efcdcdcbf0adb9539c17a65addd20a
tree1cea742edb48e1997991a0bd3512b0eeb104ff72
parenta678e26cbe89f7a27cbce794c2c2784571ee9d21
target-i386: fix abort on bad PML4E/PDPTE/PDE/PTE addresses

The code used to walk IA-32e page-tables, and possibly PAE page-tables,
uses the bit mask ~0xfff to get the next PML4E/PDPTE/PDE/PTE address.

However, as we use a uint64_t to store the resulting address, that mask
gets expanded to 0xfffffffffffff000 which not only ends up selecting
reserved bits but also selects the XD bit (execute-disable) which
happens to be enabled by Windows 8, causing qemu_get_ram_ptr() to abort.

This commit fixes that problem by replacing ~0xfff by a correct mask
that only selects the address bit range (ie. bits 51:12).

Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
target-i386/arch_memory_mapping.c