mem: make McKernel kernel heap virtual addresses Linux compatible
Cherry-pick of e5334c646d2dc6fb11d419918d8139a0de583fde
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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,
|
||||||
@@ -2685,17 +2687,31 @@ void ihk_mc_reserve_arch_pages(struct ihk_page_allocator_desc *pa_allocator,
|
|||||||
unsigned long virt_to_phys(void *v)
|
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)
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user