If you start a Linux guest with more than 4GB of memory and try to look at a memory address, you will get an error from gdb:
(gdb) p node_data[0]->node_id Cannot access memory at address 0xffff88013fffd3a0 (gdb) I debugged this down to x86_cpu_get_phys_page_debug(), it doesn't handle the case where the PDPTE has the PS bit set (although I didn't check where Linux sets that bit). This commit adds the PS bit handling, which fixes the problem for me. Signed-off-by: Luiz capitulino <lcapitul...@redhat.com> --- Two observations: 1. This bug has always existed, so it's not a regression, so I'm not sure it's worth it to fix for 2.0 2. I'm not familiar with every detail of x86_cpu_get_phys_page_debug(), so I'm not completely sure this is the right thing to do target-i386/helper.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/target-i386/helper.c b/target-i386/helper.c index 4f447b8..9b7803f 100644 --- a/target-i386/helper.c +++ b/target-i386/helper.c @@ -951,6 +951,13 @@ hwaddr x86_cpu_get_phys_page_debug(CPUState *cs, vaddr addr) return -1; } + if (pdpe & PG_PSE_MASK) { + page_size = 1024 * 1024 * 1024; + pte = pdpe & ~( (page_size - 1) & ~0xfff); + pte &= ~(PG_NX_MASK | PG_HI_USER_MASK); + goto out; + } + pde_addr = ((pdpe & ~0xfff & ~(PG_NX_MASK | PG_HI_USER_MASK)) + (((addr >> 21) & 0x1ff) << 3)) & env->a20_mask; pde = ldq_phys(cs->as, pde_addr); @@ -993,6 +1000,7 @@ hwaddr x86_cpu_get_phys_page_debug(CPUState *cs, vaddr addr) pte = pte & env->a20_mask; } +out: page_offset = (addr & TARGET_PAGE_MASK) & (page_size - 1); paddr = (pte & TARGET_PAGE_MASK) + page_offset; return paddr; -- 1.8.3.1