xref: /kvm-unit-tests/x86/taskswitch.c (revision 91abf0b9aa0bac4ca17df0be63871ca6e1562eac)
1 /*
2  * Copyright 2010 Siemens AG
3  * Author: Jan Kiszka
4  *
5  * Released under GPLv2.
6  */
7 
8 #include "libcflat.h"
9 #include "x86/desc.h"
10 #include "vmalloc.h"
11 
12 #define TSS_RETURN		(FIRST_SPARE_SEL)
13 
14 void fault_entry(void);
15 
16 static __attribute__((used, regparm(1))) void
fault_handler(unsigned long error_code)17 fault_handler(unsigned long error_code)
18 {
19 	print_current_tss_info();
20 	printf("error code %lx\n", error_code);
21 
22 	tss[0].eip += 2;
23 
24 	gdt[TSS_MAIN / 8].type &= ~DESC_BUSY;
25 
26 	set_gdt_task_gate(TSS_RETURN, tss_intr.prev);
27 }
28 
29 asm (
30 	"fault_entry:\n"
31 	"	mov (%esp),%eax\n"
32 	"	call fault_handler\n"
33 	"	jmp $" xstr(TSS_RETURN) ", $0\n"
34 );
35 
main(int ac,char ** av)36 int main(int ac, char **av)
37 {
38 	const long invalid_segment = 0x1234;
39 
40 	setup_tss32();
41 	set_intr_task_gate(13, fault_entry);
42 
43 	asm (
44 		"mov %0,%%es\n"
45 		: : "r" (invalid_segment) : "edi"
46 	);
47 
48 	printf("post fault\n");
49 
50 	return 0;
51 }
52