[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 10/10] xen: arm: Use a direct mapping of RAM on arm64
On Tue, 25 Jun 2013, Ian Campbell wrote: > > > void __init arch_init_memory(void) > > > { > > > @@ -431,6 +454,7 @@ void __init setup_pagetables(unsigned long > > > boot_phys_offset, paddr_t xen_paddr) > > > /* Flush everything after setting WXN bit. */ > > > flush_xen_text_tlb(); > > > > > > +#ifdef CONFIG_ARM_32 > > > per_cpu(xen_pgtable, 0) = boot_pgtable; > > > per_cpu(xen_dommap, 0) = xen_second + > > > second_linear_offset(DOMHEAP_VIRT_START); > > > @@ -440,43 +464,31 @@ void __init setup_pagetables(unsigned long > > > boot_phys_offset, paddr_t xen_paddr) > > > memset(this_cpu(xen_dommap), 0, DOMHEAP_SECOND_PAGES*PAGE_SIZE); > > > flush_xen_dcache_va_range(this_cpu(xen_dommap), > > > DOMHEAP_SECOND_PAGES*PAGE_SIZE); > > > +#endif > > > } > > > > > > int init_secondary_pagetables(int cpu) > > > { > > > - lpae_t *root, *first, *domheap, pte; > > > - int i; > > > - > > > - root = alloc_xenheap_page(); > > > #ifdef CONFIG_ARM_64 > > > - first = alloc_xenheap_page(); > > > + /* All CPUs share a single page table on 64 bit */ > > > + return 0; > > > > I would just ifdef the entire function > > I expect you don't mean for me to also ifdef the call? I meant: #ifdef CONFIG_ARM_64 int init_secondary_pagetables(int cpu) { bla64 #elif CONFIG_ARM_32 int init_secondary_pagetables(int cpu) { bla32 #endif > I preferred to > write the prototype only once so the two didn't get out of sync in the > future, which can be an issue with the pattern of stubbing out functions > with a separate static inline. I can change that if you have a strong > preference though. This is not a static function, if the prototype of the arm64 or the prototype of the arm32 function changed we would know. > > > +#ifdef CONFIG_ARM_64 > > > + nr_second = frametable_size >> SECOND_SHIFT; > > > + second_base = alloc_boot_pages(nr_second, 1); > > > + second = mfn_to_virt(second_base); > > > + for ( i = 0; i < nr_second; i++ ) > > > + { > > > + pte = mfn_to_xen_entry(second_base + i); > > > + pte.pt.table = 1; > > > + > > > write_pte(&boot_first[first_table_offset(FRAMETABLE_VIRT_START)+i], pte); > > > + } > > > + create_32mb_mappings(second, 0, base_mfn, frametable_size >> > > > PAGE_SHIFT); > > > +#else > > > create_32mb_mappings(xen_second, FRAMETABLE_VIRT_START, base_mfn, > > > frametable_size >> PAGE_SHIFT); > > > +#endif > > > > Is it possible to unify the arm32 and arm64 code paths here? > > I tried to unify them as much as I could. > > > Being able to handle a frametable that spans multiple second level > > pagetable pages shouldn't be a problem for arm32. > > That's not the issue. The issue is that the frame table lives at > different addresses in both cases, and in particular 64-bit has its own > first level pages with dedicated second level pages for this region > while 32-bit has a small number of second level entries under the same > first level entry as various other bits of Xen (including .text, vmap, > ioremap region etc etc). What I mean is that it seems to me that all the code you are adding under the #ifdef CONFIG_ARM_64 should actually work on CONFIG_ARM_32 too if you assume that one second level page has already been allocated on ARM32. Is that right? > > > + /* > > > + * Locate the xenheap using these constraints: > > > + * > > > + * - must be 32 MiB aligned > > > + * - must not include Xen itself or the boot modules > > > + * - must be at most 1 GiB > > > + * - must be at least 128M > > > + * > > > + * We try to allocate the largest xenheap possible within these > > > + * constraints. > > > + */ > > > > this comment is not correct on ARM64, is it? > > No, I'll fix it. > > > > +#ifdef CONFIG_ARM_32 > > > #define is_xen_heap_page(page) is_xen_heap_mfn(page_to_mfn(page)) > > > #define is_xen_heap_mfn(mfn) ({ \ > > > unsigned long _mfn = (mfn); \ > > > (_mfn >= xenheap_mfn_start && _mfn < xenheap_mfn_end); \ > > > }) > > > > I take that this check wouldn't work for arm64 because it would always > > return true? > > Correct. > > > > +#else > > > +#define is_xen_heap_page(page) ((page)->count_info & PGC_xen_heap) > > > +#define is_xen_heap_mfn(mfn) \ > > > + (mfn_valid(mfn) && is_xen_heap_page(__mfn_to_page(mfn))) > > > +#endif > > > > Looks like the ARM64 version of these two functions should work for > > arm32 too. > > arm32 doesn't set PGC_xen_heap, I don't think. It could I suppose. I think it does. Actually it's the generic code that does it (xen/common/page_alloc.c:alloc_xenheap_pages). _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |