Messages in this thread | | | Date | Thu, 09 Apr 2015 13:47:04 +0100 | From | David Vrabel <> | Subject | Re: [Xen-devel] [Patch V2 10/15] xen: check pre-allocated page tables for conflict with memory map |
| |
On 09/04/2015 07:55, Juergen Gross wrote: > Check whether the page tables built by the domain builder are at > memory addresses which are in conflict with the target memory map. > If this is the case just panic instead of running into problems > later. > > Signed-off-by: Juergen Gross <jgross@suse.com> > --- > arch/x86/xen/mmu.c | 19 ++++++++++++++++--- > arch/x86/xen/setup.c | 6 ++++++ > arch/x86/xen/xen-ops.h | 1 + > 3 files changed, 23 insertions(+), 3 deletions(-) > > diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c > index 1ca5197..41aeb1c 100644 > --- a/arch/x86/xen/mmu.c > +++ b/arch/x86/xen/mmu.c > @@ -116,6 +116,7 @@ static pud_t level3_user_vsyscall[PTRS_PER_PUD] __page_aligned_bss; > DEFINE_PER_CPU(unsigned long, xen_cr3); /* cr3 stored as physaddr */ > DEFINE_PER_CPU(unsigned long, xen_current_cr3); /* actual vcpu cr3 */ > > +static phys_addr_t xen_pt_base, xen_pt_size;
These be __init, but the use of globals in this way is confusing.
> > /* > * Just beyond the highest usermode address. STACK_TOP_MAX has a > @@ -1998,7 +1999,9 @@ void __init xen_setup_kernel_pagetable(pgd_t *pgd, unsigned long max_pfn) > check_pt_base(&pt_base, &pt_end, addr[i]); > > /* Our (by three pages) smaller Xen pagetable that we are using */ > - memblock_reserve(PFN_PHYS(pt_base), (pt_end - pt_base) * PAGE_SIZE); > + xen_pt_base = PFN_PHYS(pt_base); > + xen_pt_size = (pt_end - pt_base) * PAGE_SIZE; > + memblock_reserve(xen_pt_base, xen_pt_size);
Why not provide a xen_memblock_check_and_reserve() call that has the xen_is_e820_reserved() check and the memblock_reserve() call? This may also be useful for patch #9 as well.
> +void __init xen_pt_check_e820(void) > +{ > + if (xen_chk_e820_reserved(xen_pt_base, xen_pt_size)) { > + xen_raw_console_write("Xen hypervisor allocated page table memory conflicts with E820 map\n"); > + BUG(); > + } > +} > + > static unsigned char dummy_mapping[PAGE_SIZE] __page_aligned_bss;
David
| |