mirror of https://github.com/xqemu/xqemu.git
added cpu_get_tsc()
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@837 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
b54ad0498e
commit
28ab0e2edb
7
hw/pc.c
7
hw/pc.c
|
@ -57,6 +57,13 @@ static void ioportF0_write(void *opaque, uint32_t addr, uint32_t data)
|
||||||
pic_set_irq(13, 0);
|
pic_set_irq(13, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* TSC handling */
|
||||||
|
|
||||||
|
uint64_t cpu_get_tsc(CPUX86State *env)
|
||||||
|
{
|
||||||
|
return qemu_get_clock(vm_clock);
|
||||||
|
}
|
||||||
|
|
||||||
/* PC cmos mappings */
|
/* PC cmos mappings */
|
||||||
|
|
||||||
#define REG_EQUIPMENT_BYTE 0x14
|
#define REG_EQUIPMENT_BYTE 0x14
|
||||||
|
|
|
@ -99,10 +99,50 @@ int cpu_get_pic_interrupt(CPUState *env)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* timers for rdtsc */
|
||||||
|
|
||||||
|
#if defined(__i386__)
|
||||||
|
|
||||||
|
int64_t cpu_get_real_ticks(void)
|
||||||
|
{
|
||||||
|
int64_t val;
|
||||||
|
asm volatile ("rdtsc" : "=A" (val));
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
#elif defined(__x86_64__)
|
||||||
|
|
||||||
|
int64_t cpu_get_real_ticks(void)
|
||||||
|
{
|
||||||
|
uint32_t low,high;
|
||||||
|
int64_t val;
|
||||||
|
asm volatile("rdtsc" : "=a" (low), "=d" (high));
|
||||||
|
val = high;
|
||||||
|
val <<= 32;
|
||||||
|
val |= low;
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
static uint64_t emu_time;
|
||||||
|
|
||||||
|
int64_t cpu_get_real_ticks(void)
|
||||||
|
{
|
||||||
|
return emu_time++;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef TARGET_I386
|
#ifdef TARGET_I386
|
||||||
/***********************************************************/
|
/***********************************************************/
|
||||||
/* CPUX86 core interface */
|
/* CPUX86 core interface */
|
||||||
|
|
||||||
|
uint64_t cpu_get_tsc(CPUX86State *env)
|
||||||
|
{
|
||||||
|
return cpu_get_real_ticks();
|
||||||
|
}
|
||||||
|
|
||||||
static void write_dt(void *ptr, unsigned long addr, unsigned long limit,
|
static void write_dt(void *ptr, unsigned long addr, unsigned long limit,
|
||||||
int flags)
|
int flags)
|
||||||
{
|
{
|
||||||
|
|
|
@ -443,6 +443,8 @@ int cpu_x86_signal_handler(int host_signum, struct siginfo *info,
|
||||||
void *puc);
|
void *puc);
|
||||||
void cpu_x86_set_a20(CPUX86State *env, int a20_state);
|
void cpu_x86_set_a20(CPUX86State *env, int a20_state);
|
||||||
|
|
||||||
|
uint64_t cpu_get_tsc(CPUX86State *env);
|
||||||
|
|
||||||
/* will be suppressed */
|
/* will be suppressed */
|
||||||
void cpu_x86_update_cr0(CPUX86State *env, uint32_t new_cr0);
|
void cpu_x86_update_cr0(CPUX86State *env, uint32_t new_cr0);
|
||||||
|
|
||||||
|
|
|
@ -1775,20 +1775,11 @@ void helper_invlpg(unsigned int addr)
|
||||||
cpu_x86_flush_tlb(env, addr);
|
cpu_x86_flush_tlb(env, addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* rdtsc */
|
|
||||||
#if !defined(__i386__) && !defined(__x86_64__)
|
|
||||||
uint64_t emu_time;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void helper_rdtsc(void)
|
void helper_rdtsc(void)
|
||||||
{
|
{
|
||||||
uint64_t val;
|
uint64_t val;
|
||||||
#if defined(__i386__) || defined(__x86_64__)
|
|
||||||
asm volatile ("rdtsc" : "=A" (val));
|
val = cpu_get_tsc(env);
|
||||||
#else
|
|
||||||
/* better than nothing: the time increases */
|
|
||||||
val = emu_time++;
|
|
||||||
#endif
|
|
||||||
EAX = val;
|
EAX = val;
|
||||||
EDX = val >> 32;
|
EDX = val >> 32;
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,6 +55,11 @@ int cpu_get_pic_interrupt(CPUState *env)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint64_t cpu_get_tsc(CPUState *env)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void set_gate(void *ptr, unsigned int type, unsigned int dpl,
|
static void set_gate(void *ptr, unsigned int type, unsigned int dpl,
|
||||||
unsigned long addr, unsigned int sel)
|
unsigned long addr, unsigned int sel)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue