diff --git a/kernel/src/exec/elf.c b/kernel/src/exec/elf.c index 3da3213..7d2079d 100644 --- a/kernel/src/exec/elf.c +++ b/kernel/src/exec/elf.c @@ -65,7 +65,7 @@ program_t *elf_load(char *data) { if (!(phdr[i].p_flags & PF_X)) flags |= VMM_NX; - flags |= VMM_USER; // User mode access + flags |= VMM_USER; log("elf - loading ELF program header %u: vaddr 0x%llx - 0x%llx, offset 0x%llx, filesz 0x%llx, size 0x%llx, flags 0x%llx\n", i, vaddr_start, vaddr_end, offset, phdr[i].p_filesz, phdr[i].p_memsz, flags); @@ -81,7 +81,9 @@ program_t *elf_load(char *data) { return 0; } + log("elf - vmm_map(%p, %p, %p, %d)\n", pm, vaddr, phys, flags); vmm_map(pm, vaddr, phys, flags); + log("elf - memset(%p, 0, 0x1000)\n", HIGHER_HALF(phys)); memset((void *)HIGHER_HALF(phys), 0, PMM_PAGE_SIZE); uint64_t file_page_offset = offset + (vaddr - vaddr_start); @@ -109,6 +111,7 @@ program_t *elf_load(char *data) { { void *dest = (void *)(HIGHER_HALF(phys) + page_data_offset); void *src = (uint8_t *)data + copy_offset; + log("elf - memcpy(%p, %p, %d)\n", dest, src, copy_size); memcpy(dest, src, copy_size); //log("elf - copied 0x%llx bytes from ELF file offset 0x%llx to vaddr 0x%llx (phys 0x%llx)\n", diff --git a/kernel/src/mm/vmm.c b/kernel/src/mm/vmm.c index fdaf2a3..1593903 100755 --- a/kernel/src/mm/vmm.c +++ b/kernel/src/mm/vmm.c @@ -171,18 +171,19 @@ uint64_t vmm_get_flags(pagemap_t* pm, uint64_t vaddr) { return pml1[pml1_entry] & 0x7000000000000FFF; } - + uint64_t virt_to_phys(pagemap_t *pagemap, uint64_t virt) { - uint64_t pml1_idx = (virt & (uint64_t)0x1ff << 12) >> 12; - uint64_t pml2_idx = (virt & (uint64_t)0x1ff << 21) >> 21; - uint64_t pml3_idx = (virt & (uint64_t)0x1ff << 30) >> 30; - uint64_t pml4_idx = (virt & (uint64_t)0x1ff << 39) >> 39; + uint64_t pml4_idx = (virt >> 39) & 0x1FF; + uint64_t pml3_idx = (virt >> 30) & 0x1FF; + uint64_t pml2_idx = (virt >> 21) & 0x1FF; + uint64_t pml1_idx = (virt >> 12) & 0x1FF; uint64_t *pml3 = __vmm_get_next_lvl(pagemap->toplevel, pml4_idx, 0); uint64_t *pml2 = __vmm_get_next_lvl(pml3, pml3_idx, 0); uint64_t *pml1 = __vmm_get_next_lvl(pml2, pml2_idx, 0); - uint64_t phys_addr = pml1[pml1_idx] & 0x000FFFFFFFFFF000; + + uint64_t phys_addr = pml1[pml1_idx] & 0x000FFFFFFFFFF000; // Masque pour obtenir l'adresse physique (en retirant les bits de flags) return phys_addr; } diff --git a/kernel/src/sys/arch/x86_64/interrupts.c b/kernel/src/sys/arch/x86_64/interrupts.c index 7bcd7ba..15b7773 100755 --- a/kernel/src/sys/arch/x86_64/interrupts.c +++ b/kernel/src/sys/arch/x86_64/interrupts.c @@ -1,5 +1,6 @@ //#include "mm/pmm.h" //#include "mm/vmm.h" +#include "mm/pmm.h" #include "mm/vmm.h" #include "sched/sched.h" #include "sys/arch/x86_64/pic.h" @@ -44,8 +45,9 @@ void exception_handler(registers_t *regs) { if(regs->int_no == 0xe) { uint64_t cr2; asm ("mov %%cr2, %0" : "=r"(cr2)); - log("ints - PF: Faulting location: %p\n", cr2); + log("ints - PF: Faulting location: %p (%p)\n", cr2, virt_to_phys(vmm_current_pm, cr2)); log("ints - PF: Faulting page flags: %p\n", vmm_get_flags(vmm_current_pm, cr2)); + log("ints - PF: Faulting page map: %p\n", PHYSICAL(vmm_current_pm)); } // dump_backtrace(regs); diff --git a/testing/build.sh b/testing/build.sh new file mode 100755 index 0000000..ff9f5f5 --- /dev/null +++ b/testing/build.sh @@ -0,0 +1,3 @@ +nasm -f elf64 test.asm -o test.o +ld -T link.ld -nostdlib --no-dynamic-linker --strip-all test.o -o sk-hello.elf +echo "Test executable has been built successfully." \ No newline at end of file diff --git a/testing/sk-hello.elf b/testing/sk-hello.elf index 51f21a4..e970bd3 100755 Binary files a/testing/sk-hello.elf and b/testing/sk-hello.elf differ diff --git a/testing/test.asm b/testing/test.asm index dd15463..0fbea26 100644 --- a/testing/test.asm +++ b/testing/test.asm @@ -4,5 +4,7 @@ section .text _start: int 0x80 -lol: - jmp lol \ No newline at end of file + ; tell the kernel to exit the process. + mov rax, 10 + int 0x80 + ret \ No newline at end of file diff --git a/testing/test.o b/testing/test.o index 0be31d3..8eb605d 100644 Binary files a/testing/test.o and b/testing/test.o differ diff --git a/util/get_vaddr_info.py b/util/get_vaddr_info.py new file mode 100755 index 0000000..6020da7 --- /dev/null +++ b/util/get_vaddr_info.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python3 + +import sys + +if len(sys.argv) != 2: + print(f"Usage: {sys.argv[0]} ") + sys.exit(1) + +va = int(sys.argv[1], 16) + +def extract_index(name, shift): + return (va >> shift) & 0x1FF + +print(f"Virtual address : 0x{va:016x}") +print(f"PML4 index : {extract_index('PML4', 39)}") +print(f"PDPT index : {extract_index('PDPT', 30)}") +print(f" PD index : {extract_index('PD', 21)}") +print(f" PT index : {extract_index('PT', 12)}") +print(f" Offset : {va & 0xFFF}")