aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/xtensa/include/asm/regs.h1
-rw-r--r--arch/xtensa/kernel/align.S5
-rw-r--r--arch/xtensa/kernel/coprocessor.S9
-rw-r--r--arch/xtensa/kernel/entry.S115
-rw-r--r--arch/xtensa/kernel/vectors.S250
5 files changed, 238 insertions, 142 deletions
diff --git a/arch/xtensa/include/asm/regs.h b/arch/xtensa/include/asm/regs.h
index b24de6717020..4ba9f516b0e2 100644
--- a/arch/xtensa/include/asm/regs.h
+++ b/arch/xtensa/include/asm/regs.h
@@ -82,6 +82,7 @@
82#define PS_CALLINC_SHIFT 16 82#define PS_CALLINC_SHIFT 16
83#define PS_CALLINC_MASK 0x00030000 83#define PS_CALLINC_MASK 0x00030000
84#define PS_OWB_SHIFT 8 84#define PS_OWB_SHIFT 8
85#define PS_OWB_WIDTH 4
85#define PS_OWB_MASK 0x00000F00 86#define PS_OWB_MASK 0x00000F00
86#define PS_RING_SHIFT 6 87#define PS_RING_SHIFT 6
87#define PS_RING_MASK 0x000000C0 88#define PS_RING_MASK 0x000000C0
diff --git a/arch/xtensa/kernel/align.S b/arch/xtensa/kernel/align.S
index aa2e87b8566a..d4cef6039a5c 100644
--- a/arch/xtensa/kernel/align.S
+++ b/arch/xtensa/kernel/align.S
@@ -146,9 +146,9 @@
146 * a0: trashed, original value saved on stack (PT_AREG0) 146 * a0: trashed, original value saved on stack (PT_AREG0)
147 * a1: a1 147 * a1: a1
148 * a2: new stack pointer, original in DEPC 148 * a2: new stack pointer, original in DEPC
149 * a3: dispatch table 149 * a3: a3
150 * depc: a2, original value saved on stack (PT_DEPC) 150 * depc: a2, original value saved on stack (PT_DEPC)
151 * excsave_1: a3 151 * excsave_1: dispatch table
152 * 152 *
153 * PT_DEPC >= VALID_DOUBLE_EXCEPTION_ADDRESS: double exception, DEPC 153 * PT_DEPC >= VALID_DOUBLE_EXCEPTION_ADDRESS: double exception, DEPC
154 * < VALID_DOUBLE_EXCEPTION_ADDRESS: regular exception 154 * < VALID_DOUBLE_EXCEPTION_ADDRESS: regular exception
@@ -171,7 +171,6 @@ ENTRY(fast_unaligned)
171 s32i a8, a2, PT_AREG8 171 s32i a8, a2, PT_AREG8
172 172
173 rsr a0, depc 173 rsr a0, depc
174 xsr a3, excsave1
175 s32i a0, a2, PT_AREG2 174 s32i a0, a2, PT_AREG2
176 s32i a3, a2, PT_AREG3 175 s32i a3, a2, PT_AREG3
177 176
diff --git a/arch/xtensa/kernel/coprocessor.S b/arch/xtensa/kernel/coprocessor.S
index 647657484866..a482df5df2b2 100644
--- a/arch/xtensa/kernel/coprocessor.S
+++ b/arch/xtensa/kernel/coprocessor.S
@@ -32,9 +32,9 @@
32 * a0: trashed, original value saved on stack (PT_AREG0) 32 * a0: trashed, original value saved on stack (PT_AREG0)
33 * a1: a1 33 * a1: a1
34 * a2: new stack pointer, original in DEPC 34 * a2: new stack pointer, original in DEPC
35 * a3: dispatch table 35 * a3: a3
36 * depc: a2, original value saved on stack (PT_DEPC) 36 * depc: a2, original value saved on stack (PT_DEPC)
37 * excsave_1: a3 37 * excsave_1: dispatch table
38 * 38 *
39 * PT_DEPC >= VALID_DOUBLE_EXCEPTION_ADDRESS: double exception, DEPC 39 * PT_DEPC >= VALID_DOUBLE_EXCEPTION_ADDRESS: double exception, DEPC
40 * < VALID_DOUBLE_EXCEPTION_ADDRESS: regular exception 40 * < VALID_DOUBLE_EXCEPTION_ADDRESS: regular exception
@@ -225,9 +225,9 @@ ENDPROC(coprocessor_restore)
225 * a0: trashed, original value saved on stack (PT_AREG0) 225 * a0: trashed, original value saved on stack (PT_AREG0)
226 * a1: a1 226 * a1: a1
227 * a2: new stack pointer, original in DEPC 227 * a2: new stack pointer, original in DEPC
228 * a3: dispatch table 228 * a3: a3
229 * depc: a2, original value saved on stack (PT_DEPC) 229 * depc: a2, original value saved on stack (PT_DEPC)
230 * excsave_1: a3 230 * excsave_1: dispatch table
231 * 231 *
232 * PT_DEPC >= VALID_DOUBLE_EXCEPTION_ADDRESS: double exception, DEPC 232 * PT_DEPC >= VALID_DOUBLE_EXCEPTION_ADDRESS: double exception, DEPC
233 * < VALID_DOUBLE_EXCEPTION_ADDRESS: regular exception 233 * < VALID_DOUBLE_EXCEPTION_ADDRESS: regular exception
@@ -245,7 +245,6 @@ ENTRY(fast_coprocessor)
245 245
246 /* Save remaining registers a1-a3 and SAR */ 246 /* Save remaining registers a1-a3 and SAR */
247 247
248 xsr a3, excsave1
249 s32i a3, a2, PT_AREG3 248 s32i a3, a2, PT_AREG3
250 rsr a3, sar 249 rsr a3, sar
251 s32i a1, a2, PT_AREG1 250 s32i a1, a2, PT_AREG1
diff --git a/arch/xtensa/kernel/entry.S b/arch/xtensa/kernel/entry.S
index 3f3de283d707..ab025c1f6e23 100644
--- a/arch/xtensa/kernel/entry.S
+++ b/arch/xtensa/kernel/entry.S
@@ -91,9 +91,9 @@
91 * a0: trashed, original value saved on stack (PT_AREG0) 91 * a0: trashed, original value saved on stack (PT_AREG0)
92 * a1: a1 92 * a1: a1
93 * a2: new stack pointer, original value in depc 93 * a2: new stack pointer, original value in depc
94 * a3: dispatch table 94 * a3: a3
95 * depc: a2, original value saved on stack (PT_DEPC) 95 * depc: a2, original value saved on stack (PT_DEPC)
96 * excsave1: a3 96 * excsave1: dispatch table
97 * 97 *
98 * PT_DEPC >= VALID_DOUBLE_EXCEPTION_ADDRESS: double exception, DEPC 98 * PT_DEPC >= VALID_DOUBLE_EXCEPTION_ADDRESS: double exception, DEPC
99 * < VALID_DOUBLE_EXCEPTION_ADDRESS: regular exception 99 * < VALID_DOUBLE_EXCEPTION_ADDRESS: regular exception
@@ -109,9 +109,8 @@
109 109
110ENTRY(user_exception) 110ENTRY(user_exception)
111 111
112 /* Save a2, a3, and depc, restore excsave_1 and set SP. */ 112 /* Save a1, a2, a3, and set SP. */
113 113
114 xsr a3, excsave1
115 rsr a0, depc 114 rsr a0, depc
116 s32i a1, a2, PT_AREG1 115 s32i a1, a2, PT_AREG1
117 s32i a0, a2, PT_AREG2 116 s32i a0, a2, PT_AREG2
@@ -237,9 +236,9 @@ ENDPROC(user_exception)
237 * a0: trashed, original value saved on stack (PT_AREG0) 236 * a0: trashed, original value saved on stack (PT_AREG0)
238 * a1: a1 237 * a1: a1
239 * a2: new stack pointer, original in DEPC 238 * a2: new stack pointer, original in DEPC
240 * a3: dispatch table 239 * a3: a3
241 * depc: a2, original value saved on stack (PT_DEPC) 240 * depc: a2, original value saved on stack (PT_DEPC)
242 * excsave_1: a3 241 * excsave_1: dispatch table
243 * 242 *
244 * PT_DEPC >= VALID_DOUBLE_EXCEPTION_ADDRESS: double exception, DEPC 243 * PT_DEPC >= VALID_DOUBLE_EXCEPTION_ADDRESS: double exception, DEPC
245 * < VALID_DOUBLE_EXCEPTION_ADDRESS: regular exception 244 * < VALID_DOUBLE_EXCEPTION_ADDRESS: regular exception
@@ -255,9 +254,8 @@ ENDPROC(user_exception)
255 254
256ENTRY(kernel_exception) 255ENTRY(kernel_exception)
257 256
258 /* Save a0, a2, a3, DEPC and set SP. */ 257 /* Save a1, a2, a3, and set SP. */
259 258
260 xsr a3, excsave1 # restore a3, excsave_1
261 rsr a0, depc # get a2 259 rsr a0, depc # get a2
262 s32i a1, a2, PT_AREG1 260 s32i a1, a2, PT_AREG1
263 s32i a0, a2, PT_AREG2 261 s32i a0, a2, PT_AREG2
@@ -408,7 +406,7 @@ common_exception:
408 * exception handler and call the exception handler. 406 * exception handler and call the exception handler.
409 */ 407 */
410 408
411 movi a4, exc_table 409 rsr a4, excsave1
412 mov a6, a1 # pass stack frame 410 mov a6, a1 # pass stack frame
413 mov a7, a0 # pass EXCCAUSE 411 mov a7, a0 # pass EXCCAUSE
414 addx4 a4, a0, a4 412 addx4 a4, a0, a4
@@ -832,9 +830,9 @@ ENDPROC(unrecoverable_exception)
832 * a0: trashed, original value saved on stack (PT_AREG0) 830 * a0: trashed, original value saved on stack (PT_AREG0)
833 * a1: a1 831 * a1: a1
834 * a2: new stack pointer, original in DEPC 832 * a2: new stack pointer, original in DEPC
835 * a3: dispatch table 833 * a3: a3
836 * depc: a2, original value saved on stack (PT_DEPC) 834 * depc: a2, original value saved on stack (PT_DEPC)
837 * excsave_1: a3 835 * excsave_1: dispatch table
838 * 836 *
839 * PT_DEPC >= VALID_DOUBLE_EXCEPTION_ADDRESS: double exception, DEPC 837 * PT_DEPC >= VALID_DOUBLE_EXCEPTION_ADDRESS: double exception, DEPC
840 * < VALID_DOUBLE_EXCEPTION_ADDRESS: regular exception 838 * < VALID_DOUBLE_EXCEPTION_ADDRESS: regular exception
@@ -857,18 +855,16 @@ ENTRY(fast_alloca)
857 855
858 rsr a0, depc # get a2 856 rsr a0, depc # get a2
859 s32i a4, a2, PT_AREG4 # save a4 and 857 s32i a4, a2, PT_AREG4 # save a4 and
858 s32i a3, a2, PT_AREG3
860 s32i a0, a2, PT_AREG2 # a2 to stack 859 s32i a0, a2, PT_AREG2 # a2 to stack
861 860
862 /* Exit critical section. */ 861 /* Exit critical section. */
863 862
864 movi a0, 0 863 movi a0, 0
864 rsr a3, excsave1
865 s32i a0, a3, EXC_TABLE_FIXUP 865 s32i a0, a3, EXC_TABLE_FIXUP
866 866
867 /* Restore a3, excsave_1 */
868
869 xsr a3, excsave1 # make sure excsave_1 is valid for dbl.
870 rsr a4, epc1 # get exception address 867 rsr a4, epc1 # get exception address