diff options
author | Jan Beulich <jbeulich@suse.com> | 2013-01-23 14:09:41 +0100 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2013-01-23 14:09:41 +0100 |
commit | 02955ee2d15a43ec18f60146064ccb8841909779 (patch) | |
tree | f172f575db59dd960ee7e23341cd3d1e1bb3898d /xen/arch/x86/mm.c | |
parent | 03b4fd14aca0456b413a1855024d5e5326cc95ec (diff) | |
download | xen-02955ee2d15a43ec18f60146064ccb8841909779.tar.gz xen-02955ee2d15a43ec18f60146064ccb8841909779.tar.bz2 xen-02955ee2d15a43ec18f60146064ccb8841909779.zip |
x86: consolidate initialization of PV guest L4 page tables
So far this has been repeated in 3 places, requiring to remember to
update all of them if a change is being made.
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Diffstat (limited to 'xen/arch/x86/mm.c')
-rw-r--r-- | xen/arch/x86/mm.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index 9627b076c6..d63ea250f5 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -1315,6 +1315,18 @@ static int alloc_l3_table(struct page_info *page, int preemptible) return rc > 0 ? 0 : rc; } +void init_guest_l4_table(l4_pgentry_t l4tab[], const struct domain *d) +{ + /* Xen private mappings. */ + memcpy(&l4tab[ROOT_PAGETABLE_FIRST_XEN_SLOT], + &idle_pg_table[ROOT_PAGETABLE_FIRST_XEN_SLOT], + ROOT_PAGETABLE_XEN_SLOTS * sizeof(l4_pgentry_t)); + l4tab[l4_table_offset(LINEAR_PT_VIRT_START)] = + l4e_from_pfn(virt_to_mfn(l4tab), __PAGE_HYPERVISOR); + l4tab[l4_table_offset(PERDOMAIN_VIRT_START)] = + l4e_from_pfn(virt_to_mfn(d->arch.mm_perdomain_l3), __PAGE_HYPERVISOR); +} + static int alloc_l4_table(struct page_info *page, int preemptible) { struct domain *d = page_get_owner(page); @@ -1358,15 +1370,7 @@ static int alloc_l4_table(struct page_info *page, int preemptible) adjust_guest_l4e(pl4e[i], d); } - /* Xen private mappings. */ - memcpy(&pl4e[ROOT_PAGETABLE_FIRST_XEN_SLOT], - &idle_pg_table[ROOT_PAGETABLE_FIRST_XEN_SLOT], - ROOT_PAGETABLE_XEN_SLOTS * sizeof(l4_pgentry_t)); - pl4e[l4_table_offset(LINEAR_PT_VIRT_START)] = - l4e_from_pfn(pfn, __PAGE_HYPERVISOR); - pl4e[l4_table_offset(PERDOMAIN_VIRT_START)] = - l4e_from_page(virt_to_page(d->arch.mm_perdomain_l3), - __PAGE_HYPERVISOR); + init_guest_l4_table(pl4e, d); return rc > 0 ? 0 : rc; } |