Changes to update_tsc() - no longer requires a parameter and advances by all the currently accumulated cycles. Also changed TSC-related delta's to be correctly uint64_t.
This commit is contained in:
@@ -273,13 +273,28 @@ static void prefetch_flush()
|
|||||||
#define CACHE_ON() (!(cr0 & (1 << 30)) && !(cpu_state.flags & T_FLAG))
|
#define CACHE_ON() (!(cr0 & (1 << 30)) && !(cpu_state.flags & T_FLAG))
|
||||||
|
|
||||||
#ifdef USE_DYNAREC
|
#ifdef USE_DYNAREC
|
||||||
static int cycles_main = 0;
|
static int cycles_main = 0, cycles_old = 0;
|
||||||
|
static uint64_t tsc_old = 0;
|
||||||
|
|
||||||
void update_tsc(int cycs)
|
void update_tsc(void)
|
||||||
{
|
{
|
||||||
if (cycs > 0) {
|
int cycdiff;
|
||||||
tsc += cycs;
|
uint64_t delta;
|
||||||
|
|
||||||
|
cycdiff = cycles_old - cycles;
|
||||||
|
delta = tsc - tsc_old;
|
||||||
|
if (delta > 0) {
|
||||||
|
/* TSC has changed, this means interim timer processing has happened,
|
||||||
|
see how much we still need to add. */
|
||||||
|
cycdiff -= delta;
|
||||||
|
if (cycdiff > 0)
|
||||||
|
tsc += cycdiff;
|
||||||
|
} else {
|
||||||
|
/* TSC has not changed. */
|
||||||
|
tsc += cycdiff;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cycdiff > 0) {
|
||||||
if (TIMER_VAL_LESS_THAN_VAL(timer_target, (uint32_t)tsc))
|
if (TIMER_VAL_LESS_THAN_VAL(timer_target, (uint32_t)tsc))
|
||||||
timer_process();
|
timer_process();
|
||||||
}
|
}
|
||||||
@@ -291,9 +306,9 @@ void exec386_dynarec(int cycs)
|
|||||||
uint32_t addr;
|
uint32_t addr;
|
||||||
int tempi;
|
int tempi;
|
||||||
int cycdiff;
|
int cycdiff;
|
||||||
int oldcyc, oldtsc;
|
int oldcyc;
|
||||||
int oldcyc2;
|
int oldcyc2;
|
||||||
int delta;
|
uint64_t oldtsc, delta;
|
||||||
uint32_t start_pc = 0;
|
uint32_t start_pc = 0;
|
||||||
|
|
||||||
int cyc_period = cycs / 2000; /*5us*/
|
int cyc_period = cycs / 2000; /*5us*/
|
||||||
@@ -317,7 +332,9 @@ void exec386_dynarec(int cycs)
|
|||||||
cycdiff=0;
|
cycdiff=0;
|
||||||
#endif
|
#endif
|
||||||
oldcyc = oldcyc2 = cycles;
|
oldcyc = oldcyc2 = cycles;
|
||||||
|
cycles_old = cycles;
|
||||||
oldtsc = tsc;
|
oldtsc = tsc;
|
||||||
|
tsc_old = tsc;
|
||||||
if (!CACHE_ON()) /*Interpret block*/
|
if (!CACHE_ON()) /*Interpret block*/
|
||||||
{
|
{
|
||||||
cpu_block_end = 0;
|
cpu_block_end = 0;
|
||||||
|
|||||||
@@ -565,7 +565,7 @@ extern int cpu_effective, cpu_alt_reset;
|
|||||||
extern void cpu_dynamic_switch(int new_cpu);
|
extern void cpu_dynamic_switch(int new_cpu);
|
||||||
|
|
||||||
extern void cpu_ven_reset(void);
|
extern void cpu_ven_reset(void);
|
||||||
extern void update_tsc(int cycs);
|
extern void update_tsc(void);
|
||||||
|
|
||||||
extern int sysenter(uint32_t fetchdat);
|
extern int sysenter(uint32_t fetchdat);
|
||||||
extern int sysexit(uint32_t fetchdat);
|
extern int sysexit(uint32_t fetchdat);
|
||||||
|
|||||||
6
src/io.c
6
src/io.c
@@ -331,7 +331,7 @@ outb(uint16_t port, uint8_t val)
|
|||||||
if (!found) {
|
if (!found) {
|
||||||
sub_cycles(io_delay);
|
sub_cycles(io_delay);
|
||||||
if (cpu_use_dynarec && (port == 0xeb))
|
if (cpu_use_dynarec && (port == 0xeb))
|
||||||
update_tsc(io_delay);
|
update_tsc();
|
||||||
}
|
}
|
||||||
|
|
||||||
io_log("(%i, %i, %04i) outb(%04X, %02X)\n", in_smm, found, qfound, port, val);
|
io_log("(%i, %i, %04i) outb(%04X, %02X)\n", in_smm, found, qfound, port, val);
|
||||||
@@ -424,7 +424,7 @@ outw(uint16_t port, uint16_t val)
|
|||||||
if (!found) {
|
if (!found) {
|
||||||
sub_cycles(io_delay);
|
sub_cycles(io_delay);
|
||||||
if (cpu_use_dynarec && (port == 0xeb))
|
if (cpu_use_dynarec && (port == 0xeb))
|
||||||
update_tsc(io_delay);
|
update_tsc();
|
||||||
}
|
}
|
||||||
|
|
||||||
io_log("(%i, %i, %04i) outw(%04X, %04X)\n", in_smm, found, qfound, port, val);
|
io_log("(%i, %i, %04i) outw(%04X, %04X)\n", in_smm, found, qfound, port, val);
|
||||||
@@ -551,7 +551,7 @@ outl(uint16_t port, uint32_t val)
|
|||||||
if (!found) {
|
if (!found) {
|
||||||
sub_cycles(io_delay);
|
sub_cycles(io_delay);
|
||||||
if (cpu_use_dynarec && (port == 0xeb))
|
if (cpu_use_dynarec && (port == 0xeb))
|
||||||
update_tsc(io_delay);
|
update_tsc();
|
||||||
}
|
}
|
||||||
|
|
||||||
io_log("(%i, %i, %04i) outl(%04X, %08X)\n", in_smm, found, qfound, port, val);
|
io_log("(%i, %i, %04i) outl(%04X, %08X)\n", in_smm, found, qfound, port, val);
|
||||||
|
|||||||
Reference in New Issue
Block a user