void ProcessManager_BootstrapProcess(int argc, char **argv) { //Get the current process ID ProcessInfo* p_inf = ProcessManager_GetCurProcessInfo (); //We would want to copy the args into the KTLS so they can be pulled out later UID tmp = Elf_Load(p_inf->path, (p_inf->flags & 2)?ELF_KERNEL:ELF_USER); if(tmp != -1 && tmp != -2)Elf_Start(tmp); }
s32 __MLoad_Ioctlv(u32 cmd, ioctlv *vector, u32 inlen, u32 iolen) { s32 ret = IPC_ENOENT; /* Invalidate cache */ InvalidateVector(vector, inlen, iolen); /* Check command */ switch (cmd) { case MLOAD_GET_IOS_INFO: { iosInfo *buffer = vector[0].data; /* Copy IOS info */ memcpy(buffer, &ios, sizeof(ios)); /* Success */ ret = 0; break; } case MLOAD_GET_MLOAD_VERSION: { /* Return MLOAD version */ ret = (MLOAD_VER << 4) | MLOAD_SUBVER; break; } case MLOAD_GET_LOAD_BASE: { u32 *address = (u32 *)vector[0].data; u32 *size = (u32 *)vector[1].data; /* Modules area info */ *address = (u32)exe_mem; *size = (u32)exe_mem_size; /* Success */ ret = 0; break; } case MLOAD_LOAD_ELF: { void *data = vector[0].data; /* Load ELF */ ret = Elf_Load(data); break; } case MLOAD_RUN_ELF: { /* Run ELF */ ret = Elf_Run(); break; } case MLOAD_RUN_THREAD: { u32 start = *(u32 *)vector[0].data; u32 stack = *(u32 *)vector[1].data; u32 slen = *(u32 *)vector[2].data; u32 prio = *(u32 *)vector[3].data; /* Run thread */ ret = Elf_RunThread((void *)start, NULL, (void *)stack, slen, prio); break; } case MLOAD_STOP_THREAD: { u32 tid = *(u32 *)vector[0].data; /* Stop thread */ ret = Elf_StopThread(tid); break; } case MLOAD_CONTINUE_THREAD: { u32 tid = *(u32 *)vector[0].data; /* Continue thread */ ret = Elf_ContinueThread(tid); break; } case MLOAD_MEMSET: { u32 addr = *(u32 *)vector[0].data; u32 val = *(u32 *)vector[1].data; u32 len = *(u32 *)vector[2].data; /* Invalidate cache */ os_sync_before_read((void *)addr, len); /* Do memset */ memset((void *)addr, val, len); /* Success */ ret = 0; break; } case MLOAD_SET_LOG_MODE: { u32 mode = *(u32 *)vector[0].data; /* Set debug mode */ ret = Debug_SetMode(mode); break; } case MLOAD_GET_LOG_BUFFER: { char *buffer = (char *)vector[0].data; u32 len = *(u32 *)vector[0].len; /* Get debug buffer */ ret = Debug_GetBuffer(buffer, len-1); break; } default: break; } /* Flush cache */ FlushVector(vector, inlen, iolen); return ret; }