Implemented CR4 register for Winchip. Currently only Time Stamp Disable (TSD) has an effect.
Fixed stupid bug in WRMSR - MSRs can now be written with values other than zero.
This commit is contained in:
parent
63adb3a9ae
commit
262b188790
6 changed files with 49 additions and 2 deletions
|
|
@ -630,6 +630,7 @@ void resetx86()
|
||||||
pc=0;
|
pc=0;
|
||||||
msw=0;
|
msw=0;
|
||||||
cr0=0;
|
cr0=0;
|
||||||
|
cr4 = 0;
|
||||||
eflags=0;
|
eflags=0;
|
||||||
cgate32=0;
|
cgate32=0;
|
||||||
loadcs(0xFFFF);
|
loadcs(0xFFFF);
|
||||||
|
|
@ -660,6 +661,7 @@ void softresetx86()
|
||||||
pc=0;
|
pc=0;
|
||||||
msw=0;
|
msw=0;
|
||||||
cr0=0;
|
cr0=0;
|
||||||
|
cr4 = 0;
|
||||||
eflags=0;
|
eflags=0;
|
||||||
cgate32=0;
|
cgate32=0;
|
||||||
loadcs(0xFFFF);
|
loadcs(0xFFFF);
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,10 @@ int cpu_16bitbus;
|
||||||
int cpu_busspeed;
|
int cpu_busspeed;
|
||||||
int cpu_hasrdtsc;
|
int cpu_hasrdtsc;
|
||||||
int cpu_hasMMX, cpu_hasMSR;
|
int cpu_hasMMX, cpu_hasMSR;
|
||||||
|
int cpu_hasCR4;
|
||||||
|
|
||||||
|
uint64_t cpu_CR4_mask;
|
||||||
|
|
||||||
uint64_t tsc = 0;
|
uint64_t tsc = 0;
|
||||||
|
|
||||||
int timing_rr;
|
int timing_rr;
|
||||||
|
|
@ -267,6 +271,7 @@ void cpu_set()
|
||||||
cpu_hasrdtsc = 0;
|
cpu_hasrdtsc = 0;
|
||||||
cpu_hasMMX = 0;
|
cpu_hasMMX = 0;
|
||||||
cpu_hasMSR = 0;
|
cpu_hasMSR = 0;
|
||||||
|
cpu_hasCR4 = 0;
|
||||||
|
|
||||||
if (cpu_iscyrix)
|
if (cpu_iscyrix)
|
||||||
io_sethandler(0x0022, 0x0002, cyrix_read, NULL, NULL, cyrix_write, NULL, NULL, NULL);
|
io_sethandler(0x0022, 0x0002, cyrix_read, NULL, NULL, cyrix_write, NULL, NULL, NULL);
|
||||||
|
|
@ -413,6 +418,8 @@ void cpu_set()
|
||||||
cpu_hasrdtsc = 1;
|
cpu_hasrdtsc = 1;
|
||||||
msr.fcr = (1 << 8) | (1 << 9) | (1 << 12) | (1 << 16) | (1 << 19) | (1 << 21);
|
msr.fcr = (1 << 8) | (1 << 9) | (1 << 12) | (1 << 16) | (1 << 19) | (1 << 21);
|
||||||
cpu_hasMMX = cpu_hasMSR = 1;
|
cpu_hasMMX = cpu_hasMSR = 1;
|
||||||
|
cpu_hasCR4 = 1;
|
||||||
|
cpu_CR4_mask = CR4_TSD | CR4_DE | CR4_MCE | CR4_PCE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
@ -549,7 +556,6 @@ void cpu_WRMSR()
|
||||||
switch (models[model].cpu[cpu_manufacturer].cpus[cpu].cpu_type)
|
switch (models[model].cpu[cpu_manufacturer].cpus[cpu].cpu_type)
|
||||||
{
|
{
|
||||||
case CPU_WINCHIP:
|
case CPU_WINCHIP:
|
||||||
EAX = EDX = 0;
|
|
||||||
switch (ECX)
|
switch (ECX)
|
||||||
{
|
{
|
||||||
case 0x02:
|
case 0x02:
|
||||||
|
|
|
||||||
|
|
@ -74,6 +74,14 @@ extern int cpu_multi;
|
||||||
extern int cpu_hasrdtsc;
|
extern int cpu_hasrdtsc;
|
||||||
extern int cpu_hasMSR;
|
extern int cpu_hasMSR;
|
||||||
extern int cpu_hasMMX;
|
extern int cpu_hasMMX;
|
||||||
|
extern int cpu_hasCR4;
|
||||||
|
|
||||||
|
#define CR4_TSD (1 << 2)
|
||||||
|
#define CR4_DE (1 << 3)
|
||||||
|
#define CR4_MCE (1 << 6)
|
||||||
|
#define CR4_PCE (1 << 8)
|
||||||
|
|
||||||
|
extern uint64_t cpu_CR4_mask;
|
||||||
|
|
||||||
extern uint64_t tsc;
|
extern uint64_t tsc;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -154,7 +154,7 @@ union
|
||||||
#define cr0 CR0.l
|
#define cr0 CR0.l
|
||||||
#define msw CR0.w
|
#define msw CR0.w
|
||||||
|
|
||||||
uint32_t cr2,cr3;
|
uint32_t cr2, cr3, cr4;
|
||||||
|
|
||||||
#define C_FLAG 0x0001
|
#define C_FLAG 0x0001
|
||||||
#define P_FLAG 0x0004
|
#define P_FLAG 0x0004
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,12 @@ static int opMOV_r_CRx_a16(uint32_t fetchdat)
|
||||||
case 3:
|
case 3:
|
||||||
regs[rm].l = cr3;
|
regs[rm].l = cr3;
|
||||||
break;
|
break;
|
||||||
|
case 4:
|
||||||
|
if (cpu_hasCR4)
|
||||||
|
{
|
||||||
|
regs[rm].l = cr4;
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
pclog("Bad read of CR%i %i\n",rmdat&7,reg);
|
pclog("Bad read of CR%i %i\n",rmdat&7,reg);
|
||||||
pc = oldpc;
|
pc = oldpc;
|
||||||
|
|
@ -49,6 +55,12 @@ static int opMOV_r_CRx_a32(uint32_t fetchdat)
|
||||||
case 3:
|
case 3:
|
||||||
regs[rm].l = cr3;
|
regs[rm].l = cr3;
|
||||||
break;
|
break;
|
||||||
|
case 4:
|
||||||
|
if (cpu_hasCR4)
|
||||||
|
{
|
||||||
|
regs[rm].l = cr4;
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
pclog("Bad read of CR%i %i\n",rmdat&7,reg);
|
pclog("Bad read of CR%i %i\n",rmdat&7,reg);
|
||||||
pc = oldpc;
|
pc = oldpc;
|
||||||
|
|
@ -110,6 +122,13 @@ static int opMOV_CRx_r_a16(uint32_t fetchdat)
|
||||||
cr3 = regs[rm].l;
|
cr3 = regs[rm].l;
|
||||||
flushmmucache();
|
flushmmucache();
|
||||||
break;
|
break;
|
||||||
|
case 4:
|
||||||
|
if (cpu_hasCR4)
|
||||||
|
{
|
||||||
|
cr4 = regs[rm].l & cpu_CR4_mask;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
pclog("Bad load CR%i\n", reg);
|
pclog("Bad load CR%i\n", reg);
|
||||||
pc = oldpc;
|
pc = oldpc;
|
||||||
|
|
@ -143,6 +162,13 @@ static int opMOV_CRx_r_a32(uint32_t fetchdat)
|
||||||
cr3 = regs[rm].l;
|
cr3 = regs[rm].l;
|
||||||
flushmmucache();
|
flushmmucache();
|
||||||
break;
|
break;
|
||||||
|
case 4:
|
||||||
|
if (cpu_hasCR4)
|
||||||
|
{
|
||||||
|
cr4 = regs[rm].l & cpu_CR4_mask;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
pclog("Bad load CR%i\n", reg);
|
pclog("Bad load CR%i\n", reg);
|
||||||
pc = oldpc;
|
pc = oldpc;
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,11 @@ static int opRDTSC(uint32_t fetchdat)
|
||||||
x86illegal();
|
x86illegal();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
if ((cr4 & CR4_TSD) && CPL)
|
||||||
|
{
|
||||||
|
x86gpf("RDTSC when TSD set and CPL != 0", 0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
EAX = tsc & 0xffffffff;
|
EAX = tsc & 0xffffffff;
|
||||||
EDX = tsc >> 32;
|
EDX = tsc >> 32;
|
||||||
cycles--;
|
cycles--;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue