libsodium: Add patch to enable 1.0.21 to build on aarch64
Commit Message
- The update to 1.0.21 resulted in libsodium not building on aarch64. A fix has b
been developed and will ultimately be available with the next release. This uses that
patch fix to be applied to 1.0.21
- Build tested on aarch64 and was successfull.
Signed-off-by: Adolf Belka <adolf.belka@ipfire.org>
---
lfs/libsodium | 1 +
..._fix_compilation_with_GCC_on_aarch64.patch | 33 +++++++++++++++++++
2 files changed, 34 insertions(+)
create mode 100644 src/patches/libsodium-1.0.21_fix_compilation_with_GCC_on_aarch64.patch
@@ -73,6 +73,7 @@ $(subst %,%_BLAKE2,$(objects)) :
$(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
@$(PREBUILD)
@rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar axf $(DIR_DL)/$(DL_FILE)
+ cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/libsodium-1.0.21_fix_compilation_with_GCC_on_aarch64.patch
cd $(DIR_APP) && ./configure \
--prefix=/usr \
--disable-static
new file mode 100644
@@ -0,0 +1,33 @@
+diff --git a/src/libsodium/crypto_ipcrypt/ipcrypt_armcrypto.c b/src/libsodium/crypto_ipcrypt/ipcrypt_armcrypto.c
+index c5a27e92ec..bad4ce3898 100644
+--- a/src/libsodium/crypto_ipcrypt/ipcrypt_armcrypto.c
++++ b/src/libsodium/crypto_ipcrypt/ipcrypt_armcrypto.c
+@@ -37,7 +37,7 @@ typedef uint64x2_t BlockVec;
+ # define XOR128_3(a, b, c) veorq_u64(veorq_u64((a), (b)), (c))
+ # define SET64x2(a, b) vsetq_lane_u64((uint64_t) (a), vmovq_n_u64((uint64_t) (b)), 1)
+ # define BYTESHL128(a, b) \
+- vreinterpretq_u64_u8(vextq_s8(vdupq_n_s8(0), vreinterpretq_s8_u64(a), 16 - (b)))
++ vreinterpretq_u64_u8(vextq_u8(vdupq_n_u8(0), vreinterpretq_u8_u64(a), 16 - (b)))
+
+ # define AES_XENCRYPT(block_vec, rkey) \
+ vreinterpretq_u64_u8( \
+@@ -348,12 +348,12 @@ pfx_set_bit(uint8_t ip16[16], const unsigned int bit_index, const uint8_t bit_va
+ static void
+ pfx_shift_left(uint8_t ip16[16])
+ {
+- BlockVec v = LOAD128(ip16);
+- const BlockVec shl = vshlq_n_u8(vreinterpretq_u8_u64(v), 1);
+- const BlockVec msb = vshrq_n_u8(vreinterpretq_u8_u64(v), 7);
+- const BlockVec zero = vdupq_n_u8(0);
+- const BlockVec carries = vextq_u8(vreinterpretq_u8_u64(msb), zero, 1);
+- v = vreinterpretq_u64_u8(vorrq_u8(shl, carries));
++ BlockVec v = LOAD128(ip16);
++ const uint8x16_t shl = vshlq_n_u8(vreinterpretq_u8_u64(v), 1);
++ const uint8x16_t msb = vshrq_n_u8(vreinterpretq_u8_u64(v), 7);
++ const uint8x16_t zero = vdupq_n_u8(0);
++ const uint8x16_t carries = vextq_u8(msb, zero, 1);
++ v = vreinterpretq_u64_u8(vorrq_u8(shl, carries));
+ STORE128(ip16, v);
+ }
+
+