[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v2 09/40] xen/arm: decouple copy_from_paddr with FIXMAP
From: Wei Chen <wei.chen@xxxxxxx> copy_from_paddr will map a page to Xen's FIXMAP_MISC area for temporary access. But for those systems do not support VMSA, they can not implement set_fixmap/clear_fixmap, that means they can't always use the same virtual address for source address. In this case, we introduce to helpers to decouple copy_from_paddr with set_fixmap/clear_fixmap. map_page_to_xen_misc can always return the same virtual address as before for VMSA systems. It also can return different address for non-VMSA systems. Signed-off-by: Wei Chen <wei.chen@xxxxxxx> --- v1 -> v2: 1. New patch --- xen/arch/arm/include/asm/setup.h | 4 ++++ xen/arch/arm/kernel.c | 13 +++++++------ xen/arch/arm/mm.c | 12 ++++++++++++ 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/xen/arch/arm/include/asm/setup.h b/xen/arch/arm/include/asm/setup.h index a926f30a2b..4f39a1aa0a 100644 --- a/xen/arch/arm/include/asm/setup.h +++ b/xen/arch/arm/include/asm/setup.h @@ -119,6 +119,10 @@ extern struct bootinfo bootinfo; extern domid_t max_init_domid; +/* Map a page to misc area */ +void *map_page_to_xen_misc(mfn_t mfn, unsigned int attributes); +/* Unmap the page from misc area */ +void unmap_page_from_xen_misc(void); void copy_from_paddr(void *dst, paddr_t paddr, unsigned long len); size_t estimate_efi_size(unsigned int mem_nr_banks); diff --git a/xen/arch/arm/kernel.c b/xen/arch/arm/kernel.c index 23b840ea9e..0475d8fae7 100644 --- a/xen/arch/arm/kernel.c +++ b/xen/arch/arm/kernel.c @@ -49,18 +49,19 @@ struct minimal_dtb_header { */ void __init copy_from_paddr(void *dst, paddr_t paddr, unsigned long len) { - void *src = (void *)FIXMAP_ADDR(FIXMAP_MISC); - - while (len) { + while ( len ) + { + void *src; unsigned long l, s; - s = paddr & (PAGE_SIZE-1); + s = paddr & (PAGE_SIZE - 1); l = min(PAGE_SIZE - s, len); - set_fixmap(FIXMAP_MISC, maddr_to_mfn(paddr), PAGE_HYPERVISOR_WC); + src = map_page_to_xen_misc(maddr_to_mfn(paddr), PAGE_HYPERVISOR_WC); + ASSERT(src != NULL); memcpy(dst, src + s, l); clean_dcache_va_range(dst, l); - clear_fixmap(FIXMAP_MISC); + unmap_page_from_xen_misc(); paddr += l; dst += l; diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c index 0fc6f2992d..8f15814c5e 100644 --- a/xen/arch/arm/mm.c +++ b/xen/arch/arm/mm.c @@ -355,6 +355,18 @@ void clear_fixmap(unsigned int map) BUG_ON(res != 0); } +void *map_page_to_xen_misc(mfn_t mfn, unsigned int attributes) +{ + set_fixmap(FIXMAP_MISC, mfn, attributes); + + return fix_to_virt(FIXMAP_MISC); +} + +void unmap_page_from_xen_misc(void) +{ + clear_fixmap(FIXMAP_MISC); +} + void flush_page_to_ram(unsigned long mfn, bool sync_icache) { void *v = map_domain_page(_mfn(mfn)); -- 2.25.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |