More accurate timing for INT, IRET, CALL far, RET far and JMP far.
This commit is contained in:
parent
0ad692ad5c
commit
94f33aa873
9 changed files with 290 additions and 43 deletions
235
src/cpu.c
235
src/cpu.c
|
|
@ -76,6 +76,11 @@ int timing_mr, timing_mrl;
|
|||
int timing_rm, timing_rml;
|
||||
int timing_mm, timing_mml;
|
||||
int timing_bt, timing_bnt;
|
||||
int timing_int, timing_int_rm, timing_int_v86, timing_int_pm, timing_int_pm_outer;
|
||||
int timing_iret_rm, timing_iret_v86, timing_iret_pm, timing_iret_pm_outer;
|
||||
int timing_call_rm, timing_call_pm, timing_call_pm_gate, timing_call_pm_gate_inner;
|
||||
int timing_retf_rm, timing_retf_pm, timing_retf_pm_outer;
|
||||
int timing_jmp_rm, timing_jmp_pm, timing_jmp_pm_gate;
|
||||
|
||||
static struct
|
||||
{
|
||||
|
|
@ -514,6 +519,25 @@ void cpu_set()
|
|||
timing_mml = 11; /*memory dest - memory src*/
|
||||
timing_bt = 7-3; /*branch taken*/
|
||||
timing_bnt = 3; /*branch not taken*/
|
||||
timing_int = 0;
|
||||
timing_int_rm = 23;
|
||||
timing_int_v86 = 0;
|
||||
timing_int_pm = 40;
|
||||
timing_int_pm_outer = 78;
|
||||
timing_iret_rm = 17;
|
||||
timing_iret_v86 = 0;
|
||||
timing_iret_pm = 31;
|
||||
timing_iret_pm_outer = 55;
|
||||
timing_call_rm = 13;
|
||||
timing_call_pm = 26;
|
||||
timing_call_pm_gate = 52;
|
||||
timing_call_pm_gate_inner = 82;
|
||||
timing_retf_rm = 15;
|
||||
timing_retf_pm = 25;
|
||||
timing_retf_pm_outer = 55;
|
||||
timing_jmp_rm = 11;
|
||||
timing_jmp_pm = 23;
|
||||
timing_jmp_pm_gate = 38;
|
||||
break;
|
||||
|
||||
case CPU_386SX:
|
||||
|
|
@ -526,6 +550,25 @@ void cpu_set()
|
|||
timing_mml = 10; /*memory dest - memory src*/
|
||||
timing_bt = 7-3; /*branch taken*/
|
||||
timing_bnt = 3; /*branch not taken*/
|
||||
timing_int = 0;
|
||||
timing_int_rm = 37;
|
||||
timing_int_v86 = 59;
|
||||
timing_int_pm = 99;
|
||||
timing_int_pm_outer = 119;
|
||||
timing_iret_rm = 22;
|
||||
timing_iret_v86 = 60;
|
||||
timing_iret_pm = 38;
|
||||
timing_iret_pm_outer = 82;
|
||||
timing_call_rm = 17;
|
||||
timing_call_pm = 34;
|
||||
timing_call_pm_gate = 52;
|
||||
timing_call_pm_gate_inner = 86;
|
||||
timing_retf_rm = 18;
|
||||
timing_retf_pm = 32;
|
||||
timing_retf_pm_outer = 68;
|
||||
timing_jmp_rm = 12;
|
||||
timing_jmp_pm = 27;
|
||||
timing_jmp_pm_gate = 45;
|
||||
break;
|
||||
|
||||
case CPU_386DX:
|
||||
|
|
@ -538,6 +581,25 @@ void cpu_set()
|
|||
timing_mml = 6; /*memory dest - memory src*/
|
||||
timing_bt = 7-3; /*branch taken*/
|
||||
timing_bnt = 3; /*branch not taken*/
|
||||
timing_int = 0;
|
||||
timing_int_rm = 37;
|
||||
timing_int_v86 = 59;
|
||||
timing_int_pm = 99;
|
||||
timing_int_pm_outer = 119;
|
||||
timing_iret_rm = 22;
|
||||
timing_iret_v86 = 60;
|
||||
timing_iret_pm = 38;
|
||||
timing_iret_pm_outer = 82;
|
||||
timing_call_rm = 17;
|
||||
timing_call_pm = 34;
|
||||
timing_call_pm_gate = 52;
|
||||
timing_call_pm_gate_inner = 86;
|
||||
timing_retf_rm = 18;
|
||||
timing_retf_pm = 32;
|
||||
timing_retf_pm_outer = 68;
|
||||
timing_jmp_rm = 12;
|
||||
timing_jmp_pm = 27;
|
||||
timing_jmp_pm_gate = 45;
|
||||
break;
|
||||
|
||||
case CPU_486SLC:
|
||||
|
|
@ -550,6 +612,26 @@ void cpu_set()
|
|||
timing_mml = 7;
|
||||
timing_bt = 6-1; /*branch taken*/
|
||||
timing_bnt = 1; /*branch not taken*/
|
||||
/*unknown*/
|
||||
timing_int = 4;
|
||||
timing_int_rm = 14;
|
||||
timing_int_v86 = 82;
|
||||
timing_int_pm = 49;
|
||||
timing_int_pm_outer = 77;
|
||||
timing_iret_rm = 14;
|
||||
timing_iret_v86 = 66;
|
||||
timing_iret_pm = 31;
|
||||
timing_iret_pm_outer = 66;
|
||||
timing_call_rm = 12;
|
||||
timing_call_pm = 30;
|
||||
timing_call_pm_gate = 41;
|
||||
timing_call_pm_gate_inner = 83;
|
||||
timing_retf_rm = 13;
|
||||
timing_retf_pm = 26;
|
||||
timing_retf_pm_outer = 61;
|
||||
timing_jmp_rm = 9;
|
||||
timing_jmp_pm = 26;
|
||||
timing_jmp_pm_gate = 37;
|
||||
break;
|
||||
|
||||
case CPU_486DLC:
|
||||
|
|
@ -562,6 +644,26 @@ void cpu_set()
|
|||
timing_mml = 3;
|
||||
timing_bt = 6-1; /*branch taken*/
|
||||
timing_bnt = 1; /*branch not taken*/
|
||||
/*unknown*/
|
||||
timing_int = 4;
|
||||
timing_int_rm = 14;
|
||||
timing_int_v86 = 82;
|
||||
timing_int_pm = 49;
|
||||
timing_int_pm_outer = 77;
|
||||
timing_iret_rm = 14;
|
||||
timing_iret_v86 = 66;
|
||||
timing_iret_pm = 31;
|
||||
timing_iret_pm_outer = 66;
|
||||
timing_call_rm = 12;
|
||||
timing_call_pm = 30;
|
||||
timing_call_pm_gate = 41;
|
||||
timing_call_pm_gate_inner = 83;
|
||||
timing_retf_rm = 13;
|
||||
timing_retf_pm = 26;
|
||||
timing_retf_pm_outer = 61;
|
||||
timing_jmp_rm = 9;
|
||||
timing_jmp_pm = 26;
|
||||
timing_jmp_pm_gate = 37;
|
||||
break;
|
||||
|
||||
case CPU_i486SX:
|
||||
|
|
@ -575,6 +677,25 @@ void cpu_set()
|
|||
timing_mml = 3;
|
||||
timing_bt = 3-1; /*branch taken*/
|
||||
timing_bnt = 1; /*branch not taken*/
|
||||
timing_int = 4;
|
||||
timing_int_rm = 26;
|
||||
timing_int_v86 = 82;
|
||||
timing_int_pm = 44;
|
||||
timing_int_pm_outer = 71;
|
||||
timing_iret_rm = 15;
|
||||
timing_iret_v86 = 36; /*unknown*/
|
||||
timing_iret_pm = 20;
|
||||
timing_iret_pm_outer = 36;
|
||||
timing_call_rm = 18;
|
||||
timing_call_pm = 20;
|
||||
timing_call_pm_gate = 35;
|
||||
timing_call_pm_gate_inner = 69;
|
||||
timing_retf_rm = 13;
|
||||
timing_retf_pm = 17;
|
||||
timing_retf_pm_outer = 35;
|
||||
timing_jmp_rm = 17;
|
||||
timing_jmp_pm = 19;
|
||||
timing_jmp_pm_gate = 32;
|
||||
break;
|
||||
|
||||
case CPU_Am486SX:
|
||||
|
|
@ -589,6 +710,25 @@ void cpu_set()
|
|||
timing_mml = 3;
|
||||
timing_bt = 3-1; /*branch taken*/
|
||||
timing_bnt = 1; /*branch not taken*/
|
||||
timing_int = 4;
|
||||
timing_int_rm = 26;
|
||||
timing_int_v86 = 82;
|
||||
timing_int_pm = 44;
|
||||
timing_int_pm_outer = 71;
|
||||
timing_iret_rm = 15;
|
||||
timing_iret_v86 = 36; /*unknown*/
|
||||
timing_iret_pm = 20;
|
||||
timing_iret_pm_outer = 36;
|
||||
timing_call_rm = 18;
|
||||
timing_call_pm = 20;
|
||||
timing_call_pm_gate = 35;
|
||||
timing_call_pm_gate_inner = 69;
|
||||
timing_retf_rm = 13;
|
||||
timing_retf_pm = 17;
|
||||
timing_retf_pm_outer = 35;
|
||||
timing_jmp_rm = 17;
|
||||
timing_jmp_pm = 19;
|
||||
timing_jmp_pm_gate = 32;
|
||||
break;
|
||||
|
||||
case CPU_Cx486S:
|
||||
|
|
@ -602,6 +742,25 @@ void cpu_set()
|
|||
timing_mml = 3;
|
||||
timing_bt = 4-1; /*branch taken*/
|
||||
timing_bnt = 1; /*branch not taken*/
|
||||
timing_int = 4;
|
||||
timing_int_rm = 14;
|
||||
timing_int_v86 = 82;
|
||||
timing_int_pm = 49;
|
||||
timing_int_pm_outer = 77;
|
||||
timing_iret_rm = 14;
|
||||
timing_iret_v86 = 66; /*unknown*/
|
||||
timing_iret_pm = 31;
|
||||
timing_iret_pm_outer = 66;
|
||||
timing_call_rm = 12;
|
||||
timing_call_pm = 30;
|
||||
timing_call_pm_gate = 41;
|
||||
timing_call_pm_gate_inner = 83;
|
||||
timing_retf_rm = 13;
|
||||
timing_retf_pm = 26;
|
||||
timing_retf_pm_outer = 61;
|
||||
timing_jmp_rm = 9;
|
||||
timing_jmp_pm = 26;
|
||||
timing_jmp_pm_gate = 37;
|
||||
break;
|
||||
|
||||
case CPU_Cx5x86:
|
||||
|
|
@ -614,6 +773,25 @@ void cpu_set()
|
|||
timing_mml = 2;
|
||||
timing_bt = 5-1; /*branch taken*/
|
||||
timing_bnt = 1; /*branch not taken*/
|
||||
timing_int = 0;
|
||||
timing_int_rm = 9;
|
||||
timing_int_v86 = 82; /*unknown*/
|
||||
timing_int_pm = 21;
|
||||
timing_int_pm_outer = 32;
|
||||
timing_iret_rm = 7;
|
||||
timing_iret_v86 = 26; /*unknown*/
|
||||
timing_iret_pm = 10;
|
||||
timing_iret_pm_outer = 26;
|
||||
timing_call_rm = 4;
|
||||
timing_call_pm = 15;
|
||||
timing_call_pm_gate = 26;
|
||||
timing_call_pm_gate_inner = 35;
|
||||
timing_retf_rm = 4;
|
||||
timing_retf_pm = 7;
|
||||
timing_retf_pm_outer = 23;
|
||||
timing_jmp_rm = 5;
|
||||
timing_jmp_pm = 7;
|
||||
timing_jmp_pm_gate = 17;
|
||||
break;
|
||||
|
||||
case CPU_WINCHIP:
|
||||
|
|
@ -632,6 +810,25 @@ void cpu_set()
|
|||
cpu_hasMMX = cpu_hasMSR = 1;
|
||||
cpu_hasCR4 = 1;
|
||||
cpu_CR4_mask = CR4_TSD | CR4_DE | CR4_MCE | CR4_PCE;
|
||||
/*unknown*/
|
||||
timing_int_rm = 26;
|
||||
timing_int_v86 = 82;
|
||||
timing_int_pm = 44;
|
||||
timing_int_pm_outer = 71;
|
||||
timing_iret_rm = 7;
|
||||
timing_iret_v86 = 26;
|
||||
timing_iret_pm = 10;
|
||||
timing_iret_pm_outer = 26;
|
||||
timing_call_rm = 4;
|
||||
timing_call_pm = 15;
|
||||
timing_call_pm_gate = 26;
|
||||
timing_call_pm_gate_inner = 35;
|
||||
timing_retf_rm = 4;
|
||||
timing_retf_pm = 7;
|
||||
timing_retf_pm_outer = 23;
|
||||
timing_jmp_rm = 5;
|
||||
timing_jmp_pm = 7;
|
||||
timing_jmp_pm_gate = 17;
|
||||
break;
|
||||
|
||||
case CPU_PENTIUM:
|
||||
|
|
@ -645,6 +842,25 @@ void cpu_set()
|
|||
timing_mml = 3;
|
||||
timing_bt = 0; /*branch taken*/
|
||||
timing_bnt = 2; /*branch not taken*/
|
||||
timing_int = 6;
|
||||
timing_int_rm = 11;
|
||||
timing_int_v86 = 54;
|
||||
timing_int_pm = 25;
|
||||
timing_int_pm_outer = 42;
|
||||
timing_iret_rm = 7;
|
||||
timing_iret_v86 = 27; /*unknown*/
|
||||
timing_iret_pm = 10;
|
||||
timing_iret_pm_outer = 27;
|
||||
timing_call_rm = 4;
|
||||
timing_call_pm = 4;
|
||||
timing_call_pm_gate = 22;
|
||||
timing_call_pm_gate_inner = 44;
|
||||
timing_retf_rm = 4;
|
||||
timing_retf_pm = 4;
|
||||
timing_retf_pm_outer = 23;
|
||||
timing_jmp_rm = 3;
|
||||
timing_jmp_pm = 3;
|
||||
timing_jmp_pm_gate = 18;
|
||||
cpu_hasrdtsc = 1;
|
||||
msr.fcr = (1 << 8) | (1 << 9) | (1 << 12) | (1 << 16) | (1 << 19) | (1 << 21);
|
||||
cpu_hasMMX = 0;
|
||||
|
|
@ -665,6 +881,25 @@ void cpu_set()
|
|||
timing_mml = 3;
|
||||
timing_bt = 0; /*branch taken*/
|
||||
timing_bnt = 1; /*branch not taken*/
|
||||
timing_int = 6;
|
||||
timing_int_rm = 11;
|
||||
timing_int_v86 = 54;
|
||||
timing_int_pm = 25;
|
||||
timing_int_pm_outer = 42;
|
||||
timing_iret_rm = 7;
|
||||
timing_iret_v86 = 27; /*unknown*/
|
||||
timing_iret_pm = 10;
|
||||
timing_iret_pm_outer = 27;
|
||||
timing_call_rm = 4;
|
||||
timing_call_pm = 4;
|
||||
timing_call_pm_gate = 22;
|
||||
timing_call_pm_gate_inner = 44;
|
||||
timing_retf_rm = 4;
|
||||
timing_retf_pm = 4;
|
||||
timing_retf_pm_outer = 23;
|
||||
timing_jmp_rm = 3;
|
||||
timing_jmp_pm = 3;
|
||||
timing_jmp_pm_gate = 18;
|
||||
cpu_hasrdtsc = 1;
|
||||
msr.fcr = (1 << 8) | (1 << 9) | (1 << 12) | (1 << 16) | (1 << 19) | (1 << 21);
|
||||
cpu_hasMMX = 1;
|
||||
|
|
|
|||
Loading…
Reference in a new issue