Ejemplo n.º 1
0
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());
	}
}
Ejemplo n.º 2
0
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);
	}
}