51 lines
795 B
C
51 lines
795 B
C
/*
|
|
* Copyright 2010 Siemens AG
|
|
* Author: Jan Kiszka
|
|
*
|
|
* Released under GPLv2.
|
|
*/
|
|
|
|
#include "libcflat.h"
|
|
#include "x86/desc.h"
|
|
|
|
#define TSS_RETURN (FIRST_SPARE_SEL)
|
|
|
|
void fault_entry(void);
|
|
|
|
static __attribute__((used, regparm(1))) void
|
|
fault_handler(unsigned long error_code)
|
|
{
|
|
print_current_tss_info();
|
|
printf("error code %lx\n", error_code);
|
|
|
|
tss.eip += 2;
|
|
|
|
gdt32[TSS_MAIN / 8].access &= ~2;
|
|
|
|
set_gdt_task_gate(TSS_RETURN, tss_intr.prev);
|
|
}
|
|
|
|
asm (
|
|
"fault_entry:\n"
|
|
" mov (%esp),%eax\n"
|
|
" call fault_handler\n"
|
|
" jmp $" xstr(TSS_RETURN) ", $0\n"
|
|
);
|
|
|
|
int main(int ac, char **av)
|
|
{
|
|
const long invalid_segment = 0x1234;
|
|
|
|
setup_tss32();
|
|
set_intr_task_gate(13, fault_entry);
|
|
|
|
asm (
|
|
"mov %0,%%es\n"
|
|
: : "r" (invalid_segment) : "edi"
|
|
);
|
|
|
|
printf("post fault\n");
|
|
|
|
return 0;
|
|
}
|