mem: make McKernel kernel heap virtual addresses Linux compatible

Cherry-pick of e5334c646d2dc6fb11d419918d8139a0de583fde
This commit is contained in:
Balazs Gerofi
2018-02-19 10:57:23 +09:00
parent 9a5f3ad4e6
commit ca7edf1df8
3 changed files with 21 additions and 20 deletions

View File

@@ -64,8 +64,6 @@
#define MAP_VMAP_SIZE 0x0000000100000000UL #define MAP_VMAP_SIZE 0x0000000100000000UL
#define KERNEL_PHYS_OFFSET MAP_ST_START
#define PTL4_SHIFT 39 #define PTL4_SHIFT 39
#define PTL4_SIZE (1UL << PTL4_SHIFT) #define PTL4_SIZE (1UL << PTL4_SHIFT)
#define PTL3_SHIFT 30 #define PTL3_SHIFT 30

View File

@@ -109,6 +109,7 @@ struct page_table {
}; };
static struct page_table *init_pt; static struct page_table *init_pt;
static int init_pt_loaded = 0;
static ihk_spinlock_t init_pt_lock; static ihk_spinlock_t init_pt_lock;
static int use_1gb_page = 0; static int use_1gb_page = 0;
@@ -2657,7 +2658,8 @@ void init_page_table(void)
init_vsyscall_area(init_pt); init_vsyscall_area(init_pt);
load_page_table(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, extern void __reserve_arch_pages(unsigned long, unsigned long,
@@ -2686,16 +2688,30 @@ unsigned long virt_to_phys(void *v)
{ {
unsigned long va = (unsigned long)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; 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; return va - MAP_ST_START;
} }
} }
void *phys_to_virt(unsigned long p) 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) int copy_from_user(void *dst, const void *src, size_t siz)

View File

@@ -16,19 +16,6 @@
#include <arch-memory.h> #include <arch-memory.h>
#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; struct process_vm;
unsigned long virt_to_phys(void *v); unsigned long virt_to_phys(void *v);