diff --git a/src/kernel/boot/kmain.c b/src/kernel/boot/kmain.c index 4671d45..40a5f7e 100644 --- a/src/kernel/boot/kmain.c +++ b/src/kernel/boot/kmain.c @@ -5,6 +5,7 @@ #include #include #include +#include void TEMP_test_scheduler(); @@ -12,6 +13,7 @@ struct kernel_boot_data_st kernel_boot_data; void kmain(uint64_t multiboot_magic, void *multiboot_data) { + musl_init(); debug_info("Started kernel\n"); multiboot_init(multiboot_magic, P2V(multiboot_data)); debug_info("Kernel loaded with command line: \"%s\" by <%s>\n", diff --git a/src/kernel/include/memory.h b/src/kernel/include/memory.h index 6ac0472..47cfcfe 100644 --- a/src/kernel/include/memory.h +++ b/src/kernel/include/memory.h @@ -2,6 +2,7 @@ #define KERNEL_OFFSET 0xFFFFFF8000000000 #define KERNEL_BRK0 0xFFFFFFC000000000 +#define KERNEL_MMAP 0xFFFFFFC010000000 #define PAGE_PRESENT 0x001 #define PAGE_WRITE 0x002 diff --git a/src/kernel/include/musl-glue.h b/src/kernel/include/musl-glue.h index c2569f0..05da0e0 100644 --- a/src/kernel/include/musl-glue.h +++ b/src/kernel/include/musl-glue.h @@ -1,5 +1,7 @@ #pragma once +#include +#define SYSCALL_MMAP 9 #define SYSCALL_BRK 12 #define SYSCALL_IOCTL 16 #define SYSCALL_WRITEV 20 @@ -9,6 +11,7 @@ typedef long (*syscall_handler)(long, long, long, long, long, long); // lib/musl-glue.c syscall_handler set_syscall_handler(long num, syscall_handler handler); +void musl_init(); // drivers/terminal/terminal.c long k_ioctl(long fd, long cmd, long arg3, long, long, long); @@ -16,6 +19,30 @@ long k_writev(long fd, long iov, long iovcnt, long, long, long); // memory/kbrk.c long k_brk(long brk, long, long, long, long, long); +long k_mmap(long addr, long length, long prot, long flags, long fd, long offset); // proc/scheduler.c -long k_sched_yield(long, long, long, long, long, long); \ No newline at end of file +long k_sched_yield(long, long, long, long, long, long); + + +struct __locale_struct { + const struct __locale_map *cat[6]; +}; +struct tls_module { + struct tls_module *next; + void *image; + size_t len, size, align, offset; +}; +struct __libc { + char can_do_threads; + char threaded; + char secure; + volatile signed char need_locks; + int threads_minus_1; + size_t *auxv; + struct tls_module *tls_head; + size_t tls_size, tls_align, tls_cnt; + size_t page_size; + struct __locale_struct global_locale; +}; +extern struct __libc __libc; \ No newline at end of file diff --git a/src/kernel/lib/musl-glue.c b/src/kernel/lib/musl-glue.c index 50f6f15..765cdb8 100644 --- a/src/kernel/lib/musl-glue.c +++ b/src/kernel/lib/musl-glue.c @@ -6,6 +6,7 @@ syscall_handler syscall_handlers[440] = { [SYSCALL_IOCTL] = k_ioctl, [SYSCALL_WRITEV] = k_writev, [SYSCALL_SCHED_YIELD] = k_sched_yield, + [SYSCALL_MMAP] = k_mmap, }; syscall_handler set_syscall_handler(long num, syscall_handler handler) @@ -25,7 +26,7 @@ long syscall0(long num) return retval; } -extern long syscall1(long num, long a1) +long syscall1(long num, long a1) { long retval = 0; if(syscall_handlers[num]) @@ -35,7 +36,7 @@ extern long syscall1(long num, long a1) return retval; } -extern long syscall2(long num, long a1, long a2) +long syscall2(long num, long a1, long a2) { long retval = 0; if(syscall_handlers[num]) @@ -45,7 +46,7 @@ extern long syscall2(long num, long a1, long a2) return retval; } -extern long syscall3(long num, long a1, long a2, long a3) +long syscall3(long num, long a1, long a2, long a3) { long retval = 0; if(syscall_handlers[num]) @@ -55,7 +56,7 @@ extern long syscall3(long num, long a1, long a2, long a3) return retval; } -extern long syscall4(long num, long a1, long a2, long a3, long a4) +long syscall4(long num, long a1, long a2, long a3, long a4) { long retval = 0; if(syscall_handlers[num]) @@ -65,7 +66,7 @@ extern long syscall4(long num, long a1, long a2, long a3, long a4) return retval; } -extern long syscall5(long num, long a1, long a2, long a3, long a4, long a5) +long syscall5(long num, long a1, long a2, long a3, long a4, long a5) { long retval = 0; if(syscall_handlers[num]) @@ -75,7 +76,7 @@ extern long syscall5(long num, long a1, long a2, long a3, long a4, long a5) return retval; } -extern long syscall6(long num, long a1, long a2, long a3, long a4, long a5, long a6) +long syscall6(long num, long a1, long a2, long a3, long a4, long a5, long a6) { long retval = 0; if(syscall_handlers[num]) @@ -83,4 +84,12 @@ extern long syscall6(long num, long a1, long a2, long a3, long a4, long a5, long else PANIC("Unknown syscall: %d(%x, %x, %x, %x, %x, %x)\n", num, a1, a2, a3, a4, a5, a6); return retval; +} + + +size_t auxv[] = {0}; + +void musl_init() +{ + __libc.auxv = auxv; } \ No newline at end of file diff --git a/src/kernel/memory/kbrk.c b/src/kernel/memory/kbrk.c index 3ab1c65..483840f 100644 --- a/src/kernel/memory/kbrk.c +++ b/src/kernel/memory/kbrk.c @@ -2,6 +2,7 @@ #include static long _brk = KERNEL_BRK0; +static long _mmap = KERNEL_MMAP; long k_brk(long brk, long, long, long, long, long) { @@ -15,4 +16,22 @@ long k_brk(long brk, long, long, long, long, long) } else { return _brk; } +} + +long k_mmap(long addr, long length, long prot, long flags, long fd, long offset) +{ + (void)addr; + (void)prot; + (void)flags; + (void)offset; + if(fd != -1) + PANIC("Unknown mmap request\n"); + long retval = _mmap; + while(length > 0) + { + vmm_set_page(kernel_P4, _mmap, pmm_alloc(), PAGE_WRITE | PAGE_PRESENT); + _mmap += PAGE_SIZE; + length -= PAGE_SIZE; + } + return retval; } \ No newline at end of file