xref: /kvm-unit-tests/x86/idt_test.c (revision 73f9822e5a5b8829797944a4d88bc1b7ace6f62a)
17d36db35SAvi Kivity #include "libcflat.h"
2e7c37968SGleb Natapov #include "desc.h"
37d36db35SAvi Kivity 
4*73f9822eSNadav Amit int test_ud2(bool *rflags_rf)
57d36db35SAvi Kivity {
67d36db35SAvi Kivity     asm volatile(ASM_TRY("1f")
77d36db35SAvi Kivity                  "ud2 \n\t"
87d36db35SAvi Kivity                  "1:" :);
9*73f9822eSNadav Amit     *rflags_rf = exception_rflags_rf();
107d36db35SAvi Kivity     return exception_vector();
117d36db35SAvi Kivity }
127d36db35SAvi Kivity 
13*73f9822eSNadav Amit int test_gp(bool *rflags_rf)
147d36db35SAvi Kivity {
157d36db35SAvi Kivity     unsigned long tmp;
167d36db35SAvi Kivity 
177d36db35SAvi Kivity     asm volatile("mov $0xffffffff, %0 \n\t"
187d36db35SAvi Kivity                  ASM_TRY("1f")
197d36db35SAvi Kivity 		 "mov %0, %%cr4\n\t"
207d36db35SAvi Kivity                  "1:"
217d36db35SAvi Kivity                  : "=a"(tmp));
22*73f9822eSNadav Amit     *rflags_rf = exception_rflags_rf();
237d36db35SAvi Kivity     return exception_vector();
247d36db35SAvi Kivity }
257d36db35SAvi Kivity 
267d36db35SAvi Kivity int main(void)
277d36db35SAvi Kivity {
287d36db35SAvi Kivity     int r;
29*73f9822eSNadav Amit     bool rflags_rf;
307d36db35SAvi Kivity 
317d36db35SAvi Kivity     printf("Starting IDT test\n");
327d36db35SAvi Kivity     setup_idt();
33*73f9822eSNadav Amit     r = test_gp(&rflags_rf);
34f3cdd159SJan Kiszka     report("Testing #GP", r == GP_VECTOR);
35*73f9822eSNadav Amit     report("Testing #GP rflags.rf", rflags_rf);
36*73f9822eSNadav Amit     r = test_ud2(&rflags_rf);
37f3cdd159SJan Kiszka     report("Testing #UD", r == UD_VECTOR);
38*73f9822eSNadav Amit     report("Testing #UD rflags.rf", rflags_rf);
39f3cdd159SJan Kiszka 
40f3cdd159SJan Kiszka     return report_summary();
417d36db35SAvi Kivity }
42