17d36db35SAvi Kivity #include "libcflat.h" 2e7c37968SGleb Natapov #include "desc.h" 37d36db35SAvi Kivity 4db4898e8SThomas Huth static int test_ud2(bool *rflags_rf) 57d36db35SAvi Kivity { 67d36db35SAvi Kivity asm volatile(ASM_TRY("1f") 77d36db35SAvi Kivity "ud2 \n\t" 87d36db35SAvi Kivity "1:" :); 973f9822eSNadav Amit *rflags_rf = exception_rflags_rf(); 107d36db35SAvi Kivity return exception_vector(); 117d36db35SAvi Kivity } 127d36db35SAvi Kivity 13db4898e8SThomas Huth static 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)); 2273f9822eSNadav 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; 2973f9822eSNadav Amit bool rflags_rf; 307d36db35SAvi Kivity 317d36db35SAvi Kivity printf("Starting IDT test\n"); 327d36db35SAvi Kivity setup_idt(); 3373f9822eSNadav Amit r = test_gp(&rflags_rf); 34*a299895bSThomas Huth report(r == GP_VECTOR, "Testing #GP"); 35*a299895bSThomas Huth report(rflags_rf, "Testing #GP rflags.rf"); 3673f9822eSNadav Amit r = test_ud2(&rflags_rf); 37*a299895bSThomas Huth report(r == UD_VECTOR, "Testing #UD"); 38*a299895bSThomas Huth report(rflags_rf, "Testing #UD rflags.rf"); 39f3cdd159SJan Kiszka 40f3cdd159SJan Kiszka return report_summary(); 417d36db35SAvi Kivity } 42