[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v5 14/23] x86/mm: move PV l4 table setup code
Move the code to pv/mm.c. Export pv_arch_init_memory via global pv/mm.h and init_guest_l4_table via local pv/mm.h. Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx> --- xen/arch/x86/mm.c | 82 +------------------------------------------- xen/arch/x86/pv/dom0_build.c | 2 ++ xen/arch/x86/pv/domain.c | 5 +++ xen/arch/x86/pv/mm.c | 82 ++++++++++++++++++++++++++++++++++++++++++++ xen/arch/x86/pv/mm.h | 3 ++ xen/include/asm-x86/mm.h | 2 -- xen/include/asm-x86/pv/mm.h | 4 +++ 7 files changed, 97 insertions(+), 83 deletions(-) diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index 93ca075698..3a919c19b8 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -125,6 +125,7 @@ #include <asm/hvm/grant_table.h> #include <asm/pv/grant_table.h> +#include <asm/pv/mm.h> #include "pv/mm.h" @@ -241,53 +242,6 @@ void __init init_frametable(void) memset(end_pg, -1, (unsigned long)top_pg - (unsigned long)end_pg); } -#ifndef NDEBUG -static unsigned int __read_mostly root_pgt_pv_xen_slots - = ROOT_PAGETABLE_PV_XEN_SLOTS; -static l4_pgentry_t __read_mostly split_l4e; -#else -#define root_pgt_pv_xen_slots ROOT_PAGETABLE_PV_XEN_SLOTS -#endif - -static void pv_arch_init_memory(void) -{ -#ifndef NDEBUG - unsigned int i; - - if ( highmem_start ) - { - unsigned long split_va = (unsigned long)__va(highmem_start); - - if ( split_va < HYPERVISOR_VIRT_END && - split_va - 1 == (unsigned long)__va(highmem_start - 1) ) - { - root_pgt_pv_xen_slots = l4_table_offset(split_va) - - ROOT_PAGETABLE_FIRST_XEN_SLOT; - ASSERT(root_pgt_pv_xen_slots < ROOT_PAGETABLE_PV_XEN_SLOTS); - if ( l4_table_offset(split_va) == l4_table_offset(split_va - 1) ) - { - l3_pgentry_t *l3tab = alloc_xen_pagetable(); - - if ( l3tab ) - { - const l3_pgentry_t *l3idle = - l4e_to_l3e(idle_pg_table[l4_table_offset(split_va)]); - - for ( i = 0; i < l3_table_offset(split_va); ++i ) - l3tab[i] = l3idle[i]; - for ( ; i < L3_PAGETABLE_ENTRIES; ++i ) - l3tab[i] = l3e_empty(); - split_l4e = l4e_from_pfn(virt_to_mfn(l3tab), - __PAGE_HYPERVISOR_RW); - } - else - ++root_pgt_pv_xen_slots; - } - } - } -#endif -} - void __init arch_init_memory(void) { unsigned long i, pfn, rstart_pfn, rend_pfn, iostart_pfn, ioend_pfn; @@ -1424,40 +1378,6 @@ static int alloc_l3_table(struct page_info *page) return rc > 0 ? 0 : rc; } -/* - * This function must write all ROOT_PAGETABLE_PV_XEN_SLOTS, to clobber any - * values a guest may have left there from alloc_l4_table(). - */ -void init_guest_l4_table(l4_pgentry_t l4tab[], const struct domain *d, - bool zap_ro_mpt) -{ - /* Xen private mappings. */ - memcpy(&l4tab[ROOT_PAGETABLE_FIRST_XEN_SLOT], - &idle_pg_table[ROOT_PAGETABLE_FIRST_XEN_SLOT], - root_pgt_pv_xen_slots * sizeof(l4_pgentry_t)); -#ifndef NDEBUG - if ( unlikely(root_pgt_pv_xen_slots < ROOT_PAGETABLE_PV_XEN_SLOTS) ) - { - l4_pgentry_t *next = &l4tab[ROOT_PAGETABLE_FIRST_XEN_SLOT + - root_pgt_pv_xen_slots]; - - if ( l4e_get_intpte(split_l4e) ) - *next++ = split_l4e; - - memset(next, 0, - _p(&l4tab[ROOT_PAGETABLE_LAST_XEN_SLOT + 1]) - _p(next)); - } -#else - BUILD_BUG_ON(root_pgt_pv_xen_slots != ROOT_PAGETABLE_PV_XEN_SLOTS); -#endif - l4tab[l4_table_offset(LINEAR_PT_VIRT_START)] = - l4e_from_pfn(domain_page_map_to_mfn(l4tab), __PAGE_HYPERVISOR_RW); - l4tab[l4_table_offset(PERDOMAIN_VIRT_START)] = - l4e_from_page(d->arch.perdomain_l3_pg, __PAGE_HYPERVISOR_RW); - if ( zap_ro_mpt || is_pv_32bit_domain(d) ) - l4tab[l4_table_offset(RO_MPT_VIRT_START)] = l4e_empty(); -} - bool fill_ro_mpt(mfn_t mfn) { l4_pgentry_t *l4tab = map_domain_page(mfn); diff --git a/xen/arch/x86/pv/dom0_build.c b/xen/arch/x86/pv/dom0_build.c index ec7f96d066..dcbee43e8f 100644 --- a/xen/arch/x86/pv/dom0_build.c +++ b/xen/arch/x86/pv/dom0_build.c @@ -20,6 +20,8 @@ #include <asm/page.h> #include <asm/setup.h> +#include "mm.h" + /* Allow ring-3 access in long mode as guest cannot use ring 1 ... */ #define BASE_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_USER) #define L1_PROT (BASE_PROT|_PAGE_GUEST_KERNEL) diff --git a/xen/arch/x86/pv/domain.c b/xen/arch/x86/pv/domain.c index c8b9cb645b..90d5569be1 100644 --- a/xen/arch/x86/pv/domain.c +++ b/xen/arch/x86/pv/domain.c @@ -9,8 +9,13 @@ #include <xen/lib.h> #include <xen/sched.h> +#include <asm/p2m.h> +#include <asm/paging.h> +#include <asm/setup.h> #include <asm/pv/domain.h> +#include "mm.h" + /* Override macros from asm/page.h to make them work with mfn_t */ #undef mfn_to_page #define mfn_to_page(mfn) __mfn_to_page(mfn_x(mfn)) diff --git a/xen/arch/x86/pv/mm.c b/xen/arch/x86/pv/mm.c index 6890e80efd..d0fc14dfa6 100644 --- a/xen/arch/x86/pv/mm.c +++ b/xen/arch/x86/pv/mm.c @@ -23,6 +23,7 @@ #include <asm/current.h> #include <asm/p2m.h> +#include <asm/setup.h> #include "mm.h" @@ -32,6 +33,14 @@ #undef page_to_mfn #define page_to_mfn(pg) _mfn(__page_to_mfn(pg)) +#ifndef NDEBUG +static unsigned int __read_mostly root_pgt_pv_xen_slots + = ROOT_PAGETABLE_PV_XEN_SLOTS; +static l4_pgentry_t __read_mostly split_l4e; +#else +#define root_pgt_pv_xen_slots ROOT_PAGETABLE_PV_XEN_SLOTS +#endif + /* * Get a mapping of a PV guest's l1e for this linear address. The return * pointer should be unmapped using unmap_domain_page(). @@ -133,6 +142,79 @@ bool pv_map_ldt_shadow_page(unsigned int offset) return true; } +/* + * This function must write all ROOT_PAGETABLE_PV_XEN_SLOTS, to clobber any + * values a guest may have left there from alloc_l4_table(). + */ +void init_guest_l4_table(l4_pgentry_t l4tab[], const struct domain *d, + bool zap_ro_mpt) +{ + /* Xen private mappings. */ + memcpy(&l4tab[ROOT_PAGETABLE_FIRST_XEN_SLOT], + &idle_pg_table[ROOT_PAGETABLE_FIRST_XEN_SLOT], + root_pgt_pv_xen_slots * sizeof(l4_pgentry_t)); +#ifndef NDEBUG + if ( unlikely(root_pgt_pv_xen_slots < ROOT_PAGETABLE_PV_XEN_SLOTS) ) + { + l4_pgentry_t *next = &l4tab[ROOT_PAGETABLE_FIRST_XEN_SLOT + + root_pgt_pv_xen_slots]; + + if ( l4e_get_intpte(split_l4e) ) + *next++ = split_l4e; + + memset(next, 0, + _p(&l4tab[ROOT_PAGETABLE_LAST_XEN_SLOT + 1]) - _p(next)); + } +#else + BUILD_BUG_ON(root_pgt_pv_xen_slots != ROOT_PAGETABLE_PV_XEN_SLOTS); +#endif + l4tab[l4_table_offset(LINEAR_PT_VIRT_START)] = + l4e_from_pfn(domain_page_map_to_mfn(l4tab), __PAGE_HYPERVISOR_RW); + l4tab[l4_table_offset(PERDOMAIN_VIRT_START)] = + l4e_from_page(d->arch.perdomain_l3_pg, __PAGE_HYPERVISOR_RW); + if ( zap_ro_mpt || is_pv_32bit_domain(d) ) + l4tab[l4_table_offset(RO_MPT_VIRT_START)] = l4e_empty(); +} + +void pv_arch_init_memory(void) +{ +#ifndef NDEBUG + unsigned int i; + + if ( highmem_start ) + { + unsigned long split_va = (unsigned long)__va(highmem_start); + + if ( split_va < HYPERVISOR_VIRT_END && + split_va - 1 == (unsigned long)__va(highmem_start - 1) ) + { + root_pgt_pv_xen_slots = l4_table_offset(split_va) - + ROOT_PAGETABLE_FIRST_XEN_SLOT; + ASSERT(root_pgt_pv_xen_slots < ROOT_PAGETABLE_PV_XEN_SLOTS); + if ( l4_table_offset(split_va) == l4_table_offset(split_va - 1) ) + { + l3_pgentry_t *l3tab = alloc_xen_pagetable(); + + if ( l3tab ) + { + const l3_pgentry_t *l3idle = + l4e_to_l3e(idle_pg_table[l4_table_offset(split_va)]); + + for ( i = 0; i < l3_table_offset(split_va); ++i ) + l3tab[i] = l3idle[i]; + for ( ; i < L3_PAGETABLE_ENTRIES; ++i ) + l3tab[i] = l3e_empty(); + split_l4e = l4e_from_pfn(virt_to_mfn(l3tab), + __PAGE_HYPERVISOR_RW); + } + else + ++root_pgt_pv_xen_slots; + } + } + } +#endif +} + /* * Local variables: * mode: C diff --git a/xen/arch/x86/pv/mm.h b/xen/arch/x86/pv/mm.h index acef061acf..a641964949 100644 --- a/xen/arch/x86/pv/mm.h +++ b/xen/arch/x86/pv/mm.h @@ -3,6 +3,9 @@ l1_pgentry_t *map_guest_l1e(unsigned long linear, mfn_t *gl1mfn); +void init_guest_l4_table(l4_pgentry_t l4tab[], const struct domain *d, + bool zap_ro_mpt); + /* Read a PV guest's l1e that maps this linear address. */ static inline l1_pgentry_t guest_get_eff_l1e(unsigned long linear) { diff --git a/xen/include/asm-x86/mm.h b/xen/include/asm-x86/mm.h index 8a56bed454..e5087e11e5 100644 --- a/xen/include/asm-x86/mm.h +++ b/xen/include/asm-x86/mm.h @@ -329,8 +329,6 @@ static inline void *__page_to_virt(const struct page_info *pg) int free_page_type(struct page_info *page, unsigned long type, int preemptible); -void init_guest_l4_table(l4_pgentry_t[], const struct domain *, - bool_t zap_ro_mpt); bool fill_ro_mpt(mfn_t mfn); void zap_ro_mpt(mfn_t mfn); diff --git a/xen/include/asm-x86/pv/mm.h b/xen/include/asm-x86/pv/mm.h index 47223e38eb..4944a70c7a 100644 --- a/xen/include/asm-x86/pv/mm.h +++ b/xen/include/asm-x86/pv/mm.h @@ -30,6 +30,8 @@ void pv_destroy_gdt(struct vcpu *d); bool pv_map_ldt_shadow_page(unsigned int off); +void pv_arch_init_memory(void); + #else #include <xen/errno.h> @@ -47,6 +49,8 @@ static inline void pv_destroy_gdt(struct vcpu *d) {} static inline bool pv_map_ldt_shadow_page(unsigned int off) { return false; } +static inline void pv_arch_init_memory(void) {} + #endif #endif /* __X86_PV_MM_H__ */ -- 2.11.0 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |