File size: 886 Bytes
8df6da4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include "libcflat.h"
#include "desc.h"

int test_ud2(bool *rflags_rf)
{
    asm volatile(ASM_TRY("1f")
                 "ud2 \n\t"
                 "1:" :);
    *rflags_rf = exception_rflags_rf();
    return exception_vector();
}

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("Testing #GP", r == GP_VECTOR);
    report("Testing #GP rflags.rf", rflags_rf);
    r = test_ud2(&rflags_rf);
    report("Testing #UD", r == UD_VECTOR);
    report("Testing #UD rflags.rf", rflags_rf);

    return report_summary();
}