diff options
Diffstat (limited to 'arch/microblaze/kernel/hw_exception_handler.S')
-rw-r--r-- | arch/microblaze/kernel/hw_exception_handler.S | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/arch/microblaze/kernel/hw_exception_handler.S b/arch/microblaze/kernel/hw_exception_handler.S index 3288c9737671..6b0288ebccd6 100644 --- a/arch/microblaze/kernel/hw_exception_handler.S +++ b/arch/microblaze/kernel/hw_exception_handler.S | |||
@@ -84,9 +84,10 @@ | |||
84 | #define NUM_TO_REG(num) r ## num | 84 | #define NUM_TO_REG(num) r ## num |
85 | 85 | ||
86 | #ifdef CONFIG_MMU | 86 | #ifdef CONFIG_MMU |
87 | /* FIXME you can't change first load of MSR because there is | ||
88 | * hardcoded jump bri 4 */ | ||
89 | #define RESTORE_STATE \ | 87 | #define RESTORE_STATE \ |
88 | lwi r5, r1, 0; \ | ||
89 | mts rmsr, r5; \ | ||
90 | nop; \ | ||
90 | lwi r3, r1, PT_R3; \ | 91 | lwi r3, r1, PT_R3; \ |
91 | lwi r4, r1, PT_R4; \ | 92 | lwi r4, r1, PT_R4; \ |
92 | lwi r5, r1, PT_R5; \ | 93 | lwi r5, r1, PT_R5; \ |
@@ -309,6 +310,9 @@ _hw_exception_handler: | |||
309 | lwi r31, r0, TOPHYS(PER_CPU(CURRENT_SAVE)) /* get saved current */ | 310 | lwi r31, r0, TOPHYS(PER_CPU(CURRENT_SAVE)) /* get saved current */ |
310 | #endif | 311 | #endif |
311 | 312 | ||
313 | mfs r5, rmsr; | ||
314 | nop | ||
315 | swi r5, r1, 0; | ||
312 | mfs r3, resr | 316 | mfs r3, resr |
313 | nop | 317 | nop |
314 | mfs r4, rear; | 318 | mfs r4, rear; |
@@ -380,6 +384,8 @@ handle_other_ex: /* Handle Other exceptions here */ | |||
380 | addk r8, r17, r0; /* Load exception address */ | 384 | addk r8, r17, r0; /* Load exception address */ |
381 | bralid r15, full_exception; /* Branch to the handler */ | 385 | bralid r15, full_exception; /* Branch to the handler */ |
382 | nop; | 386 | nop; |
387 | mts r0, rfsr; /* Clear sticky fsr */ | ||
388 | nop | ||
383 | 389 | ||
384 | /* | 390 | /* |
385 | * Trigger execution of the signal handler by enabling | 391 | * Trigger execution of the signal handler by enabling |