39,8 → 39,13 |
#define MAX_DIV_INK 30000 |
|
signed long long init_tsc; |
signed long long * ptr_init_tsc = &init_tsc; |
|
signed long long init_nsec; //Warp around 292 years !! |
signed long long * ptr_init_nsec = &init_nsec; |
|
signed long long clk_per_msec; |
signed long long * ptr_clk_per_msec = &clk_per_msec; |
|
signed long last_delta_clk_per_msec; |
signed long total_delta_clk_per_msec; |
53,13 → 58,14 |
|
unsigned char set; |
|
static unsigned long Mconst = 1000000; |
|
static unsigned long init_step = 0; |
|
signed long long actual_tsc; |
|
signed long max_dcms = clk_per_msec / MAX_DIV_INK; |
|
signed long long dt,dn; |
static signed long long dn; |
static signed long long * ptr_dn = &dn; |
signed long delta_clk_per_msec; |
|
cli(); |
66,15 → 72,31 |
|
CMOS_READ(0x0C,set); |
|
rdtscll(actual_tsc); |
__asm__("rdtsc\n\t" |
"pushl %%eax\n\t" |
"pushl %%edx\n\t" |
"subl (%%edi),%%eax\n\t" |
"sbbl 4(%%edi),%%edx\n\t" |
"popl 4(%%edi)\n\t" |
"popl (%%edi)\n\t" |
"movl %%edx,%%ecx\n\t" |
"mull %4\n\t" |
"pushl %%eax\n\t" |
"movl %%ecx,%%eax\n\t" |
"movl %%edx,%%ecx\n\t" |
"mull %4\n\t" |
"addl %%ecx,%%eax\n\t" |
"adcl $0,%%edx\n\t" |
"divl (%%ebx)\n\t" |
"movl %%eax,4(%%esi)\n\t" |
"popl %%eax\n\t" |
"divl (%%ebx)\n\t" |
"movl %%eax,(%%esi)\n\t" |
|
//Delta TSC |
dt = actual_tsc - init_tsc; |
: |
: "D" (ptr_init_tsc), "S" (ptr_dn), "b" (ptr_clk_per_msec), |
"c" (0), "m" (Mconst), "a" (0), "d" (0)); |
|
init_tsc = actual_tsc; |
|
UNSIGNED_TSC2NSEC(dt,&dn); |
|
//Offset |
init_nsec += dn; |
|
189,8 → 211,8 |
void ll_read_timespec(struct timespec *tspec) |
{ |
|
signed long long actual_tsc; |
signed long long dt,dn; |
static unsigned long Gconst = 1000000000; |
static unsigned long Mconst = 1000000; |
|
if (clk_per_msec <= 0) { |
NULL_TIMESPEC(tspec); |
197,15 → 219,30 |
return; |
} |
|
rdtscll(actual_tsc); |
__asm__("rdtsc\n\t" |
"subl (%%edi),%%eax\n\t" |
"sbbl 4(%%edi),%%edx\n\t" |
"movl %%edx,%%ecx\n\t" |
"mull %6\n\t" |
"pushl %%eax\n\t" |
"movl %%ecx,%%eax\n\t" |
"movl %%edx,%%ecx\n\t" |
"mull %6\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" |
"divl %7\n\t" |
|
dt = actual_tsc - init_tsc; |
: "=a" (tspec->tv_sec), "=d" (tspec->tv_nsec) |
: "D" (ptr_init_tsc), "S" (ptr_init_nsec), "b" (ptr_clk_per_msec), |
"c" (0), "m" (Mconst), "m" (Gconst)); |
|
UNSIGNED_TSC2NSEC(dt,&dn); |
|
tspec->tv_sec = (init_nsec + dn) / 1000000000; |
tspec->tv_nsec = (init_nsec + dn) % 1000000000; |
|
} |
|
void ll_init_advtimer() |