From: Tim Deegan Date: Tue, 13 Mar 2012 15:10:58 +0000 (+0000) Subject: arm: new hook for late MMU setup on secondary CPUs X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=f8c1e36eebb39a241e3b2fd4543a90025ad8ec0b;p=xen.git arm: new hook for late MMU setup on secondary CPUs The boot CPU turns on W^X in setup_pagetables(). Do the same for other CPUs after they boot. If we go to per-CPU pagetables, this is where that will happen. Signed-off-by: Tim Deegan Committed-by: Ian Campbell --- diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c index d85813fa4d..9fbf86c226 100644 --- a/xen/arch/arm/mm.c +++ b/xen/arch/arm/mm.c @@ -263,6 +263,13 @@ void __init setup_pagetables(unsigned long boot_phys_offset) WRITE_CP32(READ_CP32(HSCTLR) | SCTLR_WXN, HSCTLR); } +/* MMU setup for secondary CPUS (which already have paging enabled) */ +void __cpuinit mmu_init_secondary_cpu(void) +{ + /* From now on, no mapping may be both writable and executable. */ + WRITE_CP32(READ_CP32(HSCTLR) | SCTLR_WXN, HSCTLR); +} + /* Create Xen's mappings of memory. * Base and virt must be 32MB aligned and size a multiple of 32MB. */ static void __init create_mappings(unsigned long virt, diff --git a/xen/arch/arm/smpboot.c b/xen/arch/arm/smpboot.c index b9b63c1fcb..f369d70f4c 100644 --- a/xen/arch/arm/smpboot.c +++ b/xen/arch/arm/smpboot.c @@ -76,6 +76,7 @@ void __cpuinit start_secondary(unsigned long boot_phys_offset, dprintk(XENLOG_DEBUG, "CPU %li awake.\n", cpuid); + mmu_init_secondary_cpu(); gic_init_secondary_cpu(); set_current(idle_vcpu[cpuid]); diff --git a/xen/include/asm-arm/mm.h b/xen/include/asm-arm/mm.h index 35b2a95fb7..61228b1e6d 100644 --- a/xen/include/asm-arm/mm.h +++ b/xen/include/asm-arm/mm.h @@ -136,6 +136,8 @@ extern unsigned long total_pages; /* Boot-time pagetable setup */ extern void setup_pagetables(unsigned long boot_phys_offset); +/* MMU setup for seccondary CPUS (which already have paging enabled) */ +extern void __cpuinit mmu_init_secondary_cpu(void); /* Set up the xenheap: up to 1GB of contiguous, always-mapped memory. * Base must be 32MB aligned and size a multiple of 32MB. */ extern void setup_xenheap_mappings(unsigned long base_mfn, unsigned long nr_mfns);