[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v7 06/15] xen/arm: implement arch_vmap_virt_end
Move virt_start out of ioremap and rename it to early_vmap_start. Implement arch_vmap_virt_end by returning early_vmap_start. Allocate virtual addresses in early_ioremap from top to bottom so that later on when we initialize vmap, we can return the end of the vmap address space (the last address allocated by early_ioremap). Changes in v4: - merge with "early_ioremap: allocate virtual addresses from top to bottom" patch; - better commit message; - declare early_vmap_start __initdata; - use "& ~SECOND_MASK" instead of shifts. Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx> --- xen/arch/arm/mm.c | 25 +++++++++++++++++-------- 1 files changed, 17 insertions(+), 8 deletions(-) diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c index 03492df..5c2fadc 100644 --- a/xen/arch/arm/mm.c +++ b/xen/arch/arm/mm.c @@ -560,31 +560,40 @@ void __init setup_frametable_mappings(paddr_t ps, paddr_t pe) * start has to be 2MB aligned. * len has to be < EARLY_VMAP_VIRT_END - EARLY_VMAP_VIRT_START. */ +static __initdata unsigned long early_vmap_start = EARLY_VMAP_VIRT_END; void* __init early_ioremap(paddr_t start, size_t len, unsigned attributes) { - static unsigned long virt_start = EARLY_VMAP_VIRT_START; - unsigned long ret_addr = virt_start; paddr_t end = start + len; + unsigned long map_start; + + len = (len + SECOND_SIZE - 1) & ~SECOND_MASK; + early_vmap_start -= len; ASSERT(!(start & (~SECOND_MASK))); - ASSERT(!(virt_start & (~SECOND_MASK))); + ASSERT(!(early_vmap_start & (~SECOND_MASK))); /* The range we need to map is too big */ - if ( virt_start + len >= EARLY_VMAP_VIRT_END ) + if ( early_vmap_start >= EARLY_VMAP_VIRT_START ) return NULL; + map_start = early_vmap_start; while ( start < end ) { lpae_t e = mfn_to_xen_entry(start >> PAGE_SHIFT); e.pt.ai = attributes; - write_pte(xen_second + second_table_offset(virt_start), e); + write_pte(xen_second + second_table_offset(map_start), e); start += SECOND_SIZE; - virt_start += SECOND_SIZE; + map_start += SECOND_SIZE; } - flush_xen_data_tlb_range_va(ret_addr, len); + flush_xen_data_tlb_range_va(early_vmap_start, len); + + return (void*)early_vmap_start; +} - return (void*)ret_addr; +void *__init arch_vmap_virt_end(void) +{ + return (void *)early_vmap_start; } enum mg { mg_clear, mg_ro, mg_rw, mg_rx }; -- 1.7.2.5 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |