xref: /kvm-unit-tests/x86/taskswitch.c (revision 91abf0b9aa0bac4ca17df0be63871ca6e1562eac)
17d36db35SAvi Kivity /*
27d36db35SAvi Kivity  * Copyright 2010 Siemens AG
37d36db35SAvi Kivity  * Author: Jan Kiszka
47d36db35SAvi Kivity  *
57d36db35SAvi Kivity  * Released under GPLv2.
67d36db35SAvi Kivity  */
77d36db35SAvi Kivity 
87d36db35SAvi Kivity #include "libcflat.h"
9761db0bdSAndrew Jones #include "x86/desc.h"
10efd8e5aaSPaolo Bonzini #include "vmalloc.h"
117d36db35SAvi Kivity 
125b0bf08bSPaolo Bonzini #define TSS_RETURN		(FIRST_SPARE_SEL)
137d36db35SAvi Kivity 
147d36db35SAvi Kivity void fault_entry(void);
157d36db35SAvi Kivity 
167d36db35SAvi Kivity static __attribute__((used, regparm(1))) void
fault_handler(unsigned long error_code)177d36db35SAvi Kivity fault_handler(unsigned long error_code)
187d36db35SAvi Kivity {
195b0bf08bSPaolo Bonzini 	print_current_tss_info();
20b006d7ebSAndrew Jones 	printf("error code %lx\n", error_code);
217d36db35SAvi Kivity 
22*7e33895dSPaolo Bonzini 	tss[0].eip += 2;
237d36db35SAvi Kivity 
245ed10141SPaolo Bonzini 	gdt[TSS_MAIN / 8].type &= ~DESC_BUSY;
257d36db35SAvi Kivity 
265b0bf08bSPaolo Bonzini 	set_gdt_task_gate(TSS_RETURN, tss_intr.prev);
277d36db35SAvi Kivity }
287d36db35SAvi Kivity 
297d36db35SAvi Kivity asm (
307d36db35SAvi Kivity 	"fault_entry:\n"
317d36db35SAvi Kivity 	"	mov (%esp),%eax\n"
327d36db35SAvi Kivity 	"	call fault_handler\n"
335b0bf08bSPaolo Bonzini 	"	jmp $" xstr(TSS_RETURN) ", $0\n"
347d36db35SAvi Kivity );
357d36db35SAvi Kivity 
main(int ac,char ** av)367d36db35SAvi Kivity int main(int ac, char **av)
377d36db35SAvi Kivity {
387d36db35SAvi Kivity 	const long invalid_segment = 0x1234;
397d36db35SAvi Kivity 
405b0bf08bSPaolo Bonzini 	setup_tss32();
415b0bf08bSPaolo Bonzini 	set_intr_task_gate(13, fault_entry);
427d36db35SAvi Kivity 
437d36db35SAvi Kivity 	asm (
447d36db35SAvi Kivity 		"mov %0,%%es\n"
457d36db35SAvi Kivity 		: : "r" (invalid_segment) : "edi"
467d36db35SAvi Kivity 	);
477d36db35SAvi Kivity 
487d36db35SAvi Kivity 	printf("post fault\n");
497d36db35SAvi Kivity 
507d36db35SAvi Kivity 	return 0;
517d36db35SAvi Kivity }
52