Пример #1
0
int process2()
{
	int* momo2 = (int*)sys_mmap(sizeof(int) * 10);
	int a2 = vmem_translate((uint32_t)momo2, current_process);
	sys_yield();
	
	sys_munmap(momo2, sizeof(int) * 10);
	a2 = vmem_translate((uint32_t)momo2, current_process);
	
	momo2++;
	return a2;
}
Пример #2
0
int process1()
{
	int* momo1 = (int*)sys_mmap(sizeof(int) * 10);
	int a1 = vmem_translate((uint32_t)momo1, current_process);
	sys_yield();
	
	sys_munmap(momo1, sizeof(int) * 10);
	a1 = vmem_translate((uint32_t)momo1, current_process);
	
	momo1[40000] = 50; // error : data_handler
	momo1++;
	
	return a1;
}
Пример #3
0
int task_signal(task_t* task, task_t* source, int sig, isf_t* state) {
	if(sig > 32) {
		sc_errno = EINVAL;
		return -1;
	}

	if(sig == SIGKILL || sig == SIGSTOP) {
		task->task_state = (sig == SIGKILL) ? TASK_STATE_TERMINATED : TASK_STATE_STOPPED;
		task->interrupt_yield = true;
		return 0;
	}

	// Check task signal mask
	if(bit_get(task->signal_mask, sig)) {
		return 0;
	}

	struct sigaction sa = task->signal_handlers[sig];
	if((uint32_t)sa.sa_handler == SIG_IGN) {
		return 0;
	}

	if(sa.sa_handler && (uint32_t)sa.sa_handler != SIG_DFL) {
		iret_t* iret = task->kernel_stack + PAGE_SIZE - sizeof(iret_t);
		iret->user_esp -= 11 * sizeof(uint32_t);

		uint32_t* user_stack = (uint32_t*)vmem_translate(task->memory_context, iret->user_esp, false);

		// Address of signal handler and signal number as argument to it
		*user_stack = (uint32_t)sa.sa_handler;
		*(user_stack + 1) = sig;

		if(!state) {
			state = task->state;
		}

		// GP registers, will be restored by task_sigjmp_crt0 using popa
		*(user_stack + 2) = state->edi;
		*(user_stack + 3) = state->esi;
		*(user_stack + 4) = (uint32_t)state->ebp;
		*(user_stack + 5) = 0;
		*(user_stack + 6) = state->ebx;
		*(user_stack + 7) = state->edx;
		*(user_stack + 8) = state->ecx;
		*(user_stack + 9) = state->eax;

		// Current EIP, will be jumped back to after handler returns
		*(user_stack + 10) = (uint32_t)iret->entry;
		iret->entry = task_sigjmp_crt0;

		task->task_state = TASK_STATE_RUNNING;
		return 0;
	}

	// Default handlers
	if(sig == SIGCONT && task->task_state == TASK_STATE_STOPPED) {
		task->task_state = TASK_STATE_RUNNING;
		return 0;
	}

	if(sig == SIGCHLD && task->task_state == TASK_STATE_WAITING) {
		task->task_state = TASK_STATE_RUNNING;
		return 0;
	}

	if(sig == SIGCONT || sig == SIGURG) {
		return 0;
	}

	task->task_state = TASK_STATE_TERMINATED;
	task->exit_code = 0x100 | sig;
	task->interrupt_yield = true;
	return 0;
}