gettid syscall, fix issues with vmm and mmap syscall

This commit is contained in:
Matheus
2022-08-18 22:12:51 -03:00
parent da99da2b36
commit 4de0ff2556
9 changed files with 50 additions and 10 deletions
+5
View File
@@ -14,6 +14,11 @@
#define ARCH_MMU_MAP_PAGESIZE (uint64_t)(1 << 7) #define ARCH_MMU_MAP_PAGESIZE (uint64_t)(1 << 7)
#define ARCH_MMU_MAP_ACCESSED (uint64_t)(1 << 5) #define ARCH_MMU_MAP_ACCESSED (uint64_t)(1 << 5)
#define ARCH_MMU_ERROR_WRITE 2
#define ARCH_MMU_ERROR_PRESENT 1
#define ARCH_MMU_ERROR_USER 4
#define ARCH_MMU_ERROR_INSTFETCH 16
typedef uint64_t* arch_mmu_tableptr; typedef uint64_t* arch_mmu_tableptr;
int arch_mmu_map(arch_mmu_tableptr, void*, void*, size_t); int arch_mmu_map(arch_mmu_tableptr, void*, void*, size_t);
+1 -1
View File
@@ -16,7 +16,7 @@ void isr_except(arch_regs *reg){
void isr_pagefault(arch_regs *reg){ void isr_pagefault(arch_regs *reg){
if(!vmm_dealwithrequest(reg->cr2)) if(!vmm_dealwithrequest(reg->cr2, reg->error, reg->cs == 0x3b))
_panic("Page fault!", reg); _panic("Page fault!", reg);
} }
+3 -1
View File
@@ -4,13 +4,15 @@ section .rodata
extern syscall_libc_log extern syscall_libc_log
extern syscall_mmap extern syscall_mmap
extern syscall_arch_ctl extern syscall_arch_ctl
func_count equ 3 extern syscall_gettid
func_count equ 4
func_table: func_table:
dq syscall_libc_log dq syscall_libc_log
dq syscall_mmap dq syscall_mmap
dq syscall_arch_ctl dq syscall_arch_ctl
dq syscall_gettid
section .text section .text
global asm_syscall_entry global asm_syscall_entry
+1
View File
@@ -11,5 +11,6 @@ typedef struct {
syscallret syscall_libc_log(char* str); syscallret syscall_libc_log(char* str);
syscallret syscall_mmap(void* hint, size_t len, int prot, int flags, int fd, off_t offset); syscallret syscall_mmap(void* hint, size_t len, int prot, int flags, int fd, off_t offset);
syscallret syscall_gettid();
#endif #endif
+1 -1
View File
@@ -55,7 +55,7 @@ typedef struct {
void vmm_init(); void vmm_init();
bool vmm_dealwithrequest(void* addr); bool vmm_dealwithrequest(void* addr, long error, bool user);
bool vmm_setused(void* addr, size_t pagec, size_t mmuflags); bool vmm_setused(void* addr, size_t pagec, size_t mmuflags);
bool vmm_unmap(void* addr, size_t pagec); bool vmm_unmap(void* addr, size_t pagec);
bool vmm_map(void* paddr, void* vaddr, size_t pagec, size_t mmuflags); bool vmm_map(void* paddr, void* vaddr, size_t pagec, size_t mmuflags);
+26 -4
View File
@@ -395,14 +395,16 @@ void* vmm_allocfrom(void* addr, size_t mmuflags, size_t pagec){
spinlock_acquire(lock); spinlock_acquire(lock);
addr = findfirstfreearea(findmappingfromaddr(*start, addr), pagec); vmm_mapping* map = findmappingfromaddr(*start, addr);
addr = findfirstfreearea(map, pagec);
if(!addr) if(!addr)
goto _done; goto _done;
if(!setmap(start, addr, pagec, mmuflags, VMM_TYPE_ANON, 0, 0)) if(!setmap(start, addr, pagec, mmuflags, VMM_TYPE_ANON, 0, 0))
addr = NULL; addr = NULL;
_done: _done:
spinlock_release(lock); spinlock_release(lock);
@@ -514,8 +516,11 @@ bool vmm_allocnowat(void* addr, size_t mmuflags, size_t size){
// called by the page fault handler // called by the page fault handler
bool vmm_dealwithrequest(void* addr){ bool vmm_dealwithrequest(void* addr, long error, bool user){
if(user && addr > USER_SPACE_END)
return false;
int* lock; int* lock;
vmm_mapping** start = NULL; vmm_mapping** start = NULL;
@@ -533,10 +538,27 @@ bool vmm_dealwithrequest(void* addr){
status = false; status = false;
goto done; goto done;
} }
if(map->type == VMM_TYPE_FILE) if(map->type == VMM_TYPE_FILE)
_panic("File mappings are not supported (yet)", 0); _panic("File mappings are not supported (yet)", 0);
size_t goodmmuflags = 1;
if(error & ARCH_MMU_ERROR_WRITE)
goodmmuflags |= ARCH_MMU_MAP_WRITE;
if(error & ARCH_MMU_ERROR_USER)
goodmmuflags |= ARCH_MMU_MAP_USER;
if(error & ARCH_MMU_ERROR_INSTFETCH == 0)
goodmmuflags |= ARCH_MMU_MAP_NOEXEC;
if(goodmmuflags != (map->mmuflags & goodmmuflags))
return false;
// allocate a page // allocate a page
addr = (size_t)addr & ~(0xFFF); addr = (size_t)addr & ~(0xFFF);
+1 -1
View File
@@ -304,7 +304,7 @@ int elf_load(thread_t* thread, vnode_t* node, char** argv, char** env){
// also load the executable memory image if we're using an interpreter // also load the executable memory image if we're using an interpreter
if(interp){ if(interp){
for(size_t currentph = 0; currentph < header.ph_count; ++currentph){ for(size_t currentph = 0; currentph < progheader.ph_count; ++currentph){
// read ph // read ph
+9
View File
@@ -0,0 +1,9 @@
#include <kernel/syscalls.h>
#include <arch/cls.h>
syscallret syscall_gettid(){
syscallret retv;
retv.errno = 0;
retv.ret = arch_getcls()->thread->tid;
return retv;
}
+3 -2
View File
@@ -45,6 +45,7 @@
#define MFD_ALLOW_SEALING 2U #define MFD_ALLOW_SEALING 2U
syscallret syscall_mmap(void* hint, size_t len, int prot, int flags, int fd, off_t offset){ syscallret syscall_mmap(void* hint, size_t len, int prot, int flags, int fd, off_t offset){
syscallret retv; syscallret retv;
retv.ret = -1; retv.ret = -1;
@@ -79,10 +80,10 @@ syscallret syscall_mmap(void* hint, size_t len, int prot, int flags, int fd, off
void* ret = NULL; void* ret = NULL;
if(hint) if(hint)
ret = vmm_allocnowat(hint, mmuflags, plen) ? hint : NULL; // TODO demand page ret = vmm_allocnowat(hint, mmuflags, len) ? hint : NULL; // TODO demand page
if(!ret && !(flags & MAP_FIXED)) if(!ret && !(flags & MAP_FIXED))
ret = vmm_allocfrom(USER_ALLOC_START, mmuflags, len); ret = vmm_allocfrom(USER_ALLOC_START, mmuflags, plen);
if(!ret){ if(!ret){
retv.errno = ENOMEM; retv.errno = ENOMEM;