aboutsummaryrefslogtreecommitdiff
path: root/src/uapi/mem.c
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2024-07-09 17:35:56 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2024-07-09 17:35:56 +0300
commit298636079d912d0936f8156a609fe74b839c547b (patch)
treee0c22ce0e7b7c8a29e3937616076e8fb327fde8b /src/uapi/mem.c
parente134202611a50b358c147c92bfb8a7f443030b8b (diff)
downloadkmi-298636079d912d0936f8156a609fe74b839c547b.tar.gz
kmi-298636079d912d0936f8156a609fe74b839c547b.zip
allow mapping null page
+ User has to 'free' the 0 page before it becomes accessible to mapping. Probably worth noting that this is likely VERY niche and mainly concerns stuff like certain kinds of emulators that I'm still eons from implementing, but still. Unbacked pages can also be useful for some kinds of notifications, like 'if someone writes to this page, please report it to me with this ID' or whatever, I remember seeing some discussion about it somewhere but that's also not really relevant for the moment. Most significantly, at least with the current design, after the null page is freed it becomes available for use to regular req_mem() calls, so users should probably using locks around memory requests. That's probably a good idea anyway as internally the kernal has to lock the virtual memory, and without a scheduler it might cause threads to spin for a while in the kernel which is rather bad.
Diffstat (limited to 'src/uapi/mem.c')
-rw-r--r--src/uapi/mem.c36
1 files changed, 19 insertions, 17 deletions
diff --git a/src/uapi/mem.c b/src/uapi/mem.c
index 49370fc..b4b2df8 100644
--- a/src/uapi/mem.c
+++ b/src/uapi/mem.c
@@ -24,10 +24,10 @@
SYSCALL_DEFINE2(req_mem)(struct tcb *t, sys_arg_t size, sys_arg_t flags)
{
struct tcb *r = get_cproc(t);
- vm_t start = 0;
flags = sanitize_uvflags(flags);
- if (!(start = alloc_uvmem(r, size, flags)))
- return_args1(t, ERR_OOMEM);
+ vm_t start = alloc_uvmem(r, size, flags);
+ if (ERR_CODE(start))
+ return_args1(t, start);
return_args2(t, OK, start);
}
@@ -47,10 +47,10 @@ SYSCALL_DEFINE3(req_fixmem)(struct tcb *t, sys_arg_t fixed, sys_arg_t size,
sys_arg_t flags)
{
struct tcb *r = get_cproc(t);
- vm_t start = 0;
flags = sanitize_uvflags(flags);
- if (!(start = alloc_fixed_uvmem(r, fixed, size, flags)))
- return_args1(t, ERR_OOMEM);
+ vm_t start = alloc_fixed_uvmem(r, fixed, size, flags);
+ if (ERR_CODE(start))
+ return_args1(t, start);
return_args2(t, OK, start);
}
@@ -97,10 +97,10 @@ SYSCALL_DEFINE3(req_pmem)(struct tcb *t, sys_arg_t paddr, sys_arg_t size,
* that keeps track of used regions outside of RAM. We'll see.
*/
struct tcb *r = get_cproc(t);
- vm_t start = 0;
flags = sanitize_uvflags(flags);
- if (!(start = alloc_devmem(r, paddr, size, flags)))
- return_args1(t, ERR_OOMEM);
+ vm_t start = alloc_devmem(r, paddr, size, flags);
+ if (ERR_CODE(start))
+ return_args1(t, start);
return_args2(t, OK, start);
}
@@ -127,8 +127,9 @@ SYSCALL_DEFINE2(req_page)(struct tcb *t, sys_arg_t size, sys_arg_t flags)
vm_t start = 0;
size_t asize = 0;
flags = sanitize_uvflags(flags);
- if (!(start = alloc_uvpage(r, size, flags, &addr, &asize)))
- return_args1(t, ERR_OOMEM);
+ start = alloc_uvpage(r, size, flags, &addr, &asize);
+ if (ERR_CODE(start))
+ return_args1(t, start);
return_args4(t, OK, start, addr, asize);
}
@@ -148,10 +149,10 @@ SYSCALL_DEFINE2(req_sharedmem)(struct tcb *t, sys_arg_t size, sys_arg_t flags)
if (!has_cap(c->caps, CAP_SHARED))
return_args1(t, ERR_PERM);
- vm_t start = 0;
flags = sanitize_uvflags(flags);
- if (!(start = alloc_shared_uvmem(c, size, flags)))
- return_args1(t, ERR_OOMEM);
+ vm_t start = alloc_shared_uvmem(c, size, flags);
+ if (ERR_CODE(start))
+ return_args1(t, start);
return_args3(t, OK, start, size);
}
@@ -178,10 +179,11 @@ SYSCALL_DEFINE3(ref_sharedmem)(struct tcb *t, sys_arg_t tid, sys_arg_t addr,
if (!r || zombie(r))
return_args1(t, ERR_INVAL);
- vm_t start = 0; size_t size = 0;
+ size_t size = 0;
flags = sanitize_uvflags(flags);
- if (!(start = ref_shared_uvmem(r, c, addr, flags)))
- return_args1(t, ERR_OOMEM);
+ vm_t start = ref_shared_uvmem(r, c, addr, flags);
+ if (ERR_CODE(start))
+ return_args1(t, start);
return_args3(t, OK, start, size);
}