diff --git a/src/lib/elf.c b/src/lib/elf.c index 71e3be6b..dcfb7974 100644 --- a/src/lib/elf.c +++ b/src/lib/elf.c @@ -23,9 +23,9 @@ struct elf_hdr { uint16_t type; uint16_t machine; uint32_t version; - uint32_t entry; - uint32_t phoff; - uint32_t shoff; + uint64_t entry; + uint64_t phoff; + uint64_t shoff; uint32_t flags; uint16_t hdr_size; uint16_t phdr_size; @@ -37,12 +37,13 @@ struct elf_hdr { struct elf_phdr { uint32_t p_type; - uint32_t p_offset; - uint32_t p_vaddr; - uint32_t p_paddr; - uint32_t p_filesz; - uint32_t p_memsz; uint32_t p_flags; + uint64_t p_offset; + uint64_t p_vaddr; + uint64_t p_paddr; + uint64_t p_filesz; + uint64_t p_memsz; + uint64_t p_align; }; int echfs_read(struct echfs_file_handle *file, void *buf, uint64_t loc, uint64_t count); @@ -61,6 +62,11 @@ int elf_load(struct echfs_file_handle *fd) { return -1; } + if (hdr.machine != ARCH_X86_64) { + print("Not an x86_64 ELF file.\n"); + return -1; + } + for (uint16_t i = 0; i < hdr.ph_num; i++) { struct elf_phdr phdr; echfs_read(fd, &phdr, hdr.phoff + i * sizeof(struct elf_phdr), @@ -69,13 +75,13 @@ int elf_load(struct echfs_file_handle *fd) { if (phdr.p_type != PT_LOAD) continue; - - echfs_read(fd, (void *)phdr.p_vaddr, phdr.p_offset, phdr.p_filesz); + echfs_read(fd, (void *)(uint32_t)phdr.p_vaddr, + phdr.p_offset, phdr.p_filesz); size_t to_zero = (size_t)(phdr.p_memsz - phdr.p_filesz); if (to_zero) { - void *ptr = (void *)(phdr.p_vaddr + phdr.p_filesz); + void *ptr = (void *)(uint32_t)(phdr.p_vaddr + phdr.p_filesz); memset(ptr, 0, to_zero); } } @@ -83,7 +89,7 @@ int elf_load(struct echfs_file_handle *fd) { asm volatile ( "jmp %0\n\t" : - : "r" (hdr.entry) + : "r" ((uint32_t)hdr.entry) : "memory" ); } diff --git a/src/main.c b/src/main.c index 3bc04472..95ff8f3b 100644 --- a/src/main.c +++ b/src/main.c @@ -83,6 +83,7 @@ void main(int boot_drive) { echfs_open(&f, drive, part, path); echfs_read(&f, (void *)0x100000, 0, f.dir_entry.size); + //elf_load(&f); // Boot the kernel. asm volatile ( diff --git a/test/Makefile b/test/Makefile index 04d67e36..8dc22c83 100644 --- a/test/Makefile +++ b/test/Makefile @@ -1,3 +1,3 @@ test.elf: test.asm linker.ld - nasm test.asm -felf32 -o test.o - ../toolchain/bin/i386-elf-ld test.o -nostdlib -T ./linker.ld -o test.elf + nasm test.asm -felf64 -o test.o + ld test.o -no-pie -nostdlib -T ./linker.ld -o test.elf diff --git a/test/test.asm b/test/test.asm index 4f0bdb03..f378f478 100644 --- a/test/test.asm +++ b/test/test.asm @@ -6,6 +6,8 @@ section .text ; Entry point +bits 32 + global _start _start: mov eax, 0xdeadbeef