From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Jan Beulich" Subject: [PATCH 05/11] x86: consolidate initialization of PV guest L4 page tables Date: Tue, 22 Jan 2013 10:52:20 +0000 Message-ID: <50FE7D7402000078000B8323@nat28.tlf.novell.com> References: <50FE7BF502000078000B82F8@nat28.tlf.novell.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=__PartDDEC7E74.0__=" Return-path: In-Reply-To: <50FE7BF502000078000B82F8@nat28.tlf.novell.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel List-Id: xen-devel@lists.xenproject.org This is a MIME message. If you are reading this text, you may want to consider changing to a mail reader or gateway that understands how to properly handle MIME multipart messages. --=__PartDDEC7E74.0__= Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable Content-Disposition: inline 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 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -290,13 +290,8 @@ static int setup_compat_l4(struct vcpu * pg->u.inuse.type_info =3D PGT_l4_page_table|PGT_validated|1; =20 l4tab =3D page_to_virt(pg); - copy_page(l4tab, idle_pg_table); - l4tab[0] =3D l4e_empty(); - l4tab[l4_table_offset(LINEAR_PT_VIRT_START)] =3D - l4e_from_page(pg, __PAGE_HYPERVISOR); - l4tab[l4_table_offset(PERDOMAIN_VIRT_START)] =3D - l4e_from_paddr(__pa(v->domain->arch.mm_perdomain_l3), - __PAGE_HYPERVISOR); + clear_page(l4tab); + init_guest_l4_table(l4tab, v->domain); =20 v->arch.guest_table =3D pagetable_from_page(pg); v->arch.guest_table_user =3D v->arch.guest_table; --- a/xen/arch/x86/domain_build.c +++ b/xen/arch/x86/domain_build.c @@ -622,13 +622,7 @@ int __init construct_dom0( l3start =3D __va(mpt_alloc); mpt_alloc +=3D PAGE_SIZE; } clear_page(l4tab); - for ( i =3D l4_table_offset(HYPERVISOR_VIRT_START); - i < l4_table_offset(HYPERVISOR_VIRT_END); ++i ) - l4tab[i] =3D idle_pg_table[i]; - l4tab[l4_table_offset(LINEAR_PT_VIRT_START)] =3D - l4e_from_paddr(__pa(l4start), __PAGE_HYPERVISOR); - l4tab[l4_table_offset(PERDOMAIN_VIRT_START)] =3D - l4e_from_paddr(__pa(d->arch.mm_perdomain_l3), __PAGE_HYPERVISOR); + init_guest_l4_table(l4tab, d); v->arch.guest_table =3D pagetable_from_paddr(__pa(l4start)); if ( is_pv_32on64_domain(d) ) v->arch.guest_table_user =3D v->arch.guest_table; --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -1315,6 +1315,18 @@ static int alloc_l3_table(struct page_in return rc > 0 ? 0 : rc; } =20 +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)] =3D + l4e_from_pfn(virt_to_mfn(l4tab), __PAGE_HYPERVISOR); + l4tab[l4_table_offset(PERDOMAIN_VIRT_START)] =3D + l4e_from_pfn(virt_to_mfn(d->arch.mm_perdomain_l3), __PAGE_HYPERVIS= OR); +} + static int alloc_l4_table(struct page_info *page, int preemptible) { struct domain *d =3D page_get_owner(page); @@ -1358,15 +1370,7 @@ static int alloc_l4_table(struct page_in adjust_guest_l4e(pl4e[i], d); } =20 - /* 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)] =3D - l4e_from_pfn(pfn, __PAGE_HYPERVISOR); - pl4e[l4_table_offset(PERDOMAIN_VIRT_START)] =3D - l4e_from_page(virt_to_page(d->arch.mm_perdomain_l3), - __PAGE_HYPERVISOR); + init_guest_l4_table(pl4e, d); =20 return rc > 0 ? 0 : rc; } --- a/xen/include/asm-x86/mm.h +++ b/xen/include/asm-x86/mm.h @@ -316,6 +316,8 @@ static inline void *__page_to_virt(const int free_page_type(struct page_info *page, unsigned long type, int preemptible); =20 +void init_guest_l4_table(l4_pgentry_t[], const struct domain *); + int is_iomem_page(unsigned long mfn); =20 void clear_superpage_mark(struct page_info *page); --=__PartDDEC7E74.0__= Content-Type: text/plain; name="x86-guest-l4-init.patch" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="x86-guest-l4-init.patch" x86: consolidate initialization of PV guest L4 page tables=0A=0ASo far = this has been repeated in 3 places, requiring to remember to=0Aupdate all = of them if a change is being made.=0A=0ASigned-off-by: Jan Beulich = =0A=0A--- a/xen/arch/x86/domain.c=0A+++ b/xen/arch/x86/d= omain.c=0A@@ -290,13 +290,8 @@ static int setup_compat_l4(struct vcpu *=0A = pg->u.inuse.type_info =3D PGT_l4_page_table|PGT_validated|1;=0A =0A = l4tab =3D page_to_virt(pg);=0A- copy_page(l4tab, idle_pg_table);=0A- = l4tab[0] =3D l4e_empty();=0A- l4tab[l4_table_offset(LINEAR_PT_VIRT_STAR= T)] =3D=0A- l4e_from_page(pg, __PAGE_HYPERVISOR);=0A- l4tab[l4_ta= ble_offset(PERDOMAIN_VIRT_START)] =3D=0A- l4e_from_paddr(__pa(v->dom= ain->arch.mm_perdomain_l3),=0A- __PAGE_HYPERVISOR);= =0A+ clear_page(l4tab);=0A+ init_guest_l4_table(l4tab, v->domain);=0A= =0A v->arch.guest_table =3D pagetable_from_page(pg);=0A v->arch.gu= est_table_user =3D v->arch.guest_table;=0A--- a/xen/arch/x86/domain_build.c= =0A+++ b/xen/arch/x86/domain_build.c=0A@@ -622,13 +622,7 @@ int __init = construct_dom0(=0A l3start =3D __va(mpt_alloc); mpt_alloc +=3D = PAGE_SIZE;=0A }=0A clear_page(l4tab);=0A- for ( i =3D l4_table_o= ffset(HYPERVISOR_VIRT_START);=0A- i < l4_table_offset(HYPERVISOR_V= IRT_END); ++i )=0A- l4tab[i] =3D idle_pg_table[i];=0A- l4tab[l4_t= able_offset(LINEAR_PT_VIRT_START)] =3D=0A- l4e_from_paddr(__pa(l4sta= rt), __PAGE_HYPERVISOR);=0A- l4tab[l4_table_offset(PERDOMAIN_VIRT_START)= ] =3D=0A- l4e_from_paddr(__pa(d->arch.mm_perdomain_l3), __PAGE_HYPER= VISOR);=0A+ init_guest_l4_table(l4tab, d);=0A v->arch.guest_table = =3D pagetable_from_paddr(__pa(l4start));=0A if ( is_pv_32on64_domain(d)= )=0A v->arch.guest_table_user =3D v->arch.guest_table;=0A--- = a/xen/arch/x86/mm.c=0A+++ b/xen/arch/x86/mm.c=0A@@ -1315,6 +1315,18 @@ = static int alloc_l3_table(struct page_in=0A return rc > 0 ? 0 : rc;=0A = }=0A =0A+void init_guest_l4_table(l4_pgentry_t l4tab[], const struct = domain *d)=0A+{=0A+ /* Xen private mappings. */=0A+ memcpy(&l4tab[ROO= T_PAGETABLE_FIRST_XEN_SLOT],=0A+ &idle_pg_table[ROOT_PAGETABLE_FI= RST_XEN_SLOT],=0A+ ROOT_PAGETABLE_XEN_SLOTS * sizeof(l4_pgentry_t= ));=0A+ l4tab[l4_table_offset(LINEAR_PT_VIRT_START)] =3D=0A+ = l4e_from_pfn(virt_to_mfn(l4tab), __PAGE_HYPERVISOR);=0A+ l4tab[l4_table_= offset(PERDOMAIN_VIRT_START)] =3D=0A+ l4e_from_pfn(virt_to_mfn(d->ar= ch.mm_perdomain_l3), __PAGE_HYPERVISOR);=0A+}=0A+=0A static int alloc_l4_ta= ble(struct page_info *page, int preemptible)=0A {=0A struct domain *d = =3D page_get_owner(page);=0A@@ -1358,15 +1370,7 @@ static int alloc_l4_tabl= e(struct page_in=0A adjust_guest_l4e(pl4e[i], d);=0A }=0A =0A- = /* Xen private mappings. */=0A- memcpy(&pl4e[ROOT_PAGETABLE_FIRST_XEN= _SLOT],=0A- &idle_pg_table[ROOT_PAGETABLE_FIRST_XEN_SLOT],=0A- = ROOT_PAGETABLE_XEN_SLOTS * sizeof(l4_pgentry_t));=0A- pl4e[l4_ta= ble_offset(LINEAR_PT_VIRT_START)] =3D=0A- l4e_from_pfn(pfn, = __PAGE_HYPERVISOR);=0A- pl4e[l4_table_offset(PERDOMAIN_VIRT_START)] = =3D=0A- l4e_from_page(virt_to_page(d->arch.mm_perdomain_l3),=0A- = __PAGE_HYPERVISOR);=0A+ init_guest_l4_table(pl4e, = d);=0A =0A return rc > 0 ? 0 : rc;=0A }=0A--- a/xen/include/asm-x86/mm.= h=0A+++ b/xen/include/asm-x86/mm.h=0A@@ -316,6 +316,8 @@ static inline = void *__page_to_virt(const=0A int free_page_type(struct page_info *page, = unsigned long type,=0A int preemptible);=0A =0A+void = init_guest_l4_table(l4_pgentry_t[], const struct domain *);=0A+=0A int = is_iomem_page(unsigned long mfn);=0A =0A void clear_superpage_mark(struct = page_info *page);=0A --=__PartDDEC7E74.0__= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel --=__PartDDEC7E74.0__=--