summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Santmyer <jon@jonsantmyer.com>2026-09-19 20:32:34 -0400
committerJon Santmyer <jon@jonsantmyer.com>2026-09-19 20:32:34 -0400
commitb6765812f7da9feccc271e8e0b06f166e8054386 (patch)
treeb4d4b437d6371d103328893acfdf7199efdb850f
parent50a05d7e173f1d610297219925b146f7ef50eef5 (diff)
downloadjove-kernel-b6765812f7da9feccc271e8e0b06f166e8054386.tar.gz
jove-kernel-b6765812f7da9feccc271e8e0b06f166e8054386.tar.bz2
jove-kernel-b6765812f7da9feccc271e8e0b06f166e8054386.zip
fix bugs with map using untyped obj
-rw-r--r--api/init.h3
-rw-r--r--arch/x86_64/hal/paging.c33
-rw-r--r--arch/x86_64/hal/smp.c2
-rw-r--r--arch/x86_64/sys/init.c2
-rw-r--r--hal/memory.h2
-rw-r--r--hal/untyped.c1
-rw-r--r--sys/syscall.c2
-rw-r--r--sys/syscall_pagedir.c13
-rw-r--r--sys/syscall_untyped.c5
9 files changed, 44 insertions, 19 deletions
diff --git a/api/init.h b/api/init.h
index ef538b4..73b19e4 100644
--- a/api/init.h
+++ b/api/init.h
@@ -1,6 +1,8 @@
#ifndef _JOVE_API_INIT_H
#define _JOVE_API_INIT_H 1
+#include <stdint.h>
+
enum {
ROOTDIR_DIR_I = 0,
ROOTDIR_PROCESSORS_I,
@@ -17,6 +19,7 @@ enum {
struct init_payload
{
void *rsdp;
+ uintptr_t brk;
};
#define ROOTDIR_SERIAL_COM_I 0x80
diff --git a/arch/x86_64/hal/paging.c b/arch/x86_64/hal/paging.c
index 8eee066..9947e9c 100644
--- a/arch/x86_64/hal/paging.c
+++ b/arch/x86_64/hal/paging.c
@@ -86,22 +86,23 @@ s_pagedir_get_pml1(page_t *pml4, uintptr_t vptr)
return 0;
}
- page_t *pml3 = (page_t*)(((uintptr_t)pml4[pml4i].paddr << 12) | IDENT_VIRT_BASE);
+ #define PML_TBL(tbl, i) (page_t*)(((uintptr_t)tbl[i].paddr << 12) | IDENT_VIRT_BASE)
+
+ page_t *pml3 = PML_TBL(pml4, pml4i);
size_t pml3i = PML3I(vptr);
if(!pml3[pml3i].p) {
errno = ENOMAP;
return 0;
}
- page_t *pml2 = (page_t*)(((uintptr_t)pml3[pml3i].paddr << 12)
- | IDENT_VIRT_BASE);
+ page_t *pml2 = PML_TBL(pml3, pml3i);
size_t pml2i = PML2I(vptr);
if(!pml2[pml2i].p) {
errno = ENOMAP;
return 0;
}
- return (page_t*)(((uintptr_t)pml2[pml2i].paddr << 12) | IDENT_VIRT_BASE);
+ return PML_TBL(pml2, pml2i);
}
int pagedir_map_frame(page_t *pml4,
@@ -129,6 +130,7 @@ int pagedir_map_untyped_frame(
return pagedir_map_frame(pml4, frame, vptr,
(flg.writeable ? PAGE_WRITEABLE : 0) |
+ PAGE_USER |
(flg.executable ? PAGE_XD : 0));
}
@@ -162,7 +164,6 @@ int pagedir_map_table(page_t *pml4,
page_t *target_table = NULL;
void *frame_ident = (void*)(pptr | IDENT_VIRT_BASE);
- memset(frame_ident, 0, 0x1000);
size_t pml4i = PML4I(vptr);
if(!pml4[pml4i].p) {
@@ -188,6 +189,7 @@ int pagedir_map_table(page_t *pml4,
return EHASMAP;
map_table:
+ memset(frame_ident, 0, 0x1000);
target_table->value = pptr |
PAGE_PRESENT |
(pptr > IDENT_VIRT_BASE ? 0 : PAGE_USER) |
@@ -197,8 +199,7 @@ map_table:
}
int pagedir_map_untyped_table(
- jove_owned_obj_t *tgt, jove_owned_obj_t *untyped_obj,
- uintptr_t vptr, struct syscall_pagedir_flags flg)
+ jove_owned_obj_t *tgt, jove_owned_obj_t *untyped_obj, uintptr_t vptr)
{
page_t *pml4 = obj_deref(tgt);
uintptr_t frame = obj_getvalue(untyped_obj);
@@ -282,9 +283,12 @@ paging_pml4_init(void)
uintptr_t kernel_pml1_pptr = KPTR_TOPHYS((uintptr_t)_kernel_pml1);
/*Maps pml4-2 as global writeable pages.*/
- _kernel_pml4[511].value = kernel_pml3_pptr | PAGE_PRESENT | PAGE_WRITEABLE | PAGE_GLOBAL;
- _kernel_pml3[510].value = kernel_pml2_pptr | PAGE_PRESENT | PAGE_WRITEABLE | PAGE_GLOBAL;
- _kernel_pml2[0].value = kernel_pml1_pptr | PAGE_PRESENT | PAGE_WRITEABLE | PAGE_GLOBAL;
+ _kernel_pml4[511].value = kernel_pml3_pptr
+ | PAGE_PRESENT | PAGE_WRITEABLE | PAGE_GLOBAL;
+ _kernel_pml3[510].value = kernel_pml2_pptr
+ | PAGE_PRESENT | PAGE_WRITEABLE | PAGE_GLOBAL;
+ _kernel_pml2[0].value = kernel_pml1_pptr
+ | PAGE_PRESENT | PAGE_WRITEABLE | PAGE_GLOBAL;
/*text*/
extern void *_kernel_text_start;
@@ -326,7 +330,8 @@ paging_pml4_init(void)
for(size_t i = 0; i < kernel_data_pages; i++) {
size_t off = i + kernel_data_off;
uintptr_t page_off = kernel_data_start_pptr + (i << 12);
- _kernel_pml1[off].value = page_off | PAGE_PRESENT | PAGE_WRITEABLE | PAGE_GLOBAL | PAGE_XD;
+ _kernel_pml1[off].value = page_off
+ | PAGE_PRESENT | PAGE_WRITEABLE | PAGE_GLOBAL | PAGE_XD;
}
/*Identity pages are mapped as huge pages starting at the 256'th PML3 entry.
@@ -336,7 +341,8 @@ paging_pml4_init(void)
for(size_t l3 = 0; l3 < IDENT_MASSIVEPAGES; l3++) {
uintptr_t ident_pml3_pptr = KPTR_TOPHYS(&ident_pml3[l3]);
- _kernel_pml4[256 + l3].value = ident_pml3_pptr | PAGE_PRESENT | PAGE_WRITEABLE | PAGE_GLOBAL;
+ _kernel_pml4[256 + l3].value = ident_pml3_pptr
+ | PAGE_PRESENT | PAGE_WRITEABLE | PAGE_GLOBAL;
}
for(size_t l2 = 0; l2 < IDENT_GIANTPAGES; l2++) {
@@ -344,7 +350,8 @@ paging_pml4_init(void)
size_t l2_mod = l2 % 512;
uintptr_t ident_pml2_pptr = KPTR_TOPHYS(&ident_pml2[l2]);
- ident_pml3[l3][l2_mod].value = ident_pml2_pptr | PAGE_PRESENT | PAGE_WRITEABLE | PAGE_GLOBAL;
+ ident_pml3[l3][l2_mod].value = ident_pml2_pptr
+ | PAGE_PRESENT | PAGE_WRITEABLE | PAGE_GLOBAL;
}
for(size_t l1 = 0; l1 < PHYS_HUGEPAGES_MAX; l1++) {
diff --git a/arch/x86_64/hal/smp.c b/arch/x86_64/hal/smp.c
index 682c6e6..473786d 100644
--- a/arch/x86_64/hal/smp.c
+++ b/arch/x86_64/hal/smp.c
@@ -54,8 +54,8 @@ smp_init_bsp(void)
obj_release(processor_objdir_obj);
}
- paging_pml4_init();
idt_init();
+ paging_pml4_init();
}
processor_t *processor_current(void)
diff --git a/arch/x86_64/sys/init.c b/arch/x86_64/sys/init.c
index 40c3240..b411fd7 100644
--- a/arch/x86_64/sys/init.c
+++ b/arch/x86_64/sys/init.c
@@ -138,6 +138,8 @@ init_setup(void)
PAGE_WRITEABLE | PAGE_USER | PAGE_XD);
extern struct init_payload _init_payload;
+ _init_payload.brk = last_base + 0x1000;
+
memcpy((void*)last_base, &_init_payload, sizeof(struct init_payload));
jove_owned_obj_t *message_obj = objdir_getlocal(_rootdir_obj, ROOTDIR_MESSAGE_I);
diff --git a/hal/memory.h b/hal/memory.h
index 7577c17..47dbf0a 100644
--- a/hal/memory.h
+++ b/hal/memory.h
@@ -27,7 +27,7 @@ int pagedir_map_untyped_frame(
uintptr_t vptr, struct syscall_pagedir_flags flg);
int pagedir_map_untyped_table(
jove_owned_obj_t *tgt, jove_owned_obj_t *untyped_obj,
- uintptr_t vptr, struct syscall_pagedir_flags flg);
+ uintptr_t vptr);
int pagedir_unmap_untyped_frame(
jove_owned_obj_t *tgt, jove_owned_obj_t *dst, uintptr_t vptr);
diff --git a/hal/untyped.c b/hal/untyped.c
index e76dd0e..6957175 100644
--- a/hal/untyped.c
+++ b/hal/untyped.c
@@ -18,7 +18,6 @@ int
untyped_split(jove_owned_obj_t *tgt, jove_owned_obj_t *dst, size_t bytes)
{
jove_untyped_t *tgt_untyped = obj_deref(tgt);
- if(bytes < JOVE_UNTYPED_MINSIZE) return EBADARG;
if(tgt_untyped->limit - bytes < JOVE_UNTYPED_MINSIZE) return ETOOSMALL;
tgt_untyped->limit -= bytes;
diff --git a/sys/syscall.c b/sys/syscall.c
index f41f3f6..457b820 100644
--- a/sys/syscall.c
+++ b/sys/syscall.c
@@ -42,7 +42,7 @@ static const syscall_handle_t s_syscall_handles[128] = {
[JOVE_OBJ_NONE] = NULL,
[JOVE_OBJ_UNTYPED] = _syscall_handle_untyped,
[JOVE_OBJ_OBJDIR] = _syscall_handle_objdir,
- [JOVE_OBJ_PAGEDIR] = _syscall_handle_generic,
+ [JOVE_OBJ_PAGEDIR] = _syscall_handle_pagedir,
[JOVE_OBJ_PROCESSOR] = _syscall_handle_generic,
[JOVE_OBJ_HWMEMORY] = _syscall_handle_generic,
[JOVE_OBJ_PROCESS] = _syscall_handle_generic,
diff --git a/sys/syscall_pagedir.c b/sys/syscall_pagedir.c
index f80da76..33acc87 100644
--- a/sys/syscall_pagedir.c
+++ b/sys/syscall_pagedir.c
@@ -44,7 +44,8 @@ s_syscall_pagedir_map(
return EALIGN;
}
if(untyped_data->limit != 0x1000) {
- kprintf("%s: Untyped object is not page sized.\n", __func__);
+ kprintf("%s: Untyped object is not page sized. (expected 0x1000 got 0x%X)\n", __func__,
+ untyped_data->limit);
obj_release(untyped_obj);
return EBADSIZE;
}
@@ -104,6 +105,10 @@ s_syscall_pagedir_map_frame(
struct syscall_pagedir_map *payload = payload_data;
sysret = pagedir_map_untyped_frame(target_obj, untyped_obj, payload->virtual_address, payload->flags);
+
+ if(sysret == 0)
+ obj_settype(untyped_obj, JOVE_OBJ_NONE);
+
obj_release(untyped_obj);
return sysret;
}
@@ -122,7 +127,11 @@ s_syscall_pagedir_map_table(
}
struct syscall_pagedir_map *payload = payload_data;
- sysret = pagedir_map_untyped_frame(target_obj, untyped_obj, payload->virtual_address, payload->flags);
+ sysret = pagedir_map_untyped_table(target_obj, untyped_obj, payload->virtual_address);
+
+ if(sysret == 0)
+ obj_settype(untyped_obj, JOVE_OBJ_NONE);
+
obj_release(untyped_obj);
return sysret;
}
diff --git a/sys/syscall_untyped.c b/sys/syscall_untyped.c
index 975faaa..a5659a6 100644
--- a/sys/syscall_untyped.c
+++ b/sys/syscall_untyped.c
@@ -21,6 +21,11 @@ s_syscall_untyped_split(
jove_owned_obj_t *dst_obj = objdir_getobj(objdir, payload->dest_path, payload->dest_pathlen);
CHECK_OBJTYPE(dst_obj, JOVE_OBJ_NONE, "Destination path is occupied!");
+ if(payload->bytes < JOVE_UNTYPED_MINSIZE) {
+ klogf("Destination untyped would be too small. (%X < %X)\n",
+ payload->bytes, JOVE_UNTYPED_MINSIZE);
+ return EBADARG;
+ }
return untyped_split(target_obj, dst_obj, payload->bytes);
}