[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 50/55] x86/pv: properly map and unmap page tables in mark_pv_pt_pages_rdonly
From: Wei Liu <wei.liu2@xxxxxxxxxx> Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx> --- xen/arch/x86/pv/dom0_build.c | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/xen/arch/x86/pv/dom0_build.c b/xen/arch/x86/pv/dom0_build.c index 1bd53e9c08..d7d42568fb 100644 --- a/xen/arch/x86/pv/dom0_build.c +++ b/xen/arch/x86/pv/dom0_build.c @@ -50,17 +50,17 @@ static __init void mark_pv_pt_pages_rdonly(struct domain *d, unsigned long count; struct page_info *page; l4_pgentry_t *pl4e; - l3_pgentry_t *pl3e; - l2_pgentry_t *pl2e; - l1_pgentry_t *pl1e; + l3_pgentry_t *pl3e, *l3t; + l2_pgentry_t *pl2e, *l2t; + l1_pgentry_t *pl1e, *l1t; pl4e = l4start + l4_table_offset(vpt_start); - pl3e = l4e_to_l3e(*pl4e); - pl3e += l3_table_offset(vpt_start); - pl2e = l3e_to_l2e(*pl3e); - pl2e += l2_table_offset(vpt_start); - pl1e = l2e_to_l1e(*pl2e); - pl1e += l1_table_offset(vpt_start); + l3t = map_xen_pagetable_new(l4e_get_mfn(*pl4e)); + pl3e = l3t + l3_table_offset(vpt_start); + l2t = map_xen_pagetable_new(l3e_get_mfn(*pl3e)); + pl2e = l2t + l2_table_offset(vpt_start); + l1t = map_xen_pagetable_new(l2e_get_mfn(*pl2e)); + pl1e = l1t + l1_table_offset(vpt_start); for ( count = 0; count < nr_pt_pages; count++ ) { l1e_remove_flags(*pl1e, _PAGE_RW); @@ -85,12 +85,23 @@ static __init void mark_pv_pt_pages_rdonly(struct domain *d, if ( !((unsigned long)++pl2e & (PAGE_SIZE - 1)) ) { if ( !((unsigned long)++pl3e & (PAGE_SIZE - 1)) ) - pl3e = l4e_to_l3e(*++pl4e); - pl2e = l3e_to_l2e(*pl3e); + { + UNMAP_XEN_PAGETABLE_NEW(l3t); + l3t = map_xen_pagetable_new(l4e_get_mfn(*++pl4e)); + pl3e = l3t; + } + UNMAP_XEN_PAGETABLE_NEW(l2t); + l2t = map_xen_pagetable_new(l3e_get_mfn(*pl3e)); + pl2e = l2t; } - pl1e = l2e_to_l1e(*pl2e); + UNMAP_XEN_PAGETABLE_NEW(l1t); + l1t = map_xen_pagetable_new(l2e_get_mfn(*pl2e)); + pl1e = l1t; } } + UNMAP_XEN_PAGETABLE_NEW(l1t); + UNMAP_XEN_PAGETABLE_NEW(l2t); + UNMAP_XEN_PAGETABLE_NEW(l3t); } static __init void setup_pv_physmap(struct domain *d, unsigned long pgtbl_pfn, -- 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 |