From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54663) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WPjFD-0003SJ-8l for qemu-devel@nongnu.org; Mon, 17 Mar 2014 21:55:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WPjF7-0001oW-9R for qemu-devel@nongnu.org; Mon, 17 Mar 2014 21:55:07 -0400 Received: from mx1.redhat.com ([209.132.183.28]:20910) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WPjF7-0001oL-0v for qemu-devel@nongnu.org; Mon, 17 Mar 2014 21:55:01 -0400 Date: Mon, 17 Mar 2014 21:54:55 -0400 From: Luiz Capitulino Message-ID: <20140317215455.2f14b61f@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] [PATCH for-2.0?] target-i386: fix gdb debugging with large memory guests List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel Cc: peter.maydell@linaro.org, afaerber@suse.de, jan.kiszka@siemens.com 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 --- 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