[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-stable] [PATCH 12/26] target-i386: fix abort on bad PML4E/PDPTE/PD
From: |
Michael Roth |
Subject: |
[Qemu-stable] [PATCH 12/26] target-i386: fix abort on bad PML4E/PDPTE/PDE/PTE addresses |
Date: |
Wed, 12 Jun 2013 16:41:24 -0500 |
From: Luiz Capitulino <address@hidden>
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 <address@hidden>
Reviewed-by: Laszlo Ersek <address@hidden>
(cherry picked from commit fbc2ed9518efcdcdcbf0adb9539c17a65addd20a)
Signed-off-by: Michael Roth <address@hidden>
---
target-i386/arch_memory_mapping.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/target-i386/arch_memory_mapping.c
b/target-i386/arch_memory_mapping.c
index 844893f..24884bd 100644
--- a/target-i386/arch_memory_mapping.c
+++ b/target-i386/arch_memory_mapping.c
@@ -75,6 +75,8 @@ static void walk_pte2(MemoryMappingList *list,
}
/* PAE Paging or IA-32e Paging */
+#define PLM4_ADDR_MASK 0xffffffffff000 /* selects bits 51:12 */
+
static void walk_pde(MemoryMappingList *list, hwaddr pde_start_addr,
int32_t a20_mask, target_ulong start_line_addr)
{
@@ -105,7 +107,7 @@ static void walk_pde(MemoryMappingList *list, hwaddr
pde_start_addr,
continue;
}
- pte_start_addr = (pde & ~0xfff) & a20_mask;
+ pte_start_addr = (pde & PLM4_ADDR_MASK) & a20_mask;
walk_pte(list, pte_start_addr, a20_mask, line_addr);
}
}
@@ -208,7 +210,7 @@ static void walk_pdpe(MemoryMappingList *list,
continue;
}
- pde_start_addr = (pdpe & ~0xfff) & a20_mask;
+ pde_start_addr = (pdpe & PLM4_ADDR_MASK) & a20_mask;
walk_pde(list, pde_start_addr, a20_mask, line_addr);
}
}
@@ -231,7 +233,7 @@ static void walk_pml4e(MemoryMappingList *list,
}
line_addr = ((i & 0x1ffULL) << 39) | (0xffffULL << 48);
- pdpe_start_addr = (pml4e & ~0xfff) & a20_mask;
+ pdpe_start_addr = (pml4e & PLM4_ADDR_MASK) & a20_mask;
walk_pdpe(list, pdpe_start_addr, a20_mask, line_addr);
}
}
@@ -249,7 +251,7 @@ int cpu_get_memory_mapping(MemoryMappingList *list,
CPUArchState *env)
if (env->hflags & HF_LMA_MASK) {
hwaddr pml4e_addr;
- pml4e_addr = (env->cr[3] & ~0xfff) & env->a20_mask;
+ pml4e_addr = (env->cr[3] & PLM4_ADDR_MASK) & env->a20_mask;
walk_pml4e(list, pml4e_addr, env->a20_mask);
} else
#endif
--
1.7.9.5
- [Qemu-stable] [PATCH 01/26] hw/9pfs: Fix segfault with 9p2000.u, (continued)
- [Qemu-stable] [PATCH 01/26] hw/9pfs: Fix segfault with 9p2000.u, Michael Roth, 2013/06/12
- [Qemu-stable] [PATCH 03/26] rtl8139: flush queued packets when RxBufPtr is written, Michael Roth, 2013/06/12
- [Qemu-stable] [PATCH 02/26] hw/9pfs: use O_NOFOLLOW for mapped readlink operation, Michael Roth, 2013/06/12
- [Qemu-stable] [PATCH 04/26] qom/object: Don't poll cast cache for NULL objects, Michael Roth, 2013/06/12
- [Qemu-stable] [PATCH 05/26] xen: simplify xen_enabled, Michael Roth, 2013/06/12
- [Qemu-stable] [PATCH 06/26] main_loop: do not set nonblocking if xen_enabled(), Michael Roth, 2013/06/12
- [Qemu-stable] [PATCH 07/26] xen_machine_pv: do not create a dummy CPU in machine->init, Michael Roth, 2013/06/12
- [Qemu-stable] [PATCH 08/26] chardev: fix "info chardev" output, Michael Roth, 2013/06/12
- [Qemu-stable] [PATCH 09/26] ide: Set BSY bit during FLUSH, Michael Roth, 2013/06/12
- [Qemu-stable] [PATCH 10/26] Revert "roms: switch oldnoconfig to olddefconfig", Michael Roth, 2013/06/12
- [Qemu-stable] [PATCH 12/26] target-i386: fix abort on bad PML4E/PDPTE/PDE/PTE addresses,
Michael Roth <=
- [Qemu-stable] [PATCH 13/26] Remove OSS support for OpenBSD, Michael Roth, 2013/06/12
- [Qemu-stable] [PATCH 14/26] xen: start PCI hole at 0xe0000000 (same as pc_init1 and qemu-xen-traditional), Michael Roth, 2013/06/12
- [Qemu-stable] [PATCH 15/26] do not check pointers after dereferencing them, Michael Roth, 2013/06/12
- [Qemu-stable] [PATCH 16/26] qdev: fix get_fw_dev_path to support to add nothing to fw_dev_path, Michael Roth, 2013/06/12
- [Qemu-stable] [PATCH 17/26] host-libusb: Correct test for USB packet state, Michael Roth, 2013/06/12
- [Qemu-stable] [PATCH 18/26] Fix usage of USB_DEV_FLAG_IS_HOST flag., Michael Roth, 2013/06/12
- [Qemu-stable] [PATCH 20/26] ui/gtk.c: Fix *BSD build of Gtk+ UI, Michael Roth, 2013/06/12
- [Qemu-stable] [PATCH 19/26] vmxnet3: fix NICState cleanup, Michael Roth, 2013/06/12
- [Qemu-stable] [PATCH 22/26] virtio-ccw: Fix unsetting of indicators., Michael Roth, 2013/06/12
- [Qemu-stable] [PATCH 21/26] s390x/css: Fix concurrent sense., Michael Roth, 2013/06/12