void faulted(int fuckoff, int userspace, addr_t ip) { if(current_task == kernel_task || !current_task || current_task->system || !userspace) { kernel_fault(fuckoff, ip); } else { printk(5, "%s occured in task %d (F=%d): He's dead, Jim.\n", exception_messages[fuckoff], current_task->pid, current_task->flag); /* we die for different reasons on different interrupts */ switch(fuckoff) { case 0: case 5: case 6: case 13: current_task->sigd = SIGILL; break; case 1: case 3: case 4: current_task->sigd = SIGTRAP; break; case 8: case 18: current_task->sigd = SIGABRT; break; default: kill_task(current_task->pid); break; } /* the above signals WILL be handled, since at the end of schedule(), it checks * for signals. Since we are returning to user-space here, the handler will always run */ while(!schedule()); } }
static void faulted(int fuckoff, int userspace, addr_t ip, long err_code, struct registers *regs) { printk(0, "Fault: %d %d\n", userspace, current_thread->system); if(!current_thread || current_thread->system || !userspace) { //if(fuckoff == 3) //debugger_enter(); //else kernel_fault(fuckoff, ip, err_code, regs); } else { printk(5, "%s occured in task %d (ip=%x, err=%x (%d), usersp=%x): He's dead, Jim.\n", exception_messages[fuckoff], current_thread->tid, ip, err_code, err_code, regs->useresp); // We die for different reasons on different interrupts. switch(fuckoff) { case 0: tm_signal_send_thread(current_thread, SIGFPE); break; case 5: case 6: case 13: tm_signal_send_thread(current_thread, SIGILL); break; case 1: case 3: case 4: tm_signal_send_thread(current_thread, SIGTRAP); break; case 8: case 18: tm_signal_send_thread(current_thread, SIGABRT); break; default: tm_signal_send_thread(current_thread, SIGABRT); break; } tm_thread_exit(-9); } }