extern void trapKernel(ExceptionStackFrame *exceptionStackFrame) { TracePrintf(512, "trapKernel: vector(%d), code(%d), addr(%d), psr(%d), pc(%d), sp(%d), regs(%s)\n", exceptionStackFrame->vector, exceptionStackFrame->code, exceptionStackFrame->addr, exceptionStackFrame->psr, exceptionStackFrame->pc, exceptionStackFrame->sp, exceptionStackFrame->regs); int temp = 0; switch(exceptionStackFrame->code){ case YALNIX_FORK: TracePrintf(0, "calling kernel Fork()"); break; case YALNIX_EXEC: KernelExec((char *)exceptionStackFrame->regs[1], (char **)exceptionStackFrame->regs[2], exceptionStackFrame); break; default: break; } }
void TrapKernel(UserContext *user_context) { TracePrintf(TRACE_LEVEL_FUNCTION_INFO, ">>> TrapKernel(%p)\n", user_context); int rc; // Call approriate syscall based on code switch(user_context->code){ case YALNIX_DELAY: rc = KernelDelay(user_context->regs[0], user_context); break; case YALNIX_FORK: rc = KernelFork(user_context); break; case YALNIX_GETPID: rc = KernelGetPid(); break; case YALNIX_EXEC: rc = KernelExec((char *) user_context->regs[0], (char **) user_context->regs[1], user_context); break; case YALNIX_WAIT: rc = KernelWait((int *)user_context->regs[0], user_context); break; case YALNIX_EXIT: KernelExit(user_context->regs[0], user_context); break; case YALNIX_BRK: rc = KernelBrk((void *) user_context->regs[0]); break; case YALNIX_TTY_READ: rc = KernelTtyRead(user_context->regs[0], (void *) user_context->regs[1], user_context->regs[2], user_context); break; case YALNIX_TTY_WRITE: rc = KernelTtyWrite(user_context->regs[0], (void *) user_context->regs[1], user_context->regs[2], user_context); break; case YALNIX_PIPE_INIT: rc = KernelPipeInit((int *) user_context->regs[0]); break; case YALNIX_PIPE_READ: rc = KernelPipeRead(user_context->regs[0], (void *) user_context->regs[1], user_context->regs[2], user_context); break; case YALNIX_PIPE_WRITE: rc = KernelPipeWrite(user_context->regs[0], (void *) user_context->regs[1], user_context->regs[2], user_context); break; case YALNIX_LOCK_INIT: rc = KernelLockInit((int *) user_context->regs[0]); break; case YALNIX_LOCK_ACQUIRE: rc = KernelAcquire(user_context->regs[0], user_context); break; case YALNIX_LOCK_RELEASE: rc = KernelRelease(user_context->regs[0]); break; case YALNIX_CVAR_INIT: rc = KernelCvarInit((int *) user_context->regs[0]); break; case YALNIX_CVAR_SIGNAL: rc = KernelCvarSignal(user_context->regs[0]); break; case YALNIX_CVAR_BROADCAST: rc = KernelCvarBroadcast(user_context->regs[0]); break; case YALNIX_CVAR_WAIT: rc = KernelCvarWait(user_context->regs[0], user_context->regs[1], user_context); break; case YALNIX_RECLAIM: rc = KernelReclaim(user_context->regs[0]); break; default: TracePrintf(TRACE_LEVEL_NON_TERMINAL_PROBLEM, "TrapKernel: Code %d undefined\n"); KernelExit(ERROR, user_context); rc = ERROR; break; } user_context->regs[0] = rc; TracePrintf(TRACE_LEVEL_FUNCTION_INFO, "<<< TrapKernel() rc=%d\n", rc); }