Add mmap kernel syscall. Needed for large malloc
This commit is contained in:
parent
fc54366eec
commit
a162680f5a
@ -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",
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
#define KERNEL_OFFSET 0xFFFFFF8000000000
|
||||
#define KERNEL_BRK0 0xFFFFFFC000000000
|
||||
#define KERNEL_MMAP 0xFFFFFFC010000000
|
||||
|
||||
#define PAGE_PRESENT 0x001
|
||||
#define PAGE_WRITE 0x002
|
||||
|
@ -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;
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user