diff options
| author | Jon Santmyer <jon@jonsantmyer.com> | 2026-09-19 20:32:34 -0400 |
|---|---|---|
| committer | Jon Santmyer <jon@jonsantmyer.com> | 2026-09-19 20:32:34 -0400 |
| commit | b6765812f7da9feccc271e8e0b06f166e8054386 (patch) | |
| tree | b4d4b437d6371d103328893acfdf7199efdb850f | |
| parent | 50a05d7e173f1d610297219925b146f7ef50eef5 (diff) | |
| download | jove-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.h | 3 | ||||
| -rw-r--r-- | arch/x86_64/hal/paging.c | 33 | ||||
| -rw-r--r-- | arch/x86_64/hal/smp.c | 2 | ||||
| -rw-r--r-- | arch/x86_64/sys/init.c | 2 | ||||
| -rw-r--r-- | hal/memory.h | 2 | ||||
| -rw-r--r-- | hal/untyped.c | 1 | ||||
| -rw-r--r-- | sys/syscall.c | 2 | ||||
| -rw-r--r-- | sys/syscall_pagedir.c | 13 | ||||
| -rw-r--r-- | sys/syscall_untyped.c | 5 |
9 files changed, 44 insertions, 19 deletions
@@ -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); } |
