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 Kivityfault_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 Kivityint 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