The macros EL1_OR_EL2() and EL1_OR_EL2_OR_EL3() allow conditional execution
of assembly sequences based on the current exception level, by jumping to
caller supplied labels 1f, 2f or 3f. However, the jump to 1f is actually
a fallthrough, which means the EL1 code needs to follow right after the
macro invocation, and the 1f label is ignored.

So let's fix this by making all jumps explicit.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <[email protected]>
---
 ArmPkg/Include/AsmMacroIoLibV8.h | 15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)

diff --git a/ArmPkg/Include/AsmMacroIoLibV8.h b/ArmPkg/Include/AsmMacroIoLibV8.h
index a9f8491bc922..efc47d3bbbc7 100644
--- a/ArmPkg/Include/AsmMacroIoLibV8.h
+++ b/ArmPkg/Include/AsmMacroIoLibV8.h
@@ -25,9 +25,9 @@
         mrs    SAFE_XREG, CurrentEL ;\
         cmp    SAFE_XREG, #0x8      ;\
         b.eq   2f                   ;\
-        cmp    SAFE_XREG, #0x4      ;\
-        b.ne   .                    ;// We should never get here
-// EL1 code starts here
+        tbnz   SAFE_XREG, #2, 1f    ;\
+        b      .                    ;// We should never get here
+
 
 // CurrentEL : 0xC = EL3; 8 = EL2; 4 = EL1
 // This only selects between EL1 and EL2 and EL3, else we die.
@@ -36,11 +36,10 @@
         mrs    SAFE_XREG, CurrentEL ;\
         cmp    SAFE_XREG, #0xC      ;\
         b.eq   3f                   ;\
-        cmp    SAFE_XREG, #0x8      ;\
-        b.eq   2f                   ;\
-        cmp    SAFE_XREG, #0x4      ;\
-        b.ne   .                    ;// We should never get here
-// EL1 code starts here
+        tbnz   SAFE_XREG, #3, 2f    ;\
+        tbnz   SAFE_XREG, #2, 1f    ;\
+        b      .                    ;// We should never get here
+
 #if defined(__clang__)
 
 // load x0 with _Data
-- 
2.5.0

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to