Revision: 18538
http://sourceforge.net/p/edk2/code/18538
Author: abiesheuvel
Date: 2015-09-24 17:05:39 +0000 (Thu, 24 Sep 2015)
Log Message:
-----------
ArmPkg/CpuDxe: Disable interrupt before restoring context
Interrupt must be disabled before we storing ELR and other system
registers, or else ELR will be overridden by interrupt reentrance.
This bug is critical as we may get occasional exception or dead loop
when interrupt reentrance occurs:
After increasing SP ... Before popping out registers
Or
After restoring ELR
The 1st circumstance could also be resolved by optimizing SP operation
(Pop out registers before adding SP back), but the 2nd could not be
resolved by disabling interrupt.
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Heyi Guo <[email protected]>
Reviewed-by: Ard Biesheuvel <[email protected]>
Modified Paths:
--------------
trunk/edk2/ArmPkg/Drivers/CpuDxe/AArch64/ExceptionSupport.S
Modified: trunk/edk2/ArmPkg/Drivers/CpuDxe/AArch64/ExceptionSupport.S
===================================================================
--- trunk/edk2/ArmPkg/Drivers/CpuDxe/AArch64/ExceptionSupport.S 2015-09-24
03:23:20 UTC (rev 18537)
+++ trunk/edk2/ArmPkg/Drivers/CpuDxe/AArch64/ExceptionSupport.S 2015-09-24
17:05:39 UTC (rev 18538)
@@ -358,6 +358,14 @@
#define REG_PAIR(REG1, REG2, OFFSET, CONTEXT_SIZE) ldp REG1, REG2, [sp,
#(OFFSET-CONTEXT_SIZE)]
#define REG_ONE(REG1, OFFSET, CONTEXT_SIZE) ldur REG1, [sp,
#(OFFSET-CONTEXT_SIZE)]
+ //
+ // Disable interrupt(IRQ and FIQ) before restoring context,
+ // or else the context will be corrupted by interrupt reentrance.
+ // Interrupt mask will be restored from spsr by hardware when we call eret
+ //
+ msr daifset, #3
+ isb
+
// Adjust SP to pop system registers
add sp, sp, #(GP_CONTEXT_SIZE + FP_CONTEXT_SIZE + SYS_CONTEXT_SIZE)
ALL_SYS_REGS
------------------------------------------------------------------------------
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits