/*! @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(); }
/*! @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; }