| From foo@baz Tue Mar 8 08:40:58 PM CET 2022 |
| From: "Russell King (Oracle)" <rmk+kernel@armlinux.org.uk> |
| Date: Fri, 11 Feb 2022 19:46:15 +0000 |
| Subject: ARM: early traps initialisation |
| |
| From: "Russell King (Oracle)" <rmk+kernel@armlinux.org.uk> |
| |
| commit 04e91b7324760a377a725e218b5ee783826d30f5 upstream. |
| |
| Provide a couple of helpers to copy the vectors and stubs, and also |
| to flush the copied vectors and stubs. |
| |
| 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> |
| --- |
| arch/arm/kernel/traps.c | 27 +++++++++++++++++++++------ |
| 1 file changed, 21 insertions(+), 6 deletions(-) |
| |
| --- a/arch/arm/kernel/traps.c |
| +++ b/arch/arm/kernel/traps.c |
| @@ -819,10 +819,22 @@ static inline void __init kuser_init(voi |
| } |
| #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) |
| { |
| -#ifndef CONFIG_CPU_V7M |
| - unsigned long vectors = (unsigned long)vectors_base; |
| extern char __stubs_start[], __stubs_end[]; |
| extern char __vectors_start[], __vectors_end[]; |
| unsigned i; |
| @@ -843,17 +855,20 @@ void __init early_trap_init(void *vector |
| * into the vector page, mapped at 0xffff0000, and ensure these |
| * are visible to the instruction stream. |
| */ |
| - memcpy((void *)vectors, __vectors_start, __vectors_end - __vectors_start); |
| - memcpy((void *)vectors + 0x1000, __stubs_start, __stubs_end - __stubs_start); |
| + copy_from_lma(vectors_base, __vectors_start, __vectors_end); |
| + copy_from_lma(vectors_base + 0x1000, __stubs_start, __stubs_end); |
| |
| 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 */ |
| +void __init early_trap_init(void *vectors_base) |
| +{ |
| /* |
| * 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 |
| * image can be used. |
| */ |
| -#endif |
| } |
| +#endif |