Add PSE-36 (36-bit page size extension) support
Code ported from PCBox
This commit is contained in:
@@ -76,6 +76,7 @@ enum {
|
|||||||
CPUID_MCA = (1 << 14), /* Machine Check Architecture */
|
CPUID_MCA = (1 << 14), /* Machine Check Architecture */
|
||||||
CPUID_CMOV = (1 << 15), /* Conditional move instructions */
|
CPUID_CMOV = (1 << 15), /* Conditional move instructions */
|
||||||
CPUID_PAT = (1 << 16), /* Page Attribute Table */
|
CPUID_PAT = (1 << 16), /* Page Attribute Table */
|
||||||
|
CPUID_PSE36 = (1 << 17), /* 36-bit Page Size Extension */
|
||||||
CPUID_MMX = (1 << 23), /* MMX technology */
|
CPUID_MMX = (1 << 23), /* MMX technology */
|
||||||
CPUID_FXSR = (1 << 24) /* FXSAVE and FXRSTOR instructions */
|
CPUID_FXSR = (1 << 24) /* FXSAVE and FXRSTOR instructions */
|
||||||
};
|
};
|
||||||
@@ -1743,8 +1744,10 @@ cpu_set(void)
|
|||||||
if (cpu_s->cpu_type >= CPU_PENTIUM2)
|
if (cpu_s->cpu_type >= CPU_PENTIUM2)
|
||||||
cpu_features |= CPU_FEATURE_MMX;
|
cpu_features |= CPU_FEATURE_MMX;
|
||||||
cpu_CR4_mask = CR4_VME | CR4_PVI | CR4_TSD | CR4_DE | CR4_PSE | CR4_MCE | CR4_PAE | CR4_PCE | CR4_PGE;
|
cpu_CR4_mask = CR4_VME | CR4_PVI | CR4_TSD | CR4_DE | CR4_PSE | CR4_MCE | CR4_PAE | CR4_PCE | CR4_PGE;
|
||||||
if (cpu_s->cpu_type == CPU_PENTIUM2D)
|
if (cpu_s->cpu_type == CPU_PENTIUM2D) {
|
||||||
cpu_CR4_mask |= CR4_OSFXSR;
|
cpu_CR4_mask |= CR4_OSFXSR;
|
||||||
|
cpu_features |= CPU_FEATURE_PSE36;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef USE_DYNAREC
|
#ifdef USE_DYNAREC
|
||||||
codegen_timing_set(&codegen_timing_p6);
|
codegen_timing_set(&codegen_timing_p6);
|
||||||
@@ -2489,7 +2492,7 @@ cpu_CPUID(void)
|
|||||||
} else if (EAX == 1) {
|
} else if (EAX == 1) {
|
||||||
EAX = CPUID;
|
EAX = CPUID;
|
||||||
EBX = ECX = 0;
|
EBX = ECX = 0;
|
||||||
EDX = CPUID_FPU | CPUID_VME | CPUID_DE | CPUID_PSE | CPUID_TSC | CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CMPXCHG8B | CPUID_MMX | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_SEP | CPUID_FXSR | CPUID_CMOV;
|
EDX = CPUID_FPU | CPUID_VME | CPUID_DE | CPUID_PSE | CPUID_TSC | CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CMPXCHG8B | CPUID_MMX | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_SEP | CPUID_FXSR | CPUID_CMOV | CPUID_PSE36;
|
||||||
} else if (EAX == 2) {
|
} else if (EAX == 2) {
|
||||||
EAX = 0x03020101; /* Instruction TLB: 4 KB pages, 4-way set associative, 32 entries
|
EAX = 0x03020101; /* Instruction TLB: 4 KB pages, 4-way set associative, 32 entries
|
||||||
Instruction TLB: 4 MB pages, fully associative, 2 entries
|
Instruction TLB: 4 MB pages, fully associative, 2 entries
|
||||||
|
|||||||
@@ -530,6 +530,7 @@ extern int hasfpu;
|
|||||||
#define CPU_FEATURE_3DNOW (1 << 6)
|
#define CPU_FEATURE_3DNOW (1 << 6)
|
||||||
#define CPU_FEATURE_SYSCALL (1 << 7)
|
#define CPU_FEATURE_SYSCALL (1 << 7)
|
||||||
#define CPU_FEATURE_3DNOWE (1 << 8)
|
#define CPU_FEATURE_3DNOWE (1 << 8)
|
||||||
|
#define CPU_FEATURE_PSE36 (1 << 9)
|
||||||
|
|
||||||
extern uint32_t cpu_features;
|
extern uint32_t cpu_features;
|
||||||
|
|
||||||
|
|||||||
@@ -320,6 +320,7 @@ mmutranslatereal_normal(uint32_t addr, int rw)
|
|||||||
|
|
||||||
if ((temp & 0x80) && (cr4 & CR4_PSE)) {
|
if ((temp & 0x80) && (cr4 & CR4_PSE)) {
|
||||||
/*4MB page*/
|
/*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))))) {
|
if (((CPL == 3) && !(temp & 4) && !cpl_override) || (rw && !cpl_override && !(temp & 2) && (((CPL == 3) && !cpl_override) || ((is486 || isibm486) && (cr0 & WP_FLAG))))) {
|
||||||
cr2 = addr;
|
cr2 = addr;
|
||||||
temp &= 1;
|
temp &= 1;
|
||||||
@@ -336,7 +337,10 @@ mmutranslatereal_normal(uint32_t addr, int rw)
|
|||||||
mmu_perm = temp & 4;
|
mmu_perm = temp & 4;
|
||||||
rammap(addr2) |= (rw ? 0x60 : 0x20);
|
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));
|
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)) {
|
if ((temp & 0x80) && (cr4 & CR4_PSE)) {
|
||||||
/*4MB page*/
|
/*4MB page*/
|
||||||
|
uint64_t ret = temp & ~0x3fffff;
|
||||||
if (((CPL == 3) && !(temp & 4) && !cpl_override) || (rw && !cpl_override && !(temp & 2) && ((CPL == 3) || (cr0 & WP_FLAG))))
|
if (((CPL == 3) && !(temp & 4) && !cpl_override) || (rw && !cpl_override && !(temp & 2) && ((CPL == 3) || (cr0 & WP_FLAG))))
|
||||||
return 0xffffffffffffffffULL;
|
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));
|
temp = rammap((temp & ~0xfff) + ((addr >> 10) & 0xffc));
|
||||||
|
|||||||
Reference in New Issue
Block a user