static L4_ThreadId_t launch(L4_BootRec_t *br) { AddrSpace_t *as = task_new(mman_tid); if (!as) { debug("launch: can't create address space for %s\n", L4_Module_Cmdline(br)); return L4_nilthread; } /* we have to explicitly grab these from sigma0 */ L4_Word_t mi; for (mi = 0; mi < L4_Module_Size(br); mi += 4096) { L4_Sigma0_GetPage(L4_nilthread, L4_Fpage(L4_Module_Start(br) + mi, 4096)); } L4_Word_t start = elf_load32(as, L4_Module_Start(br), L4_Module_Size(br)); thread_start(as->tid, start, L4_Module_Cmdline(br), n_paths, dir_paths, dir_caps); printf(" %s\n", L4_Module_Cmdline(br)); return as->tid; }
int elf_load (L4_Word_t file_start, L4_Word_t file_end, L4_Word_t *memory_start, L4_Word_t *memory_end, L4_Word_t *entry) { // Pointer to ELF file header ehdr_t* eh = (ehdr_t*) file_start; // Is it an ELF file? Check ELF magic if (!((eh->ident[0] == 0x7F) && (eh->ident[1] == 'E') && (eh->ident[2] == 'L') && (eh->ident[3] == 'F'))) { return 0; } return elf_load32 (file_start, file_end, memory_start, memory_end, entry); }