diff --git a/zion/CMakeLists.txt b/zion/CMakeLists.txt index 519dbe2..c6b6471 100644 --- a/zion/CMakeLists.txt +++ b/zion/CMakeLists.txt @@ -7,7 +7,6 @@ add_executable(zion interrupt/interrupt.cpp interrupt/interrupt_enter.s interrupt/timer.cpp - loader/elf_loader.cpp loader/init_loader.cpp memory/kernel_heap.cpp memory/kernel_stack_manager.cpp diff --git a/zion/loader/elf_loader.cpp b/zion/loader/elf_loader.cpp deleted file mode 100644 index 9b6a925..0000000 --- a/zion/loader/elf_loader.cpp +++ /dev/null @@ -1,68 +0,0 @@ -#include "loader/elf_loader.h" - -#include "debug/debug.h" -#include "memory/paging_util.h" - -namespace { - -typedef struct { - char ident[16]; - uint16_t type; - uint16_t machine; - uint32_t version; - uint64_t entry; - uint64_t phoff; - uint64_t shoff; - uint32_t flags; - uint16_t ehsize; - uint16_t phentsize; - uint16_t phnum; - uint16_t shentsize; - uint16_t shnum; - uint16_t shstrndx; -} Elf64Header; - -typedef struct { - uint32_t name; - uint32_t type; - uint64_t flags; - uint64_t addr; - uint64_t offset; - uint64_t size; - uint32_t link; - uint32_t info; - uint64_t addralign; - uint64_t entsize; -} Elf64SectionHeader; - -typedef struct { - uint32_t type; - uint32_t flags; - uint64_t offset; - uint64_t vaddr; - uint64_t paddr; - uint64_t filesz; - uint64_t memsz; - uint64_t align; -} Elf64ProgramHeader; - -} // namespace - -uint64_t LoadElfProgram(Process& dest_proc, uint64_t base, uint64_t offset) { - Elf64Header* header = reinterpret_cast(base); - dbgln("phoff: %u phnum: %u", header->phoff, header->phnum); - Elf64ProgramHeader* programs = - reinterpret_cast(base + header->phoff); - for (uint64_t i = 0; i < header->phnum; i++) { - Elf64ProgramHeader& program = programs[i]; - dbgln( - "prog: type: %u, flags: %u, offset: %u\n vaddr: %m, paddr: %m\n " - "filesz: %x, memsz: %x, align: %x", - program.type, program.flags, program.offset, program.vaddr, - program.paddr, program.filesz, program.memsz, program.align); - auto mem_obj = MakeRefCounted(program.filesz); - mem_obj->CopyBytesToObject(base + program.offset, program.filesz); - dest_proc.vmas()->MapInMemoryObject(program.vaddr, mem_obj); - } - return header->entry; -} diff --git a/zion/loader/elf_loader.h b/zion/loader/elf_loader.h deleted file mode 100644 index b2072db..0000000 --- a/zion/loader/elf_loader.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -#include - -#include "object/process.h" - -// Loads the elf program and returns its entry point. -uint64_t LoadElfProgram(Process& dest_proc, uint64_t base, uint64_t length); diff --git a/zion/loader/init_loader.cpp b/zion/loader/init_loader.cpp index 0d370af..471e0ba 100644 --- a/zion/loader/init_loader.cpp +++ b/zion/loader/init_loader.cpp @@ -3,7 +3,6 @@ #include "boot/boot_info.h" #include "debug/debug.h" #include "lib/ref_ptr.h" -#include "loader/elf_loader.h" #include "memory/paging_util.h" #include "object/process.h" #include "object/thread.h" @@ -11,6 +10,66 @@ namespace { +typedef struct { + char ident[16]; + uint16_t type; + uint16_t machine; + uint32_t version; + uint64_t entry; + uint64_t phoff; + uint64_t shoff; + uint32_t flags; + uint16_t ehsize; + uint16_t phentsize; + uint16_t phnum; + uint16_t shentsize; + uint16_t shnum; + uint16_t shstrndx; +} Elf64Header; + +typedef struct { + uint32_t name; + uint32_t type; + uint64_t flags; + uint64_t addr; + uint64_t offset; + uint64_t size; + uint32_t link; + uint32_t info; + uint64_t addralign; + uint64_t entsize; +} Elf64SectionHeader; + +typedef struct { + uint32_t type; + uint32_t flags; + uint64_t offset; + uint64_t vaddr; + uint64_t paddr; + uint64_t filesz; + uint64_t memsz; + uint64_t align; +} Elf64ProgramHeader; + +uint64_t LoadElfProgram(Process& dest_proc, uint64_t base, uint64_t offset) { + Elf64Header* header = reinterpret_cast(base); + dbgln("phoff: %u phnum: %u", header->phoff, header->phnum); + Elf64ProgramHeader* programs = + reinterpret_cast(base + header->phoff); + for (uint64_t i = 0; i < header->phnum; i++) { + Elf64ProgramHeader& program = programs[i]; + dbgln( + "prog: type: %u, flags: %u, offset: %u\n vaddr: %m, paddr: %m\n " + "filesz: %x, memsz: %x, align: %x", + program.type, program.flags, program.offset, program.vaddr, + program.paddr, program.filesz, program.memsz, program.align); + auto mem_obj = MakeRefCounted(program.filesz); + mem_obj->CopyBytesToObject(base + program.offset, program.filesz); + dest_proc.vmas()->MapInMemoryObject(program.vaddr, mem_obj); + } + return header->entry; +} + bool streq(const char* a, const char* b) { while (true) { if (*a == '\0' && *b == '\0') return true; diff --git a/zion/object/thread.cpp b/zion/object/thread.cpp index af29bd3..fb9d068 100644 --- a/zion/object/thread.cpp +++ b/zion/object/thread.cpp @@ -2,7 +2,6 @@ #include "common/gdt.h" #include "debug/debug.h" -#include "loader/elf_loader.h" #include "memory/paging_util.h" #include "object/process.h" #include "scheduler/scheduler.h" diff --git a/zion/syscall/syscall.cpp b/zion/syscall/syscall.cpp index b190297..ec933c3 100644 --- a/zion/syscall/syscall.cpp +++ b/zion/syscall/syscall.cpp @@ -5,7 +5,6 @@ #include "debug/debug.h" #include "include/zcall.h" #include "include/zerrors.h" -#include "loader/elf_loader.h" #include "object/process.h" #include "scheduler/process_manager.h" #include "scheduler/scheduler.h"