I will check with fresh Yocto build later or tomorrow. -- With best wishes Dmitry
вс, 23 февр. 2020 г., 19:08 Dmitry Baryshkov <[email protected]>: > If I remember correctly, ARMv5 be was BE-32 > > -- > With best wishes > Dmitry > > вс, 23 февр. 2020 г., 18:45 Michael Weiser <[email protected]>: > >> Hi all, >> >> On Sat, Feb 22, 2020 at 07:43:18PM +0100, Michael Weiser wrote: >> >> > > 2. Eliminate use of rev in the armbe code. >> > ... I've been looking at the revs and they now strike me as taking the >> > easy way out anyway. They work around the implicit LE order in which >> >> Updated code is now at >> https://git.lysator.liu.se/michaelweiser/nettle/-/tree/arm-memxor-generic >> and inline below for comments. >> >> It now compiles and runs the testsuite fine on my native armv7veb when >> configurd with: >> >> CFLAGS="-march=armv6" LDFLAGS="-march=armv6" \ >> ../configure --disable-documentation \ >> --host=armv6b-unknown-linux-gnueabihf >> [...] >> Assembly files: arm/neon arm/v6 arm >> >> and: >> >> CFLAGS="-march=armv5te" LDFLAGS="-march=armv5te -Wl,--be8" \ >> ../configure --disable-documentation \ >> --host=armv5b-unknown-linux-gnueabihf >> [...] >> Assembly files: arm >> >> LDFLAGS "-Wl,--be8" is necessary for armv5teb to work on my system >> because it is BE8 which the gcc linker driver defaults to when run with >> -march=armv6 but not for armv5 which causes the resuling binaries to be >> BE32 and segfault or bus error in ld-linux.so.3 on startup. For a >> (likely wrong) explanation of BE8 vs. BE32 see >> https://lists.lysator.liu.se/pipermail/nettle-bugs/2018/007059.html. >> >> A quick check can be done with file: >> >> $ echo "int main(void) {}" > t.c >> $ gcc -march=armv5te -o t t.c >> $ ./t >> Segmentation fault >> $ file t >> t: ELF 32-bit MSB shared object, ARM, EABI5 version 1 (SYSV), >> dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux >> 3.2.0, not stripped >> $ gcc -march=armv5te -Wl,--be8 -o t t.c >> $ ./t >> $ file t >> t: ELF 32-bit MSB shared object, ARM, EABI5 BE8 version 1 (SYSV), >> dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux >> 3.2.0, not stripped >> >> The qemu environment is churning along in compilation currently. >> >> Previous assembler error for reference: >> >> $ make -j4 >> [...] >> /usr/bin/m4 ../asm.m4 machine.m4 config.m4 memxor.asm >memxor.s >> /usr/bin/m4 ../asm.m4 machine.m4 config.m4 memxor3.asm >memxor3.s >> gcc -I. -DHAVE_CONFIG_H -march=armv5te -ggdb3 -Wall -W >> -Wmissing-prototypes -Wmissing-declarations -Wstrict-prototypes >> -Wpointer-arith -Wbad-function-cast -Wnested-externs -fpic -MT memxor.o >> -MD -MP -MF memxor.o.d -c memxor.s >> gcc -I. -DHAVE_CONFIG_H -march=armv5te -ggdb3 -Wall -W >> -Wmissing-prototypes -Wmissing-declarations -Wstrict-prototypes >> -Wpointer-arith -Wbad-function-cast -Wnested-externs -fpic -MT memxor3.o >> -MD -MP -MF memxor3.o.d -c memxor3.s >> memxor.s: memxor3.s: Assembler messages: >> memxor3.s:146: Error: selected processor does not support `rev r4,r4' in >> ARM mode >> Assembler messages: >> memxor3.s:256: Error: selected processor does not support `rev r4,r4' in >> ARM mode >> memxor.s:126: Error: selected processor does not support `rev r3,r3' in >> ARM mode >> -- >> Thanks, >> Michael >> >> From 3e2118d41472842c368bb5bb56d71023b861b59d Mon Sep 17 00:00:00 2001 >> From: Michael Weiser <[email protected]> >> Date: Sun, 23 Feb 2020 15:22:51 +0100 >> Subject: [PATCH] arm: Fix memxor for non-armv6+ big-endian systems >> >> ARM assembly adjustments for big-endian systems contained armv6+-only >> instructions (rev) in generic arm memxor code. Replace those with an >> actual conversion of the leftover byte store routines for big-endian >> systems. This also provides a slight optimisation by removing the >> additional instruction as well as increased symmetry between little- and >> big-endian implementations. >> >> Signed-off-by: Michael Weiser <[email protected]> >> --- >> arm/memxor.asm | 12 ++++++------ >> arm/memxor3.asm | 27 ++++++++++++++------------- >> 2 files changed, 20 insertions(+), 19 deletions(-) >> >> diff --git a/arm/memxor.asm b/arm/memxor.asm >> index 239a4034..b802e95c 100644 >> --- a/arm/memxor.asm >> +++ b/arm/memxor.asm >> @@ -138,24 +138,24 @@ PROLOGUE(nettle_memxor) >> adds N, #8 >> beq .Lmemxor_odd_done >> >> - C We have TNC/8 left-over bytes in r4, high end >> + C We have TNC/8 left-over bytes in r4, (since working upwards) low >> + C end on LE and high end on BE >> S0ADJ r4, CNT >> ldr r3, [DST] >> eor r3, r4 >> >> - C memxor_leftover does an LSB store >> - C so we need to reverse if actually BE >> -IF_BE(< rev r3, r3>) >> - >> pop {r4,r5,r6} >> >> C Store bytes, one by one. >> .Lmemxor_leftover: >> + C bring uppermost byte down for saving while preserving lower ones >> +IF_BE(< ror r3, #24>) >> strb r3, [DST], #+1 >> subs N, #1 >> beq .Lmemxor_done >> subs TNC, #8 >> - lsr r3, #8 >> + C bring down next byte, no need to preserve >> +IF_LE(< lsr r3, #8>) >> bne .Lmemxor_leftover >> b .Lmemxor_bytes >> .Lmemxor_odd_done: >> diff --git a/arm/memxor3.asm b/arm/memxor3.asm >> index 69598e1c..76b8aae6 100644 >> --- a/arm/memxor3.asm >> +++ b/arm/memxor3.asm >> @@ -159,21 +159,21 @@ PROLOGUE(nettle_memxor3) >> adds N, #8 >> beq .Lmemxor3_done >> >> - C Leftover bytes in r4, low end >> + C Leftover bytes in r4, (since working downwards) in high end on >> LE and >> + C low end on BE >> ldr r5, [AP, #-4] >> eor r4, r5, r4, S1ADJ ATNC >> >> - C leftover does an LSB store >> - C so we need to reverse if actually BE >> -IF_BE(< rev r4, r4>) >> - >> .Lmemxor3_au_leftover: >> C Store a byte at a time >> - ror r4, #24 >> + C bring uppermost byte down for saving while preserving lower ones >> +IF_LE(< ror r4, #24>) >> strb r4, [DST, #-1]! >> subs N, #1 >> beq .Lmemxor3_done >> subs ACNT, #8 >> + C bring down next byte, no need to preserve >> +IF_BE(< lsr r4, #8>) >> sub AP, #1 >> bne .Lmemxor3_au_leftover >> b .Lmemxor3_bytes >> @@ -273,18 +273,19 @@ IF_BE(< rev r4, r4>) >> adds N, #8 >> beq .Lmemxor3_done >> >> - C leftover does an LSB store >> - C so we need to reverse if actually BE >> -IF_BE(< rev r4, r4>) >> - >> - C Leftover bytes in a4, low end >> - ror r4, ACNT >> + C Leftover bytes in r4, (since working downwards) in high end on >> LE and >> + C low end on BE after preparatory alignment correction >> +IF_LE(< ror r4, ACNT>) >> +IF_BE(< ror r4, ATNC>) >> .Lmemxor3_uu_leftover: >> - ror r4, #24 >> + C bring uppermost byte down for saving while preserving lower ones >> +IF_LE(< ror r4, #24>) >> strb r4, [DST, #-1]! >> subs N, #1 >> beq .Lmemxor3_done >> subs ACNT, #8 >> + C bring down next byte, no need to preserve >> +IF_BE(< lsr r4, #8>) >> bne .Lmemxor3_uu_leftover >> b .Lmemxor3_bytes >> >> -- >> 2.25.0 >> >> _______________________________________________ >> nettle-bugs mailing list >> [email protected] >> http://lists.lysator.liu.se/mailman/listinfo/nettle-bugs >> > _______________________________________________ nettle-bugs mailing list [email protected] http://lists.lysator.liu.se/mailman/listinfo/nettle-bugs
