From a34608ca9670e07d8a4b6de2914b2960132d4b16 Mon Sep 17 00:00:00 2001 From: Ard Biesheuvel Date: Thu, 17 Mar 2016 09:07:28 +0100 Subject: ArmPkg/AsmMacroIoLibV8: remove undocumented assumption from ELx macros 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 Reviewed-by: Leif Lindholm Reviewed-by: Eugene Cohen --- ArmPkg/Include/AsmMacroIoLibV8.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'ArmPkg/Include') diff --git a/ArmPkg/Include/AsmMacroIoLibV8.h b/ArmPkg/Include/AsmMacroIoLibV8.h index a9f8491bc9..37fa255f84 100644 --- a/ArmPkg/Include/AsmMacroIoLibV8.h +++ b/ArmPkg/Include/AsmMacroIoLibV8.h @@ -24,23 +24,23 @@ #define EL1_OR_EL2(SAFE_XREG) \ mrs SAFE_XREG, CurrentEL ;\ cmp SAFE_XREG, #0x8 ;\ + b.gt . ;\ b.eq 2f ;\ - cmp SAFE_XREG, #0x4 ;\ - b.ne . ;// We should never get here -// EL1 code starts here + cbnz SAFE_XREG, 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. // Provide the Macro with a safe temp xreg to use. #define EL1_OR_EL2_OR_EL3(SAFE_XREG) \ mrs SAFE_XREG, CurrentEL ;\ - cmp SAFE_XREG, #0xC ;\ - b.eq 3f ;\ cmp SAFE_XREG, #0x8 ;\ + b.gt 3f ;\ b.eq 2f ;\ - cmp SAFE_XREG, #0x4 ;\ - b.ne . ;// We should never get here -// EL1 code starts here + cbnz SAFE_XREG, 1f ;\ + b . ;// We should never get here + #if defined(__clang__) // load x0 with _Data -- cgit v1.2.3