From 74bda71219ba7eda82bc1f2dea90ac8628973cff Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 21 Dec 2024 20:43:18 -0300 Subject: [PATCH] mem: Fix upper bits in PSE-36 translation --- src/mem/mem.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/mem/mem.c b/src/mem/mem.c index c29616ed1..aafd6223c 100644 --- a/src/mem/mem.c +++ b/src/mem/mem.c @@ -320,7 +320,6 @@ mmutranslatereal_normal(uint32_t addr, int rw) if ((temp & 0x80) && (cr4 & CR4_PSE)) { /*4MB page*/ - uint64_t ret = temp & ~0x3fffff; if (((CPL == 3) && !(temp & 4) && !cpl_override) || (rw && !cpl_override && !(temp & 2) && (((CPL == 3) && !cpl_override) || ((is486 || isibm486) && (cr0 & WP_FLAG))))) { cr2 = addr; temp &= 1; @@ -337,10 +336,10 @@ mmutranslatereal_normal(uint32_t addr, int rw) mmu_perm = temp & 4; rammap(addr2) |= (rw ? 0x60 : 0x20); + uint64_t page = temp & ~0x3fffff; if (cpu_features & CPU_FEATURE_PSE36) - ret |= (uint64_t) (temp & 0x1e000) << 32; - - return ret + (addr & 0x3fffff); + page |= (uint64_t) (temp & 0x1e000) << 19; + return page + (addr & 0x3fffff); } temp = rammap((temp & ~0xfff) + ((addr >> 10) & 0xffc)); @@ -492,14 +491,13 @@ mmutranslate_noabrt_normal(uint32_t addr, int rw) if ((temp & 0x80) && (cr4 & CR4_PSE)) { /*4MB page*/ - uint64_t ret = temp & ~0x3fffff; if (((CPL == 3) && !(temp & 4) && !cpl_override) || (rw && !cpl_override && !(temp & 2) && ((CPL == 3) || (cr0 & WP_FLAG)))) return 0xffffffffffffffffULL; + uint64_t page = temp & ~0x3fffff; if (cpu_features & CPU_FEATURE_PSE36) - ret |= (uint64_t) (temp & 0x1e000) << 32; - - return ret + (addr & 0x3fffff); + page |= (uint64_t) (temp & 0x1e000) << 19; + return page + (addr & 0x3fffff); } temp = rammap((temp & ~0xfff) + ((addr >> 10) & 0xffc));