ARM: earlier initialization of vectors page
authorRussell King <rmk+kernel@arm.linux.org.uk>
Wed, 18 Jan 2012 15:32:49 +0000 (15:32 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Mon, 23 Jan 2012 10:24:11 +0000 (10:24 +0000)
Initialize the contents of the vectors page immediately after we
allocate the page, but before we map it.  This avoids any possible
aliases with other mappings which may need to be flushed after the
page has been mapped irrespective of the cache type.

We follow this later with a flush_cache_all() after all static memory
mappings have been initialized, which ensures that this is safe from
any cache effects.

Tested-by: Catalin Marinas <catalin.marinas@arm.com>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Acked-by: Nicolas Pitre <nico@linaro.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/include/asm/traps.h
arch/arm/kernel/setup.c
arch/arm/kernel/traps.c
arch/arm/mm/mmu.c

index 5b29a66736250e71d9a4ee24cfb9e0cd341ea14f..f555bb3664dcaa2dbee6ab4e1f486d24e360ba8f 100644 (file)
@@ -46,7 +46,7 @@ static inline int in_exception_text(unsigned long ptr)
        return in ? : __in_irqentry_text(ptr);
 }
 
-extern void __init early_trap_init(void);
+extern void __init early_trap_init(void *);
 extern void dump_backtrace_entry(unsigned long where, unsigned long from, unsigned long frame);
 extern void ptrace_break(struct task_struct *tsk, struct pt_regs *regs);
 
index 129fbd55bde85612de3900035f05fd8bd85cfeee..9b65cb4589e27277c3bbc4ff1b8d49cdcb9e8601 100644 (file)
@@ -961,7 +961,6 @@ void __init setup_arch(char **cmdline_p)
        conswitchp = &dummy_con;
 #endif
 #endif
-       early_trap_init();
 
        if (mdesc->init_early)
                mdesc->init_early();
index 99a57270250936ae69e02abd57b27b8a1c3dd022..be15dafaa8815f3b6ddf972ef205f2e2811a0e19 100644 (file)
@@ -781,18 +781,16 @@ static void __init kuser_get_tls_init(unsigned long vectors)
                memcpy((void *)vectors + 0xfe0, (void *)vectors + 0xfe8, 4);
 }
 
-void __init early_trap_init(void)
+void __init early_trap_init(void *vectors_base)
 {
-#if defined(CONFIG_CPU_USE_DOMAINS)
-       unsigned long vectors = CONFIG_VECTORS_BASE;
-#else
-       unsigned long vectors = (unsigned long)vectors_page;
-#endif
+       unsigned long vectors = (unsigned long)vectors_base;
        extern char __stubs_start[], __stubs_end[];
        extern char __vectors_start[], __vectors_end[];
        extern char __kuser_helper_start[], __kuser_helper_end[];
        int kuser_sz = __kuser_helper_end - __kuser_helper_start;
 
+       vectors_page = vectors_base;
+
        /*
         * Copy the vectors, stubs and kuser helpers (in entry-armv.S)
         * into the vector page, mapped at 0xffff0000, and ensure these
index 94c5a0c94f5e2e9a19da0509b5717004188ee31a..c1263adc2a266787afcc839e50976ed4aa2caa44 100644 (file)
@@ -997,11 +997,14 @@ static void __init devicemaps_init(struct machine_desc *mdesc)
 {
        struct map_desc map;
        unsigned long addr;
+       void *vectors;
 
        /*
         * Allocate the vector page early.
         */
-       vectors_page = early_alloc(PAGE_SIZE);
+       vectors = early_alloc(PAGE_SIZE);
+
+       early_trap_init(vectors);
 
        for (addr = VMALLOC_START; addr; addr += PMD_SIZE)
                pmd_clear(pmd_off_k(addr));
@@ -1041,7 +1044,7 @@ static void __init devicemaps_init(struct machine_desc *mdesc)
         * location (0xffff0000).  If we aren't using high-vectors, also
         * create a mapping at the low-vectors virtual address.
         */
-       map.pfn = __phys_to_pfn(virt_to_phys(vectors_page));
+       map.pfn = __phys_to_pfn(virt_to_phys(vectors));
        map.virtual = 0xffff0000;
        map.length = PAGE_SIZE;
        map.type = MT_HIGH_VECTORS;