BACKPORT: ARM: 9039/1: assembler: generalize byte swapping macro into rev_l

Take the 4 instruction byte swapping sequence from the decompressor's
head.S, and turn it into a rev_l GAS macro for general use. While
at it, make it use the 'rev' instruction when compiling for v6 or
later.

Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Tested-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Nicolas Pitre <nico@fluxnic.net>
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>

(cherry picked from commit 6468e898c67b905ec0f95d9678929135bcaf7f67)
(resolved conflict due to different patch context, caused by missing
 other macros in assembler.h)
Bug: 178411248
Change-Id: I8433e97d2880f75cace215f1a8daadec7f29929c
Signed-off-by: Eric Biggers <ebiggers@google.com>
This commit is contained in:
Ard Biesheuvel 2020-12-09 17:21:43 +01:00 committed by Eric Biggers
parent 6f5e76931b
commit 1b654b23c0
2 changed files with 18 additions and 4 deletions

View File

@ -117,10 +117,7 @@
.macro be32tocpu, val, tmp .macro be32tocpu, val, tmp
#ifndef __ARMEB__ #ifndef __ARMEB__
/* convert to little endian */ /* convert to little endian */
eor \tmp, \val, \val, ror #16 rev_l \val, \tmp
bic \tmp, \tmp, #0x00ff0000
mov \val, \val, ror #8
eor \val, \val, \tmp, lsr #8
#endif #endif
.endm .endm

View File

@ -506,4 +506,21 @@ THUMB( orr \reg , \reg , #PSR_T_BIT )
#define _ASM_NOKPROBE(entry) #define _ASM_NOKPROBE(entry)
#endif #endif
/*
* rev_l - byte-swap a 32-bit value
*
* @val: source/destination register
* @tmp: scratch register
*/
.macro rev_l, val:req, tmp:req
.if __LINUX_ARM_ARCH__ < 6
eor \tmp, \val, \val, ror #16
bic \tmp, \tmp, #0x00ff0000
mov \val, \val, ror #8
eor \val, \val, \tmp, lsr #8
.else
rev \val, \val
.endif
.endm
#endif /* __ASM_ASSEMBLER_H__ */ #endif /* __ASM_ASSEMBLER_H__ */