1*bad58c9cSBen Gras/* */ 2*bad58c9cSBen Gras/* sections */ 3*bad58c9cSBen Gras#include <machine/asm.h> 4*bad58c9cSBen Gras 5*bad58c9cSBen Gras/**===========================================================================* */ 6*bad58c9cSBen Gras/* PUBLIC void read_tsc(unsigned long *high, unsigned long *low); */ 7*bad58c9cSBen Gras/* Read the cycle counter of the CPU. Pentium and up. */ 8*bad58c9cSBen GrasENTRY(read_tsc) 9*bad58c9cSBen Gras push %edx 10*bad58c9cSBen Gras push %eax 11*bad58c9cSBen Gras.byte 0x0f /* this is the RDTSC instruction */ 12*bad58c9cSBen Gras.byte 0x31 /* it places the TSC in EDX:EAX */ 13*bad58c9cSBen Gras push %ebp 14*bad58c9cSBen Gras movl 16(%esp), %ebp 15*bad58c9cSBen Gras movl %edx, (%ebp) 16*bad58c9cSBen Gras movl 20(%esp), %ebp 17*bad58c9cSBen Gras movl %eax, (%ebp) 18*bad58c9cSBen Gras pop %ebp 19*bad58c9cSBen Gras pop %eax 20*bad58c9cSBen Gras pop %edx 21*bad58c9cSBen Gras ret 22*bad58c9cSBen Gras 23*bad58c9cSBen Gras/**===========================================================================* */ 24*bad58c9cSBen Gras/* PUBLIC void read_host_time_ns(unsigned long *high, unsigned long *low); */ 25*bad58c9cSBen Gras/* access real time in ns from host in vmware. */ 26*bad58c9cSBen GrasENTRY(read_host_time_ns) 27*bad58c9cSBen Gras pushl %edx 28*bad58c9cSBen Gras pushl %eax 29*bad58c9cSBen Gras pushl %ecx 30*bad58c9cSBen Gras movl $0x10001, %ecx 31*bad58c9cSBen Gras.byte 0x0f /* this is the RDTSC instruction */ 32*bad58c9cSBen Gras.byte 0x31 /* it places the TSC in EDX:EAX */ 33*bad58c9cSBen Gras pushl %ebp 34*bad58c9cSBen Gras movl 20(%esp), %ebp 35*bad58c9cSBen Gras movl %edx, (%ebp) 36*bad58c9cSBen Gras movl 24(%esp), %ebp 37*bad58c9cSBen Gras movl %eax, (%ebp) 38*bad58c9cSBen Gras popl %ebp 39*bad58c9cSBen Gras popl %ecx 40*bad58c9cSBen Gras popl %eax 41*bad58c9cSBen Gras popl %edx 42*bad58c9cSBen Gras ret 43