Thanks - I agree, the fallthrough was totally non-obvious and inconsistent with 
other cases.  The whole '1f' syntax is pretty odd as well - I had to dig deep 
to find out what the locally defined numbered forward-only labels were.

Reviewed-by: Eugene Cohen <[email protected]>


> -----Original Message-----
> From: Ard Biesheuvel [mailto:[email protected]]
> Sent: Thursday, March 17, 2016 7:20 AM
> To: [email protected]; [email protected]; Cohen, Eugene
> <[email protected]>
> Cc: Ard Biesheuvel <[email protected]>
> Subject: [PATCH 1/7] 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 <[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