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