diff options
| -rw-r--r-- | arch/xtensa/include/asm/regs.h | 1 | ||||
| -rw-r--r-- | arch/xtensa/kernel/align.S | 5 | ||||
| -rw-r--r-- | arch/xtensa/kernel/coprocessor.S | 9 | ||||
| -rw-r--r-- | arch/xtensa/kernel/entry.S | 115 | ||||
| -rw-r--r-- | arch/xtensa/kernel/vectors.S | 250 |
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 | ||
| 110 | ENTRY(user_exception) | 110 | ENTRY(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 | ||
| 256 | ENTRY(kernel_exception) | 255 | ENTRY(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 |
