aboutsummaryrefslogtreecommitdiff
path: root/src/uapi
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
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')
-rw-r--r--src/uapi/conf.c12
-rw-r--r--src/uapi/mem.c36
2 files changed, 30 insertions, 18 deletions
diff --git a/src/uapi/conf.c b/src/uapi/conf.c
index 3a45d30..c8ec964 100644
--- a/src/uapi/conf.c
+++ b/src/uapi/conf.c
@@ -42,9 +42,10 @@ size_t rpc_stack_size()
*
* @param t Current tcb.
* @param param Parameter to read.
+ * @param d0 Optional data argument for parameter.
* @return \ref OK and parameter value.
*/
-SYSCALL_DEFINE1(conf_get)(struct tcb *t, sys_arg_t param)
+SYSCALL_DEFINE2(conf_get)(struct tcb *t, sys_arg_t param, sys_arg_t d0)
{
/* anyone can read any current parameter, I don't think they should be
* hidden. */
@@ -66,6 +67,15 @@ SYSCALL_DEFINE1(conf_get)(struct tcb *t, sys_arg_t param)
val = get_ram_size();
break;
+ case CONF_PAGE_SIZE:
+ if (d0 < 0 || d0 > max_order()) {
+ val = 0;
+ break;
+ }
+
+ val = order_size(d0);
+ break;
+
default:
return_args1(t, ERR_NF);
}
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);
}