Commit 75f2d3a0 authored by Juergen Gross's avatar Juergen Gross Committed by Boris Ostrovsky

x86/xen: enable early use of set_fixmap in 32-bit Xen PV guest

Commit 7b25b9cb ("x86/xen/time: Initialize pv xen time in
init_hypervisor_platform()") moved the mapping of the shared info area
before pagetable_init(). This breaks booting as 32-bit PV guest as the
use of set_fixmap isn't possible at this time on 32-bit.

This can be worked around by populating the needed PMD on 32-bit
kernel earlier.

In order not to reimplement populate_extra_pte() using extend_brk()
for allocating new page tables extend alloc_low_pages() to do that in
case the early page table pool is not yet available.

Fixes: 7b25b9cb ("x86/xen/time: Initialize pv xen time in init_hypervisor_platform()")
Signed-off-by: default avatarJuergen Gross <jgross@suse.com>
Reviewed-by: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarBoris Ostrovsky <boris.ostrovsky@oracle.com>
parent 00f53f75
...@@ -99,15 +99,22 @@ __ref void *alloc_low_pages(unsigned int num) ...@@ -99,15 +99,22 @@ __ref void *alloc_low_pages(unsigned int num)
} }
if ((pgt_buf_end + num) > pgt_buf_top || !can_use_brk_pgt) { if ((pgt_buf_end + num) > pgt_buf_top || !can_use_brk_pgt) {
unsigned long ret; unsigned long ret = 0;
if (min_pfn_mapped >= max_pfn_mapped)
panic("alloc_low_pages: ran out of memory"); if (min_pfn_mapped < max_pfn_mapped) {
ret = memblock_find_in_range(min_pfn_mapped << PAGE_SHIFT, ret = memblock_find_in_range(
min_pfn_mapped << PAGE_SHIFT,
max_pfn_mapped << PAGE_SHIFT, max_pfn_mapped << PAGE_SHIFT,
PAGE_SIZE * num , PAGE_SIZE); PAGE_SIZE * num , PAGE_SIZE);
}
if (ret)
memblock_reserve(ret, PAGE_SIZE * num);
else if (can_use_brk_pgt)
ret = __pa(extend_brk(PAGE_SIZE * num, PAGE_SIZE));
if (!ret) if (!ret)
panic("alloc_low_pages: can not alloc memory"); panic("alloc_low_pages: can not alloc memory");
memblock_reserve(ret, PAGE_SIZE * num);
pfn = ret >> PAGE_SHIFT; pfn = ret >> PAGE_SHIFT;
} else { } else {
pfn = pgt_buf_end; pfn = pgt_buf_end;
......
...@@ -122,6 +122,8 @@ static void __init xen_banner(void) ...@@ -122,6 +122,8 @@ static void __init xen_banner(void)
static void __init xen_pv_init_platform(void) static void __init xen_pv_init_platform(void)
{ {
populate_extra_pte(fix_to_virt(FIX_PARAVIRT_BOOTMAP));
set_fixmap(FIX_PARAVIRT_BOOTMAP, xen_start_info->shared_info); set_fixmap(FIX_PARAVIRT_BOOTMAP, xen_start_info->shared_info);
HYPERVISOR_shared_info = (void *)fix_to_virt(FIX_PARAVIRT_BOOTMAP); HYPERVISOR_shared_info = (void *)fix_to_virt(FIX_PARAVIRT_BOOTMAP);
......
...@@ -2171,6 +2171,8 @@ void __init xen_relocate_p2m(void) ...@@ -2171,6 +2171,8 @@ void __init xen_relocate_p2m(void)
#else /* !CONFIG_X86_64 */ #else /* !CONFIG_X86_64 */
static RESERVE_BRK_ARRAY(pmd_t, initial_kernel_pmd, PTRS_PER_PMD); static RESERVE_BRK_ARRAY(pmd_t, initial_kernel_pmd, PTRS_PER_PMD);
static RESERVE_BRK_ARRAY(pmd_t, swapper_kernel_pmd, PTRS_PER_PMD); static RESERVE_BRK_ARRAY(pmd_t, swapper_kernel_pmd, PTRS_PER_PMD);
RESERVE_BRK(fixup_kernel_pmd, PAGE_SIZE);
RESERVE_BRK(fixup_kernel_pte, PAGE_SIZE);
static void __init xen_write_cr3_init(unsigned long cr3) static void __init xen_write_cr3_init(unsigned long cr3)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment