git: 96e53c0c65fa - main - archivers/libunrar: Support crc and crypto flags on aarch64

From: Jason E. Hale <jhale_at_FreeBSD.org>
Date: Wed, 19 Feb 2025 08:37:36 UTC
The branch main has been updated by jhale:

URL: https://cgit.FreeBSD.org/ports/commit/?id=96e53c0c65faa691e18c0a5558d8f445e6010a70

commit 96e53c0c65faa691e18c0a5558d8f445e6010a70
Author:     Jason E. Hale <jhale@FreeBSD.org>
AuthorDate: 2025-02-19 07:09:07 +0000
Commit:     Jason E. Hale <jhale@FreeBSD.org>
CommitDate: 2025-02-19 08:36:56 +0000

    archivers/libunrar: Support crc and crypto flags on aarch64
    
    If CPU flags crc or crytpo are set, e.g. -march=armv8-a+crc+crypto, build
    would fail with missing headers because this was only implemented for
    glibc and Apple.
---
 archivers/libunrar/files/patch-crc.cpp      | 22 ++++++++++++++++
 archivers/libunrar/files/patch-os.hpp       | 25 ++++++++++++++----
 archivers/libunrar/files/patch-rijndael.cpp | 40 ++++++++++++++++++++++-------
 3 files changed, 73 insertions(+), 14 deletions(-)

diff --git a/archivers/libunrar/files/patch-crc.cpp b/archivers/libunrar/files/patch-crc.cpp
new file mode 100644
index 000000000000..131c7dc158fb
--- /dev/null
+++ b/archivers/libunrar/files/patch-crc.cpp
@@ -0,0 +1,22 @@
+--- crc.cpp.orig	2025-02-12 14:05:26 UTC
++++ crc.cpp
+@@ -42,12 +42,18 @@ void InitCRC32(uint *CRCTab)
+   }
+ 
+ #ifdef USE_NEON_CRC32
+-  #ifdef _APPLE
++  #if defined(_APPLE)
+     // getauxval isn't available in OS X
+     uint Value=0;
+     size_t Size=sizeof(Value);
+     int RetCode=sysctlbyname("hw.optional.armv8_crc32",&Value,&Size,NULL,0);
+     CRC_Neon=RetCode==0 && Value!=0;
++  #elif defined(__FreeBSD__)
++    // getauxval isn't available on FreeBSD
++    uint64 Reg=READ_SPECIALREG(id_aa64isar0_el1);
++    if (ID_AA64ISAR0_CRC32_VAL(Reg) == ID_AA64ISAR0_CRC32_BASE) {
++      CRC_Neon=true;
++    }
+   #else
+     CRC_Neon=(getauxval(AT_HWCAP) & HWCAP_CRC32)!=0;
+   #endif
diff --git a/archivers/libunrar/files/patch-os.hpp b/archivers/libunrar/files/patch-os.hpp
index 900ac20f3c86..f3936d120c1b 100644
--- a/archivers/libunrar/files/patch-os.hpp
+++ b/archivers/libunrar/files/patch-os.hpp
@@ -1,13 +1,28 @@
---- os.hpp.orig	2024-05-12 10:19:01 UTC
+--- os.hpp.orig	2025-02-12 14:05:27 UTC
 +++ os.hpp
-@@ -166,6 +166,10 @@
+@@ -158,10 +158,13 @@
+ 
+ #if defined(__aarch64__) && (defined(__ARM_FEATURE_CRYPTO) || defined(__ARM_FEATURE_CRC32))
+ #include <arm_neon.h>
+-#ifndef _APPLE
++#if !defined(_APPLE) && !defined(__FreeBSD__)
+ #include <sys/auxv.h>
+ #include <asm/hwcap.h>
  #endif
++#ifdef __FreeBSD__
++#include <machine/armreg.h>
++#endif
+ #ifdef __ARM_FEATURE_CRYPTO
+ #define USE_NEON_AES
  #endif
- 
+@@ -169,6 +172,10 @@
+ #define USE_NEON_CRC32
+ #endif
+ #endif
++
 +#if defined(OPENSSL_AES)
 +#include <openssl/evp.h>
 +#endif // OPENSSL_AES
-+
+ 
  #ifdef  S_IFLNK
  #define SAVE_LINKS
- #endif
diff --git a/archivers/libunrar/files/patch-rijndael.cpp b/archivers/libunrar/files/patch-rijndael.cpp
index 87a02086af3c..ab554519c3b9 100644
--- a/archivers/libunrar/files/patch-rijndael.cpp
+++ b/archivers/libunrar/files/patch-rijndael.cpp
@@ -1,4 +1,4 @@
---- rijndael.cpp.orig	2024-05-12 10:19:02 UTC
+--- rijndael.cpp.orig	2025-02-12 14:05:27 UTC
 +++ rijndael.cpp
 @@ -3,6 +3,7 @@
   **************************************************************************/
