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; }
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; }
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; }