Import a basic implementation of mmap() and munmap()

This commit is contained in:
Pierre Pronchery 2018-06-22 00:38:27 +02:00
parent 1141e74ea2
commit 914e11e95e
8 changed files with 165 additions and 2 deletions

View File

@ -9,6 +9,7 @@
/* constants */
# define EPERM 1
# define EBADF 9
# define ENOMEM 12
# define ENODEV 19

View File

@ -57,6 +57,31 @@ typedef unsigned long uintptr_t;
typedef unsigned long size_t;
/* constants */
# define INT8_MAX 0x7f
# define INT16_MAX 0x7fff
# define INT32_MAX 0x7fffffff
# define INT64_MAX 0x7fffffffffffffff
# define INT8_MIN (-INT8_MAX - 1)
# define INT16_MIN (-INT16_MAX - 1)
# define INT32_MIN (-INT32_MAX - 1)
# define INT64_MIN (-INT64_MAX - 1)
# define UINT8_MAX 0xff
# define UINT16_MAX 0xffff
# define UINT32_MAX 0xffffffff
# define UINT64_MAX 0xffffffffffffffff
# ifndef ULONG_MAX
# ifdef _LP64 /* FIXME probably sometimes wrong */
# define ULONG_MAX 0xffffffffffffffff
# else
# define ULONG_MAX 0xffffffff
# endif
# endif
# ifndef SIZE_MAX
# define SIZE_MAX ULONG_MAX
# endif

View File

@ -15,6 +15,7 @@
void abort(void);
int abs(int x);
uint32_t arc4random(void);
void * calloc(size_t nmemb, size_t size);
void exit(int status);
void free(void * ptr);
long labs(long x);

48
include/sys/mman.h Normal file
View File

@ -0,0 +1,48 @@
/* $Id$ */
/* Copyright (c) 2018 Pierre Pronchery <khorben@defora.org> */
/* This file is part of DeforaOS uKernel */
#ifndef UKERNEL_SYS_MMAN_H
# define UKERNEL_SYS_MMAN_H
/* types */
# ifndef mode_t
# define mode_t mode_t
typedef unsigned int mode_t;
# endif
# ifndef off_t
# define off_t off_t
typedef long long off_t;
# endif
# ifndef size_t
# define size_t size_t
typedef unsigned long size_t;
# endif
/* constants */
# define MAP_FAILED ((void *)-1)
# define MAP_SHARED 0x0001
# define MAP_PRIVATE 0x0002
# define MAP_FIXED 0x0010
# define MAP_ANONYMOUS 0x1000
# define PROT_NONE 0x0
# define PROT_READ 0x1
# define PROT_WRITE 0x2
# define PROT_EXEC 0x4
/* functions */
int mlock(const void * addr, size_t length);
void * mmap(void * addr, size_t length, int prot, int flags, int fd,
off_t offset);
int mprotect(void * addr, size_t length, int prot);
int munlock(const void * addr, size_t length);
int munmap(void * addr, size_t length);
#endif /* !UKERNEL_SYS_MMAN_H */

View File

@ -1 +1 @@
dist=Makefile,types.h
dist=Makefile,mman.h,types.h

View File

@ -7,7 +7,7 @@ dist=Makefile,ssp.h
[libuKernel]
type=library
sources=ctype.c,errno.c,ssp.c,stdio.c,stdlib.c,string.c,unistd.c
sources=ctype.c,errno.c,ssp.c,stdio.c,stdlib.c,string.c,sys/mman.c,unistd.c
[ctype.c]
depends=../../include/ctype.h
@ -26,3 +26,6 @@ depends=../../include/stdlib.h,../../include/unistd.h
[string.c]
depends=../../include/string.h
[sys/mman.c]
depends=../../include/sys/mman.h

View File

@ -4,7 +4,9 @@
#include <stdint.h>
#include <unistd.h>
#include <string.h>
#include <limits.h>
#include <errno.h>
#include <stdlib.h>
@ -48,6 +50,25 @@ uint32_t arc4random(void)
}
/* calloc */
void * calloc(size_t nmemb, size_t size)
{
void * ptr;
size_t sz;
if(nmemb != 0 && size != 0 && SIZE_MAX / nmemb < size)
{
errno = ENOMEM;
return NULL;
}
sz = nmemb * size;
if((ptr = malloc(sz)) == NULL)
return NULL;
memset(ptr, 0, sz);
return ptr;
}
/* exit */
void exit(int status)
{

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

@ -0,0 +1,64 @@
/* $Id$ */
/* Copyright (c) 2018 Pierre Pronchery <khorben@defora.org> */
/* This file is part of DeforaOS uKernel */
#include <stdlib.h>
#include <errno.h>
#include <sys/mman.h>
/* 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_PRIVATE) != MAP_PRIVATE)
{
errno = EINVAL;
return MAP_FAILED;
}
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;
}
/* FIXME really implement */
return 0;
}
/* munmap */
int munmap(void * addr, size_t length)
{
(void) length;
if(length == 0)
{
errno = EINVAL;
return -1;
}
/* FIXME check the length? */
free(addr);
return 0;
}