syscalls: continue making brk syscall
This commit is contained in:
+1
-1
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user