From 1295e521025d740fe2d220c269e082bf41813e8b Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Thu, 30 May 2019 06:27:42 +0200 Subject: [PATCH] Expose enough symbols in the libc internally --- src/lib/project.conf | 2 +- src/lib/sys/mman.c | 91 ++++++++++++++++++++++++++++++++++++++++ src/loader/libk.c | 13 +++++- src/loader/project.conf | 5 ++- tools/arch/amd64/start.S | 19 --------- tools/arch/i386/start.S | 34 --------------- tools/libk.c | 8 ++++ 7 files changed, 116 insertions(+), 56 deletions(-) create mode 100644 src/lib/sys/mman.c diff --git a/src/lib/project.conf b/src/lib/project.conf index c19752f..4934770 100644 --- a/src/lib/project.conf +++ b/src/lib/project.conf @@ -12,4 +12,4 @@ dist=Makefile #targets [libk] type=library -sources=libc/src/ctype.c,libc/src/dirent.c,libc/src/errno.c,libc/src/signal.c,libc/src/ssp/ssp.c,libc/src/ssp.c,libc/src/stdio.c,libc/src/stdlib.c,libc/src/string.c,libc/src/sys/mman.c,libc/src/syscalls.S,libc/src/sys/wait.c,libc/src/termios.c,libc/src/time.c,libc/src/unistd.c +sources=libc/src/ctype.c,libc/src/dirent.c,libc/src/errno.c,libc/src/fcntl.c,libc/src/pwd.c,libc/src/signal.c,libc/src/ssp/ssp.c,libc/src/ssp.c,libc/src/stdio.c,libc/src/stdlib.c,libc/src/string.c,libc/src/syscalls.S,libc/src/sys/ioctl.c,libc/src/sys/stat.c,libc/src/sys/sysctl.c,libc/src/sys/time.c,libc/src/sys/wait.c,libc/src/termios.c,libc/src/time.c,libc/src/unistd.c,sys/mman.c diff --git a/src/lib/sys/mman.c b/src/lib/sys/mman.c new file mode 100644 index 0000000..9b5bf86 --- /dev/null +++ b/src/lib/sys/mman.c @@ -0,0 +1,91 @@ +/* $Id$ */ +/* Copyright (c) 2018-2019 Pierre Pronchery */ +/* This file is part of DeforaOS uKernel */ + + + +#include +#include +#include + + +/* mlock */ +int mlock(const void * addr, size_t length) +{ + errno = ENOSYS; + return -1; +} + + +/* mmap */ +void * mmap(void * addr, size_t length, int prot, int flags, int fd, + off_t offset) +{ + void * ret; + + /* enforce W^X */ + if((prot & (PROT_WRITE | PROT_EXEC)) == (PROT_WRITE | PROT_EXEC)) + { + errno = EPERM; + return MAP_FAILED; + } + /* flags */ + if((flags & MAP_FIXED) == MAP_FIXED) + { + /* XXX verify if the address is aligned and allowed */ + if((flags & MAP_ANONYMOUS) == MAP_ANONYMOUS) + { + errno = ENOTSUP; + ret = MAP_FAILED; + } + ret = addr; + } + else if((flags & MAP_ANONYMOUS) == MAP_ANONYMOUS) + ret = calloc(1, length); + else + ret = malloc(length); + return (ret != NULL) ? ret : MAP_FAILED; +} + + +/* mprotect */ +int mprotect(void * addr, size_t length, int prot) +{ + if(addr == NULL || length == 0) + { + errno = EINVAL; + return -1; + } + /* enforce W^X */ + if((prot & (PROT_WRITE | PROT_EXEC)) == (PROT_WRITE | PROT_EXEC)) + { + errno = EPERM; + return -1; + } + /* FIXME really implement */ + return 0; +} + + +/* munlock */ +int munlock(const void * addr, size_t length) +{ + errno = ENOSYS; + return -1; +} + + +/* munmap */ +int munmap(void * addr, size_t length) +{ + (void) length; + + if(addr == NULL || length == 0) + { + errno = EINVAL; + return -1; + } + /* FIXME check the length? */ + free(addr); + return 0; +} diff --git a/src/loader/libk.c b/src/loader/libk.c index 30dc1c5..7f98cad 100644 --- a/src/loader/libk.c +++ b/src/loader/libk.c @@ -13,11 +13,22 @@ #include #include "lib/libc/src/ctype.c" +#include "lib/libc/src/dirent.c" #include "lib/libc/src/errno.c" #include "lib/libc/src/fcntl.c" +#include "lib/libc/src/pwd.c" +#include "lib/libc/src/signal.c" +#include "lib/libc/src/ssp/ssp.c" #include "lib/libc/src/ssp.c" #include "lib/libc/src/stdio.c" #include "lib/libc/src/stdlib.c" #include "lib/libc/src/string.c" -#include "lib/libc/src/sys/mman.c" +#include "lib/libc/src/sys/ioctl.c" +#include "lib/libc/src/sys/stat.c" +#include "lib/libc/src/sys/sysctl.c" +#include "lib/libc/src/sys/time.c" +#include "lib/libc/src/sys/wait.c" +#include "lib/libc/src/termios.c" +#include "lib/libc/src/time.c" #include "lib/libc/src/unistd.c" +#include "lib/sys/mman.c" diff --git a/src/loader/project.conf b/src/loader/project.conf index da92c7a..ccd1ef8 100644 --- a/src/loader/project.conf +++ b/src/loader/project.conf @@ -27,7 +27,7 @@ asflags=`../../tools/platform.sh -V ULOADER_CFLAGS -C "$$ARCH"` [libuLoader] type=library -sources=boot/multiboot.c,bus.c,bus/cmos.c,bus/ioport.c,bus/vga.c,console.c,console/uart.c,display.c,display/vesa.c,display/vga.c,libk.c +sources=boot/multiboot.c,bus.c,bus/cmos.c,bus/ioport.c,bus/vga.c,console.c,console/uart.c,display.c,display/vesa.c,display/vga.c,libk.c,syscalls.S cflags=`../../tools/platform.sh -V LIBULOADER_CFLAGS -C "$$ARCH"` ldflags=`../../tools/platform.sh -V LIBULOADER_LDFLAGS -C "$$ARCH"` @@ -84,3 +84,6 @@ depends=../drivers/boot/multiboot.h,../../include/kernel/drivers/bus.h,../../inc [start.S] depends=../arch/i386/intr.S,../arch/i386/loader.S,../arch/i386/multiboot.S + +[syscalls.S] +depends=$(OBJDIR)../lib/libc/src/syscalls.o diff --git a/tools/arch/amd64/start.S b/tools/arch/amd64/start.S index bcfcadc..9adf1c1 100644 --- a/tools/arch/amd64/start.S +++ b/tools/arch/amd64/start.S @@ -20,25 +20,6 @@ _syscall_return: ret -/* _brk */ -.global _brk -.type _brk,@function -_brk: - /* FIXME this syscall may differ on different kernels */ - mov $0x11, %rax - syscall - jc .errno - ret - - -/* exit */ -.global _exit -.type _exit, @function -_exit: - mov $0x1, %rax - jmp _syscall - - /* gettimeofday */ .global _gettimeofday .type _gettimeofday, @function diff --git a/tools/arch/i386/start.S b/tools/arch/i386/start.S index 6ec1352..e496546 100644 --- a/tools/arch/i386/start.S +++ b/tools/arch/i386/start.S @@ -32,40 +32,6 @@ _syscall: ret -/* brk */ -.global _brk -.type _brk, @function -_brk: - /* FIXME this syscall may differ on different kernels */ -#ifdef __linux__ - mov $0x2d, %eax - push %ebx - mov 0x8(%esp), %ebx - int $0x80 - pop %ebx - cmp 0x4(%esp), %eax - jle 1f - mov $12, %eax - mov %eax, errno - mov $-1, %eax - ret -1: - mov $0, %eax - ret -#else - mov $0x11, %eax - jmp _syscall -#endif - - -/* exit */ -.global _exit -.type _exit, @function -_exit: - mov $0x1, %eax - jmp _syscall - - /* gettimeofday */ .global _gettimeofday .type _gettimeofday, @function diff --git a/tools/libk.c b/tools/libk.c index 84ab93a..3994592 100644 --- a/tools/libk.c +++ b/tools/libk.c @@ -15,11 +15,19 @@ #include #include "lib/libc/src/ctype.c" +#include "lib/libc/src/dirent.c" #include "lib/libc/src/errno.c" +#include "lib/libc/src/pwd.c" +#include "lib/libc/src/signal.c" +#include "lib/libc/src/ssp/ssp.c" #include "lib/libc/src/ssp.c" #include "lib/libc/src/stdio.c" #include "lib/libc/src/stdlib.c" #include "lib/libc/src/string.c" +#include "lib/libc/src/sys/ioctl.c" #include "lib/libc/src/sys/mman.c" +#include "lib/libc/src/sys/time.c" +#include "lib/libc/src/sys/wait.c" +#include "lib/libc/src/termios.c" #include "lib/libc/src/time.c" #include "lib/libc/src/unistd.c"