[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [PATCH 30/40] arm64: set the mapping for console and xenbus
This patch sets the mapping for console and xenbus: .1) Use the page granule (4K) to setup the page table. .2) Use the alloc_new_page() to get new page from the memory system. Change-Id: Ic512c89412e40cbff8ebb1635e798357378485a0 Jira: ENTOS-247 Signed-off-by: Huang Shijie <shijie.huang@xxxxxxx> --- arch/arm/mm.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 55 insertions(+), 5 deletions(-) diff --git a/arch/arm/mm.c b/arch/arm/mm.c index fb7886c..f85e5a0 100644 --- a/arch/arm/mm.c +++ b/arch/arm/mm.c @@ -37,16 +37,43 @@ static inline void set_pgt_entry(lpae_t *ptr, lpae_t val) isb(); } +static void build_pte(lpae_t *pud, unsigned long vaddr, unsigned long vend, + paddr_t phys, long mem_type) +{ + lpae_t *pte; + + pte = (lpae_t *)to_virt((*pud) & ~ATTR_MASK_L) + l3_pgt_idx(vaddr); + do { + set_pgt_entry(pte, (phys & L3_MASK) | mem_type | L3_PAGE); + + vaddr += L3_SIZE; + phys += L3_SIZE; + pte++; + } while (vaddr < vend); +} + static void build_pud(lpae_t *pgd, unsigned long vaddr, unsigned long vend, paddr_t phys, long mem_type, paddr_t (*new_page)(void), int level) { lpae_t *pud; + unsigned long next; pud = (lpae_t *)to_virt((*pgd) & ~ATTR_MASK_L) + l2_pgt_idx(vaddr); do { - if (level == 2) + if (level == 2) { set_pgt_entry(pud, (phys & L2_MASK) | mem_type | L2_BLOCK); + } else if (level == 3) { + next = vaddr + L2_SIZE; + if (next > vend) + next = vend; + + if ((*pud) == L2_INVAL) + set_pgt_entry(pud, (new_page()) | PT_PT); + + build_pte(pud, vaddr, next, phys, mem_type); + } + vaddr += L2_SIZE; phys += L2_SIZE; pud++; @@ -113,11 +140,38 @@ void init_pagetable(unsigned long *start_pfn, unsigned long base_pfn, *start_pfn = first_free_pfn; } + +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 vaddr = (unsigned long)mfn_to_virt(mfn); + + build_pagetable(vaddr, mfn, 1, BLOCK_DEF_ATTR, alloc_new_page, 3); + + return vaddr; +} + #else void init_pagetable(unsigned long *start_pfn, unsigned long base_pfn, unsigned long max_pfn) { } + +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) @@ -256,7 +310,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); -} -- 2.7.4 _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/cgi-bin/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |