[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [PATCH v2 30/47] arm64: set the mapping for console and xenbus
This patch sets the mapping for console and xenbus. Just following what x86 does: 1.) Add VIRT_KERNEL_AREA/VIRT_DEMAND_AREA to limit the memory ranges for alloc_virt_kernel(). 2.) Change map_frame_virt() to setup the page table for console and xenbus. Signed-off-by: Huang Shijie <shijie.huang@xxxxxxx> --- arch/arm/mm.c | 47 ++++++++++++++++++++++++++++++++++++++++++----- include/arm/arch_mm.h | 2 ++ 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/arch/arm/mm.c b/arch/arm/mm.c index 23a23e1..7d290e2 100644 --- a/arch/arm/mm.c +++ b/arch/arm/mm.c @@ -236,12 +236,15 @@ void init_pagetable(unsigned long *start_pfn, unsigned long base, init_pagetable_ok = 1; } +static unsigned long virt_kernel_area_end; void arch_mm_preinit(void *dtb_pointer) { paddr_t **dtb_p = dtb_pointer; paddr_t *dtb = *dtb_p; uintptr_t end = (uintptr_t) &_end; + virt_kernel_area_end = VIRT_KERNEL_AREA; + dtb = to_virt(((paddr_t)dtb)); first_free_pfn = PFN_UP(to_phys(end)); min_mem_pfn = PFN_UP(to_phys(_text) + MIN_MEM_SIZE); @@ -257,6 +260,41 @@ void arch_mm_preinit(void *dtb_pointer) *dtb_p = dtb; } +static unsigned long alloc_virt_kernel(unsigned n_pages) +{ + unsigned long addr; + + addr = virt_kernel_area_end; + virt_kernel_area_end += PAGE_SIZE * n_pages; + ASSERT(virt_kernel_area_end <= VIRT_DEMAND_AREA); + + return addr; +} + +static paddr_t alloc_new_page(void) +{ + unsigned long page; + + page = alloc_page(); + if (!page) + BUG(); + memset((void *)page, 0, PAGE_SIZE); + dsb(ishst); + return to_phys(page); +} + +unsigned long map_frame_virt(unsigned long mfn) +{ + unsigned long addr; + int ret; + + addr = alloc_virt_kernel(1); + ret = build_pagetable(addr, mfn, 1, MEM_DEF_ATTR, + init_pagetable_ok? alloc_new_page: early_alloc_page, 3); + ASSERT(ret == 0); + + return addr; +} #else void arch_mm_preinit(void *dtb_pointer) { @@ -267,6 +305,10 @@ void init_pagetable(unsigned long *start_pfn, unsigned long base, { } +unsigned long map_frame_virt(unsigned long mfn) +{ + return mfn_to_virt(mfn); +} #endif void arch_init_mm(unsigned long *start_pfn_p, unsigned long *max_pfn_p) @@ -409,8 +451,3 @@ grant_entry_v1_t *arch_init_gnttab(int nr_grant_frames) return to_virt(gnttab_table); } - -unsigned long map_frame_virt(unsigned long mfn) -{ - return mfn_to_virt(mfn); -} diff --git a/include/arm/arch_mm.h b/include/arm/arch_mm.h index 7bfb942..bee1c69 100644 --- a/include/arm/arch_mm.h +++ b/include/arm/arch_mm.h @@ -11,6 +11,8 @@ typedef uint64_t paddr_t; #define PRIpaddr "lx" #define MIN_MEM_SIZE (0x400000) #define MAX_MEM_SIZE (1UL << 39) +#define VIRT_KERNEL_AREA ((unsigned long)to_virt(MAX_MEM_SIZE)) +#define VIRT_DEMAND_AREA (VIRT_KERNEL_AREA + MAX_MEM_SIZE) #endif typedef uint64_t lpae_t; -- 2.7.4 _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |