xref: /kvm-unit-tests/x86/idt_test.c (revision 7d36db351752e29ad27eaafe3f102de7064e429b)
1*7d36db35SAvi Kivity #include "libcflat.h"
2*7d36db35SAvi Kivity #include "idt.h"
3*7d36db35SAvi Kivity 
4*7d36db35SAvi Kivity int test_ud2(void)
5*7d36db35SAvi Kivity {
6*7d36db35SAvi Kivity     asm volatile(ASM_TRY("1f")
7*7d36db35SAvi Kivity                  "ud2 \n\t"
8*7d36db35SAvi Kivity                  "1:" :);
9*7d36db35SAvi Kivity     return exception_vector();
10*7d36db35SAvi Kivity }
11*7d36db35SAvi Kivity 
12*7d36db35SAvi Kivity int test_gp(void)
13*7d36db35SAvi Kivity {
14*7d36db35SAvi Kivity     unsigned long tmp;
15*7d36db35SAvi Kivity 
16*7d36db35SAvi Kivity     asm volatile("mov $0xffffffff, %0 \n\t"
17*7d36db35SAvi Kivity                  ASM_TRY("1f")
18*7d36db35SAvi Kivity 		 "mov %0, %%cr4\n\t"
19*7d36db35SAvi Kivity                  "1:"
20*7d36db35SAvi Kivity                  : "=a"(tmp));
21*7d36db35SAvi Kivity     return exception_vector();
22*7d36db35SAvi Kivity }
23*7d36db35SAvi Kivity 
24*7d36db35SAvi Kivity static int nr_fail, nr_test;
25*7d36db35SAvi Kivity 
26*7d36db35SAvi Kivity static void report(int cond, const char *name)
27*7d36db35SAvi Kivity {
28*7d36db35SAvi Kivity     ++nr_test;
29*7d36db35SAvi Kivity     if (!cond) {
30*7d36db35SAvi Kivity         ++nr_fail;
31*7d36db35SAvi Kivity         printf("%s: FAIL\n", name);
32*7d36db35SAvi Kivity     } else {
33*7d36db35SAvi Kivity         printf("%s: PASS\n", name);
34*7d36db35SAvi Kivity     }
35*7d36db35SAvi Kivity }
36*7d36db35SAvi Kivity 
37*7d36db35SAvi Kivity int main(void)
38*7d36db35SAvi Kivity {
39*7d36db35SAvi Kivity     int r;
40*7d36db35SAvi Kivity 
41*7d36db35SAvi Kivity     printf("Starting IDT test\n");
42*7d36db35SAvi Kivity     setup_idt();
43*7d36db35SAvi Kivity     r = test_gp();
44*7d36db35SAvi Kivity     report(r == GP_VECTOR, "Testing #GP");
45*7d36db35SAvi Kivity     r = test_ud2();
46*7d36db35SAvi Kivity     report(r == UD_VECTOR, "Testing #UD");
47*7d36db35SAvi Kivity     printf("%d failures of %d tests\n", nr_fail, nr_test);
48*7d36db35SAvi Kivity     return !nr_fail ? 0 : 1;
49*7d36db35SAvi Kivity }
50