Commit 50722f0b authored by Max Filippov's avatar Max Filippov

xtensa: move fast exception handlers close to vectors

On XIP kernels it makes sense to have exception vectors and fast
exception handlers together (in a fast memory). In addition, with MTD
XIP support both vectors and fast exception handlers must be outside of
the FLASH.

Add section .exception.text and move fast exception handlers to it.
Put it together with vectors when vectors are outside of the .text.
Signed-off-by: default avatarMax Filippov <jcmvbkbc@gmail.com>
parent 58bc6c69
...@@ -237,4 +237,6 @@ ...@@ -237,4 +237,6 @@
#error Unsupported Xtensa ABI #error Unsupported Xtensa ABI
#endif #endif
#define __XTENSA_HANDLER .section ".exception.text", "ax"
#endif /* _XTENSA_ASMMACRO_H */ #endif /* _XTENSA_ASMMACRO_H */
...@@ -58,6 +58,8 @@ ...@@ -58,6 +58,8 @@
.endif; \ .endif; \
.long THREAD_XTREGS_CP##x .long THREAD_XTREGS_CP##x
__XTENSA_HANDLER
SAVE_CP_REGS(0) SAVE_CP_REGS(0)
SAVE_CP_REGS(1) SAVE_CP_REGS(1)
SAVE_CP_REGS(2) SAVE_CP_REGS(2)
...@@ -76,7 +78,6 @@ ...@@ -76,7 +78,6 @@
LOAD_CP_REGS(6) LOAD_CP_REGS(6)
LOAD_CP_REGS(7) LOAD_CP_REGS(7)
.section ".rodata", "a"
.align 4 .align 4
.Lsave_cp_regs_jump_table: .Lsave_cp_regs_jump_table:
SAVE_CP_REGS_TAB(0) SAVE_CP_REGS_TAB(0)
...@@ -98,8 +99,6 @@ ...@@ -98,8 +99,6 @@
LOAD_CP_REGS_TAB(6) LOAD_CP_REGS_TAB(6)
LOAD_CP_REGS_TAB(7) LOAD_CP_REGS_TAB(7)
.previous
/* /*
* coprocessor_flush(struct thread_info*, index) * coprocessor_flush(struct thread_info*, index)
* a2 a3 * a2 a3
......
...@@ -939,6 +939,9 @@ ENDPROC(unrecoverable_exception) ...@@ -939,6 +939,9 @@ ENDPROC(unrecoverable_exception)
/* -------------------------- FAST EXCEPTION HANDLERS ----------------------- */ /* -------------------------- FAST EXCEPTION HANDLERS ----------------------- */
__XTENSA_HANDLER
.literal_position
/* /*
* Fast-handler for alloca exceptions * Fast-handler for alloca exceptions
* *
...@@ -1024,7 +1027,7 @@ ENDPROC(fast_alloca) ...@@ -1024,7 +1027,7 @@ ENDPROC(fast_alloca)
ENTRY(fast_illegal_instruction_user) ENTRY(fast_illegal_instruction_user)
rsr a0, ps rsr a0, ps
bbsi.l a0, PS_WOE_BIT, user_exception bbsi.l a0, PS_WOE_BIT, 1f
s32i a3, a2, PT_AREG3 s32i a3, a2, PT_AREG3
movi a3, PS_WOE_MASK movi a3, PS_WOE_MASK
or a0, a0, a3 or a0, a0, a3
...@@ -1033,6 +1036,8 @@ ENTRY(fast_illegal_instruction_user) ...@@ -1033,6 +1036,8 @@ ENTRY(fast_illegal_instruction_user)
l32i a0, a2, PT_AREG0 l32i a0, a2, PT_AREG0
rsr a2, depc rsr a2, depc
rfe rfe
1:
call0 user_exception
ENDPROC(fast_illegal_instruction_user) ENDPROC(fast_illegal_instruction_user)
#endif #endif
...@@ -1071,7 +1076,7 @@ ENTRY(fast_syscall_user) ...@@ -1071,7 +1076,7 @@ ENTRY(fast_syscall_user)
_beqz a0, fast_syscall_spill_registers _beqz a0, fast_syscall_spill_registers
_beqi a0, __NR_xtensa, fast_syscall_xtensa _beqi a0, __NR_xtensa, fast_syscall_xtensa
j user_exception call0 user_exception
ENDPROC(fast_syscall_user) ENDPROC(fast_syscall_user)
...@@ -1762,8 +1767,8 @@ ENTRY(fast_second_level_miss) ...@@ -1762,8 +1767,8 @@ ENTRY(fast_second_level_miss)
rsr a2, ps rsr a2, ps
bbsi.l a2, PS_UM_BIT, 1f bbsi.l a2, PS_UM_BIT, 1f
j _kernel_exception call0 _kernel_exception
1: j _user_exception 1: call0 _user_exception
ENDPROC(fast_second_level_miss) ENDPROC(fast_second_level_miss)
...@@ -1859,13 +1864,14 @@ ENTRY(fast_store_prohibited) ...@@ -1859,13 +1864,14 @@ ENTRY(fast_store_prohibited)
rsr a2, ps rsr a2, ps
bbsi.l a2, PS_UM_BIT, 1f bbsi.l a2, PS_UM_BIT, 1f
j _kernel_exception call0 _kernel_exception
1: j _user_exception 1: call0 _user_exception
ENDPROC(fast_store_prohibited) ENDPROC(fast_store_prohibited)
#endif /* CONFIG_MMU */ #endif /* CONFIG_MMU */
.text
/* /*
* System Calls. * System Calls.
* *
......
...@@ -284,6 +284,8 @@ extern char _UserExceptionVector_text_start; ...@@ -284,6 +284,8 @@ extern char _UserExceptionVector_text_start;
extern char _UserExceptionVector_text_end; extern char _UserExceptionVector_text_end;
extern char _DoubleExceptionVector_text_start; extern char _DoubleExceptionVector_text_start;
extern char _DoubleExceptionVector_text_end; extern char _DoubleExceptionVector_text_end;
extern char _exception_text_start;
extern char _exception_text_end;
#if XCHAL_EXCM_LEVEL >= 2 #if XCHAL_EXCM_LEVEL >= 2
extern char _Level2InterruptVector_text_start; extern char _Level2InterruptVector_text_start;
extern char _Level2InterruptVector_text_end; extern char _Level2InterruptVector_text_end;
...@@ -363,6 +365,8 @@ void __init setup_arch(char **cmdline_p) ...@@ -363,6 +365,8 @@ void __init setup_arch(char **cmdline_p)
mem_reserve(__pa(&_DoubleExceptionVector_text_start), mem_reserve(__pa(&_DoubleExceptionVector_text_start),
__pa(&_DoubleExceptionVector_text_end)); __pa(&_DoubleExceptionVector_text_end));
mem_reserve(__pa(&_exception_text_start),
__pa(&_exception_text_end));
#if XCHAL_EXCM_LEVEL >= 2 #if XCHAL_EXCM_LEVEL >= 2
mem_reserve(__pa(&_Level2InterruptVector_text_start), mem_reserve(__pa(&_Level2InterruptVector_text_start),
__pa(&_Level2InterruptVector_text_end)); __pa(&_Level2InterruptVector_text_end));
......
...@@ -43,6 +43,7 @@ ...@@ -43,6 +43,7 @@
*/ */
#include <linux/linkage.h> #include <linux/linkage.h>
#include <asm/asmmacro.h>
#include <asm/ptrace.h> #include <asm/ptrace.h>
#include <asm/current.h> #include <asm/current.h>
#include <asm/asm-offsets.h> #include <asm/asm-offsets.h>
...@@ -477,7 +478,6 @@ _DoubleExceptionVector_handle_exception: ...@@ -477,7 +478,6 @@ _DoubleExceptionVector_handle_exception:
ENDPROC(_DoubleExceptionVector) ENDPROC(_DoubleExceptionVector)
.text
/* /*
* Fixup handler for TLB miss in double exception handler for window owerflow. * Fixup handler for TLB miss in double exception handler for window owerflow.
* We get here with windowbase set to the window that was being spilled and * We get here with windowbase set to the window that was being spilled and
...@@ -505,6 +505,7 @@ ENDPROC(_DoubleExceptionVector) ...@@ -505,6 +505,7 @@ ENDPROC(_DoubleExceptionVector)
* a3: exctable, original value in excsave1 * a3: exctable, original value in excsave1
*/ */
__XTENSA_HANDLER
.literal_position .literal_position
ENTRY(window_overflow_restore_a0_fixup) ENTRY(window_overflow_restore_a0_fixup)
......
...@@ -110,6 +110,8 @@ SECTIONS ...@@ -110,6 +110,8 @@ SECTIONS
SECTION_VECTOR (.KernelExceptionVector.text, KERNEL_VECTOR_VADDR) SECTION_VECTOR (.KernelExceptionVector.text, KERNEL_VECTOR_VADDR)
SECTION_VECTOR (.UserExceptionVector.text, USER_VECTOR_VADDR) SECTION_VECTOR (.UserExceptionVector.text, USER_VECTOR_VADDR)
SECTION_VECTOR (.DoubleExceptionVector.text, DOUBLEEXC_VECTOR_VADDR) SECTION_VECTOR (.DoubleExceptionVector.text, DOUBLEEXC_VECTOR_VADDR)
*(.exception.text)
#endif #endif
IRQENTRY_TEXT IRQENTRY_TEXT
...@@ -190,6 +192,8 @@ SECTIONS ...@@ -190,6 +192,8 @@ SECTIONS
.DoubleExceptionVector.text); .DoubleExceptionVector.text);
RELOCATE_ENTRY(_DebugInterruptVector_text, RELOCATE_ENTRY(_DebugInterruptVector_text,
.DebugInterruptVector.text); .DebugInterruptVector.text);
RELOCATE_ENTRY(_exception_text,
.exception.text);
#endif #endif
#ifdef CONFIG_XIP_KERNEL #ifdef CONFIG_XIP_KERNEL
RELOCATE_ENTRY(_xip_data, .data); RELOCATE_ENTRY(_xip_data, .data);
...@@ -282,8 +286,7 @@ SECTIONS ...@@ -282,8 +286,7 @@ SECTIONS
.DoubleExceptionVector.text, .DoubleExceptionVector.text,
DOUBLEEXC_VECTOR_VADDR, DOUBLEEXC_VECTOR_VADDR,
.UserExceptionVector.text) .UserExceptionVector.text)
#define LAST .DoubleExceptionVector.text
. = (LOADADDR( .DoubleExceptionVector.text ) + SIZEOF( .DoubleExceptionVector.text ) + 3) & ~ 3;
#endif #endif
#if !defined(CONFIG_XIP_KERNEL) && defined(CONFIG_SMP) #if !defined(CONFIG_XIP_KERNEL) && defined(CONFIG_SMP)
...@@ -292,10 +295,20 @@ SECTIONS ...@@ -292,10 +295,20 @@ SECTIONS
.SecondaryResetVector.text, .SecondaryResetVector.text,
RESET_VECTOR1_VADDR, RESET_VECTOR1_VADDR,
.DoubleExceptionVector.text) .DoubleExceptionVector.text)
#undef LAST
#define LAST .SecondaryResetVector.text
. = LOADADDR(.SecondaryResetVector.text)+SIZEOF(.SecondaryResetVector.text); #endif
#ifdef CONFIG_VECTORS_OFFSET
SECTION_VECTOR (_exception_text,
.exception.text,
,
LAST)
#undef LAST
#define LAST .exception.text
#endif #endif
. = (LOADADDR(LAST) + SIZEOF(LAST) + 3) & ~ 3;
. = ALIGN(PAGE_SIZE); . = ALIGN(PAGE_SIZE);
......
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