diff --git a/sys/i386/trap.c b/sys/i386/trap.c index f64e3a9..f98c210 100644 --- a/sys/i386/trap.c +++ b/sys/i386/trap.c @@ -27,11 +27,36 @@ *****************************************************************************************/ +#include #include #include #include #include +static void trap_end_task(char *string, struct trapframe *regs, long error_code); + +#define TRAP_CODE(trap_nr, signr, str, trap_name, tsk) void do_##trap_name(struct trapframe *regs, long error_code) { \ + trap_end_task(str, regs, error_code); \ +} + +TRAP_CODE( 0, SIGFPE, "divide error", divide_error, _current) +TRAP_CODE( 3, SIGTRAP, "int3", int3, _current) +TRAP_CODE( 4, SIGSEGV, "overflow", overflow, _current) +TRAP_CODE( 5, SIGSEGV, "bounds", bounds, _current) +TRAP_CODE( 6, SIGILL, "invalid operand", invalid_op, _current) +TRAP_CODE( 7, SIGSEGV, "device not available", device_not_available, _current) +TRAP_CODE( 8, SIGSEGV, "double fault", double_fault, _current) +//TRAP_CODE( 9, SIGFPE, "coprocessor segment overrun", coprocessor_segment_overrun, last_task_used_math) +TRAP_CODE(10, SIGSEGV, "invalid TSS", invalid_TSS, _current) +TRAP_CODE(11, SIGBUS, "segment not present", segment_not_present, _current) +TRAP_CODE(12, SIGBUS, "stack segment", stack_segment, _current) +TRAP_CODE(15, SIGSEGV, "reserved", reserved, _current) +TRAP_CODE(17, SIGSEGV, "alignment check", alignment_check, _current) + +static void trap_end_task(char *string, struct trapframe *regs, long error_code) { + kprintf("S"); +} + #define FIRST_TSS_ENTRY 6 #define VM_MASK 0x00020000 @@ -55,37 +80,37 @@ __res;}) void die_if_kernel(char *str, struct trapframe *regs, long err) { - int i; - unsigned long esp; - unsigned short ss; + int i; + unsigned long esp; + unsigned short ss; - esp = (unsigned long) ®s->tf_esp; - //ss = KERNEL_DS; - ss = 0x10; - if ((regs->tf_eflags & VM_MASK) || (3 & regs->tf_cs) == 3) - return; - if (regs->tf_cs & 3) { - esp = regs->tf_esp; - ss = regs->tf_ss; - } + esp = (unsigned long) ®s->tf_esp; + //ss = KERNEL_DS; + ss = 0x10; + if ((regs->tf_eflags & VM_MASK) || (3 & regs->tf_cs) == 3) + return; + if (regs->tf_cs & 3) { + esp = regs->tf_esp; + ss = regs->tf_ss; + } - kprintf("%s: %04lx\n", str, err & 0xffff); - kprintf("EIP: %04x:%08lx\nEFLAGS: %08lx\n", 0xffff & regs->tf_cs,regs->tf_eip,regs->tf_eflags); - kprintf("eax: %08lx ebx: %08lx ecx: %08lx edx: %08lx\n", regs->tf_eax, regs->tf_ebx, regs->tf_ecx, regs->tf_edx); - kprintf("esi: %08lx edi: %08lx ebp: %08lx esp: %08lx\n", regs->tf_esi, regs->tf_edi, regs->tf_ebp, esp); - kprintf("ds: %04x es: %04x fs: %04x gs: %04x ss: %04x\n", regs->tf_ds, regs->tf_es, regs->tf_fs, regs->tf_gs, ss); - store_TR(i); - //kprintf("Pid: %d, process nr: %d (%s)\nStack: ", _current->id, 0xffff & i, _current->comm); - kprintf("Pid: %d, process nr: %d ()\nStack: ", _current->id, 0xffff & i); - for(i=0;i<5;i++) - kprintf("%08lx ", get_seg_long(ss,(i+(unsigned long *)esp))); - kprintf("\nCode: "); - for(i=0;i<20;i++) - kprintf("%02x ",0xff & get_seg_byte(regs->tf_cs,(i+(char *)regs->tf_eip))); - kprintf("\n"); + kprintf("%s: %04lx\n", str, err & 0xffff); + kprintf("EIP: %04x:%08lx\nEFLAGS: %08lx\n", 0xffff & regs->tf_cs, regs->tf_eip, regs->tf_eflags); + kprintf("eax: %08lx ebx: %08lx ecx: %08lx edx: %08lx\n", regs->tf_eax, regs->tf_ebx, regs->tf_ecx, regs->tf_edx); + kprintf("esi: %08lx edi: %08lx ebp: %08lx esp: %08lx\n", regs->tf_esi, regs->tf_edi, regs->tf_ebp, esp); + kprintf("ds: %04x es: %04x fs: %04x gs: %04x ss: %04x\n", regs->tf_ds, regs->tf_es, regs->tf_fs, regs->tf_gs, ss); + store_TR(i); + //kprintf("Pid: %d, process nr: %d (%s)\nStack: ", _current->id, 0xffff & i, _current->comm); + kprintf("Pid: %d, process nr: %d ()\nStack: ", _current->id, 0xffff & i); + for (i = 0; i < 5; i++) + kprintf("%08lx ", get_seg_long(ss, (i+(unsigned long *)esp))); + kprintf("\nCode: "); + for (i = 0; i < 20; i++) + kprintf("%02x ", 0xff & get_seg_byte(regs->tf_cs, (i+(char *)regs->tf_eip))); + kprintf("\n"); } -void trap( struct trapframe *frame ) { +void trap(struct trapframe *frame) { u_int trap_code; u_int cr2 = 0; @@ -93,35 +118,35 @@ trap_code = frame->tf_trapno; - if ( (frame->tf_eflags & PSL_I) == 0 ) { + if ((frame->tf_eflags & PSL_I) == 0) { if (SEL_GET_PL(frame->tf_cs) == SEL_PL_USER || (frame->tf_eflags & PSL_VM)) { - die_if_kernel("TEST", frame, 0x100); - // kpanic( "INT OFF! USER" ); -} + die_if_kernel("TEST", frame, 0x100); + // kpanic( "INT OFF! USER" ); + } else { - die_if_kernel("TEST", frame, 0x100); + die_if_kernel("TEST", frame, 0x100); // kpanic( "INT OFF! KERN[0x%X]", trap_code ); -} + } } - cr2 = rcr2(); - kprintf("trap_code: %i(0x%X), EIP: 0x%X, CR2: 0x%X\n", frame->tf_trapno, frame->tf_trapno, frame->tf_eip, cr2); + cr2 = rcr2(); + kprintf("trap_code: %i(0x%X), EIP: 0x%X, CR2: 0x%X\n", frame->tf_trapno, frame->tf_trapno, frame->tf_eip, cr2); -/* - switch (trap_code) { - case 0xC: - cr2 = rcr2(); - kprintf("trap_code: %i(0x%X), EIP: 0x%X, CR2: 0x%X\n", frame->tf_trapno, frame->tf_trapno, frame->tf_eip, cr2); - asm("sti"); // Turn Back On Ints! - vmm_pageFault(frame, cr2); - kprintf("Called page Fault\n"); - default: - break; - } + /* + switch (trap_code) { + case 0xC: + cr2 = rcr2(); + kprintf("trap_code: %i(0x%X), EIP: 0x%X, CR2: 0x%X\n", frame->tf_trapno, frame->tf_trapno, frame->tf_eip, cr2); + asm("sti"); // Turn Back On Ints! + vmm_pageFault(frame, cr2); + kprintf("Called page Fault\n"); + default: + break; + } - kprintf("GOTTA RETURN!\n"); - while(1); -*/ + kprintf("GOTTA RETURN!\n"); + while(1); + */ } /*** diff --git a/sys/include/i386/signal.h b/sys/include/i386/signal.h new file mode 100644 index 0000000..1481c5b --- /dev/null +++ b/sys/include/i386/signal.h @@ -0,0 +1,41 @@ +#ifndef _I386_SIGNAL_H_ +#define _i386_SIGNAL_H_ + +#define _NSIG 32 +#define NSIG _NSIG + +#define SIGHUP 1 +#define SIGINT 2 +#define SIGQUIT 3 +#define SIGILL 4 +#define SIGTRAP 5 +#define SIGABRT 6 +#define SIGIOT 6 +#define SIGBUS 7 +#define SIGFPE 8 +#define SIGKILL 9 +#define SIGUSR1 10 +#define SIGSEGV 11 +#define SIGUSR2 12 +#define SIGPIPE 13 +#define SIGALRM 14 +#define SIGTERM 15 +#define SIGSTKFLT 16 +#define SIGCHLD 17 +#define SIGCONT 18 +#define SIGSTOP 19 +#define SIGTSTP 20 +#define SIGTTIN 21 +#define SIGTTOU 22 +#define SIGURG 23 +#define SIGXCPU 24 +#define SIGXFSZ 25 +#define SIGVTALRM 26 +#define SIGPROF 27 +#define SIGWINCH 28 +#define SIGIO 29 +#define SIGPOLL SIGIO +#define SIGPWR 30 +#define SIGUNUSED 31 + +#endif diff --git a/sys/sys/idt.c b/sys/sys/idt.c index e959307..4dce798 100644 --- a/sys/sys/idt.c +++ b/sys/sys/idt.c @@ -244,6 +244,7 @@ void __int6(struct trapframe *frame) { + die_if_kernel("invalid_op",frame,6); kprintf("tf_gs: 0x%X, tf_fs: 0x%X, tf_es: 0x%X, tf_ds: 0x%X\n", frame->tf_gs, frame->tf_fs, frame->tf_es, frame->tf_ds); kpanic( "int6: Invalid opcode! [%i:0x%X:0x%X]\n", _current->id, _current->tss.eip, frame->tf_eip ); endTask( _current->id );