mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-31 06:28:22 +00:00
file mapping stub
This commit is contained in:
@@ -85,6 +85,18 @@ int devman_poll(int dev, pollfd* fd){
|
||||
return majorcalls[major(dev)]->poll(minor(dev), fd);
|
||||
}
|
||||
|
||||
int devman_map(int dev, void* addr, size_t len, size_t offset, size_t mmuflags){
|
||||
|
||||
if(major(dev) > highestmajor)
|
||||
return ENOTTY;
|
||||
|
||||
if(!majorcalls[major(dev)]->map)
|
||||
return ENOTTY;
|
||||
|
||||
return majorcalls[major(dev)]->map(minor(dev), addr, len, offset, mmuflags);
|
||||
|
||||
}
|
||||
|
||||
void devman_init(){
|
||||
|
||||
devfs_init();
|
||||
|
||||
@@ -551,6 +551,30 @@ bool vmm_setfree(void* addr, size_t pagec){
|
||||
return result;
|
||||
}
|
||||
|
||||
int vmm_mapfile(vnode_t* node, void* addr, size_t len, size_t offset, size_t mmuflags){
|
||||
|
||||
int* lock;
|
||||
vmm_mapping** start;
|
||||
|
||||
getcontextinfo(addr, &lock, &start);
|
||||
|
||||
spinlock_acquire(lock);
|
||||
|
||||
int err = 0;
|
||||
|
||||
if(!setmap(start, addr, len, mmuflags, VMM_TYPE_FILE, node, offset))
|
||||
err = ENOMEM;
|
||||
|
||||
if(err == 0)
|
||||
err = vfs_map(node, addr, len, offset, mmuflags);
|
||||
|
||||
spinlock_release(lock);
|
||||
|
||||
return err;
|
||||
|
||||
|
||||
}
|
||||
|
||||
bool vmm_map(void* paddr, void* vaddr, size_t pagec, size_t mmuflags){
|
||||
int* lock;
|
||||
vmm_mapping** start;
|
||||
|
||||
+44
-16
@@ -2,6 +2,7 @@
|
||||
#include <kernel/vmm.h>
|
||||
#include <sys/types.h>
|
||||
#include <errno.h>
|
||||
#include <arch/cls.h>
|
||||
|
||||
// linux abi
|
||||
|
||||
@@ -44,7 +45,7 @@
|
||||
#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 syscall_mmap(void* hint, size_t len, int prot, int flags, int ifd, off_t offset){
|
||||
|
||||
syscallret retv;
|
||||
|
||||
@@ -55,12 +56,6 @@ syscallret syscall_mmap(void* hint, size_t len, int prot, int flags, int fd, off
|
||||
retv.errno = EINVAL;
|
||||
return retv;
|
||||
}
|
||||
|
||||
if((flags & (MAP_ANON | MAP_PRIVATE)) != (MAP_ANON | MAP_PRIVATE)){
|
||||
retv.errno = ENOSYS;
|
||||
return retv;
|
||||
|
||||
}
|
||||
|
||||
size_t mmuflags = 0;
|
||||
|
||||
@@ -79,17 +74,50 @@ syscallret syscall_mmap(void* hint, size_t len, int prot, int flags, int fd, off
|
||||
|
||||
void* ret = NULL;
|
||||
|
||||
if(hint)
|
||||
ret = vmm_allocnowat(hint, mmuflags, len) ? hint : NULL; // TODO demand page
|
||||
if(ret == NULL && (flags & MAP_FIXED) == 0)
|
||||
if(flags & MAP_ANON){
|
||||
|
||||
if(hint)
|
||||
ret = vmm_allocnowat(hint, mmuflags, len) ? hint : NULL; // TODO demand page
|
||||
if(ret == NULL && (flags & MAP_FIXED) == 0)
|
||||
ret = vmm_allocfrom(USER_ALLOC_START, mmuflags, plen);
|
||||
|
||||
if(!ret)
|
||||
retv.errno = ENOMEM;
|
||||
else{
|
||||
retv.ret = ret;
|
||||
if(hint && (flags & MAP_ANON))
|
||||
memset(ret, 0, plen*PAGE_SIZE);
|
||||
}
|
||||
}
|
||||
else{
|
||||
|
||||
// open node
|
||||
|
||||
proc_t* proc = arch_getcls()->thread->proc;
|
||||
|
||||
fd_t* fd;
|
||||
|
||||
retv.errno = fd_access(&proc->fdtable, &fd, ifd);
|
||||
|
||||
if(retv.errno)
|
||||
return retv;
|
||||
|
||||
|
||||
if(hint)
|
||||
_panic("mmap: file hint unimplemented", 0);
|
||||
|
||||
ret = vmm_allocfrom(USER_ALLOC_START, mmuflags, plen);
|
||||
|
||||
if(!ret)
|
||||
retv.errno = ENOMEM;
|
||||
else{
|
||||
retv.ret = ret;
|
||||
if(hint && (flags & MAP_ANON))
|
||||
memset(ret, 0, plen*PAGE_SIZE);
|
||||
if(!ret)
|
||||
retv.errno = ENOMEM;
|
||||
else{
|
||||
retv.errno = vmm_mapfile(fd->node, ret, plen, offset, mmuflags);
|
||||
if(!retv.errno)
|
||||
retv.ret = ret;
|
||||
}
|
||||
|
||||
fd_release(fd);
|
||||
|
||||
}
|
||||
|
||||
return retv;
|
||||
|
||||
Reference in New Issue
Block a user