mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-27 12:48:22 +00:00
gettid syscall, fix issues with vmm and mmap syscall
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user