add: TRACE(("thread_exit2, running on death stack 0x%lx\n", args.t->kernel_stack_base));
context: thread_exit2(void *_args){	struct thread_exit_args args;//	char *temp;	// copy the arguments over, since the source is probably on the kernel stack we're about to delete	memcpy(&args, _args, sizeof(struct thread_exit_args));	// restore the interrupts	restore_interrupts(args.int_state);//	dprintf("thread_exit2, running on death stack 0x%lx\n", args.t->kernel_stack_base);	// delete the old kernel stack region//	dprintf("thread_exit2: deleting old kernel stack id 0x%x for thread 0x%x\n", args.old_kernel_stack, args.t->id);	vm_delete_region(vm_get_kernel_aspace_id(), args.old_kernel_stack);//	dprintf("thread_exit2: removing thread 0x%x from global lists\n", args.t->id);	// remove this thread from all of the global lists	disable_interrupts();	GRAB_TEAM_LOCK();	remove_thread_from_team(team_get_kernel_team(), args.t);	RELEASE_TEAM_LOCK();	GRAB_THREAD_LOCK();	hash_remove(thread_hash, args.t);	RELEASE_THREAD_LOCK();//	dprintf("thread_exit2: done removing thread from lists\n");	if (args.death_sem >= 0)		release_sem_etc(args.death_sem, 1, B_DO_NOT_RESCHEDULE);		// set the next state to be gone. Will return the thread structure to a ready pool upon reschedule	args.t->next_state = THREAD_STATE_FREE_ON_RESCHED;	// return the death stack and reschedule one last time	put_death_stack_and_reschedule(args.death_stack);	// never get to here	panic("thread_exit2: made it where it shouldn't have!\n");}