* [PATCH v3 0/9] xen: arm: memory mangement fixes / improvements @ 2013-09-26 11:35 Ian Campbell 2013-09-26 11:35 ` [PATCH v3 1/9] xen/arm: ensure the xenheap is 32MB aligned Ian Campbell ` (9 more replies) 0 siblings, 10 replies; 12+ messages in thread From: Ian Campbell @ 2013-09-26 11:35 UTC (permalink / raw) To: xen-devel Cc: Tim Deegan, Stefano Stabellini, keir, Andre Przywara, Jan Beulich The following fix a bunch of issues discovered while running on Midway plus some random bits and bobs. Since v2 I've fixed some typos spotted by Julien and stopped aligning the FDT module stuff. ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v3 1/9] xen/arm: ensure the xenheap is 32MB aligned 2013-09-26 11:35 [PATCH v3 0/9] xen: arm: memory mangement fixes / improvements Ian Campbell @ 2013-09-26 11:35 ` Ian Campbell 2013-09-26 11:35 ` [PATCH v3 2/9] xen/arm: DOMHEAP_SECOND_PAGES is arm32 specific Ian Campbell ` (8 subsequent siblings) 9 siblings, 0 replies; 12+ messages in thread From: Ian Campbell @ 2013-09-26 11:35 UTC (permalink / raw) To: xen-devel Cc: julien.grall, tim, Ian Campbell, andre.przywara, stefano.stabellini My patch 08693f5948d8 "xen: arm: reduce the size of the xen heap to max 1/8 RAM size" unintentionally violated the constraint that the xenheap must be 32MB aligned, since we only explicitly align the end of the heap and xenheap_pages was not a multiple of 32 pages. Round xenheap pages up to a 32MB boundary. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> --- xen/arch/arm/setup.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c index 62147b2..9a5feec 100644 --- a/xen/arch/arm/setup.c +++ b/xen/arch/arm/setup.c @@ -324,7 +324,8 @@ static void __init setup_mm(unsigned long dtb_paddr, size_t dtb_size) * constraints. */ heap_pages = (ram_size >> PAGE_SHIFT); - xenheap_pages = max(heap_pages/8, 128UL<<(20-PAGE_SHIFT)); + xenheap_pages = (heap_pages/8 + 0x1fffUL) & ~0x1fffUL; + xenheap_pages = max(xenheap_pages, 128UL<<(20-PAGE_SHIFT)); do { -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v3 2/9] xen/arm: DOMHEAP_SECOND_PAGES is arm32 specific 2013-09-26 11:35 [PATCH v3 0/9] xen: arm: memory mangement fixes / improvements Ian Campbell 2013-09-26 11:35 ` [PATCH v3 1/9] xen/arm: ensure the xenheap is 32MB aligned Ian Campbell @ 2013-09-26 11:35 ` Ian Campbell 2013-09-26 11:35 ` [PATCH v3 3/9] xen/arm: Reserve FDT via early module mechanism Ian Campbell ` (7 subsequent siblings) 9 siblings, 0 replies; 12+ messages in thread From: Ian Campbell @ 2013-09-26 11:35 UTC (permalink / raw) To: xen-devel Cc: julien.grall, tim, Ian Campbell, andre.przywara, stefano.stabellini since 5263507b1b4a "xen: arm: Use a direct mapping of RAM on arm64" Signed-off-by: Ian Campbell <ian.campbell@citrix.com> Acked-by: Julien Grall <julien.grall@linaro.org> --- xen/include/asm-arm/config.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/xen/include/asm-arm/config.h b/xen/include/asm-arm/config.h index 604088e..624c73e 100644 --- a/xen/include/asm-arm/config.h +++ b/xen/include/asm-arm/config.h @@ -136,6 +136,9 @@ #define DOMHEAP_ENTRIES 1024 /* 1024 2MB mapping slots */ +/* Number of domheap pagetable pages required at the second level (2MB mappings) */ +#define DOMHEAP_SECOND_PAGES ((DOMHEAP_VIRT_END - DOMHEAP_VIRT_START + 1) >> FIRST_SHIFT) + #else /* ARM_64 */ #define SLOT0_ENTRY_BITS 39 @@ -159,9 +162,6 @@ #endif -/* Number of domheap pagetable pages required at the second level (2MB mappings) */ -#define DOMHEAP_SECOND_PAGES ((DOMHEAP_VIRT_END - DOMHEAP_VIRT_START + 1) >> FIRST_SHIFT) - /* Fixmap slots */ #define FIXMAP_CONSOLE 0 /* The primary UART */ #define FIXMAP_PT 1 /* Temporary mappings of pagetable pages */ -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v3 3/9] xen/arm: Reserve FDT via early module mechanism 2013-09-26 11:35 [PATCH v3 0/9] xen: arm: memory mangement fixes / improvements Ian Campbell 2013-09-26 11:35 ` [PATCH v3 1/9] xen/arm: ensure the xenheap is 32MB aligned Ian Campbell 2013-09-26 11:35 ` [PATCH v3 2/9] xen/arm: DOMHEAP_SECOND_PAGES is arm32 specific Ian Campbell @ 2013-09-26 11:35 ` Ian Campbell 2013-09-26 11:35 ` [PATCH v3 4/9] xen/arm: do not relocate Xen outside of visible RAM Ian Campbell ` (6 subsequent siblings) 9 siblings, 0 replies; 12+ messages in thread From: Ian Campbell @ 2013-09-26 11:35 UTC (permalink / raw) To: xen-devel Cc: julien.grall, tim, Ian Campbell, andre.przywara, stefano.stabellini This will stop us putting any heaps or relocating Xen itself over the FDT. The devicetree will be copied to allocated memory in setup_mm and the original copy will be freed by discard_initial_modules. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> --- v3: No need to align the address/size. --- xen/arch/arm/setup.c | 3 ++- xen/common/device_tree.c | 9 ++++++++- xen/include/xen/device_tree.h | 13 +++++++------ 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c index 9a5feec..d8556bb 100644 --- a/xen/arch/arm/setup.c +++ b/xen/arch/arm/setup.c @@ -514,9 +514,10 @@ void __init start_xen(unsigned long boot_phys_offset, smp_clear_cpu_maps(); + /* This is mapped by head.S */ device_tree_flattened = (void *)BOOT_MISC_VIRT_START + (fdt_paddr & ((1 << SECOND_SHIFT) - 1)); - fdt_size = device_tree_early_init(device_tree_flattened); + fdt_size = device_tree_early_init(device_tree_flattened, fdt_paddr); cpus = smp_get_max_cpus(); cmdline_parse(device_tree_bootargs(device_tree_flattened)); diff --git a/xen/common/device_tree.c b/xen/common/device_tree.c index 0ece249..64bd686 100644 --- a/xen/common/device_tree.c +++ b/xen/common/device_tree.c @@ -468,14 +468,21 @@ static void __init early_print_info(void) * * Returns the size of the DTB. */ -size_t __init device_tree_early_init(const void *fdt) +size_t __init device_tree_early_init(const void *fdt, paddr_t paddr) { + struct dt_mb_module *mod; int ret; ret = fdt_check_header(fdt); if ( ret < 0 ) early_panic("No valid device tree\n"); + mod = &early_info.modules.module[MOD_FDT]; + mod->start = paddr; + mod->size = fdt_totalsize(fdt); + + early_info.modules.nr_mods = max(MOD_FDT, early_info.modules.nr_mods); + device_tree_for_each_node((void *)fdt, early_scan_node, NULL); early_print_info(); diff --git a/xen/include/xen/device_tree.h b/xen/include/xen/device_tree.h index 7810f53..a665c97 100644 --- a/xen/include/xen/device_tree.h +++ b/xen/include/xen/device_tree.h @@ -20,12 +20,13 @@ #define NR_MEM_BANKS 8 -#define MOD_XEN 0 -#define MOD_KERNEL 1 -#define MOD_INITRD 2 -#define NR_MODULES 3 +#define MOD_XEN 0 +#define MOD_FDT 1 +#define MOD_KERNEL 2 +#define MOD_INITRD 3 +#define NR_MODULES 4 -#define MOD_DISCARD_FIRST MOD_KERNEL +#define MOD_DISCARD_FIRST MOD_FDT struct membank { paddr_t start; @@ -179,7 +180,7 @@ typedef int (*device_tree_node_func)(const void *fdt, extern struct dt_early_info early_info; extern const void *device_tree_flattened; -size_t __init device_tree_early_init(const void *fdt); +size_t __init device_tree_early_init(const void *fdt, paddr_t paddr); const char __init *device_tree_bootargs(const void *fdt); void __init device_tree_dump(const void *fdt); -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v3 4/9] xen/arm: do not relocate Xen outside of visible RAM 2013-09-26 11:35 [PATCH v3 0/9] xen: arm: memory mangement fixes / improvements Ian Campbell ` (2 preceding siblings ...) 2013-09-26 11:35 ` [PATCH v3 3/9] xen/arm: Reserve FDT via early module mechanism Ian Campbell @ 2013-09-26 11:35 ` Ian Campbell 2013-09-26 11:35 ` [PATCH v3 5/9] xen/arm: cope with modules outside of "visible" RAM Ian Campbell ` (5 subsequent siblings) 9 siblings, 0 replies; 12+ messages in thread From: Ian Campbell @ 2013-09-26 11:35 UTC (permalink / raw) To: xen-devel Cc: julien.grall, tim, Ian Campbell, andre.przywara, stefano.stabellini Since we do not handle non-contiguous banks of memory lets avoid relocating Xen into such a bank. Avoids issues such as free_init_memory releasing pages which are outside of the frametable. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> --- xen/arch/arm/setup.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c index d8556bb..56333e7 100644 --- a/xen/arch/arm/setup.c +++ b/xen/arch/arm/setup.c @@ -240,17 +240,25 @@ static paddr_t __init get_xen_paddr(void) { struct dt_mem_info *mi = &early_info.mem; paddr_t min_size; - paddr_t paddr = 0; + paddr_t paddr = 0, last_end; int i; min_size = (_end - _start + (XEN_PADDR_ALIGN-1)) & ~(XEN_PADDR_ALIGN-1); + last_end = mi->bank[0].start; + /* Find the highest bank with enough space. */ for ( i = 0; i < mi->nr_banks; i++ ) { const struct membank *bank = &mi->bank[i]; paddr_t s, e; + /* We can only deal with contiguous memory at the moment */ + if ( last_end != bank->start ) + break; + + last_end = bank->start + bank->size; + if ( bank->size >= min_size ) { e = consider_modules(bank->start, bank->start + bank->size, -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v3 5/9] xen/arm: cope with modules outside of "visible" RAM 2013-09-26 11:35 [PATCH v3 0/9] xen: arm: memory mangement fixes / improvements Ian Campbell ` (3 preceding siblings ...) 2013-09-26 11:35 ` [PATCH v3 4/9] xen/arm: do not relocate Xen outside of visible RAM Ian Campbell @ 2013-09-26 11:35 ` Ian Campbell 2013-09-26 11:35 ` [PATCH v3 6/9] xen/arm: Support dtb /memreserve/ regions Ian Campbell ` (4 subsequent siblings) 9 siblings, 0 replies; 12+ messages in thread From: Ian Campbell @ 2013-09-26 11:35 UTC (permalink / raw) To: xen-devel Cc: julien.grall, tim, Ian Campbell, andre.przywara, stefano.stabellini This can happen if modules are in a bank which we can't cope with e.g. due to being non-contiguous. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> Reviewed-by: Julien Grall <julien.grall@linaro.org> --- xen/arch/arm/setup.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c index 56333e7..a19133a 100644 --- a/xen/arch/arm/setup.c +++ b/xen/arch/arm/setup.c @@ -390,6 +390,12 @@ static void __init setup_mm(unsigned long dtb_paddr, size_t dtb_size) e = n = ram_end; } + /* Module in RAM which we cannot see here, due to not handling + * non-contiguous memory regions yet + */ + if ( e > ram_end ) + e = ram_end; + /* Avoid the xenheap */ if ( s < ((xenheap_mfn_start+xenheap_pages) << PAGE_SHIFT) && (xenheap_mfn_start << PAGE_SHIFT) < e ) -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v3 6/9] xen/arm: Support dtb /memreserve/ regions 2013-09-26 11:35 [PATCH v3 0/9] xen: arm: memory mangement fixes / improvements Ian Campbell ` (4 preceding siblings ...) 2013-09-26 11:35 ` [PATCH v3 5/9] xen/arm: cope with modules outside of "visible" RAM Ian Campbell @ 2013-09-26 11:35 ` Ian Campbell 2013-09-26 11:35 ` [PATCH v3 7/9] xen/arm: rename boot misc region to boot reloc now it has a single purpose Ian Campbell ` (3 subsequent siblings) 9 siblings, 0 replies; 12+ messages in thread From: Ian Campbell @ 2013-09-26 11:35 UTC (permalink / raw) To: xen-devel Cc: julien.grall, tim, Ian Campbell, andre.przywara, stefano.stabellini This requires a mapping of the DTB during setup_mm. Previously this was in the BOOT_MISC slot, which is clobbered by setup_pagetables. Split it out into its own slot which can be preserved. Also handle these regions as part of consider_modules() and when adding pages to the heaps to ensure we do not locate any part of Xen or the heaps over them. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> --- v2: drop accidentally included debug prints fixed handling of avoid reserved regions with heaps don't discard initial modules, since the FDT can (but is not required to) be reserved --- xen/arch/arm/arm32/head.S | 2 +- xen/arch/arm/arm64/head.S | 2 +- xen/arch/arm/mm.c | 10 ++++++- xen/arch/arm/setup.c | 65 +++++++++++++++++++++++++++++++++++++++--- xen/common/device_tree.c | 13 ++++++++- xen/include/asm-arm/config.h | 7 +++-- xen/include/asm-arm/mm.h | 2 ++ 7 files changed, 90 insertions(+), 11 deletions(-) diff --git a/xen/arch/arm/arm32/head.S b/xen/arch/arm/arm32/head.S index 79e95b6..5072e2a 100644 --- a/xen/arch/arm/arm32/head.S +++ b/xen/arch/arm/arm32/head.S @@ -301,7 +301,7 @@ cpu_init_done: orr r2, r2, #PT_UPPER(MEM) orr r2, r2, #PT_LOWER(MEM) /* r2:r3 := 2MB RAM incl. DTB */ add r4, r4, #8 - strd r2, r3, [r1, r4] /* Map it in the early boot slot */ + strd r2, r3, [r1, r4] /* Map it in the early fdt slot */ pt_ready: PRINT("- Turning on paging -\r\n") diff --git a/xen/arch/arm/arm64/head.S b/xen/arch/arm/arm64/head.S index 21b7e4d..33ff489 100644 --- a/xen/arch/arm/arm64/head.S +++ b/xen/arch/arm/arm64/head.S @@ -255,7 +255,7 @@ skip_bss: mov x3, #PT_MEM /* x2 := 2MB RAM incl. DTB */ orr x2, x2, x3 add x4, x4, #8 - str x2, [x1, x4] /* Map it in the early boot slot */ + str x2, [x1, x4] /* Map it in the early fdt slot */ pt_ready: PRINT("- Turning on paging -\r\n") diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c index 4521c8d..5cb6dac 100644 --- a/xen/arch/arm/mm.c +++ b/xen/arch/arm/mm.c @@ -361,6 +361,13 @@ static inline lpae_t pte_of_xenaddr(vaddr_t va) return mfn_to_xen_entry(mfn); } +void __init remove_early_mappings(void) +{ + lpae_t pte = {0}; + write_pte(xen_second + second_table_offset(BOOT_FDT_VIRT_START), pte); + flush_xen_data_tlb_range_va(BOOT_FDT_VIRT_START, SECOND_SIZE); +} + /* Boot-time pagetable setup. * Changes here may need matching changes in head.S */ void __init setup_pagetables(unsigned long boot_phys_offset, paddr_t xen_paddr) @@ -401,7 +408,8 @@ void __init setup_pagetables(unsigned long boot_phys_offset, paddr_t xen_paddr) p[second_linear_offset(va)].bits = 0; } for ( i = 0; i < 4 * LPAE_ENTRIES; i++) - if ( p[i].pt.valid ) + /* The FDT is not relocated */ + if ( p[i].pt.valid && i != second_linear_offset(BOOT_FDT_VIRT_START) ) p[i].pt.base += (phys_offset - boot_phys_offset) >> PAGE_SHIFT; /* Change pagetables to the copy in the relocated Xen */ diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c index a19133a..2047588 100644 --- a/xen/arch/arm/setup.c +++ b/xen/arch/arm/setup.c @@ -35,6 +35,7 @@ #include <xen/cpu.h> #include <xen/pfn.h> #include <xen/vmap.h> +#include <xen/libfdt/libfdt.h> #include <asm/page.h> #include <asm/current.h> #include <asm/setup.h> @@ -147,6 +148,32 @@ static void __init processor_id(void) } } +static void dt_unreserved_regions(paddr_t s, paddr_t e, + void (*cb)(paddr_t, paddr_t), int first) +{ + int i, nr = fdt_num_mem_rsv(device_tree_flattened); + + for ( i = first; i < nr ; i++ ) + { + paddr_t r_s, r_e; + + if ( fdt_get_mem_rsv(device_tree_flattened, i, &r_s, &r_e ) < 0 ) + /* If we can't read it, pretend it doesn't exist... */ + continue; + + r_e += r_s; /* fdt_get_mem_rsc returns length */ + + if ( s < r_e && r_s < e ) + { + dt_unreserved_regions(r_e, e, cb, i+1); + dt_unreserved_regions(s, r_s, cb, i+1); + return; + } + } + + cb(s, e); +} + void __init discard_initial_modules(void) { struct dt_module_info *mi = &early_info.modules; @@ -157,10 +184,12 @@ void __init discard_initial_modules(void) paddr_t s = mi->module[i].start; paddr_t e = s + PAGE_ALIGN(mi->module[i].size); - init_domheap_pages(s, e); + dt_unreserved_regions(s, e, init_domheap_pages, 0); } mi->nr_mods = 0; + + remove_early_mappings(); } /* @@ -177,6 +206,7 @@ static paddr_t __init consider_modules(paddr_t s, paddr_t e, { const struct dt_module_info *mi = &early_info.modules; int i; + int nr_rsvd; s = (s+align-1) & ~(align-1); e = e & ~(align-1); @@ -184,6 +214,7 @@ static paddr_t __init consider_modules(paddr_t s, paddr_t e, if ( s > e || e - s < size ) return 0; + /* First check the boot modules */ for ( i = first_mod; i <= mi->nr_mods; i++ ) { paddr_t mod_s = mi->module[i].start; @@ -199,6 +230,32 @@ static paddr_t __init consider_modules(paddr_t s, paddr_t e, } } + /* Now check any fdt reserved areas. */ + + nr_rsvd = fdt_num_mem_rsv(device_tree_flattened); + + for ( ; i < mi->nr_mods + nr_rsvd; i++ ) + { + paddr_t mod_s, mod_e; + + if ( fdt_get_mem_rsv(device_tree_flattened, + i - mi->nr_mods, + &mod_s, &mod_e ) < 0 ) + /* If we can't read it, pretend it doesn't exist... */ + continue; + + /* fdt_get_mem_rsv returns length */ + mod_e += mod_s; + + if ( s < mod_e && mod_s < e ) + { + mod_e = consider_modules(mod_e, e, size, align, i+1); + if ( mod_e ) + return mod_e; + + return consider_modules(s, mod_s, size, align, i+1); + } + } return e; } @@ -404,7 +461,7 @@ static void __init setup_mm(unsigned long dtb_paddr, size_t dtb_size) n = pfn_to_paddr(xenheap_mfn_start+xenheap_pages); } - init_boot_pages(s, e); + dt_unreserved_regions(s, e, init_boot_pages, 0); s = n; } @@ -464,7 +521,7 @@ static void __init setup_mm(unsigned long dtb_paddr, size_t dtb_size) xenheap_mfn_end = e; - init_boot_pages(s, e); + dt_unreserved_regions(s, e, init_boot_pages, 0); s = n; } } @@ -529,7 +586,7 @@ void __init start_xen(unsigned long boot_phys_offset, smp_clear_cpu_maps(); /* This is mapped by head.S */ - device_tree_flattened = (void *)BOOT_MISC_VIRT_START + device_tree_flattened = (void *)BOOT_FDT_VIRT_START + (fdt_paddr & ((1 << SECOND_SHIFT) - 1)); fdt_size = device_tree_early_init(device_tree_flattened, fdt_paddr); diff --git a/xen/common/device_tree.c b/xen/common/device_tree.c index 64bd686..b38db0b 100644 --- a/xen/common/device_tree.c +++ b/xen/common/device_tree.c @@ -447,7 +447,7 @@ static void __init early_print_info(void) { struct dt_mem_info *mi = &early_info.mem; struct dt_module_info *mods = &early_info.modules; - int i; + int i, nr_rsvd; for ( i = 0; i < mi->nr_banks; i++ ) early_printk("RAM: %"PRIpaddr" - %"PRIpaddr"\n", @@ -460,6 +460,17 @@ static void __init early_print_info(void) mods->module[i].start, mods->module[i].start + mods->module[i].size, mods->module[i].cmdline); + nr_rsvd = fdt_num_mem_rsv(device_tree_flattened); + for ( i = 0; i < nr_rsvd; i++ ) + { + paddr_t s, e; + if ( fdt_get_mem_rsv(device_tree_flattened, i, &s, &e) < 0 ) + continue; + /* fdt_get_mem_rsv returns length */ + e += s; + early_printk(" RESVD[%d]: %"PRIpaddr" - %"PRIpaddr"\n", + i, s, e); + } } /** diff --git a/xen/include/asm-arm/config.h b/xen/include/asm-arm/config.h index 624c73e..efeb952 100644 --- a/xen/include/asm-arm/config.h +++ b/xen/include/asm-arm/config.h @@ -80,10 +80,10 @@ * 0 - 2M Unmapped * 2M - 4M Xen text, data, bss * 4M - 6M Fixmap: special-purpose 4K mapping slots - * 6M - 8M Early boot misc (see below) + * 6M - 8M Early boot mapping of FDT + * 8M - 10M Early boot misc (see below) * * The early boot misc area is used: - * - in head.S for the DTB for device_tree_early_init(). * - in setup_pagetables() when relocating Xen. * * ARM32 layout: @@ -116,7 +116,8 @@ #define XEN_VIRT_START _AT(vaddr_t,0x00200000) #define FIXMAP_ADDR(n) (_AT(vaddr_t,0x00400000) + (n) * PAGE_SIZE) -#define BOOT_MISC_VIRT_START _AT(vaddr_t,0x00600000) +#define BOOT_FDT_VIRT_START _AT(vaddr_t,0x00600000) +#define BOOT_MISC_VIRT_START _AT(vaddr_t,0x00800000) #define HYPERVISOR_VIRT_START XEN_VIRT_START diff --git a/xen/include/asm-arm/mm.h b/xen/include/asm-arm/mm.h index 173db1b..0129cd1 100644 --- a/xen/include/asm-arm/mm.h +++ b/xen/include/asm-arm/mm.h @@ -147,6 +147,8 @@ extern unsigned long total_pages; /* Boot-time pagetable setup */ extern void setup_pagetables(unsigned long boot_phys_offset, paddr_t xen_paddr); +/* Remove early mappings */ +extern void remove_early_mappings(void); /* Allocate and initialise pagetables for a secondary CPU */ extern int __cpuinit init_secondary_pagetables(int cpu); /* Switch secondary CPUS to its own pagetables and finalise MMU setup */ -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v3 7/9] xen/arm: rename boot misc region to boot reloc now it has a single purpose 2013-09-26 11:35 [PATCH v3 0/9] xen: arm: memory mangement fixes / improvements Ian Campbell ` (5 preceding siblings ...) 2013-09-26 11:35 ` [PATCH v3 6/9] xen/arm: Support dtb /memreserve/ regions Ian Campbell @ 2013-09-26 11:35 ` Ian Campbell 2013-09-26 11:35 ` [PATCH v3 8/9] xen/arm: print the location of the Xen heap on 32 bit Ian Campbell ` (2 subsequent siblings) 9 siblings, 0 replies; 12+ messages in thread From: Ian Campbell @ 2013-09-26 11:35 UTC (permalink / raw) To: xen-devel Cc: julien.grall, tim, Ian Campbell, andre.przywara, stefano.stabellini Signed-off-by: Ian Campbell <ian.campbell@citrix.com> Acked-by: Julien Grall <julien.grall@linaro.org> --- xen/arch/arm/mm.c | 4 ++-- xen/include/asm-arm/config.h | 7 ++----- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c index 5cb6dac..89d9f57 100644 --- a/xen/arch/arm/mm.c +++ b/xen/arch/arm/mm.c @@ -128,7 +128,7 @@ static inline void check_memory_layout_alignment_constraints(void) { /* 2MB aligned regions */ BUILD_BUG_ON(XEN_VIRT_START & ~SECOND_MASK); BUILD_BUG_ON(FIXMAP_ADDR(0) & ~SECOND_MASK); - BUILD_BUG_ON(BOOT_MISC_VIRT_START & ~SECOND_MASK); + BUILD_BUG_ON(BOOT_RELOC_VIRT_START & ~SECOND_MASK); /* 1GB aligned regions */ BUILD_BUG_ON(XENHEAP_VIRT_START & ~FIRST_MASK); #ifdef CONFIG_DOMAIN_PAGE @@ -377,7 +377,7 @@ void __init setup_pagetables(unsigned long boot_phys_offset, paddr_t xen_paddr) int i; /* Map the destination in the boot misc area. */ - dest_va = BOOT_MISC_VIRT_START; + dest_va = BOOT_RELOC_VIRT_START; pte = mfn_to_xen_entry(xen_paddr >> PAGE_SHIFT); write_pte(xen_second + second_table_offset(dest_va), pte); flush_xen_data_tlb_range_va(dest_va, SECOND_SIZE); diff --git a/xen/include/asm-arm/config.h b/xen/include/asm-arm/config.h index efeb952..9e395c2 100644 --- a/xen/include/asm-arm/config.h +++ b/xen/include/asm-arm/config.h @@ -81,10 +81,7 @@ * 2M - 4M Xen text, data, bss * 4M - 6M Fixmap: special-purpose 4K mapping slots * 6M - 8M Early boot mapping of FDT - * 8M - 10M Early boot misc (see below) - * - * The early boot misc area is used: - * - in setup_pagetables() when relocating Xen. + * 8M - 10M Early relocation address (used when relocating Xen) * * ARM32 layout: * 0 - 8M <COMMON> @@ -117,7 +114,7 @@ #define XEN_VIRT_START _AT(vaddr_t,0x00200000) #define FIXMAP_ADDR(n) (_AT(vaddr_t,0x00400000) + (n) * PAGE_SIZE) #define BOOT_FDT_VIRT_START _AT(vaddr_t,0x00600000) -#define BOOT_MISC_VIRT_START _AT(vaddr_t,0x00800000) +#define BOOT_RELOC_VIRT_START _AT(vaddr_t,0x00800000) #define HYPERVISOR_VIRT_START XEN_VIRT_START -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v3 8/9] xen/arm: print the location of the Xen heap on 32 bit 2013-09-26 11:35 [PATCH v3 0/9] xen: arm: memory mangement fixes / improvements Ian Campbell ` (6 preceding siblings ...) 2013-09-26 11:35 ` [PATCH v3 7/9] xen/arm: rename boot misc region to boot reloc now it has a single purpose Ian Campbell @ 2013-09-26 11:35 ` Ian Campbell 2013-09-26 11:35 ` [PATCH v3 9/9] xen: support RAM at addresses 0 and 4096 Ian Campbell 2013-09-26 14:47 ` [PATCH v3 0/9] xen: arm: memory mangement fixes / improvements Tim Deegan 9 siblings, 0 replies; 12+ messages in thread From: Ian Campbell @ 2013-09-26 11:35 UTC (permalink / raw) To: xen-devel Cc: julien.grall, tim, Ian Campbell, andre.przywara, stefano.stabellini Signed-off-by: Ian Campbell <ian.campbell@citrix.com> Reviewed-by: Julien Grall <julien.grall@linaro.org> --- xen/arch/arm/setup.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c index 2047588..133193a 100644 --- a/xen/arch/arm/setup.c +++ b/xen/arch/arm/setup.c @@ -407,8 +407,10 @@ static void __init setup_mm(unsigned long dtb_paddr, size_t dtb_size) domheap_pages = heap_pages - xenheap_pages; - early_printk("Xen heap: %lu pages Dom heap: %lu pages\n", - xenheap_pages, domheap_pages); + early_printk("Xen heap: %"PRIpaddr"-%"PRIpaddr" (%lu pages)\n", + e - (xenheap_pages << PAGE_SHIFT), e, + xenheap_pages); + early_printk("Dom heap: %lu pages\n", domheap_pages); setup_xenheap_mappings((e >> PAGE_SHIFT) - xenheap_pages, xenheap_pages); -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v3 9/9] xen: support RAM at addresses 0 and 4096 2013-09-26 11:35 [PATCH v3 0/9] xen: arm: memory mangement fixes / improvements Ian Campbell ` (7 preceding siblings ...) 2013-09-26 11:35 ` [PATCH v3 8/9] xen/arm: print the location of the Xen heap on 32 bit Ian Campbell @ 2013-09-26 11:35 ` Ian Campbell 2013-09-26 14:47 ` [PATCH v3 0/9] xen: arm: memory mangement fixes / improvements Tim Deegan 9 siblings, 0 replies; 12+ messages in thread From: Ian Campbell @ 2013-09-26 11:35 UTC (permalink / raw) To: xen-devel Cc: Ian Campbell, stefano.stabellini, julien.grall, tim, andre.przywara, jbeulich Currently the mapping from pages to zones causes the page at zero to go into zone -1 and the page at 4096 to go into zone 0, which is the Xen zone (confusing various assertions). Arrange instead for the mapping to be such that zone 0 is always reserved for Xen and all other pages map to a zone >= 1. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> Acked-by: Keir Fraser <keir@xen.org> Cc: jbeulich@suse.com --- v2: fixup my arithmetic --- xen/common/page_alloc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/xen/common/page_alloc.c b/xen/common/page_alloc.c index 41251b2..fb8187b 100644 --- a/xen/common/page_alloc.c +++ b/xen/common/page_alloc.c @@ -257,11 +257,11 @@ unsigned long __init alloc_boot_pages( */ #define MEMZONE_XEN 0 -#define NR_ZONES (PADDR_BITS - PAGE_SHIFT) +#define NR_ZONES (PADDR_BITS - PAGE_SHIFT + 1) -#define bits_to_zone(b) (((b) < (PAGE_SHIFT + 1)) ? 0 : ((b) - PAGE_SHIFT - 1)) +#define bits_to_zone(b) (((b) < (PAGE_SHIFT + 1)) ? 1 : ((b) - PAGE_SHIFT)) #define page_to_zone(pg) (is_xen_heap_page(pg) ? MEMZONE_XEN : \ - (fls(page_to_mfn(pg)) - 1)) + (fls(page_to_mfn(pg)) ? : 1)) typedef struct page_list_head heap_by_zone_and_order_t[NR_ZONES][MAX_ORDER+1]; static heap_by_zone_and_order_t *_heap[MAX_NUMNODES]; -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v3 0/9] xen: arm: memory mangement fixes / improvements 2013-09-26 11:35 [PATCH v3 0/9] xen: arm: memory mangement fixes / improvements Ian Campbell ` (8 preceding siblings ...) 2013-09-26 11:35 ` [PATCH v3 9/9] xen: support RAM at addresses 0 and 4096 Ian Campbell @ 2013-09-26 14:47 ` Tim Deegan 2013-09-26 16:40 ` Ian Campbell 9 siblings, 1 reply; 12+ messages in thread From: Tim Deegan @ 2013-09-26 14:47 UTC (permalink / raw) To: Ian Campbell Cc: keir, Stefano Stabellini, Jan Beulich, Andre Przywara, xen-devel At 12:35 +0100 on 26 Sep (1380198908), Ian Campbell wrote: > The following fix a bunch of issues discovered while running on Midway > plus some random bits and bobs. > > Since v2 I've fixed some typos spotted by Julien and stopped aligning > the FDT module stuff. Acked-by: Tim Deegan <tim@xen.org> ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v3 0/9] xen: arm: memory mangement fixes / improvements 2013-09-26 14:47 ` [PATCH v3 0/9] xen: arm: memory mangement fixes / improvements Tim Deegan @ 2013-09-26 16:40 ` Ian Campbell 0 siblings, 0 replies; 12+ messages in thread From: Ian Campbell @ 2013-09-26 16:40 UTC (permalink / raw) To: Tim Deegan Cc: keir, Stefano Stabellini, Jan Beulich, Andre Przywara, xen-devel On Thu, 2013-09-26 at 15:47 +0100, Tim Deegan wrote: > Acked-by: Tim Deegan <tim@xen.org> Applied, thanks to all. Ian. ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2013-09-26 16:40 UTC | newest] Thread overview: 12+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-09-26 11:35 [PATCH v3 0/9] xen: arm: memory mangement fixes / improvements Ian Campbell 2013-09-26 11:35 ` [PATCH v3 1/9] xen/arm: ensure the xenheap is 32MB aligned Ian Campbell 2013-09-26 11:35 ` [PATCH v3 2/9] xen/arm: DOMHEAP_SECOND_PAGES is arm32 specific Ian Campbell 2013-09-26 11:35 ` [PATCH v3 3/9] xen/arm: Reserve FDT via early module mechanism Ian Campbell 2013-09-26 11:35 ` [PATCH v3 4/9] xen/arm: do not relocate Xen outside of visible RAM Ian Campbell 2013-09-26 11:35 ` [PATCH v3 5/9] xen/arm: cope with modules outside of "visible" RAM Ian Campbell 2013-09-26 11:35 ` [PATCH v3 6/9] xen/arm: Support dtb /memreserve/ regions Ian Campbell 2013-09-26 11:35 ` [PATCH v3 7/9] xen/arm: rename boot misc region to boot reloc now it has a single purpose Ian Campbell 2013-09-26 11:35 ` [PATCH v3 8/9] xen/arm: print the location of the Xen heap on 32 bit Ian Campbell 2013-09-26 11:35 ` [PATCH v3 9/9] xen: support RAM at addresses 0 and 4096 Ian Campbell 2013-09-26 14:47 ` [PATCH v3 0/9] xen: arm: memory mangement fixes / improvements Tim Deegan 2013-09-26 16:40 ` Ian Campbell
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).