From 0076e1f5e05b113d3756f12c668cd54db5fc9302 Mon Sep 17 00:00:00 2001 From: Balazs Gerofi Date: Mon, 19 Feb 2018 10:57:23 +0900 Subject: [PATCH] mem: make McKernel kernel heap virtual addresses Linux compatible Cherry-pick of e5334c646d2dc6fb11d419918d8139a0de583fde --- arch/x86_64/kernel/include/arch-memory.h | 2 -- arch/x86_64/kernel/memory.c | 26 +++++++++++++++++++----- lib/include/memory.h | 13 ------------ 3 files changed, 21 insertions(+), 20 deletions(-) diff --git a/arch/x86_64/kernel/include/arch-memory.h b/arch/x86_64/kernel/include/arch-memory.h index ab6b918b..385e31ad 100644 --- a/arch/x86_64/kernel/include/arch-memory.h +++ b/arch/x86_64/kernel/include/arch-memory.h @@ -64,8 +64,6 @@ #define MAP_VMAP_SIZE 0x0000000100000000UL -#define KERNEL_PHYS_OFFSET MAP_ST_START - #define PTL4_SHIFT 39 #define PTL4_SIZE (1UL << PTL4_SHIFT) #define PTL3_SHIFT 30 diff --git a/arch/x86_64/kernel/memory.c b/arch/x86_64/kernel/memory.c index e98696dd..dbcb5d46 100644 --- a/arch/x86_64/kernel/memory.c +++ b/arch/x86_64/kernel/memory.c @@ -107,6 +107,7 @@ struct page_table { }; static struct page_table *init_pt; +static int init_pt_loaded = 0; static ihk_spinlock_t init_pt_lock; static int use_1gb_page = 0; @@ -2658,7 +2659,8 @@ void init_page_table(void) init_vsyscall_area(init_pt); load_page_table(init_pt); - kprintf("Page table is now at %p\n", init_pt); + init_pt_loaded = 1; + kprintf("Page table is now at 0x%lx\n", init_pt); } extern void __reserve_arch_pages(unsigned long, unsigned long, @@ -2686,17 +2688,31 @@ void ihk_mc_reserve_arch_pages(struct ihk_page_allocator_desc *pa_allocator, unsigned long virt_to_phys(void *v) { unsigned long va = (unsigned long)v; - - if (va >= MAP_KERNEL_START) { + + if (va >= LINUX_PAGE_OFFSET) { + return va - LINUX_PAGE_OFFSET; + } + else if (va >= MAP_KERNEL_START) { + //kprintf("%s: MAP_KERNEL_START <= 0x%lx <= LINUX_PAGE_OFFSET\n", __FUNCTION__, va); return va - MAP_KERNEL_START + x86_kernel_phys_base; - } else { + } + else if (va >= MAP_FIXED_START) { + return va - MAP_FIXED_START; + } + else { + //kprintf("%s: MAP_ST_START <= 0x%lx <= MAP_FIXED_START\n", __FUNCTION__, va); return va - MAP_ST_START; } } void *phys_to_virt(unsigned long p) { - return (void *)(p + MAP_ST_START); + /* Before loading our own PT use straight mapping */ + if (!init_pt_loaded) { + return (void *)(p + MAP_ST_START); + } + + return (void *)(p + LINUX_PAGE_OFFSET); } int copy_from_user(void *dst, const void *src, size_t siz) diff --git a/lib/include/memory.h b/lib/include/memory.h index e6c47c84..141111cb 100644 --- a/lib/include/memory.h +++ b/lib/include/memory.h @@ -16,19 +16,6 @@ #include -#ifndef KERNEL_PHYS_OFFSET -#define KERNEL_PHYS_OFFSET 0 - -static unsigned long virt_to_phys(void *v) -{ - return (unsigned long)v - KERNEL_PHYS_OFFSET; -} -static void *phys_to_virt(unsigned long p) -{ - return (void *)(p + KERNEL_PHYS_OFFSET); -} -#endif - struct process_vm; unsigned long virt_to_phys(void *v);