diff options
Diffstat (limited to 'arch')
| -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 |
3 files changed, 23 insertions, 14 deletions
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); |
