@@ -36,6 +36,15 @@ GTEXT(__ev_maligned)
36
36
37
37
GDATA(exc_nest_count)
38
38
39
+ .balign 4
40
+ SECTION_VAR(BSS , saved_value)
41
+ . word 0
42
+
43
+ #define EXCEPTION_STACK_SIZE 256
44
+
45
+ SECTION_VAR(NOINIT , _exception_stack)
46
+ .space EXCEPTION_STACK_SIZE
47
+
39
48
/ *
40
49
* @brief Fault handler installed in the fault and reserved vectors
41
50
* /
@@ -53,21 +62,18 @@ SECTION_SUBSEC_FUNC(TEXT,__fault,__ev_div_zero)
53
62
SECTION_SUBSEC_FUNC(TEXT , __fault , __ev_dc_error)
54
63
SECTION_SUBSEC_FUNC(TEXT , __fault , __ev_maligned)
55
64
56
- / *
57
- * Before invoking exception handler , the kernel switches to an exception
58
- * stack , to save the faulting thread's registers.
59
- * The exception is fatal and all the kernel can do is just print
60
- * a diagnostic message and halt.
61
- * /
62
65
63
66
#ifdef CONFIG_ARC_STACK_CHECKING
64
- push_s r2
67
+ st r0 , [ saved_value ]
65
68
/ * disable stack checking * /
66
- lr r2 , [ _ARC_V2_STATUS32 ]
67
- bclr r2 , r2 , _ARC_V2_STATUS32_SC_BIT
68
- kflag r2
69
- pop_s r2
69
+ lr r0 , [ _ARC_V2_STATUS32 ]
70
+ bclr r0 , r0 , _ARC_V2_STATUS32_SC_BIT
71
+ kflag r0
72
+ ld r0 , [ saved_value ]
70
73
#endif
74
+ st sp , [ saved_value ]
75
+ mov_s sp , _exception_stack
76
+ add sp , sp , EXCEPTION_STACK_SIZE
71
77
72
78
/ * save caller saved registers * /
73
79
_create_irq_stack_frame
@@ -81,30 +87,11 @@ SECTION_SUBSEC_FUNC(TEXT,__fault,__ev_maligned)
81
87
lr r0 ,[ _ARC_V2_ERET ]
82
88
st_s r0 , [ sp , ___isf_t_pc_OFFSET ] / * eret into pc * /
83
89
84
- ld r1 , [ exc_nest_count ]
85
- add r0 , r1 , 1
86
- st r0 , [ exc_nest_count ]
87
- cmp r1 , 0
88
-
89
- bgt.d exc_nest_handle
90
90
mov r0 , sp
91
91
92
- mov r1 , _kernel
93
- ld sp , [ r1 , _kernel_offset_to_irq_stack ]
94
- exc_nest_handle:
95
- push_s r0
96
-
97
92
jl _Fault
98
93
99
94
_exc_return:
100
- pop sp
101
-
102
- mov r1 , exc_nest_count
103
- ld r0 , [ r1 ]
104
- sub r0 , r0 , 1
105
- cmp r0 , 0
106
- bne.d _exc_return_from_exc
107
- st r0 , [ r1 ]
108
95
109
96
#ifdef CONFIG_PREEMPT_ENABLED
110
97
mov_s r1 , _kernel
@@ -114,11 +101,6 @@ _exc_return:
114
101
ld_s r0 , [ r1 , _kernel_offset_to_ready_q_cache ]
115
102
breq r0 , r2 , _exc_return_from_exc
116
103
117
- _save_callee_saved_regs
118
-
119
- st _CAUSE_RIRQ , [ r2 , _thread_offset_to_relinquish_cause ]
120
- / * note: Ok to use _CAUSE_RIRQ since everything is saved * /
121
-
122
104
ld_s r2 , [ r1 , _kernel_offset_to_ready_q_cache ]
123
105
st_s r2 , [ r1 , _kernel_offset_to_current ]
124
106
@@ -152,6 +134,7 @@ _exc_return:
152
134
153
135
_exc_return_from_exc:
154
136
_pop_irq_stack_frame
137
+ ld sp , [ saved_value ]
155
138
rtie
156
139
157
140
@@ -204,13 +187,16 @@ valid_syscall_id:
204
187
_do_other_trap:
205
188
#endif / * CONFIG_USERSPACE * /
206
189
#ifdef CONFIG_ARC_STACK_CHECKING
207
- push_s r2
190
+ st r0 , [ saved_value ]
208
191
/ * disable stack checking * /
209
- lr r2 , [ _ARC_V2_STATUS32 ]
210
- bclr r2 , r2 , _ARC_V2_STATUS32_SC_BIT
211
- kflag r2
212
- pop_s r2
192
+ lr r0 , [ _ARC_V2_STATUS32 ]
193
+ bclr r0 , r0 , _ARC_V2_STATUS32_SC_BIT
194
+ kflag r0
195
+ ld r0 , [ saved_value ]
213
196
#endif
197
+ st sp , [ saved_value ]
198
+ mov_s sp , _exception_stack
199
+ add sp , sp , EXCEPTION_STACK_SIZE
214
200
215
201
/ * save caller saved registers * /
216
202
_create_irq_stack_frame
@@ -224,19 +210,8 @@ _do_other_trap:
224
210
lr r0 ,[ _ARC_V2_ERET ]
225
211
st_s r0 , [ sp , ___isf_t_pc_OFFSET ] / * eret into pc * /
226
212
227
- ld r1 , [ exc_nest_count ]
228
- add r0 , r1 , 1
229
- st r0 , [ exc_nest_count ]
230
- cmp r1 , 0
231
-
232
- bgt.d trap_nest_handle
233
213
mov r0 , sp
234
214
235
- mov r1 , _kernel
236
- ld sp , [ r1 , _kernel_offset_to_irq_stack ]
237
- trap_nest_handle:
238
- push_s r0
239
-
240
215
mov blink , _exc_return
241
216
242
217
cmp ilink , _TRAP_S_CALL_RUNTIME_EXCEPT
0 commit comments