From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1CtDEm-0005uz-QW for qemu-devel@nongnu.org; Mon, 24 Jan 2005 18:03:12 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1CtDEi-0005tI-P9 for qemu-devel@nongnu.org; Mon, 24 Jan 2005 18:03:08 -0500 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1CtDEh-0005sX-DW for qemu-devel@nongnu.org; Mon, 24 Jan 2005 18:03:07 -0500 Received: from [195.250.128.73] (helo=smtp1.vol.cz) by monty-python.gnu.org with esmtp (TLSv1:DES-CBC3-SHA:168) (Exim 4.34) id 1CtD0H-0003Gg-4z for qemu-devel@nongnu.org; Mon, 24 Jan 2005 17:48:13 -0500 Received: from [10.0.0.2] (prg-v-6-220.static.adsl.vol.cz [62.177.70.220]) by smtp1.vol.cz (8.12.9p2/8.12.9) with ESMTP id j0OMm9Dm009387 for ; Mon, 24 Jan 2005 23:48:09 +0100 (CET) (envelope-from xnavara@volny.cz) Message-ID: <41F57B2C.7010208@volny.cz> Date: Mon, 24 Jan 2005 23:48:12 +0100 From: Filip Navara MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------040202090703030002090900" Subject: [Qemu-devel] [PATCH] cpu_get_phys_page_debug/PAE Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org This is a multi-part message in MIME format. --------------040202090703030002090900 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Changelog: 2005-01-24 Filip Navara * Support resolving addresses in PAE mode in cpu_get_phys_page_debug. --------------040202090703030002090900 Content-Type: text/plain; name="qemu-pae-debug.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="qemu-pae-debug.patch" Index: target-i386/helper2.c =================================================================== RCS file: /cvsroot/qemu/qemu/target-i386/helper2.c,v retrieving revision 1.29 diff -u -r1.29 helper2.c --- target-i386/helper2.c 12 Jan 2005 22:46:19 -0000 1.29 +++ target-i386/helper2.c 24 Jan 2005 22:08:51 -0000 @@ -745,30 +756,86 @@ uint8_t *pde_ptr, *pte_ptr; uint32_t pde, pte, paddr, page_offset, page_size; - if (!(env->cr[0] & CR0_PG_MASK)) { - pte = addr; - page_size = 4096; - } else { - /* page directory entry */ - pde_ptr = phys_ram_base + - (((env->cr[3] & ~0xfff) + ((addr >> 20) & ~3)) & env->a20_mask); - pde = ldl_raw(pde_ptr); - if (!(pde & PG_PRESENT_MASK)) + if (env->cr[4] & CR4_PAE_MASK) { + uint32_t pdpe_addr, pde_addr, pte_addr; + uint32_t pdpe; + + /* XXX: we only use 32 bit physical addresses */ +#ifdef TARGET_X86_64 + if (env->hflags & HF_LMA_MASK) { + uint32_t pml4e_addr, pml4e; + int32_t sext; + + /* test virtual address sign extension */ + sext = (int64_t)addr >> 47; + if (sext != 0 && sext != -1) + return -1; + + pml4e_addr = ((env->cr[3] & ~0xfff) + (((addr >> 39) & 0x1ff) << 3)) & + env->a20_mask; + pml4e = ldl_phys_aligned(pml4e_addr); + if (!(pml4e & PG_PRESENT_MASK)) + return -1; + + pdpe_addr = ((pml4e & ~0xfff) + (((addr >> 30) & 0x1ff) << 3)) & + env->a20_mask; + pdpe = ldl_phys_aligned(pdpe_addr); + if (!(pdpe & PG_PRESENT_MASK)) + return -1; + } else +#endif + { + pdpe_addr = ((env->cr[3] & ~0x1f) + ((addr >> 30) << 3)) & + env->a20_mask; + pdpe = ldl_phys_aligned(pdpe_addr); + if (!(pdpe & PG_PRESENT_MASK)) + return -1; + } + + pde_addr = ((pdpe & ~0xfff) + (((addr >> 21) & 0x1ff) << 3)) & + env->a20_mask; + pde = ldl_phys_aligned(pde_addr); + if (!(pde & PG_PRESENT_MASK)) { return -1; - if ((pde & PG_PSE_MASK) && (env->cr[4] & CR4_PSE_MASK)) { - pte = pde & ~0x003ff000; /* align to 4MB */ - page_size = 4096 * 1024; + } + if (pde & PG_PSE_MASK) { + /* 2 MB page */ + page_size = 2048 * 1024; + pte = pde & ~( (page_size - 1) & ~0xfff); /* align to page_size */ + } else { + /* 4 KB page */ + pte_addr = ((pde & ~0xfff) + (((addr >> 12) & 0x1ff) << 3)) & + env->a20_mask; + page_size = 4096; + pte = ldl_phys_aligned(pte_addr); + } + } else { + if (!(env->cr[0] & CR0_PG_MASK)) { + pte = addr; + page_size = 4096; } else { /* page directory entry */ - pte_ptr = phys_ram_base + - (((pde & ~0xfff) + ((addr >> 10) & 0xffc)) & env->a20_mask); - pte = ldl_raw(pte_ptr); - if (!(pte & PG_PRESENT_MASK)) + pde_ptr = phys_ram_base + + (((env->cr[3] & ~0xfff) + ((addr >> 20) & ~3)) & env->a20_mask); + pde = ldl_raw(pde_ptr); + if (!(pde & PG_PRESENT_MASK)) return -1; - page_size = 4096; + if ((pde & PG_PSE_MASK) && (env->cr[4] & CR4_PSE_MASK)) { + pte = pde & ~0x003ff000; /* align to 4MB */ + page_size = 4096 * 1024; + } else { + /* page directory entry */ + pte_ptr = phys_ram_base + + (((pde & ~0xfff) + ((addr >> 10) & 0xffc)) & env->a20_mask); + pte = ldl_raw(pte_ptr); + if (!(pte & PG_PRESENT_MASK)) + return -1; + page_size = 4096; + } } + pte = pte & env->a20_mask; } - pte = pte & env->a20_mask; + page_offset = (addr & TARGET_PAGE_MASK) & (page_size - 1); paddr = (pte & TARGET_PAGE_MASK) + page_offset; return paddr; --------------040202090703030002090900--