From df3e7be9ffeecd571a41bdc1ed08c41ed062fffc Mon Sep 17 00:00:00 2001 From: Piotr Kubaj Date: Tue, 6 Dec 2022 03:51:49 +0000 Subject: [PATCH] security/palisade: fix build on powerpc64* and libomp-less architectures --- security/palisade/Makefile | 7 ++---- ...src_core_include_math_bigintnat_ubintnat.h | 22 +++++++++++++++++++ 2 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 security/palisade/files/patch-src_core_include_math_bigintnat_ubintnat.h diff --git a/security/palisade/Makefile b/security/palisade/Makefile index 0d923f077abc..80b7ad07804a 100644 --- a/security/palisade/Makefile +++ b/security/palisade/Makefile @@ -11,11 +11,6 @@ LICENSE= BSD2CLAUSE LICENSE_FILE= ${WRKSRC}/LICENSE BROKEN_i386= fails to build: a declaration of 'Mul128' must be available -BROKEN_powerpc64= fails to build: math/native_int/binint.h:510:11: error: Architecture not supported for MultD() -BROKEN_riscv64= fails to build: math/bigintnat/ubintnat.h:2250:2: error: Architecture not supported for MultD() -.if !exists(/usr/include/omp.h) -BROKEN= requires OpenMP support that is missing on this architecture -.endif BUILD_DEPENDS= autoconf:devel/autoconf # possibly a mistake in the project @@ -43,7 +38,9 @@ BINARY_ALIAS= git=false LDFLAGS+= -pthread # only for tests: see https://gitlab.com/palisade/palisade-release/-/issues/23 OPTIONS_DEFINE= OPENMP HEXL +.if exists(/usr/include/omp.h) OPTIONS_DEFAULT= OPENMP +.endif HEXL_DESC= Use Intel Hexl Library diff --git a/security/palisade/files/patch-src_core_include_math_bigintnat_ubintnat.h b/security/palisade/files/patch-src_core_include_math_bigintnat_ubintnat.h new file mode 100644 index 000000000000..8f02234b7e17 --- /dev/null +++ b/security/palisade/files/patch-src_core_include_math_bigintnat_ubintnat.h @@ -0,0 +1,22 @@ +--- src/core/include/math/bigintnat/ubintnat.h.orig 2022-01-28 23:16:29 UTC ++++ src/core/include/math/bigintnat/ubintnat.h +@@ -2218,12 +2218,17 @@ class NativeIntegerT + res.lo = x.lo * y; + asm("umulh %0, %1, %2\n\t" : "=r"(res.hi) : "r"(x.lo), "r"(y)); + res.hi += x.hi * y; +-#elif defined(__arm__) // 32 bit processor ++#elif defined(__powerpc64__) || defined(__riscv) ++ U128BITS wres(0), wa(a), wb(b); ++ wres = wa * wb; // should give us 128 bits of 64 * 64 ++ res.hi = (uint64_t)(wres >> 64); ++ res.lo = (uint64_t)wres; ++#elif defined(__arm__) || defined(__powerpc__) // 32 bit processor + uint64_t wres(0), wa(a), wb(b); + + wres = wa * wb; // should give us the lower 64 bits of 32*32 + res.hi = wres >> 32; +- res.lo = (uint32_t)wres && 0xFFFFFFFF; ++ res.lo = (uint32_t)wres & 0xFFFFFFFF; + #elif defined(__EMSCRIPTEN__) // web assembly + U64BITS a1 = a >> 32; + U64BITS a2 = (uint32_t)a;