mirror of
https://github.com/open-quantum-safe/liboqs.git
synced 2025-10-04 00:02:01 -04:00
S390x support (#1103)
* s390x support * - Fix for FrodoKEM-SHAKE for big endian support - Fix unused variable in Keccak code on big endian
This commit is contained in:
parent
59c19872eb
commit
016404076d
@ -22,8 +22,15 @@ if(CMAKE_C_COMPILER_ID MATCHES "Clang|GNU")
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(OQS_OPT_TARGET STREQUAL "generic")
|
if(OQS_OPT_TARGET STREQUAL "generic")
|
||||||
# Assume sensible default like -march=x86-64, -march=armv8-a, etc.
|
if(ARCH_S390X)
|
||||||
set(OQS_OPT_FLAG "")
|
# At least z9-109 is needed for 'stckf' in benchmarking code.
|
||||||
|
# gcc's default is z900 (older than z9-109), clang's default and minimum is z10.
|
||||||
|
# setting to z10 as sensible default.
|
||||||
|
set(OQS_OPT_FLAG "-march=z10")
|
||||||
|
else()
|
||||||
|
# Assume sensible default like -march=x86-64, -march=armv8-a, etc.
|
||||||
|
set(OQS_OPT_FLAG "")
|
||||||
|
endif()
|
||||||
elseif(OQS_OPT_TARGET STREQUAL "auto")
|
elseif(OQS_OPT_TARGET STREQUAL "auto")
|
||||||
if(ARCH_X86_64)
|
if(ARCH_X86_64)
|
||||||
set(OQS_OPT_FLAG "-march=native")
|
set(OQS_OPT_FLAG "-march=native")
|
||||||
@ -31,6 +38,8 @@ if(CMAKE_C_COMPILER_ID MATCHES "Clang|GNU")
|
|||||||
set(OQS_OPT_FLAG "-mcpu=native")
|
set(OQS_OPT_FLAG "-mcpu=native")
|
||||||
elseif(ARCH_ARM64v8 AND CMAKE_SYSTEM_NAME STREQUAL "Darwin")
|
elseif(ARCH_ARM64v8 AND CMAKE_SYSTEM_NAME STREQUAL "Darwin")
|
||||||
set(OQS_OPT_FLAG "-mcpu=native")
|
set(OQS_OPT_FLAG "-mcpu=native")
|
||||||
|
elseif(ARCH_S390X)
|
||||||
|
set(OQS_OPT_FLAG "-march=native")
|
||||||
else()
|
else()
|
||||||
message(WARNING "Setting OQS_OPT_TARGET=AUTO may not produce optimized code on this system.")
|
message(WARNING "Setting OQS_OPT_TARGET=AUTO may not produce optimized code on this system.")
|
||||||
endif()
|
endif()
|
||||||
@ -39,6 +48,8 @@ if(CMAKE_C_COMPILER_ID MATCHES "Clang|GNU")
|
|||||||
set(OQS_OPT_FLAG "-march=${OQS_OPT_TARGET}")
|
set(OQS_OPT_FLAG "-march=${OQS_OPT_TARGET}")
|
||||||
elseif(ARCH_ARM64v8 OR ARCH_ARM32v7)
|
elseif(ARCH_ARM64v8 OR ARCH_ARM32v7)
|
||||||
set(OQS_OPT_FLAG "-mcpu=${OQS_OPT_TARGET}")
|
set(OQS_OPT_FLAG "-mcpu=${OQS_OPT_TARGET}")
|
||||||
|
elseif(ARCH_S390X)
|
||||||
|
set(OQS_OPT_FLAG "-march=${OQS_OPT_TARGET}")
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
@ -11,3 +11,11 @@ jobs:
|
|||||||
script:
|
script:
|
||||||
- mkdir build && cd build && cmake -GNinja .. && cmake -LA .. && ninja
|
- mkdir build && cd build && cmake -GNinja .. && cmake -LA .. && ninja
|
||||||
- cd build & ninja run_tests
|
- cd build & ninja run_tests
|
||||||
|
- arch: s390x
|
||||||
|
os: linux
|
||||||
|
dist: focal
|
||||||
|
compiler: gcc
|
||||||
|
if: NOT branch =~ /^ghactionsonly-/
|
||||||
|
script:
|
||||||
|
- mkdir build && cd build && cmake -DOQS_ENABLE_KEM_BIKE=OFF -GNinja .. && cmake -LA .. && ninja
|
||||||
|
- cd build & ninja run_tests
|
||||||
|
@ -59,6 +59,12 @@ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "ppc64le")
|
|||||||
if(${OQS_DIST_BUILD})
|
if(${OQS_DIST_BUILD})
|
||||||
set(OQS_DIST_PPC64LE_BUILD ON)
|
set(OQS_DIST_PPC64LE_BUILD ON)
|
||||||
endif()
|
endif()
|
||||||
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "s390x")
|
||||||
|
set(ARCH "s390x")
|
||||||
|
set(ARCH_S390X ON)
|
||||||
|
if(${OQS_DIST_BUILD})
|
||||||
|
set(OQS_DIST_S390X_BUILD ON)
|
||||||
|
endif()
|
||||||
elseif(OQS_PERMIT_UNSUPPORTED_ARCHITECTURE)
|
elseif(OQS_PERMIT_UNSUPPORTED_ARCHITECTURE)
|
||||||
message(WARNING "Unknown or unsupported processor: " ${CMAKE_SYSTEM_PROCESSOR})
|
message(WARNING "Unknown or unsupported processor: " ${CMAKE_SYSTEM_PROCESSOR})
|
||||||
message(WARNING "Compilation on an unsupported processor should only be used for testing, as it may result an insecure configuration, for example due to variable-time instructions leaking secret information.")
|
message(WARNING "Compilation on an unsupported processor should only be used for testing, as it may result an insecure configuration, for example due to variable-time instructions leaking secret information.")
|
||||||
|
@ -135,6 +135,11 @@ static void set_available_cpu_extensions(void) {
|
|||||||
/* mark that this function has been called */
|
/* mark that this function has been called */
|
||||||
cpu_ext_data[OQS_CPU_EXT_INIT] = 1;
|
cpu_ext_data[OQS_CPU_EXT_INIT] = 1;
|
||||||
}
|
}
|
||||||
|
#elif defined(OQS_DIST_S390X_BUILD)
|
||||||
|
static void set_available_cpu_extensions(void) {
|
||||||
|
/* mark that this function has been called */
|
||||||
|
cpu_ext_data[OQS_CPU_EXT_INIT] = 1;
|
||||||
|
}
|
||||||
#elif defined(OQS_DIST_BUILD)
|
#elif defined(OQS_DIST_BUILD)
|
||||||
static void set_available_cpu_extensions(void) {
|
static void set_available_cpu_extensions(void) {
|
||||||
}
|
}
|
||||||
|
@ -435,10 +435,11 @@ void KeccakP1600_ExtractAndAddBytesInLane(const void *state, unsigned int lanePo
|
|||||||
|
|
||||||
void KeccakP1600_ExtractAndAddLanes(const void *state, const unsigned char *input, unsigned char *output, unsigned int laneCount) {
|
void KeccakP1600_ExtractAndAddLanes(const void *state, const unsigned char *input, unsigned char *output, unsigned int laneCount) {
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
uint64_t lane;
|
|
||||||
#if (PLATFORM_BYTE_ORDER != IS_LITTLE_ENDIAN)
|
#if (PLATFORM_BYTE_ORDER != IS_LITTLE_ENDIAN)
|
||||||
unsigned char temp[8];
|
unsigned char temp[8];
|
||||||
unsigned int j;
|
unsigned int j;
|
||||||
|
#else
|
||||||
|
uint64_t lane;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (i = 0; i < laneCount; i++) {
|
for (i = 0; i < laneCount; i++) {
|
||||||
|
@ -39,7 +39,7 @@ int frodo_mul_add_sa_plus_e_shake_portable(uint16_t *out, const uint16_t *s, con
|
|||||||
for (j = 0; j < 4; j++) {
|
for (j = 0; j < 4; j++) {
|
||||||
uint16_t sp = s[i*PARAMS_N + kk + j];
|
uint16_t sp = s[i*PARAMS_N + kk + j];
|
||||||
for (int k = 0; k < PARAMS_N; k++) { // Matrix-vector multiplication
|
for (int k = 0; k < PARAMS_N; k++) { // Matrix-vector multiplication
|
||||||
sum[k] += (uint16_t) ((uint32_t) sp * (uint32_t) a_cols[(t+j)*PARAMS_N + k]);
|
sum[k] += (uint16_t) ((uint32_t) sp * (uint32_t) UINT16_TO_LE(a_cols[(t+j)*PARAMS_N + k]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (int k = 0; k < PARAMS_N; k++){
|
for (int k = 0; k < PARAMS_N; k++){
|
||||||
|
@ -128,6 +128,8 @@ if(OQS_ENABLE_KEM_sike_p434 OR
|
|||||||
endif()
|
endif()
|
||||||
elseif(ARCH_PPC64LE)
|
elseif(ARCH_PPC64LE)
|
||||||
target_compile_definitions(sike PRIVATE _GENERIC_ _PPC64LE_)
|
target_compile_definitions(sike PRIVATE _GENERIC_ _PPC64LE_)
|
||||||
|
elseif(ARCH_S390X)
|
||||||
|
target_compile_definitions(sike PRIVATE _GENERIC_ _S390X_)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
|
if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
|
||||||
|
@ -135,6 +135,11 @@ static uint64_t _bench_rdtsc(void) {
|
|||||||
__asm__ volatile("mrc p15, 0, %0, c9, c13, 0\t\n"
|
__asm__ volatile("mrc p15, 0, %0, c9, c13, 0\t\n"
|
||||||
: "=r"(value));
|
: "=r"(value));
|
||||||
return value;
|
return value;
|
||||||
|
#elif defined(__s390x__)
|
||||||
|
#define USING_TIME_RATHER_THAN_CYCLES
|
||||||
|
uint64_t tod;
|
||||||
|
__asm__ volatile("stckf %0\n" : "=Q" (tod) : : "cc");
|
||||||
|
return (tod * 1000 / 4096);
|
||||||
#else
|
#else
|
||||||
#define USING_TIME_RATHER_THAN_CYCLES
|
#define USING_TIME_RATHER_THAN_CYCLES
|
||||||
struct timespec time;
|
struct timespec time;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user