@@ -67,7 +67,29 @@
    // Check SIMD here instead of constructor, so if object is a part of some
    // structure memset'ed before use, these variables are not lost.
  #if defined(USE_SSE)
-@@ -166,6 +197,7 @@ void Rijndael::Init(bool Encrypt,const byte *key,uint 
+@@ -116,7 +147,7 @@ void Rijndael::Init(bool Encrypt,const byte *key,uint 
+ #endif
+ 
+ #elif defined(USE_NEON_AES)
+-  #ifdef _APPLE
++  #if defined(_APPLE)
+     // getauxval isn't available in OS X
+     uint Value=0;
+     size_t Size=sizeof(Value);
+@@ -126,6 +157,12 @@ void Rijndael::Init(bool Encrypt,const byte *key,uint 
+     // because "hw.optional.arm.FEAT_AES" was missing in OS X 11, but AES
+     // still was supported by Neon.
+     AES_Neon=RetCode!=0 || Value!=0;
++  #elif defined(__FreeBSD__)
++    // getauxval isn't available on FreeBSD
++    uint64 Reg=READ_SPECIALREG(id_aa64isar0_el1);
++    if (ID_AA64ISAR0_AES_VAL(Reg) == ID_AA64ISAR0_AES_BASE) {
++      AES_Neon=true;
++    }
+   #else
+     AES_Neon=(getauxval(AT_HWCAP) & HWCAP_AES)!=0;
+   #endif
+@@ -166,6 +203,7 @@ void Rijndael::Init(bool Encrypt,const byte *key,uint 
  
    if(!Encrypt)
      keyEncToDec();
@@ -75,7 +97,7 @@
  }
  
  
-@@ -174,6 +206,15 @@ void Rijndael::blockEncrypt(const byte *input,size_t i
+@@ -174,6 +212,15 @@ void Rijndael::blockEncrypt(const byte *input,size_t i
    if (inputLen <= 0)
      return;
  
@@ -91,7 +113,7 @@
    size_t numBlocks = inputLen/16;
  #if defined(USE_SSE)
    if (AES_NI)
-@@ -238,9 +279,11 @@ void Rijndael::blockEncrypt(const byte *input,size_t i
+@@ -238,9 +285,11 @@ void Rijndael::blockEncrypt(const byte *input,size_t i
      input += 16;
    }
    Copy128(m_initVector,prevBlock);
@@ -103,7 +125,7 @@
  #ifdef USE_SSE
  void Rijndael::blockEncryptSSE(const byte *input,size_t numBlocks,byte *outBuffer)
  {
-@@ -306,6 +349,7 @@ void Rijndael::blockEncryptNeon(const byte *input,size
+@@ -306,6 +355,7 @@ void Rijndael::blockEncryptNeon(const byte *input,size
    return;
  }
  #endif
@@ -111,7 +133,7 @@
  
    
  void Rijndael::blockDecrypt(const byte *input, size_t inputLen, byte *outBuffer)
-@@ -313,6 +357,15 @@ void Rijndael::blockDecrypt(const byte *input, size_t 
+@@ -313,6 +363,15 @@ void Rijndael::blockDecrypt(const byte *input, size_t 
    if (inputLen <= 0)
      return;
  
@@ -127,7 +149,7 @@
    size_t numBlocks=inputLen/16;
  #if defined(USE_SSE)
    if (AES_NI)
-@@ -381,9 +434,11 @@ void Rijndael::blockDecrypt(const byte *input, size_t 
+@@ -381,9 +440,11 @@ void Rijndael::blockDecrypt(const byte *input, size_t 
    }
  
    memcpy(m_initVector,iv,16);
@@ -139,7 +161,7 @@
  #ifdef USE_SSE
  void Rijndael::blockDecryptSSE(const byte *input, size_t numBlocks, byte *outBuffer)
  {
-@@ -450,8 +505,10 @@ void Rijndael::blockDecryptNeon(const byte *input, siz
+@@ -450,8 +511,10 @@ void Rijndael::blockDecryptNeon(const byte *input, siz
    memcpy(m_initVector,iv,16);
  }
  #endif
@@ -150,7 +172,7 @@
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  // ALGORITHM
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-@@ -580,6 +637,7 @@ void Rijndael::GenerateTables()
+@@ -580,6 +643,7 @@ void Rijndael::GenerateTables()
      U1[b][0]=U2[b][1]=U3[b][2]=U4[b][3]=T5[I][0]=T6[I][1]=T7[I][2]=T8[I][3]=gmul(b,0xe);
    }
  }