diff mbox series

[v2,5/6] armv8: Simplify switch_el macro

Message ID 20220211112939.1327953-6-andre.przywara@arm.com
State Accepted
Commit f660fe0bd3a8cfa7fc6271bbf27b1530e7348b85
Delegated to: Tom Rini
Headers show
Series armv8: fixes and cleanups | expand

Commit Message

Andre Przywara Feb. 11, 2022, 11:29 a.m. UTC
The switch_el macro is a neat contraption to handle cases where we need
different code depending on the current exception level, but its
implementation was longer than needed.

Simplify it by doing just one comparison, then using the different
condition codes to branch to the desired target. PState.CurrentEL just
holds two bits, and since we don't care about EL0, we can use >, =, < to
select EL3, EL2 and EL1, respectively.

Signed-off-by: Andre Przywara <andre.przywara@arm.com>
---
 arch/arm/include/asm/macro.h | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

Comments

Tom Rini March 2, 2022, 10:41 p.m. UTC | #1
On Fri, Feb 11, 2022 at 11:29:38AM +0000, Andre Przywara wrote:

> The switch_el macro is a neat contraption to handle cases where we need
> different code depending on the current exception level, but its
> implementation was longer than needed.
> 
> Simplify it by doing just one comparison, then using the different
> condition codes to branch to the desired target. PState.CurrentEL just
> holds two bits, and since we don't care about EL0, we can use >, =, < to
> select EL3, EL2 and EL1, respectively.
> 
> Signed-off-by: Andre Przywara <andre.przywara@arm.com>

Applied to u-boot/next, thanks!
diff mbox series

Patch

diff --git a/arch/arm/include/asm/macro.h b/arch/arm/include/asm/macro.h
index ec0171e0e6..acd519020d 100644
--- a/arch/arm/include/asm/macro.h
+++ b/arch/arm/include/asm/macro.h
@@ -69,12 +69,10 @@  lr	.req	x30
  */
 .macro	switch_el, xreg, el3_label, el2_label, el1_label
 	mrs	\xreg, CurrentEL
-	cmp	\xreg, 0xc
-	b.eq	\el3_label
-	cmp	\xreg, 0x8
+	cmp	\xreg, #0x8
+	b.gt	\el3_label
 	b.eq	\el2_label
-	cmp	\xreg, 0x4
-	b.eq	\el1_label
+	b.lt	\el1_label
 .endm
 
 /*