Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 335 → Rev 336

/shark/trunk/shark.cfg
15,6 → 15,6
#TIMER_OPT = 1000 (For CPU < 1 GHz - Wraparound 585 years)
#TIMER_OPT = 2000 (For 1 GHz < CPU < 2 GHz - Wraparound 146 years)
#TIMER_OPT = 4000 (For 2 GHz < CPU < 4 GHz - Wraparound 36 years)
#TIMER_OPT = SLOW (No CPU dependent - Wraparound 585 years)
TIMER_OPT = SLOW
#TIMER_OPT = 8000 (For CPU < 8 GHz - Wraparound 292 years)
TIMER_OPT = 8000
/shark/trunk/oslib/kl/advtimer.c
46,10 → 46,14
unsigned int apic_clk_per_msec = 0;
unsigned int apic_set_limit = 0;
 
/* Precalcolated const
used in ll_read_timer */
unsigned int clk_opt_0 = 0;
unsigned int clk_opt_1 = 0;
unsigned int clk_opt_2 = 0;
unsigned int clk_opt_3 = 0;
unsigned int clk_opt_4 = 0;
unsigned int clk_opt_5 = 0;
 
unsigned char save_CMOS_regA;
unsigned char save_CMOS_regB;
191,10 → 195,12
dtsc = irq8_end - irq8_start;
 
clk_per_msec = dtsc / 500;
clk_opt_0 = (unsigned int)(dtsc);
clk_opt_1 = (unsigned int)((unsigned long long)(dtsc << 1));
clk_opt_2 = (unsigned int)((unsigned long long)(dtsc << 33) / 1000000000L);
clk_opt_3 = (unsigned int)((unsigned long long)(dtsc << 32) / 1000000000L);
clk_opt_4 = (unsigned int)((unsigned long long)(dtsc << 31) / 1000000000L);
clk_opt_5 = (unsigned int)((unsigned long long)(dtsc << 30) / 1000000000L);
 
message("Calibrated CPU Clk/msec = %10u\n",clk_per_msec);
 
/shark/trunk/oslib/ll/i386/advtimer.h
39,11 → 39,7
__asm__ __volatile__("xorl %%eax,%%eax\n\t" \
"cpuid\n\t" \
"rdtsc\n\t" \
"movl %%eax,%%esi\n\t" \
"movl %%edx,%%edi\n\t" \
"xorl %%eax,%%eax\n\t" \
"cpuid" \
: "=S" (low), "=D" (high) \
: "=a" (low), "=d" (high) \
:: "ebx", "ecx")
 
#define rdtscll(val) \
50,12 → 46,6
__asm__ __volatile__("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" \
: "=A" (val) \
:: "ebx","ecx")
 
68,7 → 58,7
#ifdef __O4000__
#define ll_read_timespec ll_read_timespec_4000
#else
#define ll_read_timespec ll_read_timespec_slow
#define ll_read_timespec ll_read_timespec_8000
#endif
#endif
#endif
84,8 → 74,7
return;
}
__asm__("xchgl %%eax,%%edx\n\t"
"rdtsc\n\t"
__asm__("rdtsc\n\t"
"subl (%%edi),%%eax\n\t"
"sbbl 4(%%edi),%%edx\n\t"
"divl %%ebx\n\t"
109,12 → 98,13
return;
}
__asm__("xchgl %%eax,%%edx\n\t"
"rdtsc\n\t"
__asm__("rdtsc\n\t"
"subl (%%edi),%%eax\n\t"
"sbbl 4(%%edi),%%edx\n\t"
"divl %%ebx\n\t"
"movl %%eax,%%ebx\n\t"
"xorl %%eax,%%eax\n\t"
"shrdl $1,%%edx,%%eax\n\t"
"shrl %%edx\n\t"
"divl %%ecx\n\t"
: "=a" (tspec->tv_nsec), "=b" (tspec->tv_sec)
134,14 → 124,14
return;
}
__asm__("xchgl %%eax,%%edx\n\t"
"rdtsc\n\t"
__asm__("rdtsc\n\t"
"subl (%%edi),%%eax\n\t"
"sbbl 4(%%edi),%%edx\n\t"
"divl %%ebx\n\t"
"movl %%eax,%%ebx\n\t"
"shrl %%edx\n\t"
"shrl %%edx\n\t"
"xorl %%eax,%%eax\n\t"
"shrdl $2,%%edx,%%eax\n\t"
"shrl $2,%%edx\n\t"
"divl %%ecx\n\t"
: "=a" (tspec->tv_nsec), "=b" (tspec->tv_sec)
: "D" (ptr_init_tsc) , "b" (clk_opt_1), "c" (clk_opt_4)
150,39 → 140,30
}
 
//Low level time read function
extern __inline__ void ll_read_timespec_slow(struct timespec *tspec)
extern __inline__ void ll_read_timespec_8000(struct timespec *tspec)
{
extern unsigned int clk_per_msec;
extern unsigned int clk_opt_0,clk_opt_5;
extern unsigned long long *ptr_init_tsc;
 
if (clk_per_msec == 0) {
if (clk_opt_0 == 0) {
NULL_TIMESPEC(tspec);
return;
}
__asm__("xchgl %%eax,%%edx\n\t"
"rdtsc\n\t"
 
__asm__("rdtsc\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"
"movl %%eax,%%esi\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"
"movl %%esi,%%eax\n\t"
"divl %%ebx\n\t"
"movl %%ecx,%%edx\n\t"
"movl $1000000000,%%edi\n\t"
"divl %%edi\n\t"
: "=a" (tspec->tv_sec), "=d" (tspec->tv_nsec)
: "D" (ptr_init_tsc), "b" (clk_per_msec)
: "ecx", "esi");
"sbbl 4(%%edi),%%edx\n\t"
"shrdl $1,%%edx,%%eax\n\t"
"shrl %%edx\n\t"
"divl %%ebx\n\t"
"movl %%eax,%%ebx\n\t"
"xorl %%eax,%%eax\n\t"
"shrdl $2,%%edx,%%eax\n\t"
"shrl $2,%%edx\n\t"
"divl %%ecx\n\t"
: "=b" (tspec->tv_sec), "=a" (tspec->tv_nsec)
: "D" (ptr_init_tsc), "b" (clk_opt_0), "c" (clk_opt_5)
: "edx");
}
 
/shark/trunk/oslib/mk/gnu.mk
24,7 → 24,7
ifeq ($(findstring 4000,$(TIMER_OPT)) , 4000)
CFG_OPT += -D__O4000__
else
CFG_OPT += -D__OSLOW__
CFG_OPT += -D__O8000__
endif
endif
endif
/shark/trunk/oslib/mk/linux.mk
24,7 → 24,7
ifeq ($(findstring 4000,$(TIMER_OPT)) , 4000)
CFG_OPT += -D__O4000__
else
CFG_OPT += -D__OSLOW__
CFG_OPT += -D__O8000__
endif
endif
endif