[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 30/55] efi: use new page table APIs in efi_init_memory
From: Wei Liu <wei.liu2@xxxxxxxxxx> Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx> --- xen/common/efi/boot.c | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/xen/common/efi/boot.c b/xen/common/efi/boot.c index 64a287690a..1d1420f02c 100644 --- a/xen/common/efi/boot.c +++ b/xen/common/efi/boot.c @@ -1637,39 +1637,50 @@ void __init efi_init_memory(void) if ( !(l4e_get_flags(l4e) & _PAGE_PRESENT) ) { - pl3e = alloc_xen_pagetable(); - BUG_ON(!pl3e); + mfn_t l3t_mfn; + + l3t_mfn = alloc_xen_pagetable_new(); + BUG_ON(mfn_eq(l3t_mfn, INVALID_MFN)); + pl3e = map_xen_pagetable_new(l3t_mfn); clear_page(pl3e); efi_l4_pgtable[l4_table_offset(addr)] = - l4e_from_paddr(virt_to_maddr(pl3e), __PAGE_HYPERVISOR); + l4e_from_mfn(l3t_mfn, __PAGE_HYPERVISOR); } else - pl3e = l4e_to_l3e(l4e); + pl3e = map_xen_pagetable_new(l4e_get_mfn(l4e)); pl3e += l3_table_offset(addr); + if ( !(l3e_get_flags(*pl3e) & _PAGE_PRESENT) ) { - pl2e = alloc_xen_pagetable(); - BUG_ON(!pl2e); + mfn_t l2t_mfn; + + l2t_mfn = alloc_xen_pagetable_new(); + BUG_ON(mfn_eq(l2t_mfn, INVALID_MFN)); + pl2e = map_xen_pagetable_new(l2t_mfn); clear_page(pl2e); - *pl3e = l3e_from_paddr(virt_to_maddr(pl2e), __PAGE_HYPERVISOR); + *pl3e = l3e_from_mfn(l2t_mfn, __PAGE_HYPERVISOR); } else { BUG_ON(l3e_get_flags(*pl3e) & _PAGE_PSE); - pl2e = l3e_to_l2e(*pl3e); + pl2e = map_xen_pagetable_new(l3e_get_mfn(*pl3e)); } pl2e += l2_table_offset(addr); + if ( !(l2e_get_flags(*pl2e) & _PAGE_PRESENT) ) { - l1t = alloc_xen_pagetable(); - BUG_ON(!l1t); + mfn_t l1t_mfn; + + l1t_mfn = alloc_xen_pagetable_new(); + BUG_ON(mfn_eq(l1t_mfn, INVALID_MFN)); + l1t = map_xen_pagetable_new(l1t_mfn); clear_page(l1t); - *pl2e = l2e_from_paddr(virt_to_maddr(l1t), __PAGE_HYPERVISOR); + *pl2e = l2e_from_mfn(l1t_mfn, __PAGE_HYPERVISOR); } else { BUG_ON(l2e_get_flags(*pl2e) & _PAGE_PSE); - l1t = l2e_to_l1e(*pl2e); + l1t = map_xen_pagetable_new(l2e_get_mfn(*pl2e)); } for ( i = l1_table_offset(addr); i < L1_PAGETABLE_ENTRIES && extra->smfn < extra->emfn; @@ -1681,6 +1692,10 @@ void __init efi_init_memory(void) extra_head = extra->next; xfree(extra); } + + UNMAP_XEN_PAGETABLE_NEW(l1t); + UNMAP_XEN_PAGETABLE_NEW(pl2e); + UNMAP_XEN_PAGETABLE_NEW(pl3e); } /* Insert Xen mappings. */ -- 2.17.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |