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 points to: 0x%X huy2 points to:0x%X\n", huy, huy2);
|
||||||
printf("huy1: %s\nhuy2: %s", huy, huy2);
|
printf("huy1: %s\nhuy2: %s", huy, huy2);
|
||||||
|
|
||||||
exec_from_file("/ebalo/aye", "/ebalo/");
|
exec_from_file("/ebalo/main", "/ebalo/");
|
||||||
|
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -263,6 +263,38 @@ int sys_getpid(TrapFrame *tf)
|
|||||||
return current->pid;
|
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)
|
void handle_syscall(TrapFrame *tf)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@@ -308,6 +340,10 @@ void handle_syscall(TrapFrame *tf)
|
|||||||
tf->eax = sys_getcwd(tf);
|
tf->eax = sys_getcwd(tf);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 0x2d://brk
|
||||||
|
tf->eax = sys_brk(tf);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
debug_log("unknown syscall: %X\n", tf->eax);
|
debug_log("unknown syscall: %X\n", tf->eax);
|
||||||
tf->eax = -1;
|
tf->eax = -1;
|
||||||
|
|||||||
Reference in New Issue
Block a user