summaryrefslogtreecommitdiffstats
path: root/arch/x86_64/hal
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/hal')
-rw-r--r--arch/x86_64/hal/obj.c18
-rw-r--r--arch/x86_64/hal/paging.c105
-rw-r--r--arch/x86_64/hal/paging.h8
-rw-r--r--arch/x86_64/hal/process.c8
4 files changed, 95 insertions, 44 deletions
diff --git a/arch/x86_64/hal/obj.c b/arch/x86_64/hal/obj.c
index cb0e13d..9844a54 100644
--- a/arch/x86_64/hal/obj.c
+++ b/arch/x86_64/hal/obj.c
@@ -79,7 +79,7 @@ objdir_peeklocal(
jove_owned_obj_t *objdir_obj,
uint16_t entry)
{
- if(obj_gettype_linked(objdir_obj) != JOVE_OBJ_OBJDIR) {
+ if(obj_gettype(objdir_obj) != JOVE_OBJ_OBJDIR) {
errno = EBADOBJ;
return (jove_obj_t) { 0 };
}
@@ -88,7 +88,7 @@ objdir_peeklocal(
return (jove_obj_t) { 0 };
}
- jove_objdir_t *objtab = obj_deref_linked(objdir_obj);
+ jove_objdir_t *objtab = obj_deref(objdir_obj);
return objtab->entries[entry];
}
@@ -97,14 +97,17 @@ objdir_getlocal(
jove_owned_obj_t *objdir_obj,
uint16_t entry)
{
- if(obj_gettype_linked(objdir_obj) != JOVE_OBJ_OBJDIR) {
+ while(obj_gettype(objdir_obj) == JOVE_OBJ_LINK) {
+ objdir_obj = link_deref(objdir_obj);
+ }
+ if(obj_gettype(objdir_obj) != JOVE_OBJ_OBJDIR) {
reterr(EBADOBJ);
}
if(entry >= JOVE_OBJDIR_ENTRIES) {
reterr(EBADPATH);
}
- jove_objdir_t *objtab = obj_deref_linked(objdir_obj);
+ jove_objdir_t *objtab = obj_deref(objdir_obj);
return obj_take(&objtab->entries[entry]);
}
@@ -113,14 +116,17 @@ objdir_trygetlocal(
jove_owned_obj_t *objdir_obj,
uint16_t entry)
{
- if(obj_gettype_linked(objdir_obj) != JOVE_OBJ_OBJDIR) {
+ while(obj_gettype(objdir_obj) == JOVE_OBJ_LINK) {
+ objdir_obj = link_deref(objdir_obj);
+ }
+ if(obj_gettype(objdir_obj) != JOVE_OBJ_OBJDIR) {
reterr(EBADOBJ);
}
if(entry >= JOVE_OBJDIR_ENTRIES) {
reterr(EBADPATH);
}
- jove_objdir_t *objtab = obj_deref_linked(objdir_obj);
+ jove_objdir_t *objtab = obj_deref(objdir_obj);
return obj_trytake(&objtab->entries[entry]);
}
diff --git a/arch/x86_64/hal/paging.c b/arch/x86_64/hal/paging.c
index 9947e9c..2fbf26c 100644
--- a/arch/x86_64/hal/paging.c
+++ b/arch/x86_64/hal/paging.c
@@ -106,7 +106,7 @@ s_pagedir_get_pml1(page_t *pml4, uintptr_t vptr)
}
int pagedir_map_frame(page_t *pml4,
- uintptr_t pptr, uintptr_t vptr,
+ uintptr_t pptr, uintptr_t vptr,
uintmax_t flg)
{
page_t *pml1 = s_pagedir_get_pml1(pml4, vptr);
@@ -121,41 +121,35 @@ int pagedir_map_frame(page_t *pml4,
return 0;
}
-int pagedir_map_untyped_frame(
- jove_owned_obj_t *tgt, jove_owned_obj_t *untyped_obj,
- uintptr_t vptr, struct syscall_pagedir_flags flg)
+int pagedir_map_shmem(page_t *pml4,
+ uintptr_t pptr, uintptr_t vptr,
+ struct syscall_pagedir_flags flg)
{
- page_t *pml4 = obj_deref(tgt);
- uintptr_t frame = obj_getvalue(untyped_obj);
-
- return pagedir_map_frame(pml4, frame, vptr,
- (flg.writeable ? PAGE_WRITEABLE : 0) |
- PAGE_USER |
- (flg.executable ? PAGE_XD : 0));
+ uintmax_t real_flg = PAGE_USER | PAGE_SHMEM;
+ if(flg.writeable) {
+ real_flg |= PAGE_WRITEABLE;
+ }
+ if(!flg.executable) {
+ real_flg |= PAGE_XD;
+ }
+ return pagedir_map_frame(pml4, pptr, vptr, real_flg);
}
-int pagedir_unmap_untyped_frame(
- jove_owned_obj_t *tgt, jove_owned_obj_t *dst, uintptr_t vptr)
+int pagedir_map_untyped_frame(
+ jove_owned_obj_t *tgt, jove_perm_obj_t *untyped,
+ uintptr_t vptr, struct syscall_pagedir_flags flg)
{
page_t *pml4 = obj_deref(tgt);
- size_t pml4i = PML4I(vptr);
- if(!pml4[pml4i].p) return ENOMAP;
-
- page_t *pml1 = s_pagedir_get_pml1(pml4, vptr);
- size_t pml1i = PML1I(vptr);
- if(!pml1[pml1i].p) return ENOMAP;
-
- uintptr_t untyped_pptr = (pml1[pml1i].paddr << 12);
-
- obj_settype(dst, JOVE_OBJ_UNTYPED);
- obj_setvalue(dst, untyped_pptr);
-
- jove_untyped_t *untyped_data = obj_deref(dst);
- untyped_data->limit = 0x1000;
- __asm__ volatile("invlpg (%0)":: "r"(vptr): "memory");
+ if(flg.writeable && (untyped->permissions & JOVE_PERM_WRITE) == 0) {
+ kprintf("%s: Untyped object flagged for writeable mapping missing write permissions!\n", __func__);
+ return -EPERM;
+ }
- return 0;
+ uintptr_t frame = obj_getvalue(untyped->obj);
+ return pagedir_map_frame(pml4, frame, vptr, PAGE_USER |
+ (flg.writeable ? PAGE_WRITEABLE : 0) |
+ (flg.executable ? 0 : PAGE_XD));
}
int pagedir_map_table(page_t *pml4,
@@ -199,14 +193,63 @@ map_table:
}
int pagedir_map_untyped_table(
- jove_owned_obj_t *tgt, jove_owned_obj_t *untyped_obj, uintptr_t vptr)
+ jove_owned_obj_t *tgt, jove_perm_obj_t *untyped, uintptr_t vptr)
{
page_t *pml4 = obj_deref(tgt);
- uintptr_t frame = obj_getvalue(untyped_obj);
+
+ if((untyped->permissions & JOVE_PERM_WRITE) == 0) {
+ kprintf("%s: Untyped object flagged for table mapping missing write permissions!\n", __func__);
+ return -EPERM;
+ }
+ uintptr_t frame = obj_getvalue(untyped->obj);
return pagedir_map_table(pml4, frame, vptr);
}
+int pagedir_map_shmem_frame(
+ jove_owned_obj_t *tgt, jove_perm_obj_t *shmem, uint8_t page_offset,
+ uintptr_t vptr, struct syscall_pagedir_flags flg)
+{
+ page_t *pml4 = obj_deref(tgt);
+
+ if(flg.writeable && (shmem->permissions & JOVE_PERM_WRITE) != 0) {
+ kprintf("%s: Shared memory object flagged for writeable mapping missing write permissions!\n", __func__);
+ return -EPERM;
+ }
+
+ uintmax_t value = obj_getvalue(shmem->obj);
+ uintptr_t frame = value & ~0xFF;
+ frame += (uintmax_t)page_offset << 12;
+
+ return pagedir_map_frame(pml4, frame, vptr, PAGE_USER |
+ (flg.writeable ? PAGE_WRITEABLE : 0) |
+ (flg.executable ? 0 : PAGE_XD));
+}
+
+int pagedir_unmap_untyped_frame(
+ jove_owned_obj_t *tgt, jove_owned_obj_t *dst, uintptr_t vptr)
+{
+ page_t *pml4 = obj_deref(tgt);
+
+ size_t pml4i = PML4I(vptr);
+ if(!pml4[pml4i].p) return ENOMAP;
+
+ page_t *pml1 = s_pagedir_get_pml1(pml4, vptr);
+ size_t pml1i = PML1I(vptr);
+ if(!pml1[pml1i].p) return ENOMAP;
+
+ uintptr_t untyped_pptr = (pml1[pml1i].paddr << 12);
+
+ obj_settype(dst, JOVE_OBJ_UNTYPED);
+ obj_setvalue(dst, untyped_pptr);
+
+ jove_untyped_t *untyped_data = obj_deref(dst);
+ untyped_data->limit = 0x1000;
+ __asm__ volatile("invlpg (%0)":: "r"(vptr): "memory");
+
+ return 0;
+}
+
int pagedir_unmap_untyped_table(
jove_owned_obj_t *tgt, jove_owned_obj_t *dst, uintptr_t vptr)
{
diff --git a/arch/x86_64/hal/paging.h b/arch/x86_64/hal/paging.h
index 5b7260c..becf353 100644
--- a/arch/x86_64/hal/paging.h
+++ b/arch/x86_64/hal/paging.h
@@ -17,7 +17,8 @@ typedef union page_table_entry
uint8_t d : 1;
uint8_t ps : 1;
uint8_t g : 1;
- uint8_t ign_0 : 2;
+ uint8_t shm : 1;
+ uint8_t ign_0 : 1;
uint8_t r : 1;
uint64_t paddr : 35;
uint8_t ign_1 : 4;
@@ -35,8 +36,9 @@ typedef union page_table_entry
#define PAGE_ACCESSED 0b100000
#define PAGE_DIRTY 0b1000000
#define PAGE_PS 0b10000000
-#define PAGE_GLOBAL 0b000000000
-#define PAGE_XD (0ULL << 63)
+#define PAGE_GLOBAL 0b100000000
+#define PAGE_SHMEM 0b1000000000
+#define PAGE_XD (1ULL << 63)
extern void *_kernel_physptr;
diff --git a/arch/x86_64/hal/process.c b/arch/x86_64/hal/process.c
index f30d703..aa51f45 100644
--- a/arch/x86_64/hal/process.c
+++ b/arch/x86_64/hal/process.c
@@ -22,7 +22,7 @@ process_current(void)
pcb_t*
pcb_from_obj(jove_owned_obj_t *obj)
{
- if(obj_gettype(obj) != JOVE_OBJ_PROCESS) {
+ if(obj_gettype(obj) != JOVE_OBJ_PCB) {
reterr(EBADOBJ);
}
return obj_deref(obj);
@@ -34,10 +34,10 @@ pcb_pid(pcb_t *pcb)
return pcb->pid;
}
-jove_owned_obj_t*
+jove_obj_t*
pcb_rootdir(pcb_t *pcb)
{
- return obj_take(pcb->rootdir);
+ return pcb->rootdir;
}
void
@@ -62,7 +62,7 @@ processing_setup(void (*process_main))
{
jove_owned_obj_t *process_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_PCB_I);
- obj_settype(process_obj, JOVE_OBJ_PROCESS);
+ obj_settype(process_obj, JOVE_OBJ_PCB);
obj_setvalue(process_obj, (uintptr_t)s_init_pcb);
proc->pcb_obj = obj_release(process_obj);