Commit 94e5a85b authored by Russell King's avatar Russell King

ARM: earlier initialization of vectors page

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: default avatarCatalin Marinas <catalin.marinas@arm.com>
Reviewed-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Acked-by: default avatarNicolas Pitre <nico@linaro.org>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 45cd5290
...@@ -46,7 +46,7 @@ static inline int in_exception_text(unsigned long ptr) ...@@ -46,7 +46,7 @@ static inline int in_exception_text(unsigned long ptr)
return in ? : __in_irqentry_text(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 dump_backtrace_entry(unsigned long where, unsigned long from, unsigned long frame);
extern void ptrace_break(struct task_struct *tsk, struct pt_regs *regs); extern void ptrace_break(struct task_struct *tsk, struct pt_regs *regs);
......
...@@ -961,7 +961,6 @@ void __init setup_arch(char **cmdline_p) ...@@ -961,7 +961,6 @@ void __init setup_arch(char **cmdline_p)
conswitchp = &dummy_con; conswitchp = &dummy_con;
#endif #endif
#endif #endif
early_trap_init();
if (mdesc->init_early) if (mdesc->init_early)
mdesc->init_early(); mdesc->init_early();
......
...@@ -781,18 +781,16 @@ static void __init kuser_get_tls_init(unsigned long vectors) ...@@ -781,18 +781,16 @@ static void __init kuser_get_tls_init(unsigned long vectors)
memcpy((void *)vectors + 0xfe0, (void *)vectors + 0xfe8, 4); 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 = (unsigned long)vectors_base;
unsigned long vectors = CONFIG_VECTORS_BASE;
#else
unsigned long vectors = (unsigned long)vectors_page;
#endif
extern char __stubs_start[], __stubs_end[]; extern char __stubs_start[], __stubs_end[];
extern char __vectors_start[], __vectors_end[]; extern char __vectors_start[], __vectors_end[];
extern char __kuser_helper_start[], __kuser_helper_end[]; extern char __kuser_helper_start[], __kuser_helper_end[];
int kuser_sz = __kuser_helper_end - __kuser_helper_start; int kuser_sz = __kuser_helper_end - __kuser_helper_start;
vectors_page = vectors_base;
/* /*
* Copy the vectors, stubs and kuser helpers (in entry-armv.S) * Copy the vectors, stubs and kuser helpers (in entry-armv.S)
* into the vector page, mapped at 0xffff0000, and ensure these * into the vector page, mapped at 0xffff0000, and ensure these
......
...@@ -997,11 +997,14 @@ static void __init devicemaps_init(struct machine_desc *mdesc) ...@@ -997,11 +997,14 @@ static void __init devicemaps_init(struct machine_desc *mdesc)
{ {
struct map_desc map; struct map_desc map;
unsigned long addr; unsigned long addr;
void *vectors;
/* /*
* Allocate the vector page early. * 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) for (addr = VMALLOC_START; addr; addr += PMD_SIZE)
pmd_clear(pmd_off_k(addr)); pmd_clear(pmd_off_k(addr));
...@@ -1041,7 +1044,7 @@ static void __init devicemaps_init(struct machine_desc *mdesc) ...@@ -1041,7 +1044,7 @@ static void __init devicemaps_init(struct machine_desc *mdesc)
* location (0xffff0000). If we aren't using high-vectors, also * location (0xffff0000). If we aren't using high-vectors, also
* create a mapping at the low-vectors virtual address. * 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.virtual = 0xffff0000;
map.length = PAGE_SIZE; map.length = PAGE_SIZE;
map.type = MT_HIGH_VECTORS; map.type = MT_HIGH_VECTORS;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment