aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAvi Kivity <avi@qumranet.com>2008-04-15 11:10:37 +0300
committerAvi Kivity <avi@qumranet.com>2008-04-15 11:10:37 +0300
commit2dc49c9fb4c867e39fdff5f19acdf92e039534bf (patch)
tree6530b070acdcb3dd2f2c5481c3dcee231efd6b83
parent5b2d6ec8d542d6616cf8cda9b055e5e2e9f7a466 (diff)
kvm: testsuite: add lmsw test
Signed-off-by: Avi Kivity <avi@qumranet.com>
-rw-r--r--kvm/user/test/x86/emulator.c32
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;