From: Sam Price <samuel.r.pr...@nasa.gov>

The interrupt context save is now done in the BSP. This avoids an issue
where a register is modified by the interrupt handler before it is
saved. Specifically, the MSR register was modified by the `addi`
instruction in the interrupt handler before the MSR was saved. This
caused the MSR to be saved with the wrong value.

Closes #4962
---
 .../start/_interrupt_handler.S                | 21 +++++++++++++++----
 cpukit/score/cpu/microblaze/cpu_asm.S         | 17 ---------------
 2 files changed, 17 insertions(+), 21 deletions(-)

diff --git a/bsps/microblaze/microblaze_fpga/start/_interrupt_handler.S 
b/bsps/microblaze/microblaze_fpga/start/_interrupt_handler.S
index c24807c3e0..cf95eaee2f 100644
--- a/bsps/microblaze/microblaze_fpga/start/_interrupt_handler.S
+++ b/bsps/microblaze/microblaze_fpga/start/_interrupt_handler.S
@@ -45,11 +45,24 @@
        /* Subtract stack frame */
        addik r1, r1, -(CPU_INTERRUPT_FRAME_SIZE)
 
-       swi r5, r1, 8
+   /* Save stack frame */
+       swi  r3, r1, MICROBLAZE_INTERRUPT_FRAME_R3
+       swi  r4, r1, MICROBLAZE_INTERRUPT_FRAME_R4
+   swi  r5, r1, MICROBLAZE_INTERRUPT_FRAME_R5
+       swi  r6, r1, MICROBLAZE_INTERRUPT_FRAME_R6
+       swi  r7, r1, MICROBLAZE_INTERRUPT_FRAME_R7
+       swi  r8, r1, MICROBLAZE_INTERRUPT_FRAME_R8
+       swi  r9, r1, MICROBLAZE_INTERRUPT_FRAME_R9
+       swi r10, r1, MICROBLAZE_INTERRUPT_FRAME_R10
+       swi r11, r1, MICROBLAZE_INTERRUPT_FRAME_R11
+       swi r12, r1, MICROBLAZE_INTERRUPT_FRAME_R12
+   swi r14, r1, MICROBLAZE_INTERRUPT_FRAME_R14
+       swi r15, r1, MICROBLAZE_INTERRUPT_FRAME_R15
+       swi r18, r1, MICROBLAZE_INTERRUPT_FRAME_R18
+       mfs r3, rmsr
+       swi  r3, r1, MICROBLAZE_INTERRUPT_FRAME_MSR
 
        /* Indicate unknown interrupt source */
-       addi r5, r0, 0xFF
-
        braid _ISR_Handler
-       nop
+       addik r5, r0, 0xFF
 #endif /* __rtems__ */
diff --git a/cpukit/score/cpu/microblaze/cpu_asm.S 
b/cpukit/score/cpu/microblaze/cpu_asm.S
index 0a2c5d8fff..b0bb2b1fa1 100644
--- a/cpukit/score/cpu/microblaze/cpu_asm.S
+++ b/cpukit/score/cpu/microblaze/cpu_asm.S
@@ -41,28 +41,11 @@
        .align 2
 
 _ISR_Handler:
-       /* Save stack frame */
-       swi  r3, r1, MICROBLAZE_INTERRUPT_FRAME_R3
-       swi  r4, r1, MICROBLAZE_INTERRUPT_FRAME_R4
-       swi  r6, r1, MICROBLAZE_INTERRUPT_FRAME_R6
-       swi  r7, r1, MICROBLAZE_INTERRUPT_FRAME_R7
-       swi  r8, r1, MICROBLAZE_INTERRUPT_FRAME_R8
-       swi  r9, r1, MICROBLAZE_INTERRUPT_FRAME_R9
-       swi r10, r1, MICROBLAZE_INTERRUPT_FRAME_R10
-       swi r11, r1, MICROBLAZE_INTERRUPT_FRAME_R11
-       swi r12, r1, MICROBLAZE_INTERRUPT_FRAME_R12
-       swi r15, r1, MICROBLAZE_INTERRUPT_FRAME_R15
-       swi r18, r1, MICROBLAZE_INTERRUPT_FRAME_R18
-       mfs r3, rmsr
-       swi  r3, r1, MICROBLAZE_INTERRUPT_FRAME_MSR
-
        /* Disable dispatching */
        lwi r3, r0, _Per_CPU_Information + 16
        addik r3, r3, 1
        swi r3, r0, _Per_CPU_Information + 16
 
-       swi r14, r1, MICROBLAZE_INTERRUPT_FRAME_R14
-
        /* Is SP < INTERRUPT_STACK_LOW? */
        lwi r4, r0, _Per_CPU_Information
        rsubk r3, r4, r1
-- 
2.34.1

_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to