Import a basic implementation of mmap() and munmap()
This commit is contained in:
parent
1141e74ea2
commit
914e11e95e
|
@ -9,6 +9,7 @@
|
|||
|
||||
|
||||
/* constants */
|
||||
# define EPERM 1
|
||||
# define EBADF 9
|
||||
# define ENOMEM 12
|
||||
# define ENODEV 19
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
48
include/sys/mman.h
Normal 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 */
|
|
@ -1 +1 @@
|
|||
dist=Makefile,types.h
|
||||
dist=Makefile,mman.h,types.h
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
64
src/lib/sys/mman.c
Normal 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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user