From 5b5de55919ddf3ede48d383d0800f01fa779b1d6 Mon Sep 17 00:00:00 2001 From: Ruslan Isaev Date: Tue, 8 Jul 2025 18:53:06 +0300 Subject: [PATCH] i'm so close --- src/mm/paging.c | 2 +- src/tasking/syscalls.c | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/mm/paging.c b/src/mm/paging.c index 84dae5a..467eeb3 100644 --- a/src/mm/paging.c +++ b/src/mm/paging.c @@ -180,7 +180,7 @@ void destroy_page_dir(uint32_t* page_dir_virt) { // If the page table entry is present, free the physical page (frame) it points to if (pte & PAGE_PRESENT) { - debug_log("freeing page %X\n", pte); + //debug_log("freeing page %X\n", pte); free_page((void*)(pte & ~0xFFF)); } } diff --git a/src/tasking/syscalls.c b/src/tasking/syscalls.c index 0051c30..ec5cd2c 100644 --- a/src/tasking/syscalls.c +++ b/src/tasking/syscalls.c @@ -103,7 +103,14 @@ int sys_fork(TrapFrame *tf) sp -= sizeof(TrapFrame); child->tf = (TrapFrame*)sp; - *child->tf = *tf; + memcpy(&child->tf->gs, &tf->gs, 12 * sizeof(uint32_t)); + uint32_t* parent_cpu_state_ptr = (uint32_t*)&tf->interrupt; + child->tf->eip = parent_cpu_state_ptr[0]; + child->tf->cs = parent_cpu_state_ptr[1]; + child->tf->eflags = parent_cpu_state_ptr[2]; + child->tf->usermode_esp = parent_cpu_state_ptr[3]; + child->tf->usermode_ss = parent_cpu_state_ptr[4]; + child->tf->eax = 0; // Child returns 0 debug_log("Parent returns PID: %X, Child returns 0\n", child->pid);