Commit 28ab0e2edb36685da7280b24e665962754d9e4ff

Authored by bellard
1 parent b54ad049

added cpu_get_tsc()


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@837 c046a42c-6fe2-441c-8c8c-71466251a162
@@ -57,6 +57,13 @@ static void ioportF0_write(void *opaque, uint32_t addr, uint32_t data) @@ -57,6 +57,13 @@ static void ioportF0_write(void *opaque, uint32_t addr, uint32_t data)
57 pic_set_irq(13, 0); 57 pic_set_irq(13, 0);
58 } 58 }
59 59
  60 +/* TSC handling */
  61 +
  62 +uint64_t cpu_get_tsc(CPUX86State *env)
  63 +{
  64 + return qemu_get_clock(vm_clock);
  65 +}
  66 +
60 /* PC cmos mappings */ 67 /* PC cmos mappings */
61 68
62 #define REG_EQUIPMENT_BYTE 0x14 69 #define REG_EQUIPMENT_BYTE 0x14
linux-user/main.c
@@ -99,10 +99,50 @@ int cpu_get_pic_interrupt(CPUState *env) @@ -99,10 +99,50 @@ int cpu_get_pic_interrupt(CPUState *env)
99 return -1; 99 return -1;
100 } 100 }
101 101
  102 +/* timers for rdtsc */
  103 +
  104 +#if defined(__i386__)
  105 +
  106 +int64_t cpu_get_real_ticks(void)
  107 +{
  108 + int64_t val;
  109 + asm volatile ("rdtsc" : "=A" (val));
  110 + return val;
  111 +}
  112 +
  113 +#elif defined(__x86_64__)
  114 +
  115 +int64_t cpu_get_real_ticks(void)
  116 +{
  117 + uint32_t low,high;
  118 + int64_t val;
  119 + asm volatile("rdtsc" : "=a" (low), "=d" (high));
  120 + val = high;
  121 + val <<= 32;
  122 + val |= low;
  123 + return val;
  124 +}
  125 +
  126 +#else
  127 +
  128 +static uint64_t emu_time;
  129 +
  130 +int64_t cpu_get_real_ticks(void)
  131 +{
  132 + return emu_time++;
  133 +}
  134 +
  135 +#endif
  136 +
102 #ifdef TARGET_I386 137 #ifdef TARGET_I386
103 /***********************************************************/ 138 /***********************************************************/
104 /* CPUX86 core interface */ 139 /* CPUX86 core interface */
105 140
  141 +uint64_t cpu_get_tsc(CPUX86State *env)
  142 +{
  143 + return cpu_get_real_ticks();
  144 +}
  145 +
106 static void write_dt(void *ptr, unsigned long addr, unsigned long limit, 146 static void write_dt(void *ptr, unsigned long addr, unsigned long limit,
107 int flags) 147 int flags)
108 { 148 {
target-i386/cpu.h
@@ -443,6 +443,8 @@ int cpu_x86_signal_handler(int host_signum, struct siginfo *info, @@ -443,6 +443,8 @@ int cpu_x86_signal_handler(int host_signum, struct siginfo *info,
443 void *puc); 443 void *puc);
444 void cpu_x86_set_a20(CPUX86State *env, int a20_state); 444 void cpu_x86_set_a20(CPUX86State *env, int a20_state);
445 445
  446 +uint64_t cpu_get_tsc(CPUX86State *env);
  447 +
446 /* will be suppressed */ 448 /* will be suppressed */
447 void cpu_x86_update_cr0(CPUX86State *env, uint32_t new_cr0); 449 void cpu_x86_update_cr0(CPUX86State *env, uint32_t new_cr0);
448 450
target-i386/helper.c
@@ -1775,20 +1775,11 @@ void helper_invlpg(unsigned int addr) @@ -1775,20 +1775,11 @@ void helper_invlpg(unsigned int addr)
1775 cpu_x86_flush_tlb(env, addr); 1775 cpu_x86_flush_tlb(env, addr);
1776 } 1776 }
1777 1777
1778 -/* rdtsc */  
1779 -#if !defined(__i386__) && !defined(__x86_64__)  
1780 -uint64_t emu_time;  
1781 -#endif  
1782 -  
1783 void helper_rdtsc(void) 1778 void helper_rdtsc(void)
1784 { 1779 {
1785 uint64_t val; 1780 uint64_t val;
1786 -#if defined(__i386__) || defined(__x86_64__)  
1787 - asm volatile ("rdtsc" : "=A" (val));  
1788 -#else  
1789 - /* better than nothing: the time increases */  
1790 - val = emu_time++;  
1791 -#endif 1781 +
  1782 + val = cpu_get_tsc(env);
1792 EAX = val; 1783 EAX = val;
1793 EDX = val >> 32; 1784 EDX = val >> 32;
1794 } 1785 }
tests/qruncom.c
@@ -55,6 +55,11 @@ int cpu_get_pic_interrupt(CPUState *env) @@ -55,6 +55,11 @@ int cpu_get_pic_interrupt(CPUState *env)
55 return -1; 55 return -1;
56 } 56 }
57 57
  58 +uint64_t cpu_get_tsc(CPUState *env)
  59 +{
  60 + return 0;
  61 +}
  62 +
58 static void set_gate(void *ptr, unsigned int type, unsigned int dpl, 63 static void set_gate(void *ptr, unsigned int type, unsigned int dpl,
59 unsigned long addr, unsigned int sel) 64 unsigned long addr, unsigned int sel)
60 { 65 {