Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 304 → Rev 305

/shark/trunk/oslib/ll/i386/advtimer.h
31,6 → 31,8
#include <ll/i386/defs.h>
BEGIN_DEF
 
#include <ll/sys/ll/time.h>
 
/* TSC */
 
#define rdtsc(low,high) \
57,6 → 59,54
: "=A" (val) \
:: "ebx","ecx")
 
//Low level time read function
extern __inline__ void ll_read_timespec(struct timespec *tspec)
{
extern unsigned int clk_per_msec;
extern unsigned long long *ptr_init_nsec;
extern unsigned long long *ptr_init_tsc;
 
if (clk_per_msec == 0) {
NULL_TIMESPEC(tspec);
return;
}
__asm__("xorl %%eax,%%eax\n\t"
"cpuid\n\t"
"rdtsc\n\t"
"pushl %%eax\n\t"
"pushl %%edx\n\t"
"xorl %%eax,%%eax\n\t"
"cpuid\n\t"
"popl %%edx\n\t"
"popl %%eax\n\t"
"movl %4,%%ebx\n\t"
"subl (%%edi),%%eax\n\t"
"sbbl 4(%%edi),%%edx\n\t"
"movl %%edx,%%ecx\n\t"
"movl $1000000,%%edi\n\t"
"mull %%edi\n\t"
"pushl %%eax\n\t"
"movl %%ecx,%%eax\n\t"
"movl %%edx,%%ecx\n\t"
"mull %%edi\n\t"
"addl %%ecx,%%eax\n\t"
"adcl $0,%%edx\n\t"
"divl %%ebx\n\t"
"movl %%eax,%%ecx\n\t"
"popl %%eax\n\t"
"divl %%ebx\n\t"
"movl %%ecx,%%edx\n\t"
"addl (%%esi),%%eax\n\t"
"adcl 4(%%esi),%%edx\n\t"
"movl $1000000000,%%edi\n\t"
"divl %%edi\n\t"
: "=a" (tspec->tv_sec), "=d" (tspec->tv_nsec)
: "D" (ptr_init_tsc), "S" (ptr_init_nsec), "m" (clk_per_msec)
: "ebx", "ecx");
}
 
#define rdmsr(msr,val1,val2) \
__asm__ __volatile__("rdmsr" \
: "=a" (val1), "=d" (val2) \