|  | #include "libcflat.h" | 
|  | #include "processor.h" | 
|  | #include "desc.h" | 
|  |  | 
|  | static int test_ud2(bool *rflags_rf) | 
|  | { | 
|  | asm volatile(ASM_TRY("1f") | 
|  | "ud2 \n\t" | 
|  | "1:" :); | 
|  | *rflags_rf = exception_rflags_rf(); | 
|  | return exception_vector(); | 
|  | } | 
|  |  | 
|  | static int test_gp(bool *rflags_rf) | 
|  | { | 
|  | unsigned long tmp; | 
|  |  | 
|  | asm volatile("mov $0xffffffff, %0 \n\t" | 
|  | ASM_TRY("1f") | 
|  | "mov %0, %%cr4\n\t" | 
|  | "1:" | 
|  | : "=a"(tmp)); | 
|  | *rflags_rf = exception_rflags_rf(); | 
|  | return exception_vector(); | 
|  | } | 
|  |  | 
|  | int main(void) | 
|  | { | 
|  | int r; | 
|  | bool rflags_rf; | 
|  |  | 
|  | printf("Starting IDT test\n"); | 
|  | setup_idt(); | 
|  | r = test_gp(&rflags_rf); | 
|  | report(r == GP_VECTOR, "Testing #GP"); | 
|  | report(rflags_rf, "Testing #GP rflags.rf"); | 
|  | r = test_ud2(&rflags_rf); | 
|  | report(r == UD_VECTOR, "Testing #UD"); | 
|  | report(rflags_rf, "Testing #UD rflags.rf"); | 
|  |  | 
|  | return report_summary(); | 
|  | } |