syscalls: continue making brk syscall

This commit is contained in:
2025-07-31 17:54:20 +03:00
parent df45ffe2ce
commit d017f0b245
2 changed files with 37 additions and 1 deletions
+1 -1
View File
@@ -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)
{
+36
View File
@@ -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);