diff --git a/src/kernel/boot/kmain.c b/src/kernel/boot/kmain.c index 50ba9eb..b427b7c 100644 --- a/src/kernel/boot/kmain.c +++ b/src/kernel/boot/kmain.c @@ -28,7 +28,7 @@ void kmain(uint64_t multiboot_magic, void *multiboot_data) debug_info("Boot complete\n"); debug_info("Mallocing\n"); - uint64_t a = malloc(100); + void *a = malloc(100); debug_info("Malloced %x\n", a); PANIC("End of kernel function!"); diff --git a/src/kernel/include/memory.h b/src/kernel/include/memory.h index 2352d15..fbbb62c 100644 --- a/src/kernel/include/memory.h +++ b/src/kernel/include/memory.h @@ -1,6 +1,7 @@ #pragma once #define KERNEL_OFFSET 0xFFFFFF8000000000 +#define KERNEL_BRK0 0xFFFFFFC000000000 #define PAGE_PRESENT 0x001 #define PAGE_WRITE 0x002 @@ -46,6 +47,9 @@ int memcmp(const void *s1, const void *s2, size_t n); size_t strlen(const char *s); + // memory/kbrk.c + long kbrk(long brk, long, long, long, long, long); + // Link.ld extern int kernel_start, kernel_end; diff --git a/src/kernel/include/musl-glue.h b/src/kernel/include/musl-glue.h new file mode 100644 index 0000000..573caab --- /dev/null +++ b/src/kernel/include/musl-glue.h @@ -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); \ No newline at end of file diff --git a/src/kernel/lib/musl-glue.c b/src/kernel/lib/musl-glue.c index 2c15a9a..a5a9f46 100644 --- a/src/kernel/lib/musl-glue.c +++ b/src/kernel/lib/musl-glue.c @@ -1,22 +1,41 @@ +#include #include +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 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; } extern long syscall1(long num, long a1) { 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; } extern long syscall2(long num, long a1, long a2) { 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); 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) { 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); 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) { 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); 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) { 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); 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) { 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; } \ No newline at end of file diff --git a/src/kernel/memory/kbrk.c b/src/kernel/memory/kbrk.c new file mode 100644 index 0000000..da0b193 --- /dev/null +++ b/src/kernel/memory/kbrk.c @@ -0,0 +1,18 @@ +#include +#include + +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; + } +} \ No newline at end of file diff --git a/src/kernel/memory/memory.c b/src/kernel/memory/memory.c index 36f5522..2f3e519 100644 --- a/src/kernel/memory/memory.c +++ b/src/kernel/memory/memory.c @@ -2,6 +2,7 @@ #include #include #include +#include uint64_t kernel_P4; @@ -37,4 +38,6 @@ void memory_init() pmm_free(p); } } + + set_syscall_handler(SYSCALL_BRK, &kbrk); } \ No newline at end of file