summaryrefslogtreecommitdiff
path: root/src/kernel/ipc/shm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/ipc/shm.c')
-rw-r--r--src/kernel/ipc/shm.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/kernel/ipc/shm.c b/src/kernel/ipc/shm.c
index 0a0d3ee..1cdacfb 100644
--- a/src/kernel/ipc/shm.c
+++ b/src/kernel/ipc/shm.c
@@ -1,6 +1,7 @@
#include "shm.h"
#include <mem/mem.h>
#include <mem/seg.h>
+#include <task/task.h>
struct segment* shmseg_make(size_t len, struct process* owner) {
struct shmseg *ss = kmalloc(sizeof(struct shmseg));
@@ -54,3 +55,28 @@ void shmseg_delete(struct segment *seg) {
}
kfree(ss->frames);
}
+
+struct segment_map* shmseg_getByOff(struct process* pr, size_t offset) {
+ struct segment_map* m = pr->pagedir->mappedSegs;
+ while (m != 0) {
+ if (m->start == offset && m->seg->delete == shmseg_delete) return m;
+ m = m->next;
+ }
+ return 0;
+}
+
+// **** **** SHM syscalls **** ****
+int shm_create(size_t offset, size_t len) {
+ if (offset >= 0xE0000000) return -1;
+ if (len >= 0x10000000) return -1;
+ if (offset+len >= 0xE0000000) return -1;
+ seg_map(shmseg_make(len, current_thread->process), current_thread->process->pagedir, offset);
+ return 0;
+}
+
+int shm_delete(size_t offset) {
+ struct segment_map *s = shmseg_getByOff(current_thread->process, offset);
+ if (s == 0) return -1;
+ seg_unmap(s);
+ return 0;
+}