summaryrefslogtreecommitdiffstats
path: root/arch/x86_64/sys
diff options
context:
space:
mode:
authorJon Santmyer <jon@jonsantmyer.com>2026-10-13 22:31:43 -0400
committerJon Santmyer <jon@jonsantmyer.com>2026-10-13 22:31:43 -0400
commit548506392b789f58b1556a6ffca917441e1d89fd (patch)
tree58e4b747446ea64e7951e523353f58510b3a8b2f /arch/x86_64/sys
parentc5e3bb7917689bc9ed54fee23a143144fade802d (diff)
downloadjove-kernel-548506392b789f58b1556a6ffca917441e1d89fd.tar.gz
jove-kernel-548506392b789f58b1556a6ffca917441e1d89fd.tar.bz2
jove-kernel-548506392b789f58b1556a6ffca917441e1d89fd.zip
ipc functions. work on process spawning
Diffstat (limited to 'arch/x86_64/sys')
-rw-r--r--arch/x86_64/sys/link.c69
-rw-r--r--arch/x86_64/sys/link.h15
2 files changed, 69 insertions, 15 deletions
diff --git a/arch/x86_64/sys/link.c b/arch/x86_64/sys/link.c
index 96f8eeb..c8b08ec 100644
--- a/arch/x86_64/sys/link.c
+++ b/arch/x86_64/sys/link.c
@@ -1,19 +1,58 @@
#include "sys/link.h"
+#include "api/obj.h"
+#include "arch/x86_64/hal/paging.h"
+#include "hal/memory.h"
+#include "hal/obj.h"
+#include "jove.h"
+#include "sys/lock.h"
-jove_obj_t
-link_unlink(jove_owned_obj_t *link)
+int link_new(jove_owned_obj_t *target_obj, jove_owned_obj_t *untyped_obj, uint8_t permissions)
{
- struct obj_link *linkval = obj_deref(link);
- if(--linkval->refcount == 1) {
- jove_obj_t held_obj = linkval->obj;
- link->locked = held_obj;
- return (jove_obj_t) {
- .lock = 0,
- .type = JOVE_OBJ_UNTYPED,
- .value = (uintptr_t)linkval
- };
- }else{
- obj_settype(link, JOVE_OBJ_NONE);
- }
- return (jove_obj_t) { 0 };
+ jove_untyped_t *untyped = obj_deref(untyped_obj);
+ if(untyped->limit != sizeof(jove_link_obj_t)) return -EBADSIZE;
+
+ jove_link_obj_t *link = (jove_link_obj_t*)untyped;
+ release_mutex(&link->lock);
+ link->permissions = permissions;
+ link->refcount = 2;
+ link->obj = target_obj->locked;
+
+ obj_setvalue(target_obj, (uintptr_t)link);
+ obj_setvalue(untyped_obj, (uintptr_t)link);
+
+ obj_settype(target_obj, JOVE_OBJ_LINK);
+ obj_settype(untyped_obj, JOVE_OBJ_LINK);
+
+ return 0;
+}
+
+int link_dup(jove_owned_obj_t *link_obj, jove_owned_obj_t *dest_obj)
+{
+ jove_link_obj_t *link = obj_deref(link_obj);
+ obj_settype(dest_obj, JOVE_OBJ_LINK);
+ obj_setvalue(dest_obj, obj_getvalue(link_obj));
+ link->refcount++;
+ return 0;
+}
+
+inline jove_owned_obj_t*
+link_deref(jove_link_obj_t *link)
+{
+ return obj_take(&link->obj);
}
+
+inline jove_owned_obj_t*
+link_try_deref(jove_link_obj_t *link)
+{
+ return obj_trytake(&link->obj);
+}
+
+inline void link_lock(jove_link_obj_t *link)
+{ take_mutex(&link->lock); }
+inline void link_unlock(jove_link_obj_t *link)
+{ release_mutex(&link->lock); }
+
+inline uint8_t link_getperm(jove_link_obj_t *link)
+{ return link->permissions; }
+inline void link_setperm(jove_link_obj_t *link, uint8_t perm)
+{ link->permissions = perm; }
diff --git a/arch/x86_64/sys/link.h b/arch/x86_64/sys/link.h
new file mode 100644
index 0000000..e826dc3
--- /dev/null
+++ b/arch/x86_64/sys/link.h
@@ -0,0 +1,15 @@
+#ifndef _JOVE_ARCH_SYS_LINK_H
+#define _JOVE_ARCH_SYS_LINK_H 1
+
+#include <stdatomic.h>
+#include "hal/obj.h"
+
+typedef struct link_obj
+{
+ jove_obj_t obj;
+ uint32_t refcount;
+ uint8_t permissions;
+ atomic_flag lock;
+} jove_link_obj_t;
+
+#endif