From 0a4c76dc789d4b72e320e9717dc99b3526d0e2ae Mon Sep 17 00:00:00 2001 From: Mathieu Serandour Date: Fri, 25 Mar 2022 20:41:35 +0100 Subject: [PATCH] remap_pages --- kernel/memory/paging.c | 55 +++++++++++++++++++++++++++++++++++++++++- kernel/memory/paging.h | 10 ++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/kernel/memory/paging.c b/kernel/memory/paging.c index 406df61..f9cec8b 100644 --- a/kernel/memory/paging.c +++ b/kernel/memory/paging.c @@ -528,6 +528,60 @@ static void internal_map_pages(uint64_t physical_addr, } +void remap_pages(void* vaddr_ptr, + size_t count, + uint64_t flags) { + + uint64_t virtual_addr = (uint64_t)vaddr_ptr; + + while(count > 0) { + + // fetch table indexes + unsigned pml4i = pml4_offset(virtual_addr), + pdpti = pdpt_offset(virtual_addr), + pdi = pd_offset(virtual_addr), + pti = pt_offset(virtual_addr); + + assert(pml4i == 0 || pml4i == 511 || pml4i == 256); + // those entries should exist + pml4e restrict pml4entry = extract_pointer(get_entry_or_allocate((void**)pml4, pml4i)); + pdpte restrict pdptentry = extract_pointer(get_entry_or_allocate((void**)pml4entry, pdpti)); + pde restrict pdentry = extract_pointer(get_entry_or_allocate((void**)pdptentry, pdi)); + + + while(count > 0 && pti < 512) { + // create a new entry + + void** entry_ptr = (void**)translate_address(pdentry) + pti; + + + if(!present_entry(*entry_ptr)) { + + char buff[256]; + + sprintf(buff, + "remap_pages(...,flags=%lu):\n" + " tried to remap virtual memory 0x%lx, nothing was mapped there", + flags, virtual_addr + ); + + panic(buff); + } + + // extract physical page and remake an entry with + // the given flags + void* e = create_table_entry(0,flags); + + *entry_ptr = e; + + pti++; + count--; + virtual_addr += 0x1000; + } + } +} + + void alloc_pages(void* virtual_addr_begin, size_t count, uint64_t flags) { @@ -558,7 +612,6 @@ void alloc_pages(void* virtual_addr_begin, } } - void map_pages(uint64_t physical_addr, uint64_t virtual_addr, size_t count, diff --git a/kernel/memory/paging.h b/kernel/memory/paging.h index 1e59f95..cc66474 100644 --- a/kernel/memory/paging.h +++ b/kernel/memory/paging.h @@ -54,3 +54,13 @@ void unmap_pages(uint64_t virtual_addr, size_t count); void alloc_pages(void* virtual_addr, size_t count, uint64_t flags); + +/** + * @brief change page level attributes: PL_RW PL_US PWT PCD + * of already mapped pages + * + */ +void remap_pages(void* virtual_addr, + size_t count, + uint64_t new_flags); +