Implement kernel brk

This commit is contained in:
Thomas Lovén 2022-01-10 00:06:31 +01:00
parent 4a2dc7e083
commit 8eaa8e6c8f
6 changed files with 68 additions and 4 deletions

View File

@ -28,7 +28,7 @@ void kmain(uint64_t multiboot_magic, void *multiboot_data)
debug_info("Boot complete\n"); debug_info("Boot complete\n");
debug_info("Mallocing\n"); debug_info("Mallocing\n");
uint64_t a = malloc(100); void *a = malloc(100);
debug_info("Malloced %x\n", a); debug_info("Malloced %x\n", a);
PANIC("End of kernel function!"); PANIC("End of kernel function!");

View File

@ -1,6 +1,7 @@
#pragma once #pragma once
#define KERNEL_OFFSET 0xFFFFFF8000000000 #define KERNEL_OFFSET 0xFFFFFF8000000000
#define KERNEL_BRK0 0xFFFFFFC000000000
#define PAGE_PRESENT 0x001 #define PAGE_PRESENT 0x001
#define PAGE_WRITE 0x002 #define PAGE_WRITE 0x002
@ -46,6 +47,9 @@
int memcmp(const void *s1, const void *s2, size_t n); int memcmp(const void *s1, const void *s2, size_t n);
size_t strlen(const char *s); size_t strlen(const char *s);
// memory/kbrk.c
long kbrk(long brk, long, long, long, long, long);
// Link.ld // Link.ld
extern int kernel_start, kernel_end; extern int kernel_start, kernel_end;

View File

@ -0,0 +1,8 @@
#pragma once
#define SYSCALL_BRK 12
typedef long (*syscall_handler)(long, long, long, long, long, long);
// lib/musl-glue.c
syscall_handler set_syscall_handler(long num, syscall_handler handler);

View File

@ -1,22 +1,41 @@
#include <musl-glue.h>
#include <debug.h> #include <debug.h>
syscall_handler syscall_handlers[440];
syscall_handler set_syscall_handler(long num, syscall_handler handler)
{
syscall_handler old = syscall_handlers[num];
syscall_handlers[num] = handler;
return old;
}
long syscall0(long num) long syscall0(long num)
{ {
long retval = 0; long retval = 0;
PANIC("Unknown syscall: %d()\n", num); if(syscall_handlers[num])
retval = syscall_handlers[num](0, 0, 0, 0, 0, 0);
else
PANIC("Unknown syscall: %d()\n", num);
return retval; return retval;
} }
extern long syscall1(long num, long a1) extern long syscall1(long num, long a1)
{ {
long retval = 0; long retval = 0;
PANIC("Unknown syscall: %d(%x)\n", num, a1); if(syscall_handlers[num])
retval = syscall_handlers[num](a1, 0, 0, 0, 0, 0);
else
PANIC("Unknown syscall: %d(%x)\n", num, a1);
return retval; return retval;
} }
extern long syscall2(long num, long a1, long a2) extern long syscall2(long num, long a1, long a2)
{ {
long retval = 0; long retval = 0;
if(syscall_handlers[num])
retval = syscall_handlers[num](a1, a2, 0, 0, 0, 0);
else
PANIC("Unknown syscall: %d(%x, %x)\n", num, a1, a2); PANIC("Unknown syscall: %d(%x, %x)\n", num, a1, a2);
return retval; return retval;
} }
@ -24,6 +43,9 @@ extern long syscall2(long num, long a1, long a2)
extern long syscall3(long num, long a1, long a2, long a3) extern long syscall3(long num, long a1, long a2, long a3)
{ {
long retval = 0; long retval = 0;
if(syscall_handlers[num])
retval = syscall_handlers[num](a1, a2, a3, 0, 0, 0);
else
PANIC("Unknown syscall: %d(%x, %x, %x)\n", num, a1, a2, a3); PANIC("Unknown syscall: %d(%x, %x, %x)\n", num, a1, a2, a3);
return retval; return retval;
} }
@ -31,6 +53,9 @@ extern long syscall3(long num, long a1, long a2, long a3)
extern long syscall4(long num, long a1, long a2, long a3, long a4) extern long syscall4(long num, long a1, long a2, long a3, long a4)
{ {
long retval = 0; long retval = 0;
if(syscall_handlers[num])
retval = syscall_handlers[num](a1, a2, a3, a4, 0, 0);
else
PANIC("Unknown syscall: %d(%x, %x, %x, %x)\n", num, a1, a2, a3, a4); PANIC("Unknown syscall: %d(%x, %x, %x, %x)\n", num, a1, a2, a3, a4);
return retval; return retval;
} }
@ -38,6 +63,9 @@ extern long syscall4(long num, long a1, long a2, long a3, long a4)
extern long syscall5(long num, long a1, long a2, long a3, long a4, long a5) extern long syscall5(long num, long a1, long a2, long a3, long a4, long a5)
{ {
long retval = 0; long retval = 0;
if(syscall_handlers[num])
retval = syscall_handlers[num](a1, a2, a3, a4, a5, 0);
else
PANIC("Unknown syscall: %d(%x, %x, %x, %x, %x)\n", num, a1, a2, a3, a4, a5); PANIC("Unknown syscall: %d(%x, %x, %x, %x, %x)\n", num, a1, a2, a3, a4, a5);
return retval; return retval;
} }
@ -45,6 +73,9 @@ extern long syscall5(long num, long a1, long a2, long a3, long a4, long a5)
extern long syscall6(long num, long a1, long a2, long a3, long a4, long a5, long a6) extern long syscall6(long num, long a1, long a2, long a3, long a4, long a5, long a6)
{ {
long retval = 0; long retval = 0;
PANIC("Unknown syscall: %d(%x, %x, %x, %x, %x, %x)\n", num, a1, a2, a3, a4, a5, a6); if(syscall_handlers[num])
retval = syscall_handlers[num](a1, a2, a3, a4, a5, a6);
else
PANIC("Unknown syscall: %d(%x, %x, %x, %x, %x, %x)\n", num, a1, a2, a3, a4, a5, a6);
return retval; return retval;
} }

18
src/kernel/memory/kbrk.c Normal file
View File

@ -0,0 +1,18 @@
#include <memory.h>
#include <debug.h>
static long _brk = KERNEL_BRK0;
long kbrk(long brk, long, long, long, long, long)
{
if(brk)
{
while(_brk < brk) {
vmm_set_page(kernel_P4, _brk, pmm_alloc(), PAGE_WRITE | PAGE_PRESENT);
_brk += PAGE_SIZE;
}
return _brk;
} else {
return _brk;
}
}

View File

@ -2,6 +2,7 @@
#include <memory.h> #include <memory.h>
#include <debug.h> #include <debug.h>
#include <multiboot.h> #include <multiboot.h>
#include <musl-glue.h>
uint64_t kernel_P4; uint64_t kernel_P4;
@ -37,4 +38,6 @@ void memory_init()
pmm_free(p); pmm_free(p);
} }
} }
set_syscall_handler(SYSCALL_BRK, &kbrk);
} }