Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dfea9912 authored by Russell King (Oracle)'s avatar Russell King (Oracle) Committed by Greg Kroah-Hartman
Browse files

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.

Acked-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Signed-off-by: default avatarRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent b24d4041
Loading
Loading
Loading
Loading
+21 −6
Original line number Original line Diff line number Diff line
@@ -819,10 +819,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;
@@ -843,17 +855,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