x86 memory: use page_offset_base from linux

rhel 7.5 and later kernels have a page offset that is no longer
necessarily 0xffff880000000000, leading to kernel panics if we
use the wrong address

Change-Id: I3572fde1c31303a937855c23fbd3815ce0f96c64
This commit is contained in:
Dominique Martinet
2019-09-10 15:13:47 +02:00
committed by Masamichi Takagi
parent b8d96a74ce
commit 1526237bc6
2 changed files with 12 additions and 9 deletions

View File

@ -37,6 +37,7 @@
static char *last_page;
extern char _head[], _end[];
extern unsigned long linux_page_offset_base;
extern unsigned long x86_kernel_phys_base;
/* Arch specific early allocation routine */
@ -2468,10 +2469,10 @@ static void init_linux_kernel_mapping(struct page_table *pt)
map_start = 0;
map_end = 0x20000000000;
virt = (void *)LINUX_PAGE_OFFSET;
virt = (void *)linux_page_offset_base;
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, virt + 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) {
@ -2495,9 +2496,11 @@ static void init_linux_kernel_mapping(struct page_table *pt)
}
dkprintf("Linux kernel virtual: 0x%lx - 0x%lx -> 0x%lx - 0x%lx\n",
LINUX_PAGE_OFFSET + map_start, LINUX_PAGE_OFFSET + map_end, map_start, map_end);
linux_page_offset_base + map_start,
linux_page_offset_base + map_end,
map_start, map_end);
virt = (void *)(LINUX_PAGE_OFFSET + map_start);
virt = (void *)(linux_page_offset_base + map_start);
for (phys = map_start; phys < map_end; phys += LARGE_PAGE_SIZE, virt += LARGE_PAGE_SIZE) {
if (set_pt_large_page(pt, virt, phys, PTATTR_WRITABLE) != 0) {
kprintf("%s: set_pt_large_page() failed for 0x%lx\n", __FUNCTION__, virt);
@ -2641,12 +2644,12 @@ unsigned long virt_to_phys(void *v)
unsigned long va = (unsigned long)v;
if (va >= MAP_KERNEL_START) {
dkprintf("%s: MAP_KERNEL_START <= 0x%lx <= LINUX_PAGE_OFFSET\n",
dkprintf("%s: MAP_KERNEL_START <= 0x%lx <= linux_page_offset_base\n",
__FUNCTION__, va);
return va - MAP_KERNEL_START + x86_kernel_phys_base;
}
else if (va >= LINUX_PAGE_OFFSET) {
return va - LINUX_PAGE_OFFSET;
else if (va >= linux_page_offset_base) {
return va - linux_page_offset_base;
}
else if (va >= MAP_FIXED_START) {
return va - MAP_FIXED_START;
@ -2665,7 +2668,7 @@ void *phys_to_virt(unsigned long p)
return (void *)(p + MAP_ST_START);
}
return (void *)(p + LINUX_PAGE_OFFSET);
return (void *)(p + linux_page_offset_base);
}
int copy_from_user(void *dst, const void *src, size_t siz)

2
ihk

Submodule ihk updated: d5dc1632cc...761248395d