Some clang-formatting in src/cpu
This commit is contained in:
@@ -25,14 +25,12 @@
|
||||
#include <86box/gdbstub.h>
|
||||
#include "386_common.h"
|
||||
#ifdef USE_NEW_DYNAREC
|
||||
#include "codegen.h"
|
||||
# include "codegen.h"
|
||||
#endif
|
||||
|
||||
|
||||
#undef CPU_BLOCK_END
|
||||
#define CPU_BLOCK_END()
|
||||
|
||||
|
||||
extern int codegen_flags_changed;
|
||||
|
||||
int tempc, oldcpl, optype, inttype, oddeven = 0;
|
||||
@@ -48,11 +46,9 @@ uint32_t backupregs[16];
|
||||
|
||||
x86seg _oldds;
|
||||
|
||||
|
||||
#ifdef ENABLE_386_LOG
|
||||
int x386_do_log = ENABLE_386_LOG;
|
||||
|
||||
|
||||
void
|
||||
x386_log(const char *fmt, ...)
|
||||
{
|
||||
@@ -65,49 +61,54 @@ x386_log(const char *fmt, ...)
|
||||
}
|
||||
}
|
||||
#else
|
||||
#define x386_log(fmt, ...)
|
||||
# define x386_log(fmt, ...)
|
||||
#endif
|
||||
|
||||
|
||||
#undef CPU_BLOCK_END
|
||||
#define CPU_BLOCK_END()
|
||||
|
||||
#include "x86_flags.h"
|
||||
|
||||
#define getbytef() ((uint8_t)(fetchdat)); cpu_state.pc++
|
||||
#define getwordf() ((uint16_t)(fetchdat)); cpu_state.pc+=2
|
||||
#define getbyte2f() ((uint8_t)(fetchdat>>8)); cpu_state.pc++
|
||||
#define getword2f() ((uint16_t)(fetchdat>>8)); cpu_state.pc+=2
|
||||
#define getbytef() \
|
||||
((uint8_t) (fetchdat)); \
|
||||
cpu_state.pc++
|
||||
#define getwordf() \
|
||||
((uint16_t) (fetchdat)); \
|
||||
cpu_state.pc += 2
|
||||
#define getbyte2f() \
|
||||
((uint8_t) (fetchdat >> 8)); \
|
||||
cpu_state.pc++
|
||||
#define getword2f() \
|
||||
((uint16_t) (fetchdat >> 8)); \
|
||||
cpu_state.pc += 2
|
||||
|
||||
|
||||
#define OP_TABLE(name) ops_ ## name
|
||||
#define OP_TABLE(name) ops_##name
|
||||
|
||||
#if 0
|
||||
#define CLOCK_CYCLES(c) \
|
||||
{\
|
||||
if (fpu_cycles > 0) {\
|
||||
fpu_cycles -= (c);\
|
||||
if (fpu_cycles < 0) {\
|
||||
cycles += fpu_cycles;\
|
||||
}\
|
||||
} else {\
|
||||
cycles -= (c);\
|
||||
}\
|
||||
# define CLOCK_CYCLES(c) \
|
||||
{ \
|
||||
if (fpu_cycles > 0) { \
|
||||
fpu_cycles -= (c); \
|
||||
if (fpu_cycles < 0) { \
|
||||
cycles += fpu_cycles; \
|
||||
} \
|
||||
} else { \
|
||||
cycles -= (c); \
|
||||
} \
|
||||
}
|
||||
|
||||
#define CLOCK_CYCLES_FPU(c) cycles -= (c)
|
||||
#define CONCURRENCY_CYCLES(c) fpu_cycles = (c)
|
||||
# define CLOCK_CYCLES_FPU(c) cycles -= (c)
|
||||
# define CONCURRENCY_CYCLES(c) fpu_cycles = (c)
|
||||
#else
|
||||
#define CLOCK_CYCLES(c) cycles -= (c)
|
||||
#define CLOCK_CYCLES_FPU(c) cycles -= (c)
|
||||
#define CONCURRENCY_CYCLES(c)
|
||||
# define CLOCK_CYCLES(c) cycles -= (c)
|
||||
# define CLOCK_CYCLES_FPU(c) cycles -= (c)
|
||||
# define CONCURRENCY_CYCLES(c)
|
||||
#endif
|
||||
|
||||
#define CLOCK_CYCLES_ALWAYS(c) cycles -= (c)
|
||||
|
||||
#include "x86_ops.h"
|
||||
|
||||
|
||||
void
|
||||
exec386(int cycs)
|
||||
{
|
||||
@@ -118,7 +119,7 @@ exec386(int cycs)
|
||||
cycles += cycs;
|
||||
|
||||
while (cycles > 0) {
|
||||
cycle_period = (timer_target - (uint32_t)tsc) + 1;
|
||||
cycle_period = (timer_target - (uint32_t) tsc) + 1;
|
||||
|
||||
x86_was_reset = 0;
|
||||
cycdiff = 0;
|
||||
@@ -127,8 +128,8 @@ exec386(int cycs)
|
||||
ins_cycles = cycles;
|
||||
|
||||
#ifndef USE_NEW_DYNAREC
|
||||
oldcs=CS;
|
||||
oldcpl=CPL;
|
||||
oldcs = CS;
|
||||
oldcpl = CPL;
|
||||
#endif
|
||||
cpu_state.oldpc = cpu_state.pc;
|
||||
cpu_state.op32 = use32;
|
||||
@@ -162,7 +163,8 @@ exec386(int cycs)
|
||||
#endif
|
||||
|
||||
#ifndef USE_NEW_DYNAREC
|
||||
if (!use32) cpu_state.pc &= 0xffff;
|
||||
if (!use32)
|
||||
cpu_state.pc &= 0xffff;
|
||||
#endif
|
||||
|
||||
if (cpu_end_block_after_ins)
|
||||
@@ -197,8 +199,8 @@ exec386(int cycs)
|
||||
else if (trap) {
|
||||
flags_rebuild();
|
||||
dr[6] |= 0x4000;
|
||||
if (msw&1)
|
||||
pmodeint(1,0);
|
||||
if (msw & 1)
|
||||
pmodeint(1, 0);
|
||||
else {
|
||||
writememw(ss, (SP - 2) & 0xFFFF, cpu_state.flags);
|
||||
writememw(ss, (SP - 4) & 0xFFFF, CS);
|
||||
|
491
src/cpu/808x.c
491
src/cpu/808x.c
File diff suppressed because it is too large
Load Diff
420
src/cpu/cpu.c
420
src/cpu/cpu.c
@@ -49,7 +49,6 @@
|
||||
#define CCR3_SMI_LOCK (1 << 0)
|
||||
#define CCR3_NMI_EN (1 << 1)
|
||||
|
||||
|
||||
enum {
|
||||
CPUID_FPU = (1 << 0),
|
||||
CPUID_VME = (1 << 1),
|
||||
@@ -71,7 +70,6 @@ enum {
|
||||
/*Addition flags returned by CPUID function 0x80000001*/
|
||||
#define CPUID_3DNOW (1UL << 31UL)
|
||||
|
||||
|
||||
/* Make sure this is as low as possible. */
|
||||
cpu_state_t cpu_state;
|
||||
|
||||
@@ -102,7 +100,7 @@ const OpFn *x86_opcodes, *x86_opcodes_0f,
|
||||
*x86_opcodes_3DNOW;
|
||||
|
||||
uint16_t cpu_fast_off_count, cpu_fast_off_val;
|
||||
uint16_t temp_seg_data[4] = {0, 0, 0, 0};
|
||||
uint16_t temp_seg_data[4] = { 0, 0, 0, 0 };
|
||||
|
||||
int isa_cycles, cpu_inited,
|
||||
|
||||
@@ -127,12 +125,12 @@ int isa_cycles, cpu_inited,
|
||||
timing_jmp_rm, timing_jmp_pm, timing_jmp_pm_gate, timing_misaligned;
|
||||
uint32_t cpu_features, cpu_fast_off_flags;
|
||||
|
||||
uint32_t _tr[8] = {0, 0, 0, 0, 0, 0, 0, 0};
|
||||
uint32_t _tr[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
uint32_t cache_index = 0;
|
||||
uint8_t _cache[2048];
|
||||
|
||||
uint64_t cpu_CR4_mask, tsc = 0;
|
||||
uint64_t pmc[2] = {0, 0};
|
||||
uint64_t pmc[2] = { 0, 0 };
|
||||
|
||||
double cpu_dmulti;
|
||||
|
||||
@@ -147,20 +145,16 @@ uint8_t do_translate = 0, do_translate2 = 0;
|
||||
|
||||
void (*cpu_exec)(int cycs);
|
||||
|
||||
|
||||
static uint8_t ccr0, ccr1, ccr2, ccr3, ccr4, ccr5, ccr6;
|
||||
|
||||
static int cyrix_addr;
|
||||
|
||||
|
||||
static void cpu_write(uint16_t addr, uint8_t val, void *priv);
|
||||
static uint8_t cpu_read(uint16_t addr, void *priv);
|
||||
|
||||
|
||||
#ifdef ENABLE_CPU_LOG
|
||||
int cpu_do_log = ENABLE_CPU_LOG;
|
||||
|
||||
|
||||
void
|
||||
cpu_log(const char *fmt, ...)
|
||||
{
|
||||
@@ -173,17 +167,15 @@ cpu_log(const char *fmt, ...)
|
||||
}
|
||||
}
|
||||
#else
|
||||
#define cpu_log(fmt, ...)
|
||||
# define cpu_log(fmt, ...)
|
||||
#endif
|
||||
|
||||
|
||||
int
|
||||
cpu_has_feature(int feature)
|
||||
{
|
||||
return cpu_features & feature;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
cpu_dynamic_switch(int new_cpu)
|
||||
{
|
||||
@@ -199,14 +191,12 @@ cpu_dynamic_switch(int new_cpu)
|
||||
cpu = c;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
cpu_set_edx(void)
|
||||
{
|
||||
EDX = cpu_s->edx_reset;
|
||||
}
|
||||
|
||||
|
||||
cpu_family_t *
|
||||
cpu_get_family(const char *internal_name)
|
||||
{
|
||||
@@ -221,7 +211,6 @@ cpu_get_family(const char *internal_name)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
uint8_t
|
||||
cpu_is_eligible(const cpu_family_t *cpu_family, int cpu, int machine)
|
||||
{
|
||||
@@ -295,11 +284,9 @@ cpu_is_eligible(const cpu_family_t *cpu_family, int cpu, int machine)
|
||||
/* K6-2+ / K6-3+ */
|
||||
else if ((cpu_s->cpu_type == CPU_K6_2P) || (cpu_s->cpu_type == CPU_K6_3P))
|
||||
multi = 2.5;
|
||||
else if (((cpu_s->cpu_type == CPU_WINCHIP) || (cpu_s->cpu_type == CPU_WINCHIP2)) &&
|
||||
(machine_s->cpu.min_multi > 2.0)) /* WinChip (2) */
|
||||
else if (((cpu_s->cpu_type == CPU_WINCHIP) || (cpu_s->cpu_type == CPU_WINCHIP2)) && (machine_s->cpu.min_multi > 2.0)) /* WinChip (2) */
|
||||
multi = 2.5;
|
||||
}
|
||||
else if (multi == (7.0 / 3.0)) /* WinChip 2A - 2.33x */
|
||||
} else if (multi == (7.0 / 3.0)) /* WinChip 2A - 2.33x */
|
||||
multi = 5.0;
|
||||
else if (multi == (8.0 / 3.0)) /* WinChip 2A - 2.66x */
|
||||
multi = 5.5;
|
||||
@@ -320,8 +307,7 @@ cpu_is_eligible(const cpu_family_t *cpu_family, int cpu, int machine)
|
||||
multi = 4.5;
|
||||
} else if ((cpu_s->cpu_type == CPU_Cx6x86) || (cpu_s->cpu_type == CPU_Cx6x86L)) /* 6x86(L) */
|
||||
multi = 3.0;
|
||||
} else if ((multi == 5.0) && ((cpu_s->cpu_type == CPU_WINCHIP) || (cpu_s->cpu_type == CPU_WINCHIP2)) &&
|
||||
(machine_s->cpu.min_multi > 5.0)) /* WinChip (2) */
|
||||
} else if ((multi == 5.0) && ((cpu_s->cpu_type == CPU_WINCHIP) || (cpu_s->cpu_type == CPU_WINCHIP2)) && (machine_s->cpu.min_multi > 5.0)) /* WinChip (2) */
|
||||
multi = 5.5;
|
||||
else if (multi == 6.0) /* K6-2(+) / K6-3(+) */
|
||||
multi = 2.0;
|
||||
@@ -338,7 +324,6 @@ cpu_is_eligible(const cpu_family_t *cpu_family, int cpu, int machine)
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
uint8_t
|
||||
cpu_family_is_eligible(const cpu_family_t *cpu_family, int machine)
|
||||
{
|
||||
@@ -353,7 +338,6 @@ cpu_family_is_eligible(const cpu_family_t *cpu_family, int machine)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
cpu_set(void)
|
||||
{
|
||||
@@ -376,8 +360,7 @@ cpu_set(void)
|
||||
is286 = (cpu_s->cpu_type >= CPU_286);
|
||||
is386 = (cpu_s->cpu_type >= CPU_386SX);
|
||||
israpidcad = (cpu_s->cpu_type == CPU_RAPIDCAD);
|
||||
isibm486 = (cpu_s->cpu_type == CPU_IBM386SLC) || (cpu_s->cpu_type == CPU_IBM486SLC) ||
|
||||
(cpu_s->cpu_type == CPU_IBM486BL);
|
||||
isibm486 = (cpu_s->cpu_type == CPU_IBM386SLC) || (cpu_s->cpu_type == CPU_IBM486SLC) || (cpu_s->cpu_type == CPU_IBM486BL);
|
||||
is486 = (cpu_s->cpu_type >= CPU_RAPIDCAD);
|
||||
is_am486 = (cpu_s->cpu_type == CPU_ENH_Am486DX);
|
||||
is_am486dxl = (cpu_s->cpu_type == CPU_Am486DXL);
|
||||
@@ -389,24 +372,19 @@ cpu_set(void)
|
||||
|
||||
/* SL-Enhanced Intel 486s have the same SMM save state table layout as Pentiums,
|
||||
and the WinChip datasheet claims those are Pentium-compatible as well. AMD Am486DXL/DXL2 also has compatible SMM, or would if not for it's different SMBase*/
|
||||
is_pentium = (cpu_isintel && (cpu_s->cpu_type >= CPU_i486SX_SLENH) && (cpu_s->cpu_type < CPU_PENTIUMPRO)) ||
|
||||
!strcmp(cpu_f->manufacturer, "IDT") || (cpu_s->cpu_type == CPU_Am486DXL);
|
||||
is_pentium = (cpu_isintel && (cpu_s->cpu_type >= CPU_i486SX_SLENH) && (cpu_s->cpu_type < CPU_PENTIUMPRO)) || !strcmp(cpu_f->manufacturer, "IDT") || (cpu_s->cpu_type == CPU_Am486DXL);
|
||||
is_k5 = !strcmp(cpu_f->manufacturer, "AMD") && (cpu_s->cpu_type > CPU_ENH_Am486DX) && (cpu_s->cpu_type < CPU_K6);
|
||||
is_k6 = (cpu_s->cpu_type >= CPU_K6) && !strcmp(cpu_f->manufacturer, "AMD");
|
||||
/* The Samuel 2 datasheet claims it's Celeron-compatible. */
|
||||
is_p6 = (cpu_isintel && (cpu_s->cpu_type >= CPU_PENTIUMPRO)) || !strcmp(cpu_f->manufacturer, "VIA");
|
||||
is_cxsmm = (!strcmp(cpu_f->manufacturer, "Cyrix") || !strcmp(cpu_f->manufacturer, "ST")) &&
|
||||
(cpu_s->cpu_type >= CPU_Cx486S);
|
||||
is_cxsmm = (!strcmp(cpu_f->manufacturer, "Cyrix") || !strcmp(cpu_f->manufacturer, "ST")) && (cpu_s->cpu_type >= CPU_Cx486S);
|
||||
|
||||
cpu_isintel = cpu_isintel || !strcmp(cpu_f->manufacturer, "AMD");
|
||||
|
||||
hasfpu = (fpu_type != FPU_NONE);
|
||||
hascache = (cpu_s->cpu_type >= CPU_486SLC) || (cpu_s->cpu_type == CPU_IBM386SLC) ||
|
||||
(cpu_s->cpu_type == CPU_IBM486SLC) || (cpu_s->cpu_type == CPU_IBM486BL);
|
||||
hascache = (cpu_s->cpu_type >= CPU_486SLC) || (cpu_s->cpu_type == CPU_IBM386SLC) || (cpu_s->cpu_type == CPU_IBM486SLC) || (cpu_s->cpu_type == CPU_IBM486BL);
|
||||
|
||||
cpu_16bitbus = (cpu_s->cpu_type == CPU_286) || (cpu_s->cpu_type == CPU_386SX) ||
|
||||
(cpu_s->cpu_type == CPU_486SLC) || (cpu_s->cpu_type == CPU_IBM386SLC) ||
|
||||
(cpu_s->cpu_type == CPU_IBM486SLC);
|
||||
cpu_16bitbus = (cpu_s->cpu_type == CPU_286) || (cpu_s->cpu_type == CPU_386SX) || (cpu_s->cpu_type == CPU_486SLC) || (cpu_s->cpu_type == CPU_IBM386SLC) || (cpu_s->cpu_type == CPU_IBM486SLC);
|
||||
cpu_64bitbus = (cpu_s->cpu_type >= CPU_WINCHIP);
|
||||
|
||||
if (cpu_s->multi)
|
||||
@@ -1043,14 +1021,14 @@ cpu_set(void)
|
||||
case CPU_CxGX1:
|
||||
case CPU_Cx6x86MX:
|
||||
if (cpu_s->cpu_type == CPU_Cx6x86MX) {
|
||||
#ifdef USE_DYNAREC
|
||||
# ifdef USE_DYNAREC
|
||||
x86_dynarec_opcodes_da_a16 = dynarec_ops_fpu_686_da_a16;
|
||||
x86_dynarec_opcodes_da_a32 = dynarec_ops_fpu_686_da_a32;
|
||||
x86_dynarec_opcodes_db_a16 = dynarec_ops_fpu_686_db_a16;
|
||||
x86_dynarec_opcodes_db_a32 = dynarec_ops_fpu_686_db_a32;
|
||||
x86_dynarec_opcodes_df_a16 = dynarec_ops_fpu_686_df_a16;
|
||||
x86_dynarec_opcodes_df_a32 = dynarec_ops_fpu_686_df_a32;
|
||||
#endif
|
||||
# endif
|
||||
x86_opcodes_da_a16 = ops_fpu_686_da_a16;
|
||||
x86_opcodes_da_a32 = ops_fpu_686_da_a32;
|
||||
x86_opcodes_db_a16 = ops_fpu_686_db_a16;
|
||||
@@ -1059,7 +1037,7 @@ cpu_set(void)
|
||||
x86_opcodes_df_a32 = ops_fpu_686_df_a32;
|
||||
}
|
||||
|
||||
#ifdef USE_DYNAREC
|
||||
# ifdef USE_DYNAREC
|
||||
if (cpu_s->cpu_type == CPU_Cx6x86MX)
|
||||
x86_setopcodes(ops_386, ops_c6x86mx_0f, dynarec_ops_386, dynarec_ops_c6x86mx_0f);
|
||||
else if (cpu_s->cpu_type == CPU_Cx6x86L)
|
||||
@@ -1067,14 +1045,14 @@ cpu_set(void)
|
||||
else
|
||||
x86_setopcodes(ops_386, ops_c6x86mx_0f, dynarec_ops_386, dynarec_ops_c6x86mx_0f);
|
||||
// x86_setopcodes(ops_386, ops_c6x86_0f, dynarec_ops_386, dynarec_ops_c6x86_0f);
|
||||
#else
|
||||
# else
|
||||
if (cpu_s->cpu_type == CPU_Cx6x86MX)
|
||||
x86_setopcodes(ops_386, ops_c6x86mx_0f);
|
||||
else if (cpu_s->cpu_type == CPU_Cx6x86L)
|
||||
x86_setopcodes(ops_386, ops_pentium_0f);
|
||||
else
|
||||
x86_setopcodes(ops_386, ops_c6x86_0f);
|
||||
#endif
|
||||
# endif
|
||||
|
||||
timing_rr = 1; /* register dest - register src */
|
||||
timing_rm = 1; /* register dest - memory src */
|
||||
@@ -1125,9 +1103,9 @@ cpu_set(void)
|
||||
if (cpu_s->cpu_type >= CPU_CxGX1)
|
||||
cpu_CR4_mask = CR4_TSD | CR4_DE | CR4_PCE;
|
||||
|
||||
#ifdef USE_DYNAREC
|
||||
# ifdef USE_DYNAREC
|
||||
codegen_timing_set(&codegen_timing_686);
|
||||
#endif
|
||||
# endif
|
||||
|
||||
if ((cpu_s->cpu_type == CPU_Cx6x86L) || (cpu_s->cpu_type == CPU_Cx6x86MX))
|
||||
ccr4 = 0x80;
|
||||
@@ -1149,27 +1127,27 @@ cpu_set(void)
|
||||
#ifdef USE_DYNAREC
|
||||
if (cpu_s->cpu_type >= CPU_K6_2)
|
||||
x86_setopcodes(ops_386, ops_k62_0f, dynarec_ops_386, dynarec_ops_k62_0f);
|
||||
#if defined(DEV_BRANCH) && defined(USE_AMD_K5)
|
||||
# if defined(DEV_BRANCH) && defined(USE_AMD_K5)
|
||||
else if (cpu_s->cpu_type == CPU_K6)
|
||||
x86_setopcodes(ops_386, ops_k6_0f, dynarec_ops_386, dynarec_ops_k6_0f);
|
||||
else
|
||||
x86_setopcodes(ops_386, ops_pentiummmx_0f, dynarec_ops_386, dynarec_ops_pentiummmx_0f);
|
||||
#else
|
||||
# else
|
||||
else
|
||||
x86_setopcodes(ops_386, ops_k6_0f, dynarec_ops_386, dynarec_ops_k6_0f);
|
||||
#endif
|
||||
# endif
|
||||
#else
|
||||
if (cpu_s->cpu_type >= CPU_K6_2)
|
||||
x86_setopcodes(ops_386, ops_k62_0f);
|
||||
#if defined(DEV_BRANCH) && defined(USE_AMD_K5)
|
||||
# if defined(DEV_BRANCH) && defined(USE_AMD_K5)
|
||||
else if (cpu_s->cpu_type = CPU_K6)
|
||||
x86_setopcodes(ops_386, ops_k6_0f);
|
||||
else
|
||||
x86_setopcodes(ops_386, ops_pentiummmx_0f);
|
||||
#else
|
||||
# else
|
||||
else
|
||||
x86_setopcodes(ops_386, ops_k6_0f);
|
||||
#endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
timing_rr = 1; /* register dest - register src */
|
||||
@@ -1391,14 +1369,12 @@ cpu_set(void)
|
||||
gdbstub_cpu_init();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
cpu_close(void)
|
||||
{
|
||||
cpu_inited = 0;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
cpu_set_isa_speed(int speed)
|
||||
{
|
||||
@@ -1413,7 +1389,6 @@ cpu_set_isa_speed(int speed)
|
||||
cpu_log("cpu_set_isa_speed(%d) = %d\n", speed, cpu_isa_speed);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
cpu_set_pci_speed(int speed)
|
||||
{
|
||||
@@ -1439,7 +1414,6 @@ cpu_set_pci_speed(int speed)
|
||||
cpu_log("cpu_set_pci_speed(%d) = %d\n", speed, cpu_pci_speed);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
cpu_set_isa_pci_div(int div)
|
||||
{
|
||||
@@ -1453,15 +1427,13 @@ cpu_set_isa_pci_div(int div)
|
||||
cpu_set_isa_speed(0);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
cpu_set_agp_speed(int speed)
|
||||
{
|
||||
if (speed) {
|
||||
cpu_agp_speed = speed;
|
||||
pc_speed_changed();
|
||||
}
|
||||
else if (cpu_busspeed < 84000000)
|
||||
} else if (cpu_busspeed < 84000000)
|
||||
cpu_agp_speed = cpu_busspeed;
|
||||
else if (cpu_busspeed < 120000000)
|
||||
cpu_agp_speed = cpu_busspeed / 1.5;
|
||||
@@ -1474,7 +1446,6 @@ cpu_set_agp_speed(int speed)
|
||||
cpu_log("cpu_set_agp_speed(%d) = %d\n", speed, cpu_agp_speed);
|
||||
}
|
||||
|
||||
|
||||
char *
|
||||
cpu_current_pc(char *bufp)
|
||||
{
|
||||
@@ -1485,10 +1456,9 @@ cpu_current_pc(char *bufp)
|
||||
|
||||
sprintf(bufp, "%04X:%04X", CS, cpu_state.pc);
|
||||
|
||||
return(bufp);
|
||||
return (bufp);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
cpu_CPUID(void)
|
||||
{
|
||||
@@ -2056,7 +2026,6 @@ cpu_CPUID(void)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
cpu_ven_reset(void)
|
||||
{
|
||||
@@ -2087,7 +2056,6 @@ cpu_ven_reset(void)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
cpu_RDMSR(void)
|
||||
{
|
||||
@@ -2145,7 +2113,8 @@ cpu_RDMSR(void)
|
||||
case CPU_CYRIX3S:
|
||||
EAX = EDX = 0;
|
||||
switch (ECX) {
|
||||
case 0x00: case 0x01:
|
||||
case 0x00:
|
||||
case 0x01:
|
||||
break;
|
||||
case 0x10:
|
||||
EAX = tsc & 0xffffffff;
|
||||
@@ -2184,10 +2153,22 @@ cpu_RDMSR(void)
|
||||
EAX = msr.fcr2 & 0xffffffff;
|
||||
EDX = msr.fcr2 >> 32;
|
||||
break;
|
||||
case 0x200: case 0x201: case 0x202: case 0x203:
|
||||
case 0x204: case 0x205: case 0x206: case 0x207:
|
||||
case 0x208: case 0x209: case 0x20a: case 0x20b:
|
||||
case 0x20c: case 0x20d: case 0x20e: case 0x20f:
|
||||
case 0x200:
|
||||
case 0x201:
|
||||
case 0x202:
|
||||
case 0x203:
|
||||
case 0x204:
|
||||
case 0x205:
|
||||
case 0x206:
|
||||
case 0x207:
|
||||
case 0x208:
|
||||
case 0x209:
|
||||
case 0x20a:
|
||||
case 0x20b:
|
||||
case 0x20c:
|
||||
case 0x20d:
|
||||
case 0x20e:
|
||||
case 0x20f:
|
||||
if (ECX & 1) {
|
||||
EAX = msr.mtrr_physmask[(ECX - 0x200) >> 1] & 0xffffffff;
|
||||
EDX = msr.mtrr_physmask[(ECX - 0x200) >> 1] >> 32;
|
||||
@@ -2208,8 +2189,14 @@ cpu_RDMSR(void)
|
||||
EAX = msr.mtrr_fix16k_a000 & 0xffffffff;
|
||||
EDX = msr.mtrr_fix16k_a000 >> 32;
|
||||
break;
|
||||
case 0x268: case 0x269: case 0x26a: case 0x26b:
|
||||
case 0x26c: case 0x26d: case 0x26e: case 0x26f:
|
||||
case 0x268:
|
||||
case 0x269:
|
||||
case 0x26a:
|
||||
case 0x26b:
|
||||
case 0x26c:
|
||||
case 0x26d:
|
||||
case 0x26e:
|
||||
case 0x26f:
|
||||
EAX = msr.mtrr_fix4k[ECX - 0x268] & 0xffffffff;
|
||||
EDX = msr.mtrr_fix4k[ECX - 0x268] >> 32;
|
||||
break;
|
||||
@@ -2315,7 +2302,8 @@ amd_k_invalid_rdmsr:
|
||||
#endif
|
||||
EAX = EDX = 0;
|
||||
switch (ECX) {
|
||||
case 0x00: case 0x01:
|
||||
case 0x00:
|
||||
case 0x01:
|
||||
break;
|
||||
case 0x10:
|
||||
EAX = tsc & 0xffffffff;
|
||||
@@ -2330,7 +2318,8 @@ amd_k_invalid_rdmsr:
|
||||
case CPU_PENTIUM2D:
|
||||
EAX = EDX = 0;
|
||||
switch (ECX) {
|
||||
case 0x00: case 0x01:
|
||||
case 0x00:
|
||||
case 0x01:
|
||||
break;
|
||||
case 0x10:
|
||||
EAX = tsc & 0xffffffff;
|
||||
@@ -2388,12 +2377,21 @@ amd_k_invalid_rdmsr:
|
||||
EAX = msr.ecx79 & 0xffffffff;
|
||||
EDX = msr.ecx79 >> 32;
|
||||
break;
|
||||
case 0x88: case 0x89: case 0x8a: case 0x8b:
|
||||
case 0x88:
|
||||
case 0x89:
|
||||
case 0x8a:
|
||||
case 0x8b:
|
||||
EAX = msr.ecx8x[ECX - 0x88] & 0xffffffff;
|
||||
EDX = msr.ecx8x[ECX - 0x88] >> 32;
|
||||
break;
|
||||
case 0xc1: case 0xc2: case 0xc3: case 0xc4:
|
||||
case 0xc5: case 0xc6: case 0xc7: case 0xc8:
|
||||
case 0xc1:
|
||||
case 0xc2:
|
||||
case 0xc3:
|
||||
case 0xc4:
|
||||
case 0xc5:
|
||||
case 0xc6:
|
||||
case 0xc7:
|
||||
case 0xc8:
|
||||
EAX = msr.ia32_pmc[ECX - 0xC1] & 0xffffffff;
|
||||
EDX = msr.ia32_pmc[ECX - 0xC1] >> 32;
|
||||
break;
|
||||
@@ -2405,7 +2403,10 @@ amd_k_invalid_rdmsr:
|
||||
EAX = msr.ecx116 & 0xffffffff;
|
||||
EDX = msr.ecx116 >> 32;
|
||||
break;
|
||||
case 0x118: case 0x119: case 0x11a: case 0x11b:
|
||||
case 0x118:
|
||||
case 0x119:
|
||||
case 0x11a:
|
||||
case 0x11b:
|
||||
EAX = msr.ecx11x[ECX - 0x118] & 0xffffffff;
|
||||
EDX = msr.ecx11x[ECX - 0x118] >> 32;
|
||||
break;
|
||||
@@ -2457,10 +2458,22 @@ amd_k_invalid_rdmsr:
|
||||
EAX = msr.ecx1e0 & 0xffffffff;
|
||||
EDX = msr.ecx1e0 >> 32;
|
||||
break;
|
||||
case 0x200: case 0x201: case 0x202: case 0x203:
|
||||
case 0x204: case 0x205: case 0x206: case 0x207:
|
||||
case 0x208: case 0x209: case 0x20a: case 0x20b:
|
||||
case 0x20c: case 0x20d: case 0x20e: case 0x20f:
|
||||
case 0x200:
|
||||
case 0x201:
|
||||
case 0x202:
|
||||
case 0x203:
|
||||
case 0x204:
|
||||
case 0x205:
|
||||
case 0x206:
|
||||
case 0x207:
|
||||
case 0x208:
|
||||
case 0x209:
|
||||
case 0x20a:
|
||||
case 0x20b:
|
||||
case 0x20c:
|
||||
case 0x20d:
|
||||
case 0x20e:
|
||||
case 0x20f:
|
||||
if (ECX & 1) {
|
||||
EAX = msr.mtrr_physmask[(ECX - 0x200) >> 1] & 0xffffffff;
|
||||
EDX = msr.mtrr_physmask[(ECX - 0x200) >> 1] >> 32;
|
||||
@@ -2481,8 +2494,14 @@ amd_k_invalid_rdmsr:
|
||||
EAX = msr.mtrr_fix16k_a000 & 0xffffffff;
|
||||
EDX = msr.mtrr_fix16k_a000 >> 32;
|
||||
break;
|
||||
case 0x268: case 0x269: case 0x26a: case 0x26b:
|
||||
case 0x26c: case 0x26d: case 0x26e: case 0x26f:
|
||||
case 0x268:
|
||||
case 0x269:
|
||||
case 0x26a:
|
||||
case 0x26b:
|
||||
case 0x26c:
|
||||
case 0x26d:
|
||||
case 0x26e:
|
||||
case 0x26f:
|
||||
EAX = msr.mtrr_fix4k[ECX - 0x268] & 0xffffffff;
|
||||
EDX = msr.mtrr_fix4k[ECX - 0x268] >> 32;
|
||||
break;
|
||||
@@ -2494,14 +2513,24 @@ amd_k_invalid_rdmsr:
|
||||
EAX = msr.mtrr_deftype & 0xffffffff;
|
||||
EDX = msr.mtrr_deftype >> 32;
|
||||
break;
|
||||
case 0x400: case 0x404: case 0x408: case 0x40c:
|
||||
case 0x400:
|
||||
case 0x404:
|
||||
case 0x408:
|
||||
case 0x40c:
|
||||
case 0x410:
|
||||
EAX = msr.mca_ctl[(ECX - 0x400) >> 2] & 0xffffffff;
|
||||
EDX = msr.mca_ctl[(ECX - 0x400) >> 2] >> 32;
|
||||
break;
|
||||
case 0x401: case 0x402: case 0x405: case 0x406:
|
||||
case 0x407: case 0x409: case 0x40d: case 0x40e:
|
||||
case 0x411: case 0x412:
|
||||
case 0x401:
|
||||
case 0x402:
|
||||
case 0x405:
|
||||
case 0x406:
|
||||
case 0x407:
|
||||
case 0x409:
|
||||
case 0x40d:
|
||||
case 0x40e:
|
||||
case 0x411:
|
||||
case 0x412:
|
||||
break;
|
||||
case 0x570:
|
||||
EAX = msr.ecx570 & 0xffffffff;
|
||||
@@ -2535,7 +2564,6 @@ i686_invalid_rdmsr:
|
||||
cpu_log("RDMSR %08X %08X%08X\n", ECX, EDX, EAX);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
cpu_WRMSR(void)
|
||||
{
|
||||
@@ -2572,7 +2600,7 @@ cpu_WRMSR(void)
|
||||
msr.tr12 = EAX & 0x228;
|
||||
break;
|
||||
case 0x10:
|
||||
tsc = EAX | ((uint64_t)EDX << 32);
|
||||
tsc = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0x11:
|
||||
msr.cesr = EAX & 0xff00ff;
|
||||
@@ -2597,20 +2625,21 @@ cpu_WRMSR(void)
|
||||
CPUID = cpu_s->cpuid_model;
|
||||
break;
|
||||
case 0x108:
|
||||
msr.fcr2 = EAX | ((uint64_t)EDX << 32);
|
||||
msr.fcr2 = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0x109:
|
||||
msr.fcr3 = EAX | ((uint64_t)EDX << 32);
|
||||
msr.fcr3 = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case CPU_CYRIX3S:
|
||||
switch (ECX) {
|
||||
case 0x00: case 0x01:
|
||||
case 0x00:
|
||||
case 0x01:
|
||||
break;
|
||||
case 0x10:
|
||||
tsc = EAX | ((uint64_t)EDX << 32);
|
||||
tsc = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0x1107:
|
||||
msr.fcr = EAX;
|
||||
@@ -2620,34 +2649,53 @@ cpu_WRMSR(void)
|
||||
cpu_features &= ~CPU_FEATURE_CX8;
|
||||
break;
|
||||
case 0x1108:
|
||||
msr.fcr2 = EAX | ((uint64_t)EDX << 32);
|
||||
msr.fcr2 = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0x1109:
|
||||
msr.fcr3 = EAX | ((uint64_t)EDX << 32);
|
||||
msr.fcr3 = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0x200: case 0x201: case 0x202: case 0x203:
|
||||
case 0x204: case 0x205: case 0x206: case 0x207:
|
||||
case 0x208: case 0x209: case 0x20a: case 0x20b:
|
||||
case 0x20c: case 0x20d: case 0x20e: case 0x20f:
|
||||
case 0x200:
|
||||
case 0x201:
|
||||
case 0x202:
|
||||
case 0x203:
|
||||
case 0x204:
|
||||
case 0x205:
|
||||
case 0x206:
|
||||
case 0x207:
|
||||
case 0x208:
|
||||
case 0x209:
|
||||
case 0x20a:
|
||||
case 0x20b:
|
||||
case 0x20c:
|
||||
case 0x20d:
|
||||
case 0x20e:
|
||||
case 0x20f:
|
||||
if (ECX & 1)
|
||||
msr.mtrr_physmask[(ECX - 0x200) >> 1] = EAX | ((uint64_t)EDX << 32);
|
||||
msr.mtrr_physmask[(ECX - 0x200) >> 1] = EAX | ((uint64_t) EDX << 32);
|
||||
else
|
||||
msr.mtrr_physbase[(ECX - 0x200) >> 1] = EAX | ((uint64_t)EDX << 32);
|
||||
msr.mtrr_physbase[(ECX - 0x200) >> 1] = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0x250:
|
||||
msr.mtrr_fix64k_8000 = EAX | ((uint64_t)EDX << 32);
|
||||
msr.mtrr_fix64k_8000 = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0x258:
|
||||
msr.mtrr_fix16k_8000 = EAX | ((uint64_t)EDX << 32);
|
||||
msr.mtrr_fix16k_8000 = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0x259:
|
||||
msr.mtrr_fix16k_a000 = EAX | ((uint64_t)EDX << 32);
|
||||
msr.mtrr_fix16k_a000 = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0x268: case 0x269: case 0x26A: case 0x26B: case 0x26C: case 0x26D: case 0x26E: case 0x26F:
|
||||
msr.mtrr_fix4k[ECX - 0x268] = EAX | ((uint64_t)EDX << 32);
|
||||
case 0x268:
|
||||
case 0x269:
|
||||
case 0x26A:
|
||||
case 0x26B:
|
||||
case 0x26C:
|
||||
case 0x26D:
|
||||
case 0x26E:
|
||||
case 0x26F:
|
||||
msr.mtrr_fix4k[ECX - 0x268] = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0x2ff:
|
||||
msr.mtrr_deftype = EAX | ((uint64_t)EDX << 32);
|
||||
msr.mtrr_deftype = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
@@ -2663,19 +2711,20 @@ cpu_WRMSR(void)
|
||||
case CPU_K6_2P:
|
||||
case CPU_K6_3P:
|
||||
switch (ECX) {
|
||||
case 0x00: case 0x01:
|
||||
case 0x00:
|
||||
case 0x01:
|
||||
break;
|
||||
case 0x0e:
|
||||
msr.tr12 = EAX & 0x228;
|
||||
break;
|
||||
case 0x10:
|
||||
tsc = EAX | ((uint64_t)EDX << 32);
|
||||
tsc = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0x83:
|
||||
msr.ecx83 = EAX | ((uint64_t)EDX << 32);
|
||||
msr.ecx83 = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0xc0000080:
|
||||
temp = EAX | ((uint64_t)EDX << 32);
|
||||
temp = EAX | ((uint64_t) EDX << 32);
|
||||
if (temp & ~1ULL)
|
||||
x86gpf(NULL, 0);
|
||||
else
|
||||
@@ -2685,40 +2734,40 @@ cpu_WRMSR(void)
|
||||
if (cpu_s->cpu_type < CPU_K6_2)
|
||||
goto amd_k_invalid_wrmsr;
|
||||
|
||||
msr.star = EAX | ((uint64_t)EDX << 32);
|
||||
msr.star = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0xc0000082:
|
||||
msr.amd_whcr = EAX | ((uint64_t)EDX << 32);
|
||||
msr.amd_whcr = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0xc0000085:
|
||||
if (cpu_s->cpu_type < CPU_K6_2C)
|
||||
goto amd_k_invalid_wrmsr;
|
||||
|
||||
msr.amd_uwccr = EAX | ((uint64_t)EDX << 32);
|
||||
msr.amd_uwccr = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0xc0000086:
|
||||
if (cpu_s->cpu_type < CPU_K6_2P)
|
||||
goto amd_k_invalid_wrmsr;
|
||||
|
||||
msr.amd_epmr = EAX | ((uint64_t)EDX << 32);
|
||||
msr.amd_epmr = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0xc0000087:
|
||||
if (cpu_s->cpu_type < CPU_K6_2C)
|
||||
goto amd_k_invalid_wrmsr;
|
||||
|
||||
msr.amd_psor = EAX | ((uint64_t)EDX << 32);
|
||||
msr.amd_psor = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0xc0000088:
|
||||
if (cpu_s->cpu_type < CPU_K6_2C)
|
||||
goto amd_k_invalid_wrmsr;
|
||||
|
||||
msr.amd_pfir = EAX | ((uint64_t)EDX << 32);
|
||||
msr.amd_pfir = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0xc0000089:
|
||||
if (cpu_s->cpu_type < CPU_K6_3)
|
||||
goto amd_k_invalid_wrmsr;
|
||||
|
||||
msr.amd_l2aar = EAX | ((uint64_t)EDX << 32);
|
||||
msr.amd_l2aar = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
default:
|
||||
amd_k_invalid_wrmsr:
|
||||
@@ -2738,10 +2787,11 @@ amd_k_invalid_wrmsr:
|
||||
#endif
|
||||
cpu_log("WRMSR: ECX = %08X, val = %08X%08X\n", ECX, EDX, EAX);
|
||||
switch (ECX) {
|
||||
case 0x00: case 0x01:
|
||||
case 0x00:
|
||||
case 0x01:
|
||||
break;
|
||||
case 0x10:
|
||||
tsc = EAX | ((uint64_t)EDX << 32);
|
||||
tsc = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0x8b:
|
||||
#if defined(DEV_BRANCH) && defined(USE_CYRIX_6X86)
|
||||
@@ -2760,12 +2810,13 @@ amd_k_invalid_wrmsr:
|
||||
case CPU_PENTIUM2:
|
||||
case CPU_PENTIUM2D:
|
||||
switch (ECX) {
|
||||
case 0x00: case 0x01:
|
||||
case 0x00:
|
||||
case 0x01:
|
||||
if (EAX || EDX)
|
||||
x86gpf(NULL, 0);
|
||||
break;
|
||||
case 0x10:
|
||||
tsc = EAX | ((uint64_t)EDX << 32);
|
||||
tsc = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0x1b:
|
||||
cpu_log("APIC_BASE write: %08X%08X\n", EDX, EAX);
|
||||
@@ -2774,26 +2825,38 @@ amd_k_invalid_wrmsr:
|
||||
case 0x2a:
|
||||
break;
|
||||
case 0x79:
|
||||
msr.ecx79 = EAX | ((uint64_t)EDX << 32);
|
||||
msr.ecx79 = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0x88: case 0x89: case 0x8a: case 0x8b:
|
||||
msr.ecx8x[ECX - 0x88] = EAX | ((uint64_t)EDX << 32);
|
||||
case 0x88:
|
||||
case 0x89:
|
||||
case 0x8a:
|
||||
case 0x8b:
|
||||
msr.ecx8x[ECX - 0x88] = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0xc1: case 0xc2: case 0xc3: case 0xc4:
|
||||
case 0xc5: case 0xc6: case 0xc7: case 0xc8:
|
||||
msr.ia32_pmc[ECX - 0xC1] = EAX | ((uint64_t)EDX << 32);
|
||||
case 0xc1:
|
||||
case 0xc2:
|
||||
case 0xc3:
|
||||
case 0xc4:
|
||||
case 0xc5:
|
||||
case 0xc6:
|
||||
case 0xc7:
|
||||
case 0xc8:
|
||||
msr.ia32_pmc[ECX - 0xC1] = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0xfe:
|
||||
msr.mtrr_cap = EAX | ((uint64_t)EDX << 32);
|
||||
msr.mtrr_cap = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0x116:
|
||||
msr.ecx116 = EAX | ((uint64_t)EDX << 32);
|
||||
msr.ecx116 = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0x118: case 0x119: case 0x11a: case 0x11b:
|
||||
msr.ecx11x[ECX - 0x118] = EAX | ((uint64_t)EDX << 32);
|
||||
case 0x118:
|
||||
case 0x119:
|
||||
case 0x11a:
|
||||
case 0x11b:
|
||||
msr.ecx11x[ECX - 0x118] = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0x11e:
|
||||
msr.ecx11e = EAX | ((uint64_t)EDX << 32);
|
||||
msr.ecx11e = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0x174:
|
||||
if (cpu_s->cpu_type == CPU_PENTIUMPRO)
|
||||
@@ -2820,69 +2883,97 @@ amd_k_invalid_wrmsr:
|
||||
x86gpf(NULL, 0);
|
||||
break;
|
||||
case 0x17b:
|
||||
msr.mcg_ctl = EAX | ((uint64_t)EDX << 32);
|
||||
msr.mcg_ctl = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0x186:
|
||||
msr.ecx186 = EAX | ((uint64_t)EDX << 32);
|
||||
msr.ecx186 = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0x187:
|
||||
msr.ecx187 = EAX | ((uint64_t)EDX << 32);
|
||||
msr.ecx187 = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0x1e0:
|
||||
msr.ecx1e0 = EAX | ((uint64_t)EDX << 32);
|
||||
msr.ecx1e0 = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0x200: case 0x201: case 0x202: case 0x203:
|
||||
case 0x204: case 0x205: case 0x206: case 0x207:
|
||||
case 0x208: case 0x209: case 0x20a: case 0x20b:
|
||||
case 0x20c: case 0x20d: case 0x20e: case 0x20f:
|
||||
case 0x200:
|
||||
case 0x201:
|
||||
case 0x202:
|
||||
case 0x203:
|
||||
case 0x204:
|
||||
case 0x205:
|
||||
case 0x206:
|
||||
case 0x207:
|
||||
case 0x208:
|
||||
case 0x209:
|
||||
case 0x20a:
|
||||
case 0x20b:
|
||||
case 0x20c:
|
||||
case 0x20d:
|
||||
case 0x20e:
|
||||
case 0x20f:
|
||||
if (ECX & 1)
|
||||
msr.mtrr_physmask[(ECX - 0x200) >> 1] = EAX | ((uint64_t)EDX << 32);
|
||||
msr.mtrr_physmask[(ECX - 0x200) >> 1] = EAX | ((uint64_t) EDX << 32);
|
||||
else
|
||||
msr.mtrr_physbase[(ECX - 0x200) >> 1] = EAX | ((uint64_t)EDX << 32);
|
||||
msr.mtrr_physbase[(ECX - 0x200) >> 1] = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0x250:
|
||||
msr.mtrr_fix64k_8000 = EAX | ((uint64_t)EDX << 32);
|
||||
msr.mtrr_fix64k_8000 = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0x258:
|
||||
msr.mtrr_fix16k_8000 = EAX | ((uint64_t)EDX << 32);
|
||||
msr.mtrr_fix16k_8000 = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0x259:
|
||||
msr.mtrr_fix16k_a000 = EAX | ((uint64_t)EDX << 32);
|
||||
msr.mtrr_fix16k_a000 = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0x268: case 0x269: case 0x26a: case 0x26b:
|
||||
case 0x26c: case 0x26d: case 0x26e: case 0x26f:
|
||||
msr.mtrr_fix4k[ECX - 0x268] = EAX | ((uint64_t)EDX << 32);
|
||||
case 0x268:
|
||||
case 0x269:
|
||||
case 0x26a:
|
||||
case 0x26b:
|
||||
case 0x26c:
|
||||
case 0x26d:
|
||||
case 0x26e:
|
||||
case 0x26f:
|
||||
msr.mtrr_fix4k[ECX - 0x268] = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0x277:
|
||||
msr.pat = EAX | ((uint64_t)EDX << 32);
|
||||
msr.pat = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0x2ff:
|
||||
msr.mtrr_deftype = EAX | ((uint64_t)EDX << 32);
|
||||
msr.mtrr_deftype = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0x400: case 0x404: case 0x408: case 0x40c:
|
||||
case 0x400:
|
||||
case 0x404:
|
||||
case 0x408:
|
||||
case 0x40c:
|
||||
case 0x410:
|
||||
msr.mca_ctl[(ECX - 0x400) >> 2] = EAX | ((uint64_t)EDX << 32);
|
||||
msr.mca_ctl[(ECX - 0x400) >> 2] = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0x401: case 0x402: case 0x405: case 0x406:
|
||||
case 0x407: case 0x409: case 0x40d: case 0x40e:
|
||||
case 0x411: case 0x412:
|
||||
case 0x401:
|
||||
case 0x402:
|
||||
case 0x405:
|
||||
case 0x406:
|
||||
case 0x407:
|
||||
case 0x409:
|
||||
case 0x40d:
|
||||
case 0x40e:
|
||||
case 0x411:
|
||||
case 0x412:
|
||||
if (EAX || EDX)
|
||||
x86gpf(NULL, 0);
|
||||
break;
|
||||
case 0x570:
|
||||
msr.ecx570 = EAX | ((uint64_t)EDX << 32);
|
||||
msr.ecx570 = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0x1002ff:
|
||||
msr.ecx1002ff = EAX | ((uint64_t)EDX << 32);
|
||||
msr.ecx1002ff = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0xf0f00250:
|
||||
msr.ecxf0f00250 = EAX | ((uint64_t)EDX << 32);
|
||||
msr.ecxf0f00250 = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0xf0f00258:
|
||||
msr.ecxf0f00258 = EAX | ((uint64_t)EDX << 32);
|
||||
msr.ecxf0f00258 = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
case 0xf0f00259:
|
||||
msr.ecxf0f00259 = EAX | ((uint64_t)EDX << 32);
|
||||
msr.ecxf0f00259 = EAX | ((uint64_t) EDX << 32);
|
||||
break;
|
||||
default:
|
||||
i686_invalid_wrmsr:
|
||||
@@ -2894,7 +2985,6 @@ i686_invalid_wrmsr:
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
cpu_write(uint16_t addr, uint8_t val, void *priv)
|
||||
{
|
||||
@@ -2910,7 +3000,8 @@ cpu_write(uint16_t addr, uint8_t val, void *priv)
|
||||
|
||||
if (!(addr & 1))
|
||||
cyrix_addr = val;
|
||||
else switch (cyrix_addr) {
|
||||
else
|
||||
switch (cyrix_addr) {
|
||||
case 0xc0: /* CCR0 */
|
||||
ccr0 = val;
|
||||
break;
|
||||
@@ -2976,7 +3067,6 @@ cpu_write(uint16_t addr, uint8_t val, void *priv)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static uint8_t
|
||||
cpu_read(uint16_t addr, void *priv)
|
||||
{
|
||||
@@ -3018,7 +3108,6 @@ cpu_read(uint16_t addr, void *priv)
|
||||
return 0xff;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
#ifdef USE_DYNAREC
|
||||
x86_setopcodes(const OpFn *opcodes, const OpFn *opcodes_0f,
|
||||
@@ -3037,7 +3126,6 @@ x86_setopcodes(const OpFn *opcodes, const OpFn *opcodes_0f)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
void
|
||||
cpu_update_waitstates(void)
|
||||
{
|
||||
@@ -3053,11 +3141,11 @@ cpu_update_waitstates(void)
|
||||
cpu_prefetch_cycles = 0;
|
||||
} else if (cpu_waitstates && (cpu_s->cpu_type >= CPU_286 && cpu_s->cpu_type <= CPU_386DX)) {
|
||||
/* Waitstates override */
|
||||
cpu_prefetch_cycles = cpu_waitstates+1;
|
||||
cpu_cycles_read = cpu_waitstates+1;
|
||||
cpu_cycles_read_l = (cpu_16bitbus ? 2 : 1) * (cpu_waitstates+1);
|
||||
cpu_cycles_write = cpu_waitstates+1;
|
||||
cpu_cycles_write_l = (cpu_16bitbus ? 2 : 1) * (cpu_waitstates+1);
|
||||
cpu_prefetch_cycles = cpu_waitstates + 1;
|
||||
cpu_cycles_read = cpu_waitstates + 1;
|
||||
cpu_cycles_read_l = (cpu_16bitbus ? 2 : 1) * (cpu_waitstates + 1);
|
||||
cpu_cycles_write = cpu_waitstates + 1;
|
||||
cpu_cycles_write_l = (cpu_16bitbus ? 2 : 1) * (cpu_waitstates + 1);
|
||||
} else if (cpu_cache_ext_enabled) {
|
||||
/* Use cache timings */
|
||||
cpu_prefetch_cycles = cpu_s->cache_read_cycles;
|
||||
|
@@ -19,7 +19,7 @@
|
||||
* Copyright 2016,2018 Miran Grca.
|
||||
*/
|
||||
#ifndef EMU_CPU_H
|
||||
# define EMU_CPU_H
|
||||
#define EMU_CPU_H
|
||||
|
||||
enum {
|
||||
FPU_NONE,
|
||||
@@ -108,7 +108,6 @@ enum {
|
||||
CPU_PKG_EBGA368 = (1 << 22)
|
||||
};
|
||||
|
||||
|
||||
#define MANU_INTEL 0
|
||||
#define MANU_AMD 1
|
||||
#define MANU_CYRIX 2
|
||||
@@ -121,12 +120,11 @@ enum {
|
||||
#define CPU_FIXED_MULTIPLIER 8
|
||||
|
||||
#if (defined __amd64__ || defined _M_X64)
|
||||
#define LOOKUP_INV -1LL
|
||||
# define LOOKUP_INV -1LL
|
||||
#else
|
||||
#define LOOKUP_INV -1
|
||||
# define LOOKUP_INV -1
|
||||
#endif
|
||||
|
||||
|
||||
typedef struct {
|
||||
const char *name;
|
||||
const char *internal_name;
|
||||
@@ -168,8 +166,6 @@ typedef struct {
|
||||
const cpu_legacy_table_t **tables;
|
||||
} cpu_legacy_machine_t;
|
||||
|
||||
|
||||
|
||||
#define C_FLAG 0x0001
|
||||
#define P_FLAG 0x0004
|
||||
#define A_FLAG 0x0010
|
||||
@@ -193,12 +189,11 @@ typedef struct {
|
||||
#define CR4_PSE (1 << 4)
|
||||
#define CR4_PAE (1 << 5)
|
||||
|
||||
#define CPL ((cpu_state.seg_cs.access>>5)&3)
|
||||
#define CPL ((cpu_state.seg_cs.access >> 5) & 3)
|
||||
|
||||
#define IOPL ((cpu_state.flags>>12)&3)
|
||||
|
||||
#define IOPLp ((!(msw&1)) || (CPL<=IOPL))
|
||||
#define IOPL ((cpu_state.flags >> 12) & 3)
|
||||
|
||||
#define IOPLp ((!(msw & 1)) || (CPL <= IOPL))
|
||||
|
||||
typedef union {
|
||||
uint32_t l;
|
||||
@@ -370,12 +365,12 @@ typedef struct {
|
||||
|
||||
#ifdef USE_NEW_DYNAREC
|
||||
uint32_t old_fp_control, new_fp_control;
|
||||
#if defined i386 || defined __i386 || defined __i386__ || defined _X86_ || defined _M_IX86
|
||||
# if defined i386 || defined __i386 || defined __i386__ || defined _X86_ || defined _M_IX86
|
||||
uint16_t old_fp_control2, new_fp_control2;
|
||||
#endif
|
||||
#if defined i386 || defined __i386 || defined __i386__ || defined _X86_ || defined _M_IX86 || defined __amd64__ || defined _M_X64
|
||||
# endif
|
||||
# if defined i386 || defined __i386 || defined __i386__ || defined _X86_ || defined _M_IX86 || defined __amd64__ || defined _M_X64
|
||||
uint32_t trunc_fp_control;
|
||||
#endif
|
||||
# endif
|
||||
#else
|
||||
uint16_t old_npxc, new_npxc;
|
||||
#endif
|
||||
@@ -393,13 +388,11 @@ typedef struct {
|
||||
uint32_t _smbase;
|
||||
} cpu_state_t;
|
||||
|
||||
|
||||
#define in_smm cpu_state._in_smm
|
||||
#define smi_line cpu_state._smi_line
|
||||
|
||||
#define smbase cpu_state._smbase
|
||||
|
||||
|
||||
/*The cpu_state.flags below must match in both cpu_cur_status and block->status for a block
|
||||
to be valid*/
|
||||
#define CPU_STATUS_USE32 (1 << 0)
|
||||
@@ -412,13 +405,13 @@ typedef struct {
|
||||
/*If the cpu_state.flags below are set in cpu_cur_status, they must be set in block->status.
|
||||
Otherwise they are ignored*/
|
||||
#ifdef USE_NEW_DYNAREC
|
||||
#define CPU_STATUS_NOTFLATDS (1 << 8)
|
||||
#define CPU_STATUS_NOTFLATSS (1 << 9)
|
||||
#define CPU_STATUS_MASK 0xff00
|
||||
# define CPU_STATUS_NOTFLATDS (1 << 8)
|
||||
# define CPU_STATUS_NOTFLATSS (1 << 9)
|
||||
# define CPU_STATUS_MASK 0xff00
|
||||
#else
|
||||
#define CPU_STATUS_NOTFLATDS (1 << 16)
|
||||
#define CPU_STATUS_NOTFLATSS (1 << 17)
|
||||
#define CPU_STATUS_MASK 0xffff0000
|
||||
# define CPU_STATUS_NOTFLATDS (1 << 16)
|
||||
# define CPU_STATUS_NOTFLATSS (1 << 17)
|
||||
# define CPU_STATUS_MASK 0xffff0000
|
||||
#endif
|
||||
|
||||
#ifdef _MSC_VER
|
||||
@@ -433,7 +426,7 @@ typedef struct {
|
||||
|
||||
COMPILE_TIME_ASSERT(sizeof(cpu_state_t) <= 128)
|
||||
|
||||
#define cpu_state_offset(MEMBER) ((uint8_t)((uintptr_t)&cpu_state.MEMBER - (uintptr_t)&cpu_state - 128))
|
||||
#define cpu_state_offset(MEMBER) ((uint8_t) ((uintptr_t) &cpu_state.MEMBER - (uintptr_t) &cpu_state - 128))
|
||||
|
||||
#define EAX cpu_state.regs[0].l
|
||||
#define AX cpu_state.regs[0].w
|
||||
@@ -462,7 +455,7 @@ COMPILE_TIME_ASSERT(sizeof(cpu_state_t) <= 128)
|
||||
|
||||
#define cycles cpu_state._cycles
|
||||
#ifdef FPU_CYCLES
|
||||
#define fpu_cycles cpu_state._fpu_cycles
|
||||
# define fpu_cycles cpu_state._fpu_cycles
|
||||
#endif
|
||||
|
||||
#define cpu_rm cpu_state.rm_data.rm_mod_reg.rm
|
||||
@@ -475,7 +468,6 @@ COMPILE_TIME_ASSERT(sizeof(cpu_state_t) <= 128)
|
||||
#define CR4_PCE (1 << 8)
|
||||
#define CR4_OSFXSR (1 << 9)
|
||||
|
||||
|
||||
/* Global variables. */
|
||||
extern cpu_state_t cpu_state;
|
||||
|
||||
@@ -528,7 +520,7 @@ extern int cpl_override;
|
||||
extern int CPUID;
|
||||
extern uint64_t xt_cpu_multi;
|
||||
extern int isa_cycles, cpu_inited;
|
||||
extern uint32_t oldds,oldss,olddslimit,oldsslimit,olddslimitw,oldsslimitw;
|
||||
extern uint32_t oldds, oldss, olddslimit, oldsslimit, olddslimitw, oldsslimitw;
|
||||
extern uint32_t pccache;
|
||||
extern uint8_t *pccache2;
|
||||
|
||||
@@ -552,12 +544,11 @@ extern uint32_t _tr[8];
|
||||
extern uint32_t cache_index;
|
||||
extern uint8_t _cache[2048];
|
||||
|
||||
|
||||
/*Segments -
|
||||
_cs,_ds,_es,_ss are the segment structures
|
||||
CS,DS,ES,SS is the 16-bit data
|
||||
cs,ds,es,ss are defines to the bases*/
|
||||
extern x86seg gdt,ldt,idt,tr;
|
||||
extern x86seg gdt, ldt, idt, tr;
|
||||
extern x86seg _oldds;
|
||||
#define CS cpu_state.seg_cs.seg
|
||||
#define DS cpu_state.seg_ds.seg
|
||||
@@ -572,7 +563,6 @@ extern x86seg _oldds;
|
||||
#define fs_seg cpu_state.seg_fs.base
|
||||
#define gs cpu_state.seg_gs.base
|
||||
|
||||
|
||||
#define ISA_CYCLES(x) (x * isa_cycles)
|
||||
|
||||
extern int cpu_cycles_read, cpu_cycles_read_l, cpu_cycles_write, cpu_cycles_write_l;
|
||||
@@ -608,7 +598,6 @@ extern int cpu_end_block_after_ins;
|
||||
extern uint16_t cpu_fast_off_count, cpu_fast_off_val;
|
||||
extern uint32_t cpu_fast_off_flags;
|
||||
|
||||
|
||||
/* Functions. */
|
||||
extern int cpu_has_feature(int feature);
|
||||
|
||||
@@ -716,7 +705,6 @@ typedef struct
|
||||
uint32_t smhr;
|
||||
} cyrix_t;
|
||||
|
||||
|
||||
extern uint32_t addr64, addr64_2;
|
||||
extern uint32_t addr64a[8], addr64a_2[8];
|
||||
|
||||
|
@@ -10,8 +10,7 @@
|
||||
x87_timings_t x87_timings;
|
||||
x87_timings_t x87_concurrency;
|
||||
|
||||
const x87_timings_t x87_timings_8087 =
|
||||
{
|
||||
const x87_timings_t x87_timings_8087 = {
|
||||
.f2xm1 = (310 + 630) / 2,
|
||||
.fabs = (10 + 17) / 2,
|
||||
.fadd = (70 + 100) / 2,
|
||||
@@ -87,8 +86,7 @@ const x87_timings_t x87_timings_8087 =
|
||||
};
|
||||
|
||||
/*Mostly the same as 8087*/
|
||||
const x87_timings_t x87_timings_287 =
|
||||
{
|
||||
const x87_timings_t x87_timings_287 = {
|
||||
.f2xm1 = (310 + 630) / 2,
|
||||
.fabs = (10 + 17) / 2,
|
||||
.fadd = (70 + 100) / 2,
|
||||
@@ -163,8 +161,7 @@ const x87_timings_t x87_timings_287 =
|
||||
.fyl2xp1 = (700 + 1000) / 2
|
||||
};
|
||||
|
||||
const x87_timings_t x87_timings_387 =
|
||||
{
|
||||
const x87_timings_t x87_timings_387 = {
|
||||
.f2xm1 = (211 + 476) / 2,
|
||||
.fabs = 22,
|
||||
.fadd = (23 + 34) / 2,
|
||||
@@ -239,8 +236,7 @@ const x87_timings_t x87_timings_387 =
|
||||
.fyl2xp1 = (257 + 547) / 2
|
||||
};
|
||||
|
||||
const x87_timings_t x87_timings_486 =
|
||||
{
|
||||
const x87_timings_t x87_timings_486 = {
|
||||
.f2xm1 = (140 + 270) / 2,
|
||||
.fabs = 3,
|
||||
.fadd = (8 + 20) / 2,
|
||||
@@ -317,8 +313,7 @@ const x87_timings_t x87_timings_486 =
|
||||
|
||||
/* this should be used for FPUs with no concurrency.
|
||||
some pre-486DX Cyrix FPUs reportedly are like this. */
|
||||
const x87_timings_t x87_concurrency_none =
|
||||
{
|
||||
const x87_timings_t x87_concurrency_none = {
|
||||
.f2xm1 = 0,
|
||||
.fabs = 0,
|
||||
.fadd = 0,
|
||||
@@ -393,8 +388,7 @@ const x87_timings_t x87_concurrency_none =
|
||||
.fyl2xp1 = 0,
|
||||
};
|
||||
|
||||
const x87_timings_t x87_concurrency_486 =
|
||||
{
|
||||
const x87_timings_t x87_concurrency_486 = {
|
||||
.f2xm1 = 2,
|
||||
.fabs = 0,
|
||||
.fadd = 7,
|
||||
|
Reference in New Issue
Block a user