Add PSE-36 (36-bit page size extension) support

Code ported from PCBox
This commit is contained in:
Alexander Babikov
2024-12-21 20:37:26 +05:00
parent 5e2559452c
commit f1a60d8242
3 changed files with 16 additions and 4 deletions

View File

@@ -320,6 +320,7 @@ 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;
@@ -336,7 +337,10 @@ mmutranslatereal_normal(uint32_t addr, int rw)
mmu_perm = temp & 4;
rammap(addr2) |= (rw ? 0x60 : 0x20);
return (temp & ~0x3fffff) + (addr & 0x3fffff);
if (cpu_features & CPU_FEATURE_PSE36)
ret |= (uint64_t) (temp & 0x1e000) << 32;
return ret + (addr & 0x3fffff);
}
temp = rammap((temp & ~0xfff) + ((addr >> 10) & 0xffc));
@@ -488,10 +492,14 @@ 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;
return (temp & ~0x3fffff) + (addr & 0x3fffff);
if (cpu_features & CPU_FEATURE_PSE36)
ret |= (uint64_t) (temp & 0x1e000) << 32;
return ret + (addr & 0x3fffff);
}
temp = rammap((temp & ~0xfff) + ((addr >> 10) & 0xffc));