Commit c8c14bcb authored by Luiz Capitulino's avatar Luiz Capitulino Committed by Andreas Färber
Browse files

target-i386: x86_cpu_get_phys_page_debug(): support 1GB page translation



Linux guests, when using more than 4GB of RAM, may end up using 1GB pages
to store (kernel) data. When this happens, we're unable to debug a running
Linux kernel with GDB:

(gdb) p node_data[0]->node_id
Cannot access memory at address 0xffff88013fffd3a0
(gdb)

GDB returns this error because x86_cpu_get_phys_page_debug() doesn't support
translating 1GB pages in IA-32e paging mode and returns an error to GDB.

This commit adds support for 1GB page translation for IA32e paging.

Signed-off-by: default avatarLuiz Capitulino <lcapitulino@redhat.com>
Reviewed-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Reviewed-by: default avatarJan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: default avatarAndreas Färber <afaerber@suse.de>
parent 8648fcd5
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -941,6 +941,14 @@ hwaddr x86_cpu_get_phys_page_debug(CPUState *cs, vaddr addr)
            pdpe = ldq_phys(cs->as, pdpe_addr);
            if (!(pdpe & PG_PRESENT_MASK))
                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;
            }

        } else
#endif
        {
@@ -993,6 +1001,9 @@ hwaddr x86_cpu_get_phys_page_debug(CPUState *cs, vaddr addr)
        pte = pte & env->a20_mask;
    }

#ifdef TARGET_X86_64
out:
#endif
    page_offset = (addr & TARGET_PAGE_MASK) & (page_size - 1);
    paddr = (pte & TARGET_PAGE_MASK) + page_offset;
    return paddr;