fix several issues relating to elf and registers and add mmap

This commit is contained in:
Matheus
2022-08-18 17:50:34 -03:00
parent fc6d0000c5
commit 0984a6458d
9 changed files with 243 additions and 34 deletions
+1 -1
View File
@@ -17,7 +17,7 @@ syscallret syscall_libc_log(char* str){
strcpy(buf, str);
printf("%s", str);
printf("%s\n", str);
ret.errno = 0;
ret.ret = 0;
+97
View File
@@ -0,0 +1,97 @@
#include <kernel/syscalls.h>
#include <kernel/vmm.h>
#include <sys/types.h>
#include <errno.h>
// linux abi
#define PROT_NONE 0x00
#define PROT_READ 0x01
#define PROT_WRITE 0x02
#define PROT_EXEC 0x04
#define MAP_FILE 0x00
#define MAP_SHARED 0x01
#define MAP_PRIVATE 0x02
#define MAP_FIXED 0x10
#define MAP_ANON 0x20
#define MAP_ANONYMOUS 0x20
#define MAP_NORESERVE 0x4000
#define MS_ASYNC 0x01
#define MS_INVALIDATE 0x02
#define MS_SYNC 0x04
#define MCL_CURRENT 0x01
#define MCL_FUTURE 0x02
#define POSIX_MADV_NORMAL 0
#define POSIX_MADV_RANDOM 1
#define POSIX_MADV_SEQUENTIAL 2
#define POSIX_MADV_WILLNEED 3
#define POSIX_MADV_DONTNEED 4
#define MADV_NORMAL 0
#define MADV_RANDOM 1
#define MADV_SEQUENTIAL 2
#define MADV_WILLNEED 3
#define MADV_DONTNEED 4
#define MADV_FREE 8
#define MREMAP_MAYMOVE 1
#define MREMAP_FIXED 2
#define MFD_CLOEXEC 1U
#define MFD_ALLOW_SEALING 2U
syscallret syscall_mmap(void* hint, size_t len, int prot, int flags, int fd, off_t offset){
syscallret retv;
retv.ret = -1;
retv.errno = 0;
if(len == 0 || hint > USER_SPACE_END){
retv.errno = EINVAL;
return retv;
}
if(flags != (MAP_ANON | MAP_PRIVATE)){
retv.errno = ENOSYS;
return retv;
}
size_t mmuflags = 0;
if(prot & PROT_READ)
mmuflags |= ARCH_MMU_MAP_READ;
if(prot & PROT_WRITE)
mmuflags |= ARCH_MMU_MAP_WRITE;
if(!prot & PROT_EXEC)
mmuflags |= ARCH_MMU_MAP_NOEXEC;
mmuflags |= ARCH_MMU_MAP_USER;
size_t plen = len / PAGE_SIZE + (len % PAGE_SIZE ? 1 : 0);
void* ret = NULL;
if(hint)
ret = vmm_allocnowat(hint, mmuflags, plen) ? hint : NULL; // TODO demand page
if(!ret && !(flags & MAP_FIXED))
ret = vmm_allocfrom(USER_ALLOC_START, mmuflags, len);
if(!ret){
retv.errno = ENOMEM;
if(flags & MAP_ANON)
memset(ret, 0, plen);
}
else
retv.ret = ret;
return retv;
}