diff options
author | Avi Kivity <avi@qumranet.com> | 2008-04-15 11:10:37 +0300 |
---|---|---|
committer | Avi Kivity <avi@qumranet.com> | 2008-04-15 11:10:37 +0300 |
commit | 2dc49c9fb4c867e39fdff5f19acdf92e039534bf (patch) | |
tree | 6530b070acdcb3dd2f2c5481c3dcee231efd6b83 | |
parent | 5b2d6ec8d542d6616cf8cda9b055e5e2e9f7a466 (diff) |
kvm: testsuite: add lmsw test
Signed-off-by: Avi Kivity <avi@qumranet.com>
-rw-r--r-- | kvm/user/test/x86/emulator.c | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/kvm/user/test/x86/emulator.c b/kvm/user/test/x86/emulator.c index 26c9aaa03..c60551846 100644 --- a/kvm/user/test/x86/emulator.c +++ b/kvm/user/test/x86/emulator.c @@ -128,14 +128,20 @@ void test_push(void *mem) report("push mem", stack_top[-3] == 0x123456789abcdeful); } +unsigned long read_cr0(void) +{ + unsigned long cr0; + + asm volatile ("mov %%cr0, %0" : "=r"(cr0)); + return cr0; +} + void test_smsw(void *mem) { unsigned short msw, msw_orig, *pmsw; - unsigned long cr0; int i, zero; - asm("mov %%cr0, %0" : "=r"(cr0)); - msw_orig = cr0; + msw_orig = read_cr0(); asm("smsw %0" : "=r"(msw)); report("smsw (1)", msw == msw_orig); @@ -150,6 +156,25 @@ void test_smsw(void *mem) report("smsw (2)", msw == pmsw[4] && zero); } +void test_lmsw(void *mem) +{ + unsigned short msw, *pmsw; + unsigned long cr0; + + cr0 = read_cr0(); + + msw = cr0 ^ 8; + asm("lmsw %0" : : "r"(msw)); + printf("before %lx after %lx\n", cr0, read_cr0()); + report("lmsw (1)", (cr0 ^ read_cr0()) == 8); + + pmsw = mem; + *pmsw = cr0; + asm("lmsw %0" : : "m"(*pmsw)); + printf("before %lx after %lx\n", cr0, read_cr0()); + report("lmsw (2)", cr0 == read_cr0()); +} + int main() { void *mem; @@ -174,6 +199,7 @@ int main() test_cr8(); test_smsw(mem); + test_lmsw(mem); printf("\nSUMMARY: %d tests, %d failures\n", tests, fails); return fails ? 1 : 0; |