xref: /kvm-unit-tests/x86/idt_test.c (revision 31e68df7c38220f4144a45b8e3d1663f6348ee7e)
17d36db35SAvi Kivity #include "libcflat.h"
2*2b934609SXiaoyao Li #include "processor.h"
3e7c37968SGleb Natapov #include "desc.h"
47d36db35SAvi Kivity 
test_ud2(bool * rflags_rf)5db4898e8SThomas Huth static int test_ud2(bool *rflags_rf)
67d36db35SAvi Kivity {
77d36db35SAvi Kivity     asm volatile(ASM_TRY("1f")
87d36db35SAvi Kivity                  "ud2 \n\t"
97d36db35SAvi Kivity                  "1:" :);
1073f9822eSNadav Amit     *rflags_rf = exception_rflags_rf();
117d36db35SAvi Kivity     return exception_vector();
127d36db35SAvi Kivity }
137d36db35SAvi Kivity 
test_gp(bool * rflags_rf)14db4898e8SThomas Huth static int test_gp(bool *rflags_rf)
157d36db35SAvi Kivity {
167d36db35SAvi Kivity     unsigned long tmp;
177d36db35SAvi Kivity 
187d36db35SAvi Kivity     asm volatile("mov $0xffffffff, %0 \n\t"
197d36db35SAvi Kivity                  ASM_TRY("1f")
207d36db35SAvi Kivity 		 "mov %0, %%cr4\n\t"
217d36db35SAvi Kivity                  "1:"
227d36db35SAvi Kivity                  : "=a"(tmp));
2373f9822eSNadav Amit     *rflags_rf = exception_rflags_rf();
247d36db35SAvi Kivity     return exception_vector();
257d36db35SAvi Kivity }
267d36db35SAvi Kivity 
main(void)277d36db35SAvi Kivity int main(void)
287d36db35SAvi Kivity {
297d36db35SAvi Kivity     int r;
3073f9822eSNadav Amit     bool rflags_rf;
317d36db35SAvi Kivity 
327d36db35SAvi Kivity     printf("Starting IDT test\n");
3373f9822eSNadav Amit     r = test_gp(&rflags_rf);
34a299895bSThomas Huth     report(r == GP_VECTOR, "Testing #GP");
35a299895bSThomas Huth     report(rflags_rf, "Testing #GP rflags.rf");
3673f9822eSNadav Amit     r = test_ud2(&rflags_rf);
37a299895bSThomas Huth     report(r == UD_VECTOR, "Testing #UD");
38a299895bSThomas Huth     report(rflags_rf, "Testing #UD rflags.rf");
39f3cdd159SJan Kiszka 
40f3cdd159SJan Kiszka     return report_summary();
417d36db35SAvi Kivity }
42