mem: map Linux kernel virtual addresses properly
Cherry-pick of 5f37e846c3d70e5d5c0baea5b8eb8ceee3411c88
This commit is contained in:
@ -191,28 +191,6 @@ static void init_normal_area(struct page_table *pt)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void init_linux_kernel_mapping(struct page_table *pt)
|
|
||||||
{
|
|
||||||
unsigned long map_start, map_end, phys, pt_phys;
|
|
||||||
int virt_index;
|
|
||||||
|
|
||||||
map_start = 0;
|
|
||||||
/* Map 2 TB for now */
|
|
||||||
map_end = 0x20000000000;
|
|
||||||
|
|
||||||
kprintf("Linux kernel virtual: 0x%lx - 0x%lx -> 0x%lx - 0x%lx\n",
|
|
||||||
LINUX_PAGE_OFFSET, LINUX_PAGE_OFFSET + map_end, 0, map_end);
|
|
||||||
virt_index = (MAP_ST_START >> PTL4_SHIFT) & (PT_ENTRIES - 1);
|
|
||||||
|
|
||||||
for (phys = (map_start & ~(PTL4_SIZE - 1)); phys < map_end;
|
|
||||||
phys += PTL4_SIZE) {
|
|
||||||
pt_phys = setup_l3(ihk_mc_alloc_pages(1, IHK_MC_AP_CRITICAL), phys,
|
|
||||||
map_start, map_end);
|
|
||||||
|
|
||||||
pt->entry[virt_index++] = pt_phys | PFL4_PDIR_ATTR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct page_table *__alloc_new_pt(ihk_mc_ap_flag ap_flag)
|
static struct page_table *__alloc_new_pt(ihk_mc_ap_flag ap_flag)
|
||||||
{
|
{
|
||||||
struct page_table *newpt = ihk_mc_alloc_pages(1, ap_flag);
|
struct page_table *newpt = ihk_mc_alloc_pages(1, ap_flag);
|
||||||
@ -2625,6 +2603,28 @@ void init_low_area(struct page_table *pt)
|
|||||||
set_pt_large_page(pt, 0, 0, PTATTR_NO_EXECUTE|PTATTR_WRITABLE);
|
set_pt_large_page(pt, 0, 0, PTATTR_NO_EXECUTE|PTATTR_WRITABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void init_linux_kernel_mapping(struct page_table *pt)
|
||||||
|
{
|
||||||
|
unsigned long map_start, map_end, phys;
|
||||||
|
void *virt;
|
||||||
|
|
||||||
|
/* Map 2 TB for now */
|
||||||
|
map_start = 0;
|
||||||
|
map_end = 0x20000000000;
|
||||||
|
|
||||||
|
virt = (void *)LINUX_PAGE_OFFSET;
|
||||||
|
|
||||||
|
kprintf("Linux kernel virtual: 0x%lx - 0x%lx -> 0x%lx - 0x%lx\n",
|
||||||
|
LINUX_PAGE_OFFSET, LINUX_PAGE_OFFSET + map_end, 0, map_end);
|
||||||
|
|
||||||
|
for (phys = map_start; phys < map_end; phys += LARGE_PAGE_SIZE) {
|
||||||
|
if (set_pt_large_page(pt, virt, phys, PTATTR_WRITABLE) != 0) {
|
||||||
|
kprintf("%s: error setting mapping for 0x%lx\n", __FUNCTION__, virt);
|
||||||
|
}
|
||||||
|
virt += LARGE_PAGE_SIZE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void init_vsyscall_area(struct page_table *pt)
|
static void init_vsyscall_area(struct page_table *pt)
|
||||||
{
|
{
|
||||||
extern char vsyscall_page[];
|
extern char vsyscall_page[];
|
||||||
|
|||||||
Reference in New Issue
Block a user