This code must have been taken from Linux, where such a mechanism allows for an efficient exception vector replacement for board-specific code. We don't really need that. If some extensions for exception vector are to be required, this may be done inside the generic handler code anyway. As we are not using this code, it seems reasonable to just remove it. Also properly calculate the size of the handler that we are copying into the designated vectors. Originally, we just made a copy of a fixed size, copying more than actually needed. We could have just hardcoded this value there, as the code to copy now consists of just two instructions. However it feels more safe to calculate that in code instead, so that we don't have to update this value if some code is added there in the future. Signed-off-by: Denis Orlov <denorl2009@xxxxxxxxx> --- arch/mips/boot/main_entry.c | 39 ++++++++----------------------------- arch/mips/lib/genex.S | 29 ++++++++------------------- 2 files changed, 16 insertions(+), 52 deletions(-) diff --git a/arch/mips/boot/main_entry.c b/arch/mips/boot/main_entry.c index 237288a337..d0c69f3c82 100644 --- a/arch/mips/boot/main_entry.c +++ b/arch/mips/boot/main_entry.c @@ -14,45 +14,22 @@ #include <asm/addrspace.h> #include <linux/sizes.h> -extern void handle_reserved(void); +extern void exception_vec(void); +extern void exception_vec_end(void); void main_entry(void *fdt, u32 fdt_size); -unsigned long exception_handlers[32]; - -static void set_except_vector(int n, void *addr) -{ - unsigned long handler = (unsigned long) addr; - - exception_handlers[n] = handler; -} - static void trap_init(void) { - extern char except_vec3_generic; - int i; - - unsigned long ebase; - - ebase = CKSEG1; - - /* - * Copy the generic exception handlers to their final destination. - * This will be overriden later as suitable for a particular - * configuration. - */ - memcpy((void *)(ebase + 0x180), &except_vec3_generic, 0x80); + const unsigned long vec_size = exception_vec_end - exception_vec; + const unsigned long ebase = CKSEG1; - /* - * Setup default vectors - */ - for (i = 0; i <= 31; i++) { - set_except_vector(i, &handle_reserved); - } + /* copy the generic exception handlers to their final destination */ + memcpy((void *)(ebase + 0x180), &exception_vec, vec_size); /* FIXME: handle tlb */ - memcpy((void *)(ebase), &except_vec3_generic, 0x80); - memcpy((void *)(ebase + 0x080), &except_vec3_generic, 0x80); + memcpy((void *)(ebase), &exception_vec, vec_size); + memcpy((void *)(ebase + 0x80), &exception_vec, vec_size); /* unset BOOT EXCEPTION VECTOR bit */ write_c0_status(read_c0_status() & ~ST0_BEV); diff --git a/arch/mips/lib/genex.S b/arch/mips/lib/genex.S index b9d18fc394..27dd9de67a 100644 --- a/arch/mips/lib/genex.S +++ b/arch/mips/lib/genex.S @@ -2,7 +2,6 @@ #include <asm/asm.h> #include <asm/regdef.h> -#include <asm/mipsregs.h> #include <asm/stackframe.h> .text @@ -11,31 +10,19 @@ .set noreorder .align 5 -/* Exception vector */ -NESTED(handle_reserved, 0, sp) +NESTED(exception_vec, 0, sp) + j handle_reserved + nop +EXPORT(exception_vec_end) +END(exception_vec) + +handle_reserved: SAVE_ALL PTR_LA k0, barebox_exc_handler - jal k0 + j k0 move a0, sp - /* will never return here */ - END(handle_reserved) - -/* General exception vector */ -NESTED(except_vec3_generic, 0, sp) - .set noat - mfc0 k1, CP0_CAUSE - PTR_LA k0, exception_handlers - andi k1, k1, 0x7c - PTR_ADDU k0, k0, k1 - PTR_L k0, (k0) - nop - jr k0 - nop - END(except_vec3_generic) - .set at FEXPORT(ret_from_exception) .set noat RESTORE_ALL_AND_RET - nop .set at -- 2.41.0