Expose enough symbols in the libc internally

This commit is contained in:
Pierre Pronchery 2019-05-30 06:27:42 +02:00
parent f5eeda37ef
commit 1295e52102
7 changed files with 116 additions and 56 deletions

View File

@ -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

91
src/lib/sys/mman.c Normal file
View File

@ -0,0 +1,91 @@
/* $Id$ */
/* Copyright (c) 2018-2019 Pierre Pronchery <khorben@defora.org> */
/* This file is part of DeforaOS uKernel */
#include <stdlib.h>
#include <errno.h>
#include <sys/mman.h>
/* 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;
}

View File

@ -13,11 +13,22 @@
#include <ssp.h>
#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"

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -15,11 +15,19 @@
#include <ssp.h>
#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"