summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Lutomirski <luto@kernel.org>2016-04-06 11:48:26 -0700
committerAndy Lutomirski <luto@kernel.org>2016-04-06 11:48:26 -0700
commit0d36a1499418b5b044f1909838904cbdddb86950 (patch)
tree2d695eac969f5212e045368dabcd709555c6f3cc
parent5a1fb94300458ea05826f5d01e822e4aa0ddf92d (diff)
downloadmisc-tests-0d36a1499418b5b044f1909838904cbdddb86950.tar.gz
timing_test: Add some xsave tests
-rw-r--r--timing_test.cc51
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;