diff options
author | Andy Lutomirski <luto@amacapital.net> | 2014-05-29 08:48:45 -0700 |
---|---|---|
committer | Andy Lutomirski <luto@amacapital.net> | 2014-05-29 08:48:45 -0700 |
commit | 6d82274573a430e8725965d509b9124bbc9174fd (patch) | |
tree | e34088cf3851f2ace6dc4627dee143f2fdb1428d | |
parent | 636e714ad9dae28769c5d938ebd6b3655d5d485c (diff) | |
parent | 6ecbf653d60c8b0965fb4893784e76e166b7262d (diff) | |
download | misc-tests-6d82274573a430e8725965d509b9124bbc9174fd.tar.gz |
Merge branch 'master' of gitorious.org:linux-test-utils/linux-clock-tests
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | Makefile | 7 | ||||
-rw-r--r-- | kernel_pf.c | 17 | ||||
-rw-r--r-- | user_visible_state.c | 65 |
4 files changed, 75 insertions, 15 deletions
@@ -9,4 +9,5 @@ test_vsyscall_32 test_vsyscall_64 context_switch_latency kernel_pf +user_visible_state *~ @@ -1,8 +1,11 @@ .PHONY: all clean -all: timing_test_64 timing_test_32 evil-clock-test test_vsyscall_64 test_vsyscall_32 dump-vdso dump-vvar dump-vsyscall context_switch_latency kernel_pf +all: timing_test_64 timing_test_32 evil-clock-test test_vsyscall_64 test_vsyscall_32 dump-vdso dump-vvar dump-vsyscall context_switch_latency kernel_pf user_visible_state clean: - rm -f timing_test_64 timing_test_32 evil-clock-test test_vsyscall_64 test_vsyscall_32 dump-vdso dump-vvar dump-vsyscall context_switch_latency kernel_pf + rm -f timing_test_64 timing_test_32 evil-clock-test test_vsyscall_64 test_vsyscall_32 dump-vdso dump-vvar dump-vsyscall context_switch_latency kernel_pf user_visible_state + +user_visible_state: user_visible_state.c + gcc -o $@ -O2 -std=gnu99 -Wall $(EXTRA_CFLAGS) -g $^ -lrt -ldl kernel_pf: kernel_pf.c gcc -o $@ -O2 -std=gnu99 -Wall $(EXTRA_CFLAGS) -g $^ -lrt -ldl diff --git a/kernel_pf.c b/kernel_pf.c index 0e0d5d6..20f9784 100644 --- a/kernel_pf.c +++ b/kernel_pf.c @@ -17,30 +17,21 @@ static uint64_t faults = 0; static void iter(void) { - void *addr = mmap(NULL, NPAGES * PAGE_SIZE, PROT_READ|PROT_WRITE, - MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); - if (addr == MAP_FAILED) - err(1, "mmap"); - - for (int i = 0; i < NPAGES; i++) - clock_getres(CLOCK_REALTIME, addr + i * PAGE_SIZE); - - munmap(addr, NPAGES * PAGE_SIZE); - - faults += NPAGES; + clock_getres(CLOCK_REALTIME, (void *)8); + faults++; } int main(int argc, char **argv) { // Warm up - for (int i = 0; i < 1000; i++) + for (int i = 0; i < 1000000; i++) iter(); faults = 0; struct timespec start; clock_gettime(CLOCK_MONOTONIC, &start); - for (int i = 0; i < 1000; i++) + for (int i = 0; i < 1000000; i++) iter(); struct timespec end; diff --git a/user_visible_state.c b/user_visible_state.c new file mode 100644 index 0000000..58d1d88 --- /dev/null +++ b/user_visible_state.c @@ -0,0 +1,65 @@ +#include <stdio.h> +#include <stdint.h> +#include <xmmintrin.h> + +static void show_gdt_and_idt(void) +{ + struct { + unsigned short limit; + unsigned long base; + } __attribute__((packed)) val; + + __asm__ ("sgdt %0" : "=m" (val)); + printf("GDT: base = 0x%016lX limit = 0x%04hX\n", val.base, val.limit); + + __asm__ ("sidt %0" : "=m" (val)); + printf("IDT: base = 0x%016lX limit = 0x%04hX\n", val.base, val.limit); +} + +static void show_ldt(void) +{ + unsigned short ldt; + asm ("sldt %0" : "=rm" (ldt)); + printf("LDT: 0x%04hX\n", ldt); +} + +static void show_tr(void) +{ + unsigned short tr; + asm ("str %0" : "=rm" (tr)); + printf("TR: 0x%04X\n", tr); +} + +static void show_msw(void) +{ + unsigned short msw; + asm ("smsww %0" : "=rm" (msw)); + printf("MSW: 0x%04X\n", msw); +} + +static void show_flags(void) +{ + unsigned long flags; + asm ("sub $128, %%sp\n\t" + "pushf\n\t" + "pop %0\n\t" + "add $128, %%sp" : "=r" (flags)); + printf("FLAGS: 0x%016lX\n", flags); +} + +static void show_rdtscp(void) +{ + unsigned int cpu; + __builtin_ia32_rdtscp(&cpu); + printf("RDTSCP: cpu %d\n", cpu); +} + +int main() +{ + show_gdt_and_idt(); + show_ldt(); + show_tr(); + show_msw(); + show_flags(); + show_rdtscp(); +} |