diff options
author | Andy Lutomirski <luto@kernel.org> | 2016-04-06 11:48:26 -0700 |
---|---|---|
committer | Andy Lutomirski <luto@kernel.org> | 2016-04-06 11:48:26 -0700 |
commit | 0d36a1499418b5b044f1909838904cbdddb86950 (patch) | |
tree | 2d695eac969f5212e045368dabcd709555c6f3cc | |
parent | 5a1fb94300458ea05826f5d01e822e4aa0ddf92d (diff) | |
download | misc-tests-0d36a1499418b5b044f1909838904cbdddb86950.tar.gz |
timing_test: Add some xsave tests
-rw-r--r-- | timing_test.cc | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/timing_test.cc b/timing_test.cc index 3477b9a..6737023 100644 --- a/timing_test.cc +++ b/timing_test.cc @@ -172,6 +172,57 @@ int main(int argc, char **argv) asm ("mov %%ss, %0" : "=rm" (sel)); for (size_t i = 0; i < loops; ++i) asm volatile ("mov %0, %%gs" : : "rm" (sel)); + } else if (!strcmp(mode, "rdgsbase")) { + asm volatile ("mov %0, %%gs" : : "rm" (0)); + for (size_t i = 0; i < loops; ++i) { + unsigned long base; + asm volatile ("rdgsbase %0" : "=rm" (base)); + } + } else if (!strcmp(mode, "wrgsbase")) { + asm volatile ("mov %0, %%gs" : : "rm" (0)); + for (size_t i = 0; i < loops; ++i) + asm volatile ("wrgsbase %0" : : "rm" (1)); + } else if (!strcmp(mode, "rdwrgsbase")) { + asm volatile ("mov %0, %%gs" : : "rm" (0)); + for (size_t i = 0; i < loops; ++i) { + unsigned long base; + asm volatile ("rdgsbase %0" : "=rm" (base)); + asm volatile ("wrgsbase %0" : : "rm" (base)); + } + } else if (!strcmp(mode, "xsave_legacy")) { + struct state { + unsigned char buf[65536] __attribute__ ((aligned (64))); + } state; + for (size_t i = 0; i < loops; ++i) { + asm volatile ("xsave %0" + : "+m" (state) : "a" (0x3), "d" (0)); + } + } else if (!strcmp(mode, "xsave_all")) { + struct state { + unsigned char buf[65536] __attribute__ ((aligned (64))); + } state; + unsigned long eax, edx; + asm ("xgetbv" : "=a" (eax), "=d" (edx) : "c" (0)); + for (size_t i = 0; i < loops; ++i) { + asm volatile ("xsave %0" + : "+m" (state) : "a" (eax), "d" (edx)); + } + } else if (!strcmp(mode, "xsave_bndcsr")) { + struct state { + unsigned char buf[65536] __attribute__ ((aligned (64))); + } state; + for (size_t i = 0; i < loops; ++i) { + asm volatile ("xsave %0" + : "+m" (state) : "a" (0x10), "d" (0)); + } + } else if (!strcmp(mode, "xsavec_bndcsr")) { + struct state { + unsigned char buf[65536] __attribute__ ((aligned (64))); + } state; + for (size_t i = 0; i < loops; ++i) { + asm volatile ("xsavec %0" + : "+m" (state) : "a" (0x10), "d" (0)); + } } else if (!strcmp(mode, "sgdt")) { struct { unsigned short limit; |