|
102 | 102 | POP r2 |
103 | 103 | POP r1 |
104 | 104 | POP r0 |
| 105 | + |
| 106 | +#ifdef CONFIG_ARC_CURR_IN_REG |
| 107 | + ld r25, [sp, 12] |
| 108 | +#endif |
105 | 109 | .endm |
106 | 110 |
|
107 | 111 | /*-------------------------------------------------------------- |
|
138 | 142 | POP r13 |
139 | 143 | .endm |
140 | 144 |
|
| 145 | +#define OFF_USER_R25_FROM_R24 (SZ_CALLEE_REGS + SZ_PT_REGS - 8)/4 |
141 | 146 |
|
142 | 147 | /*-------------------------------------------------------------- |
143 | 148 | * Collect User Mode callee regs as struct callee_regs - needed by |
|
155 | 160 |
|
156 | 161 | #ifdef CONFIG_ARC_CURR_IN_REG |
157 | 162 | ; Retrieve orig r25 and save it on stack |
158 | | - ld r12, [r25, TASK_THREAD + THREAD_USER_R25] |
| 163 | + ld.as r12, [sp, OFF_USER_R25_FROM_R24] |
159 | 164 | st.a r12, [sp, -4] |
160 | 165 | #else |
161 | 166 | PUSH r25 |
|
204 | 209 |
|
205 | 210 | #ifdef CONFIG_ARC_CURR_IN_REG |
206 | 211 | ld.ab r12, [sp, 4] |
207 | | - st r12, [r25, TASK_THREAD + THREAD_USER_R25] |
| 212 | + st.as r12, [sp, OFF_USER_R25_FROM_R24] |
208 | 213 | #else |
209 | 214 | POP r25 |
210 | 215 | #endif |
|
218 | 223 | add sp, sp, SZ_CALLEE_REGS |
219 | 224 | .endm |
220 | 225 |
|
221 | | -/*-------------------------------------------------------------- |
222 | | - * Restore User mode r25 saved in task_struct->thread.user_r25 |
223 | | - *-------------------------------------------------------------*/ |
224 | | -.macro RESTORE_USER_R25 |
225 | | - ld r25, [r25, TASK_THREAD + THREAD_USER_R25] |
226 | | -.endm |
227 | | - |
228 | 226 | /*------------------------------------------------------------- |
229 | 227 | * given a tsk struct, get to the base of it's kernel mode stack |
230 | 228 | * tsk->thread_info is really a PAGE, whose bottom hoists stack |
|
297 | 295 |
|
298 | 296 | GET_CURR_TASK_ON_CPU r9 |
299 | 297 |
|
300 | | -#ifdef CONFIG_ARC_CURR_IN_REG |
301 | | - |
302 | | - /* If current task pointer cached in r25, time to |
303 | | - * -safekeep USER r25 in task->thread_struct->user_r25 |
304 | | - * -load r25 with current task ptr |
305 | | - */ |
306 | | - st.as r25, [r9, (TASK_THREAD + THREAD_USER_R25)/4] |
307 | | - mov r25, r9 |
308 | | -#endif |
309 | | - |
310 | 298 | /* With current tsk in r9, get it's kernel mode stack base */ |
311 | 299 | GET_TSK_STACK_BASE r9, r9 |
312 | 300 |
|
313 | 301 | 66: |
| 302 | +#ifdef CONFIG_ARC_CURR_IN_REG |
| 303 | + /* |
| 304 | + * Treat r25 as scratch reg, save it on stack first |
| 305 | + * Load it with current task pointer |
| 306 | + */ |
| 307 | + st r25, [r9, -4] |
| 308 | + GET_CURR_TASK_ON_CPU r25 |
| 309 | +#endif |
| 310 | + |
314 | 311 | /* Save Pre Intr/Exception User SP on kernel stack */ |
315 | | - st.a sp, [r9, -12] ; Make room for orig_r0 and orig_r8 |
| 312 | + st.a sp, [r9, -16] ; Make room for orig_r0, orig_r8, user_r25 |
316 | 313 |
|
317 | 314 | /* CAUTION: |
318 | 315 | * SP should be set at the very end when we are done with everything |
|
466 | 463 | RESTORE_R12_TO_R0 |
467 | 464 |
|
468 | 465 | ld sp, [sp] /* restore original sp */ |
469 | | - /* orig_r0 and orig_r8 skipped automatically */ |
| 466 | + /* orig_r0, orig_r8, user_r25 skipped automatically */ |
470 | 467 | .endm |
471 | 468 |
|
472 | 469 |
|
|
549 | 546 | RESTORE_R12_TO_R0 |
550 | 547 |
|
551 | 548 | ld sp, [sp] /* restore original sp */ |
552 | | - /* orig_r0 and orig_r8 skipped automatically */ |
| 549 | + /* orig_r0, orig_r8, user_r25 skipped automatically */ |
553 | 550 | .endm |
554 | 551 |
|
555 | 552 | .macro RESTORE_ALL_INT2 |
|
568 | 565 | RESTORE_R12_TO_R0 |
569 | 566 |
|
570 | 567 | ld sp, [sp] /* restore original sp */ |
571 | | - /* orig_r0 and orig_r8 skipped automatically */ |
| 568 | + /* orig_r0, orig_r8, user_r25 skipped automatically */ |
572 | 569 | .endm |
573 | 570 |
|
574 | 571 |
|
|
0 commit comments