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