Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 193 → Rev 194

/shark/trunk/oslib/kl/advtimer.c
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;
52,32 → 57,49
{
 
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();
CMOS_READ(0x0C,set);
 
__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"
:
: "D" (ptr_init_tsc), "S" (ptr_dn), "b" (ptr_clk_per_msec),
"c" (0), "m" (Mconst), "a" (0), "d" (0));
rdtscll(actual_tsc);
//Delta TSC
dt = actual_tsc - init_tsc;
 
init_tsc = actual_tsc;
UNSIGNED_TSC2NSEC(dt,&dn);
//Offset
init_nsec += dn;
 
if (init_step < 5) {
init_step++;
return;
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);
 
dt = actual_tsc - init_tsc;
UNSIGNED_TSC2NSEC(dt,&dn);
tspec->tv_sec = (init_nsec + dn) / 1000000000;
tspec->tv_nsec = (init_nsec + dn) % 1000000000;
__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"
: "=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));
}
 
void ll_init_advtimer()
/shark/trunk/oslib/ll/i386/advtimer.h
57,39 → 57,6
 
#define RTC_IRQ 8
 
extern signed long long clk_per_msec;
 
extern __inline__ void UNSIGNED_TSC2NSEC(unsigned long long tsc, unsigned long long *n)
{
 
unsigned long nl,nh;
 
nl = *n & 0xFFFFFFFF;
nh = *n >> 32;
__asm__("mull %%ecx\n\t"
"movl %%eax,%%esi\n\t"
"movl %%edx,%%edi\n\t"
"xorl %%edx,%%edx\n\t"
"movl %6,%%eax\n\t"
"mull %%ecx\n\t"
"addl %%edi,%%eax\n\t"
"adcl $0,%%edx\n\t"
"movl %5,%%ecx\n\t"
"divl %%ecx\n\t"
"xchgl %%eax,%%esi\n\t"
"divl %%ecx\n\t"
: "=a" (nl), "=S" (nh)
: "c" (1000000), "a" ((unsigned long)(tsc & 0xFFFFFFFF)), "d" (0),
"m" ((unsigned long)(clk_per_msec)), "m" ((unsigned long)(tsc >> 32)),
"S" (0), "D" (0));
 
*n = nh;
*n <<= 32;
*n |= nl;
 
}
 
void ll_init_advtimer(void);
void ll_restore_CMOS(void);