[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v4 14/31] x86/mm: move and rename guest_{, un}map_l1e
Move them to pv/mm.c and rename them pv_{,un}map_guest_l1e. Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx> --- xen/arch/x86/mm.c | 63 +++++++++++---------------------------------- xen/arch/x86/pv/mm.c | 33 ++++++++++++++++++++++++ xen/include/asm-x86/pv/mm.h | 9 +++++++ 3 files changed, 57 insertions(+), 48 deletions(-) diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index dd8fa43ef3..c42dd5f8f5 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -512,39 +512,6 @@ void update_cr3(struct vcpu *v) make_cr3(v, cr3_mfn); } -/* Get a mapping of a PV guest's l1e for this virtual address. */ -static l1_pgentry_t *guest_map_l1e(unsigned long addr, unsigned long *gl1mfn) -{ - l2_pgentry_t l2e; - - ASSERT(!paging_mode_translate(current->domain)); - ASSERT(!paging_mode_external(current->domain)); - - if ( unlikely(!__addr_ok(addr)) ) - return NULL; - - /* Find this l1e and its enclosing l1mfn in the linear map. */ - if ( __copy_from_user(&l2e, - &__linear_l2_table[l2_linear_offset(addr)], - sizeof(l2_pgentry_t)) ) - return NULL; - - /* Check flags that it will be safe to read the l1e. */ - if ( (l2e_get_flags(l2e) & (_PAGE_PRESENT | _PAGE_PSE)) != _PAGE_PRESENT ) - return NULL; - - *gl1mfn = l2e_get_pfn(l2e); - - return (l1_pgentry_t *)map_domain_page(_mfn(*gl1mfn)) + - l1_table_offset(addr); -} - -/* Pull down the mapping we got from guest_map_l1e(). */ -static inline void guest_unmap_l1e(void *p) -{ - unmap_domain_page(p); -} - static inline void page_set_tlbflush_timestamp(struct page_info *page) { /* @@ -3786,7 +3753,7 @@ static int create_grant_va_mapping( adjust_guest_l1e(nl1e, d); - pl1e = guest_map_l1e(va, &gl1mfn); + pl1e = pv_map_guest_l1e(va, &gl1mfn); if ( !pl1e ) { gdprintk(XENLOG_WARNING, "Could not find L1 PTE for address %lx\n", va); @@ -3795,7 +3762,7 @@ static int create_grant_va_mapping( if ( !get_page_from_mfn(_mfn(gl1mfn), current->domain) ) { - guest_unmap_l1e(pl1e); + pv_unmap_guest_l1e(pl1e); return GNTST_general_error; } @@ -3803,7 +3770,7 @@ static int create_grant_va_mapping( if ( !page_lock(l1pg) ) { put_page(l1pg); - guest_unmap_l1e(pl1e); + pv_unmap_guest_l1e(pl1e); return GNTST_general_error; } @@ -3811,7 +3778,7 @@ static int create_grant_va_mapping( { page_unlock(l1pg); put_page(l1pg); - guest_unmap_l1e(pl1e); + pv_unmap_guest_l1e(pl1e); return GNTST_general_error; } @@ -3820,7 +3787,7 @@ static int create_grant_va_mapping( page_unlock(l1pg); put_page(l1pg); - guest_unmap_l1e(pl1e); + pv_unmap_guest_l1e(pl1e); if ( okay ) put_page_from_l1e(ol1e, d); @@ -3836,7 +3803,7 @@ static int replace_grant_va_mapping( struct page_info *l1pg; int rc = 0; - pl1e = guest_map_l1e(addr, &gl1mfn); + pl1e = pv_map_guest_l1e(addr, &gl1mfn); if ( !pl1e ) { gdprintk(XENLOG_WARNING, "Could not find L1 PTE for address %lx\n", addr); @@ -3887,7 +3854,7 @@ static int replace_grant_va_mapping( page_unlock(l1pg); put_page(l1pg); out: - guest_unmap_l1e(pl1e); + pv_unmap_guest_l1e(pl1e); return rc; } @@ -3945,7 +3912,7 @@ int replace_grant_pv_mapping(uint64_t addr, unsigned long frame, if ( !new_addr ) return destroy_grant_va_mapping(addr, frame, curr); - pl1e = guest_map_l1e(new_addr, &gl1mfn); + pl1e = pv_map_guest_l1e(new_addr, &gl1mfn); if ( !pl1e ) { gdprintk(XENLOG_WARNING, @@ -3955,7 +3922,7 @@ int replace_grant_pv_mapping(uint64_t addr, unsigned long frame, if ( !get_page_from_mfn(_mfn(gl1mfn), current->domain) ) { - guest_unmap_l1e(pl1e); + pv_unmap_guest_l1e(pl1e); return GNTST_general_error; } @@ -3963,7 +3930,7 @@ int replace_grant_pv_mapping(uint64_t addr, unsigned long frame, if ( !page_lock(l1pg) ) { put_page(l1pg); - guest_unmap_l1e(pl1e); + pv_unmap_guest_l1e(pl1e); return GNTST_general_error; } @@ -3971,7 +3938,7 @@ int replace_grant_pv_mapping(uint64_t addr, unsigned long frame, { page_unlock(l1pg); put_page(l1pg); - guest_unmap_l1e(pl1e); + pv_unmap_guest_l1e(pl1e); return GNTST_general_error; } @@ -3983,13 +3950,13 @@ int replace_grant_pv_mapping(uint64_t addr, unsigned long frame, page_unlock(l1pg); put_page(l1pg); gdprintk(XENLOG_WARNING, "Cannot delete PTE entry at %p\n", pl1e); - guest_unmap_l1e(pl1e); + pv_unmap_guest_l1e(pl1e); return GNTST_general_error; } page_unlock(l1pg); put_page(l1pg); - guest_unmap_l1e(pl1e); + pv_unmap_guest_l1e(pl1e); rc = replace_grant_va_mapping(addr, frame, ol1e, curr); if ( rc ) @@ -4123,7 +4090,7 @@ static int __do_update_va_mapping( return rc; rc = -EINVAL; - pl1e = guest_map_l1e(va, &gl1mfn); + pl1e = pv_map_guest_l1e(va, &gl1mfn); if ( unlikely(!pl1e || !get_page_from_mfn(_mfn(gl1mfn), d)) ) goto out; @@ -4148,7 +4115,7 @@ static int __do_update_va_mapping( out: if ( pl1e ) - guest_unmap_l1e(pl1e); + pv_unmap_guest_l1e(pl1e); switch ( flags & UVMF_FLUSHTYPE_MASK ) { diff --git a/xen/arch/x86/pv/mm.c b/xen/arch/x86/pv/mm.c index 2cb5995e62..32e73d59df 100644 --- a/xen/arch/x86/pv/mm.c +++ b/xen/arch/x86/pv/mm.c @@ -63,6 +63,39 @@ void pv_get_guest_eff_kern_l1e(struct vcpu *v, unsigned long addr, toggle_guest_mode(v); } +/* Get a mapping of a PV guest's l1e for this virtual address. */ +l1_pgentry_t *pv_map_guest_l1e(unsigned long addr, unsigned long *gl1mfn) +{ + l2_pgentry_t l2e; + + ASSERT(!paging_mode_translate(current->domain)); + ASSERT(!paging_mode_external(current->domain)); + + if ( unlikely(!__addr_ok(addr)) ) + return NULL; + + /* Find this l1e and its enclosing l1mfn in the linear map. */ + if ( __copy_from_user(&l2e, + &__linear_l2_table[l2_linear_offset(addr)], + sizeof(l2_pgentry_t)) ) + return NULL; + + /* Check flags that it will be safe to read the l1e. */ + if ( (l2e_get_flags(l2e) & (_PAGE_PRESENT | _PAGE_PSE)) != _PAGE_PRESENT ) + return NULL; + + *gl1mfn = l2e_get_pfn(l2e); + + return (l1_pgentry_t *)map_domain_page(_mfn(*gl1mfn)) + + l1_table_offset(addr); +} + +/* Pull down the mapping we got from pv_map_guest_l1e(). */ +void pv_unmap_guest_l1e(void *p) +{ + unmap_domain_page(p); +} + /* * How to write an entry to the guest pagetables. * Returns false for failure (pointer not valid), true for success. diff --git a/xen/include/asm-x86/pv/mm.h b/xen/include/asm-x86/pv/mm.h index b3887989b6..006156d0e1 100644 --- a/xen/include/asm-x86/pv/mm.h +++ b/xen/include/asm-x86/pv/mm.h @@ -86,6 +86,9 @@ bool pv_update_intpte(intpte_t *p, intpte_t old, intpte_t new, _t ## e_get_intpte(_o), _t ## e_get_intpte(_n), \ (_m), (_v), (_ad)) +l1_pgentry_t *pv_map_guest_l1e(unsigned long addr, unsigned long *gl1mfn); +void pv_unmap_guest_l1e(void *p); + #else static inline void pv_get_guest_eff_l1e(unsigned long addr, @@ -101,6 +104,12 @@ static inline bool pv_update_intpte(intpte_t *p, intpte_t old, intpte_t new, int preserve_ad) { return false; } +static inline l1_pgentry_t *pv_map_guest_l1e(unsigned long addr, + unsigned long *gl1mfn); +{ return NULL; } + +static inline void pv_unmap_guest_l1e(void *p) {} + #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 |