# Changed the real-time clock to use gettimeofday rather than rdtsc. # Some code tidying and removal of the rdtsc code. # Removed the host /proc/cpuinfo parsing. Index: um/arch/um/include/os.h =================================================================== --- um.orig/arch/um/include/os.h 2004-08-05 20:22:49.000000000 -0400 +++ um/arch/um/include/os.h 2004-08-05 20:38:09.000000000 -0400 @@ -166,6 +166,7 @@ int r, int w, int x); extern int os_unmap_memory(void *addr, int len); extern void os_flush_stdout(void); +extern unsigned long long os_usecs(void); #endif Index: um/arch/um/kernel/time.c =================================================================== --- um.orig/arch/um/kernel/time.c 2004-08-05 20:22:49.000000000 -0400 +++ um/arch/um/kernel/time.c 2004-08-05 20:38:58.000000000 -0400 @@ -94,49 +94,12 @@ set_interval(ITIMER_REAL); } -static unsigned long long get_host_hz(void) -{ - char mhzline[16], *end; - unsigned long long mhz; - int ret, mult, rest, len; - - ret = cpu_feature("cpu MHz", mhzline, - sizeof(mhzline) / sizeof(mhzline[0])); - if(!ret) - panic ("Could not get host MHZ"); - - mhz = strtoul(mhzline, &end, 10); - - /* This business is to parse a floating point number without using - * floating types. - */ - - rest = 0; - mult = 0; - if(*end == '.'){ - end++; - len = strlen(end); - if(len < 6) - mult = 6 - len; - else if(len > 6) - end[6] = '\0'; - rest = strtoul(end, NULL, 10); - while(mult-- > 0) - rest *= 10; - } - - return(1000000 * mhz + rest); -} - -unsigned long long host_hz = 0; - extern int do_posix_clock_monotonic_gettime(struct timespec *tp); void time_init(void) { struct timespec now; - host_hz = get_host_hz(); if(signal(SIGVTALRM, boot_timer_handler) == SIG_ERR) panic("Couldn't set SIGVTALRM handler"); set_interval(ITIMER_VIRTUAL); Index: um/arch/um/kernel/time_kern.c =================================================================== --- um.orig/arch/um/kernel/time_kern.c 2004-08-05 20:22:43.000000000 -0400 +++ um/arch/um/kernel/time_kern.c 2004-08-05 20:37:41.000000000 -0400 @@ -20,6 +20,7 @@ #include "user_util.h" #include "time_user.h" #include "mode.h" +#include "os.h" u64 jiffies_64; @@ -42,10 +43,10 @@ int timer_irq_inited = 0; static int first_tick; -static unsigned long long prev_tsc; +static unsigned long long prev_usecs; static long long delta; /* Deviation per interval */ -extern unsigned long long host_hz; +#define MILLION 1000000 void timer_irq(union uml_pt_regs *regs) { @@ -60,21 +61,20 @@ if(first_tick){ #if defined(CONFIG_UML_REAL_TIME_CLOCK) - unsigned long long tsc; /* We've had 1 tick */ - tsc = time_stamp(); + unsigned long long usecs = os_usecs(); - delta += tsc - prev_tsc; - prev_tsc = tsc; + delta += usecs - prev_usecs; + prev_usecs = usecs; - ticks += (delta * HZ) / host_hz; - delta -= (ticks * host_hz) / HZ; + ticks += (delta * HZ) / MILLION; + delta -= (ticks * MILLION) / HZ; #else ticks = 1; #endif } else { - prev_tsc = time_stamp(); + prev_usecs = os_usecs(); first_tick = 1; } @@ -149,7 +149,7 @@ { int i, n; - n = (loops_per_jiffy * HZ * usecs) / 1000000; + n = (loops_per_jiffy * HZ * usecs) / MILLION; for(i=0;i +#include + +unsigned long long os_usecs(void) +{ + struct timeval tv; + + gettimeofday(&tv, NULL); + return((unsigned long long) tv.tv_sec * 1000000 + tv.tv_usec); +} + +/* + * Overrides for Emacs so that we follow Linus's tabbing style. + * Emacs will notice this stuff at the end of the file and automatically + * adjust the settings for this buffer only. This must remain at the end + * of the file. + * --------------------------------------------------------------------------- + * Local variables: + * c-file-style: "linux" + * End: + */ Index: um/arch/um/sys-i386/Makefile =================================================================== --- um.orig/arch/um/sys-i386/Makefile 2004-08-05 20:22:43.000000000 -0400 +++ um/arch/um/sys-i386/Makefile 2004-08-05 20:23:16.000000000 -0400 @@ -1,5 +1,5 @@ obj-y = bugs.o checksum.o fault.o ksyms.o ldt.o ptrace.o ptrace_user.o \ - semaphore.o sigcontext.o syscalls.o sysrq.o time.o + semaphore.o sigcontext.o syscalls.o sysrq.o obj-$(CONFIG_HIGHMEM) += highmem.o obj-$(CONFIG_MODULES) += module.o Index: um/arch/um/sys-i386/time.c =================================================================== --- um.orig/arch/um/sys-i386/time.c 2004-08-05 20:22:43.000000000 -0400 +++ um/arch/um/sys-i386/time.c 2003-09-15 09:40:47.000000000 -0400 @@ -1,24 +0,0 @@ -/* - * sys-i386/time.c - * Created 25.9.2002 Sapan Bhatia - * - */ - -unsigned long long time_stamp(void) -{ - unsigned long low, high; - - asm("rdtsc" : "=a" (low), "=d" (high)); - return((((unsigned long long) high) << 32) + low); -} - -/* - * Overrides for Emacs so that we follow Linus's tabbing style. - * Emacs will notice this stuff at the end of the file and automatically - * adjust the settings for this buffer only. This must remain at the end - * of the file. - * --------------------------------------------------------------------------- - * Local variables: - * c-file-style: "linux" - * End: - */