예제 #1
0
파일: main.c 프로젝트: hypernewbie/refos
/*! @brief Process server main entry point. */
int
main(void)
{
    SET_MUSLC_SYSCALL_TABLE;
    initialise(seL4_GetBootInfo(), &procServ);
    dprintf("======== RefOS Process Server ========\n");

    // -----> Run Root Task Testing.
    #ifdef CONFIG_REFOS_RUN_TESTS
        test_run_all();
    #endif

    // -----> Start RefOS system processes.
    int error;

    error = proc_load_direct("console_server", 252, "", PID_NULL, 
            PROCESS_PERMISSION_DEVICE_IRQ | PROCESS_PERMISSION_DEVICE_MAP |
            PROCESS_PERMISSION_DEVICE_IOPORT);
    if (error) {
        ROS_WARNING("Procserv could not start console_server.");
        assert(!"RefOS system startup error.");
    }

    error = proc_load_direct("file_server", 250, "", PID_NULL, 0x0);
    if (error) {
        ROS_WARNING("Procserv could not start file_server.");
        assert(!"RefOS system startup error.");
    }

    // -----> Start OS level tests.
    #ifdef CONFIG_REFOS_RUN_TESTS
        error = proc_load_direct("test_os", 245, "", PID_NULL, 0x0);
        if (error) {
            ROS_WARNING("Procserv could not start test_os.");
            assert(!"RefOS system startup error.");
        }
    #endif

    // -----> Start RefOS timer server.
    error = proc_load_direct("selfloader", 245, "fileserv/timer_server", PID_NULL,
            PROCESS_PERMISSION_DEVICE_IRQ | PROCESS_PERMISSION_DEVICE_MAP |
            PROCESS_PERMISSION_DEVICE_IOPORT);
    if (error) {
        ROS_WARNING("Procserv could not start timer_server.");
        assert(!"RefOS system startup error.");
    }

    // -----> Start initial task.
    if (strlen(CONFIG_REFOS_INIT_TASK) > 0) {
        error = proc_load_direct("selfloader", CONFIG_REFOS_INIT_TASK_PRIO, CONFIG_REFOS_INIT_TASK,
                                 PID_NULL, 0x0);
        if (error) {
            ROS_WARNING("Procserv could not start initial task.");
            assert(!"RefOS system startup error.");
        }
    }

    return proc_server_loop();
}
예제 #2
0
파일: proc_syscall.c 프로젝트: buaakq/RefOS
/*! @brief Starts a new process. */
refos_err_t
proc_new_proc_handler(void *rpc_userptr , char* rpc_name , char* rpc_params , bool rpc_block ,
                      int32_t rpc_priority , int32_t* rpc_status)
{
    struct proc_pcb *pcb = (struct proc_pcb*) rpc_userptr;
    assert(pcb->magic == REFOS_PCB_MAGIC);
    
    if (!rpc_name) {
        return EINVALIDPARAM;
    }

    /* Kick off an instance of selfloader, which will do the actual process loading work. */
    int error = proc_load_direct("selfloader", rpc_priority, rpc_name, pcb->pid, 0x0);
    if (error != ESUCCESS) {
        ROS_WARNING("failed to run selfloader for new process [%s].", rpc_name);
        return error;
    }

    /* Optionally block parent process until child process has finished. */
    if (rpc_block) {
        /* Save the reply endpoint. */
        proc_save_caller(pcb);
        pcb->parentWaiting = true;
        pcb->rpcClient.skip_reply = true;
        return ESUCCESS;
    }

    /* Immediately resume the parent process. */
    return ESUCCESS;
}