UPSTREAM: ARM: early traps initialisation
commit 04e91b7324760a377a725e218b5ee783826d30f5 upstream. Provide a couple of helpers to copy the vectors and stubs, and also to flush the copied vectors and stubs. Bug: 215557547 Acked-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Id60ef859e431a093597199294e4f57efdde84867
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
5a64a66802
commit
3bfcb356df
@@ -806,10 +806,22 @@ static inline void __init kuser_init(void *vectors)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONFIG_CPU_V7M
|
||||||
|
static void copy_from_lma(void *vma, void *lma_start, void *lma_end)
|
||||||
|
{
|
||||||
|
memcpy(vma, lma_start, lma_end - lma_start);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void flush_vectors(void *vma, size_t offset, size_t size)
|
||||||
|
{
|
||||||
|
unsigned long start = (unsigned long)vma + offset;
|
||||||
|
unsigned long end = start + size;
|
||||||
|
|
||||||
|
flush_icache_range(start, end);
|
||||||
|
}
|
||||||
|
|
||||||
void __init early_trap_init(void *vectors_base)
|
void __init early_trap_init(void *vectors_base)
|
||||||
{
|
{
|
||||||
#ifndef CONFIG_CPU_V7M
|
|
||||||
unsigned long vectors = (unsigned long)vectors_base;
|
|
||||||
extern char __stubs_start[], __stubs_end[];
|
extern char __stubs_start[], __stubs_end[];
|
||||||
extern char __vectors_start[], __vectors_end[];
|
extern char __vectors_start[], __vectors_end[];
|
||||||
unsigned i;
|
unsigned i;
|
||||||
@@ -830,17 +842,20 @@ void __init early_trap_init(void *vectors_base)
|
|||||||
* into the vector page, mapped at 0xffff0000, and ensure these
|
* into the vector page, mapped at 0xffff0000, and ensure these
|
||||||
* are visible to the instruction stream.
|
* are visible to the instruction stream.
|
||||||
*/
|
*/
|
||||||
memcpy((void *)vectors, __vectors_start, __vectors_end - __vectors_start);
|
copy_from_lma(vectors_base, __vectors_start, __vectors_end);
|
||||||
memcpy((void *)vectors + 0x1000, __stubs_start, __stubs_end - __stubs_start);
|
copy_from_lma(vectors_base + 0x1000, __stubs_start, __stubs_end);
|
||||||
|
|
||||||
kuser_init(vectors_base);
|
kuser_init(vectors_base);
|
||||||
|
|
||||||
flush_icache_range(vectors, vectors + PAGE_SIZE * 2);
|
flush_vectors(vectors_base, 0, PAGE_SIZE * 2);
|
||||||
|
}
|
||||||
#else /* ifndef CONFIG_CPU_V7M */
|
#else /* ifndef CONFIG_CPU_V7M */
|
||||||
|
void __init early_trap_init(void *vectors_base)
|
||||||
|
{
|
||||||
/*
|
/*
|
||||||
* on V7-M there is no need to copy the vector table to a dedicated
|
* on V7-M there is no need to copy the vector table to a dedicated
|
||||||
* memory area. The address is configurable and so a table in the kernel
|
* memory area. The address is configurable and so a table in the kernel
|
||||||
* image can be used.
|
* image can be used.
|
||||||
*/
|
*/
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
Reference in New Issue
Block a user