From d017f0b24588e30d0be8568c224dca9dc473c360 Mon Sep 17 00:00:00 2001 From: Ruslan Isaev Date: Thu, 31 Jul 2025 17:54:20 +0300 Subject: [PATCH] syscalls: continue making brk syscall --- src/kernel/kernel.c | 2 +- src/tasking/syscalls.c | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c index ae00450..b21397b 100644 --- a/src/kernel/kernel.c +++ b/src/kernel/kernel.c @@ -218,7 +218,7 @@ void kmain(unsigned int magic, unsigned int info) printf("huy1 points to: 0x%X huy2 points to:0x%X\n", huy, huy2); printf("huy1: %s\nhuy2: %s", huy, huy2); - exec_from_file("/ebalo/aye", "/ebalo/"); + exec_from_file("/ebalo/main", "/ebalo/"); while(1) { diff --git a/src/tasking/syscalls.c b/src/tasking/syscalls.c index 604e29d..059e52a 100644 --- a/src/tasking/syscalls.c +++ b/src/tasking/syscalls.c @@ -263,6 +263,38 @@ int sys_getpid(TrapFrame *tf) return current->pid; } +#define DivRoundUp(number, divisor) ((number + divisor - 1) / divisor) + +uint32_t sys_brk(TrapFrame *tf) +{ + if(!tf->ebx) + { + debug_log("current brk is %X\n", (uint32_t)current->brk); + return (uint32_t)current->brk; + } + if(tf->ebx < (uint32_t)current->brk) + { + debug_log("PIZDETS!!!! new brk less than current brk\n"); + while(1){} + } + + uint32_t old_brk_page = DivRoundUp((uint32_t)current->brk, 0x1000); + uint32_t new_brk_page = DivRoundUp(tf->ebx, 0x1000); + + uint32_t pages_needed = new_brk_page - old_brk_page; + for(uint32_t i = 0; i < pages_needed; i++) + { + void* phys_addr = alloc_page(); + void* virt_addr = (void*)(old_brk_page * 0x1000 + i * 0x1000); + map_page(phys_addr, virt_addr, 0x7); + debug_log("mapping page %X to %X\n", phys_addr, virt_addr); + memset(virt_addr, 0, 0x1000); + current->brk = (void*)tf->ebx; + debug_log("new brk is %X\n", (uint32_t)current->brk); + } + return (uint32_t)current->brk; +} + void handle_syscall(TrapFrame *tf) { /* @@ -307,6 +339,10 @@ void handle_syscall(TrapFrame *tf) case 183://getcwd tf->eax = sys_getcwd(tf); break; + + case 0x2d://brk + tf->eax = sys_brk(tf); + break; default: debug_log("unknown syscall: %X\n", tf->eax);