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)17fault_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)36int 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