Add mmap kernel syscall. Needed for large malloc

This commit is contained in:
Thomas Lovén 2022-01-11 22:08:00 +01:00
parent fc54366eec
commit a162680f5a
5 changed files with 65 additions and 7 deletions

View File

@ -5,6 +5,7 @@
#include <terminal.h>
#include <debug.h>
#include <proc.h>
#include <musl-glue.h>
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",

View File

@ -2,6 +2,7 @@
#define KERNEL_OFFSET 0xFFFFFF8000000000
#define KERNEL_BRK0 0xFFFFFFC000000000
#define KERNEL_MMAP 0xFFFFFFC010000000
#define PAGE_PRESENT 0x001
#define PAGE_WRITE 0x002

View File

@ -1,5 +1,7 @@
#pragma once
#include <stddef.h>
#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);
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;

View File

@ -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])
@ -84,3 +85,11 @@ extern long syscall6(long num, long a1, long a2, long a3, long a4, long a5, long
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;
}

View File

@ -2,6 +2,7 @@
#include <debug.h>
static long _brk = KERNEL_BRK0;
static long _mmap = KERNEL_MMAP;
long k_brk(long brk, long, long, long, long, long)
{
@ -16,3 +17,21 @@ long k_brk(long brk, long, long, long, long, long)
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;
}