From 5e3d7a81da2845081be1a2a0aac821a3afb43c50 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Fri, 28 Aug 2015 22:45:38 +0200 Subject: [PATCH] switch back to rdtsc - no all emulators supports rdtscp --- hermit/arch/x86/include/asm/processor.h | 8 ++++---- hermit/arch/x86/kernel/apic.c | 2 +- hermit/arch/x86/kernel/tasks.c | 11 ++++++++--- hermit/kernel/main.c | 2 +- hermit/usr/examples/stream.c | 26 ++++++++++++------------- 5 files changed, 26 insertions(+), 23 deletions(-) diff --git a/hermit/arch/x86/include/asm/processor.h b/hermit/arch/x86/include/asm/processor.h index f1ef4e128..6eb6c92c1 100644 --- a/hermit/arch/x86/include/asm/processor.h +++ b/hermit/arch/x86/include/asm/processor.h @@ -316,11 +316,11 @@ static inline void clts(void) */ inline static uint64_t rdtsc(void) { - uint64_t lo, hi; + uint32_t lo, hi; asm volatile ("rdtsc" : "=a"(lo), "=d"(hi) ); - return (hi << 32 | lo); + return ((uint64_t)hi << 32ULL | (uint64_t)lo); } /** @brief Read time stamp counter and processor id @@ -332,14 +332,14 @@ inline static uint64_t rdtsc(void) */ inline static unsigned long long rdtscp(uint32_t* cpu_id) { - uint64_t lo, hi; + uint32_t lo, hi; uint32_t id; asm volatile ("rdtscp" : "=a"(lo), "=c"(id), "=d"(hi) :: "memory"); if (cpu_id) *cpu_id = id; - return (hi << 32 | lo); + return ((uint64_t)hi << 32ULL | (uint64_t)lo); } /** @brief Read MSR diff --git a/hermit/arch/x86/kernel/apic.c b/hermit/arch/x86/kernel/apic.c index 443749b39..fe852edef 100644 --- a/hermit/arch/x86/kernel/apic.c +++ b/hermit/arch/x86/kernel/apic.c @@ -704,7 +704,7 @@ static void apic_shutdown(struct state *s) static void apic_lint0(struct state * s) { // Currently nothing to do - //kputs("Receive LINT0 interrupt\n"); + kputs("Receive LINT0 interrupt\n"); } int apic_init(void) diff --git a/hermit/arch/x86/kernel/tasks.c b/hermit/arch/x86/kernel/tasks.c index 2517466a5..63fd7800f 100644 --- a/hermit/arch/x86/kernel/tasks.c +++ b/hermit/arch/x86/kernel/tasks.c @@ -43,8 +43,13 @@ extern uint64_t base; static inline void enter_user_task(size_t ep, size_t stack) { - asm volatile ("swapgs"); + // don't interrupt the jump to user-level code + irq_disable(); + asm volatile ("swapgs" ::: "memory"); + +kprintf("AAAA fs 0x%llx\n", readfs()); + // the jump also enable interrupts jump_to_user_code(ep, stack); } @@ -90,7 +95,7 @@ static int thread_entry(void* arg, size_t ep) if (curr_task->tls_addr && curr_task->tls_size) { // set fs register to the TLS segment writefs(stack+offset); - kprintf("Task %d set fs to 0x%llx\n", curr_task->id, stack+offset); + kprintf("Task %d set fs to 0x%llx\n", curr_task->id, readfs()); // copy default TLS segment to stack offset -= curr_task->tls_size; @@ -389,7 +394,7 @@ static int load_task(load_args_t* largs) // set fs register to the TLS segment writefs(stack+offset); - kprintf("Task %d set fs to 0x%zx\n", curr_task->id, stack+offset); + kprintf("Task %d set fs to 0x%zx\n", curr_task->id, readfs()); // copy default TLS segment to stack offset -= curr_task->tls_size; diff --git a/hermit/kernel/main.c b/hermit/kernel/main.c index 24a66d36e..0d05b8dfb 100644 --- a/hermit/kernel/main.c +++ b/hermit/kernel/main.c @@ -140,7 +140,7 @@ static int initd(void* arg) //create_kernel_task(NULL, foo, "foo1", NORMAL_PRIO); //create_kernel_task(NULL, foo, "foo2", NORMAL_PRIO); - //create_user_task(NULL, "/bin/hello", argv1, NORMAL_PRIO); + create_user_task(NULL, "/bin/hello", argv1, NORMAL_PRIO); //create_user_task(NULL, "/bin/jacobi", argv2, NORMAL_PRIO); //create_user_task(NULL, "/bin/jacobi", argv2, NORMAL_PRIO); create_user_task(NULL, "/bin/stream", argv3, NORMAL_PRIO); diff --git a/hermit/usr/examples/stream.c b/hermit/usr/examples/stream.c index e3631b711..549946bf6 100644 --- a/hermit/usr/examples/stream.c +++ b/hermit/usr/examples/stream.c @@ -417,12 +417,18 @@ checktick() #include extern unsigned int get_cpufreq(); +static unsigned long long start_tsc; -inline static unsigned long long rdtscp(void) +inline static unsigned long long rdtsc(void) { - unsigned long long lo, hi; - asm volatile ("rdtscp; lfence" : "=a"(lo), "=d"(hi) :: "%rcx", "memory"); - return (hi << 32 | lo); + unsigned long lo, hi; + asm volatile ("rdtsc; mfence" : "=a"(lo), "=d"(hi) :: "memory"); + return ((unsigned long long) hi << 32ULL | (unsigned long long) lo); +} + +__attribute__((constructor)) static void timer_init() +{ + start_tsc = rdtsc(); } double mysecond() @@ -435,18 +441,10 @@ double mysecond() i = gettimeofday(&tp,&tzp); return ( (double) tp.tv_sec + (double) tp.tv_usec * 1.e-6 ); #else - static unsigned long long start; - static int init = 0; double ret; - if (init) { - ret = (double) (rdtscp() - start) / ((double) get_cpufreq() * 1000000.0); - } else { - //printf("CPU frequency: %d MHz\n", get_cpufreq()); - start = rdtscp(); - init = 1; - ret = 0.0; - } + ret = ((double) (rdtsc() - start_tsc)) / ((double) get_cpufreq() * 1000000.0); + //printf("CPU frequency: %d MHz\n", get_cpufreq()); return ret; #endif