File openucx-s390x-support.patch of Package openucx

commit ba1d7048df80ee535e01335992f70568e2f88c80
Author: Nicolas Morey <nmorey@suse.com>
Date:   Wed Feb 19 16:46:33 2025 +0100

    openucx s390x support
    
    Signed-off-by: Nicolas Morey-Chaisemartin <nmoreychaisemartin@suse.com>

diff --git config/m4/ucm.m4 config/m4/ucm.m4
index e5e66266d695..ef7e4ede93ce 100644
--- config/m4/ucm.m4
+++ config/m4/ucm.m4
@@ -80,9 +80,20 @@ AC_CHECK_DECLS([SYS_ipc],
                [ipc_hooks_happy=no],
                [#include <sys/syscall.h>])
 
+
+SAVE_CFLAGS=$CFLAGS
+CFLAGS="$CLAGS -Isrc/"
+bistro_arch_happy=yes
+AC_CHECK_DECLS([ucm_bistro_patch],
+               [],
+               [bistro_arch_happy=no],
+               [#include <ucm/bistro/bistro.h>])
+CFLAGS=$SAVE_CFLAGS
+
 AS_IF([test "x$mmap_hooks_happy" = "xyes"],
       AS_IF([test "x$ipc_hooks_happy" = "xyes" -o "x$shm_hooks_happy" = "xyes"],
-            [bistro_hooks_happy=yes]))
+	       AS_IF([test "x$bistro_arch_happy" == "xyes"],
+                [bistro_hooks_happy=yes])))
 
 AS_IF([test "x$bistro_hooks_happy" = "xyes"],
       [AC_DEFINE([UCM_BISTRO_HOOKS], [1], [Enable BISTRO hooks])],
diff --git src/ucm/Makefile.am src/ucm/Makefile.am
index 7866aa0ac13b..2d44e20f124d 100644
--- src/ucm/Makefile.am
+++ src/ucm/Makefile.am
@@ -35,6 +35,7 @@ noinst_HEADERS = \
 	bistro/bistro_aarch64.h \
 	bistro/bistro_ppc64.h \
 	bistro/bistro_rv64.h
+	bistro/bistro_s390x.h
 
 libucm_la_SOURCES = \
 	event/event.c \
diff --git src/ucm/bistro/bistro.h src/ucm/bistro/bistro.h
index fffbe738b116..31859a84b159 100644
--- src/ucm/bistro/bistro.h
+++ src/ucm/bistro/bistro.h
@@ -23,6 +23,8 @@ typedef struct ucm_bistro_restore_point ucm_bistro_restore_point_t;
 #  include "bistro_x86_64.h"
 #elif defined(__riscv)
 #  include "bistro_rv64.h"
+#elif defined(__s390x__)
+#  include "bistro_s390x.h"
 #else
 #  error "Unsupported architecture"
 #endif
diff --git src/ucm/bistro/bistro_s390x.h src/ucm/bistro/bistro_s390x.h
new file mode 100644
index 000000000000..2beb5de54fab
--- /dev/null
+++ src/ucm/bistro/bistro_s390x.h
@@ -0,0 +1,27 @@
+#ifndef UCM_BISTRO_BISTRO_S390X_H_
+#define UCM_BISTRO_BISTRO_S390X_H_
+
+#include <stdint.h>
+
+#include <ucs/type/status.h>
+#include <ucs/sys/compiler_def.h>
+
+#define UCM_BISTRO_PROLOGUE
+#define UCM_BISTRO_EPILOGUE
+
+typedef struct ucm_bistro_patch {
+} UCS_S_PACKED ucm_bistro_patch_t;
+typedef struct {
+} UCS_S_PACKED ucm_bistro_lock_t;
+
+static inline ucs_status_t ucm_bistro_patch(void *func_ptr, void *hook, const char *symbol,
+					    void **orig_func_p,
+					    ucm_bistro_restore_point_t **rp){
+	return UCS_ERR_UNSUPPORTED;
+}
+
+static inline void ucm_bistro_patch_lock(void * UCS_V_UNUSED dst)
+{
+}
+
+#endif
diff --git src/ucs/Makefile.am src/ucs/Makefile.am
index 86a469a60bcc..6751bad764b8 100644
--- src/ucs/Makefile.am
+++ src/ucs/Makefile.am
@@ -24,6 +24,7 @@ nobase_dist_libucs_la_HEADERS = \
 	arch/aarch64/bitops.h \
 	arch/ppc64/bitops.h \
 	arch/rv64/bitops.h \
+	arch/s390x/bitops.h \
 	arch/x86_64/bitops.h \
 	arch/bitops.h \
 	algorithm/crc.h \
@@ -87,6 +88,7 @@ nobase_dist_libucs_la_HEADERS = \
 	arch/generic/atomic.h \
 	arch/ppc64/global_opts.h \
 	arch/rv64/global_opts.h \
+	arch/s390x/global_opts.h \
 	arch/global_opts.h
 
 noinst_HEADERS = \
@@ -94,6 +96,7 @@ noinst_HEADERS = \
 	arch/generic/cpu.h \
 	arch/ppc64/cpu.h \
 	arch/rv64/cpu.h \
+	arch/s390x/cpu.h \
 	arch/x86_64/cpu.h \
 	arch/cpu.h \
 	config/ucm_opts.h \
@@ -149,6 +152,7 @@ libucs_la_SOURCES = \
 	algorithm/string_distance.c \
 	arch/aarch64/cpu.c \
 	arch/aarch64/global_opts.c \
+	arch/s390x/global_opts.c \
 	arch/ppc64/timebase.c \
 	arch/ppc64/global_opts.c \
 	arch/rv64/cpu.c \
diff --git src/ucs/arch/atomic.h src/ucs/arch/atomic.h
index 849647902fab..a328c37e2020 100644
--- src/ucs/arch/atomic.h
+++ src/ucs/arch/atomic.h
@@ -18,6 +18,8 @@
 #  include "generic/atomic.h"
 #elif defined(__riscv)
 #  include "generic/atomic.h"
+#elif defined(__s390x__)
+#  include "generic/atomic.h"
 #else
 #  error "Unsupported architecture"
 #endif
diff --git src/ucs/arch/bitops.h src/ucs/arch/bitops.h
index f8e51c45888a..476631d95eb6 100644
--- src/ucs/arch/bitops.h
+++ src/ucs/arch/bitops.h
@@ -23,6 +23,8 @@ BEGIN_C_DECLS
 #  include "aarch64/bitops.h"
 #elif defined(__riscv)
 #  include "rv64/bitops.h"
+#elif defined(__s390x__)
+#  include "s390x/bitops.h"
 #else
 #  error "Unsupported architecture"
 #endif
diff --git src/ucs/arch/cpu.c src/ucs/arch/cpu.c
index 6fe5e31dba31..f92c53f303cd 100644
--- src/ucs/arch/cpu.c
+++ src/ucs/arch/cpu.c
@@ -64,6 +64,10 @@ const ucs_cpu_builtin_memcpy_t ucs_cpu_builtin_memcpy[UCS_CPU_VENDOR_LAST] = {
         .min = UCS_MEMUNITS_INF,
         .max = UCS_MEMUNITS_INF
     },
+    [UCS_CPU_VENDOR_GENERIC_IBM] = {
+        .min = UCS_MEMUNITS_INF,
+        .max = UCS_MEMUNITS_INF
+    },
     [UCS_CPU_VENDOR_FUJITSU_ARM] = {
         .min = UCS_MEMUNITS_INF,
         .max = UCS_MEMUNITS_INF
@@ -82,7 +86,6 @@ const ucs_cpu_builtin_memcpy_t ucs_cpu_builtin_memcpy[UCS_CPU_VENDOR_LAST] = {
     }
 };
 
-
 static void ucs_sysfs_get_cache_size()
 {
     char type_str[32];  /* Data/Instruction/Unified */
@@ -167,6 +170,7 @@ const char *ucs_cpu_vendor_name()
         [UCS_CPU_VENDOR_GENERIC_ARM]   = "Generic ARM",
         [UCS_CPU_VENDOR_GENERIC_PPC]   = "Generic PPC",
         [UCS_CPU_VENDOR_GENERIC_RV64G] = "Generic RV64G",
+	[UCS_CPU_VENDOR_GENERIC_IBM]   = "Generic IBM",
         [UCS_CPU_VENDOR_FUJITSU_ARM]   = "Fujitsu ARM",
         [UCS_CPU_VENDOR_ZHAOXIN]       = "Zhaoxin",
         [UCS_CPU_VENDOR_NVIDIA]        = "Nvidia"
@@ -197,6 +201,7 @@ const char *ucs_cpu_model_name()
         [UCS_CPU_MODEL_ZHAOXIN_WUDAOKOU]   = "Wudaokou",
         [UCS_CPU_MODEL_ZHAOXIN_LUJIAZUI]   = "Lujiazui",
         [UCS_CPU_MODEL_RV64G]              = "RV64G",
+        [UCS_CPU_MODEL_S390X]              = "S390x",
         [UCS_CPU_MODEL_NVIDIA_GRACE]       = "Grace"
     };
 
diff --git src/ucs/arch/cpu.h src/ucs/arch/cpu.h
index 857b8b804cf7..89461d52d406 100644
--- src/ucs/arch/cpu.h
+++ src/ucs/arch/cpu.h
@@ -41,6 +41,7 @@ typedef enum ucs_cpu_model {
     UCS_CPU_MODEL_ZHAOXIN_WUDAOKOU,
     UCS_CPU_MODEL_ZHAOXIN_LUJIAZUI,
     UCS_CPU_MODEL_RV64G,
+    UCS_CPU_MODEL_S390X,
     UCS_CPU_MODEL_NVIDIA_GRACE,
     UCS_CPU_MODEL_LAST
 } ucs_cpu_model_t;
@@ -70,6 +71,7 @@ typedef enum ucs_cpu_vendor {
     UCS_CPU_VENDOR_AMD,
     UCS_CPU_VENDOR_GENERIC_ARM,
     UCS_CPU_VENDOR_GENERIC_PPC,
+    UCS_CPU_VENDOR_GENERIC_IBM,
     UCS_CPU_VENDOR_FUJITSU_ARM,
     UCS_CPU_VENDOR_ZHAOXIN,
     UCS_CPU_VENDOR_GENERIC_RV64G,
@@ -109,6 +111,8 @@ typedef struct ucs_cpu_builtin_memcpy {
 #  include "aarch64/cpu.h"
 #elif defined(__riscv)
 #  include "rv64/cpu.h"
+#elif defined(__s390x__)
+#  include "s390x/cpu.h"
 #else
 #  error "Unsupported architecture"
 #endif
diff --git src/ucs/arch/global_opts.h src/ucs/arch/global_opts.h
index 550d22b8b751..d8e4a7cca694 100644
--- src/ucs/arch/global_opts.h
+++ src/ucs/arch/global_opts.h
@@ -18,6 +18,8 @@
 #  include "aarch64/global_opts.h"
 #elif defined(__riscv)
 #  include "rv64/global_opts.h"
+#elif defined(__s390x__)
+#  include "s390x/global_opts.h"
 #else
 #  error "Unsupported architecture"
 #endif
diff --git src/ucs/arch/s390x/bitops.h src/ucs/arch/s390x/bitops.h
new file mode 100644
index 000000000000..ce48ff1ff451
--- /dev/null
+++ src/ucs/arch/s390x/bitops.h
@@ -0,0 +1,37 @@
+/**
+* Copyright (C) Mellanox Technologies Ltd. 2001-2015.  ALL RIGHTS RESERVED.
+*
+* See file LICENSE for terms.
+*/
+
+#ifndef UCS_S390X_BITOPS_H_
+#define UCS_S390X_BITOPS_H_
+
+#include <stdint.h>
+
+
+static inline unsigned __ucs_ilog2_u32(uint32_t n)
+{
+	if (!n)
+		return 0;
+	return 31 - __builtin_clz(n);
+}
+
+static inline unsigned __ucs_ilog2_u64(uint64_t n)
+{
+	if (!n)
+		return 0;
+	return 63 - __builtin_clz(n);
+}
+
+static UCS_F_ALWAYS_INLINE unsigned ucs_ffs32(uint32_t n)
+{
+    return __ucs_ilog2_u32(n & -n);
+}
+
+static inline unsigned ucs_ffs64(uint64_t n)
+{
+    return __ucs_ilog2_u64(n & -n);
+}
+
+#endif
diff --git src/ucs/arch/s390x/cpu.h src/ucs/arch/s390x/cpu.h
new file mode 100644
index 000000000000..e1d41a0ef8b8
--- /dev/null
+++ src/ucs/arch/s390x/cpu.h
@@ -0,0 +1,86 @@
+/**
+* Copyright (C) Mellanox Technologies Ltd. 2001-2013.  ALL RIGHTS RESERVED.
+* Copyright (C) ARM Ltd. 2016-2017.  ALL RIGHTS RESERVED.
+*
+* See file LICENSE for terms.
+*/
+
+
+#ifndef UCS_S390X_CPU_H_
+#define UCS_S390X_CPU_H_
+
+#include <ucs/sys/compiler.h>
+#include <ucs/arch/generic/cpu.h>
+#include <stdint.h>
+#include <string.h>
+#include <ucs/type/status.h>
+
+
+#define UCS_ARCH_CACHE_LINE_SIZE 256
+
+BEGIN_C_DECLS
+
+/* Assume the worst - weak memory ordering */
+#define ucs_memory_bus_fence()        asm volatile (""::: "memory")
+#define ucs_memory_bus_store_fence()  ucs_memory_bus_fence()
+#define ucs_memory_bus_load_fence()   ucs_memory_bus_fence()
+#define ucs_memory_bus_cacheline_wc_flush()     ucs_memory_bus_fence()
+#define ucs_memory_cpu_fence()        ucs_memory_bus_fence()
+#define ucs_memory_cpu_store_fence()  ucs_memory_bus_fence()
+#define ucs_memory_cpu_load_fence()   ucs_memory_bus_fence()
+#define ucs_memory_cpu_wc_fence()     ucs_memory_bus_fence()
+
+
+static inline uint64_t ucs_arch_read_hres_clock()
+{
+    unsigned long  clk;
+    asm volatile("stck %0" : "=Q" (clk) : : "cc");
+    return clk >> 2;
+}
+#define ucs_arch_get_clocks_per_sec ucs_arch_generic_get_clocks_per_sec
+
+
+static inline ucs_cpu_model_t ucs_arch_get_cpu_model()
+{
+    return UCS_CPU_MODEL_S390X;
+}
+
+static inline ucs_cpu_vendor_t ucs_arch_get_cpu_vendor()
+{
+    return UCS_CPU_VENDOR_GENERIC_IBM;
+}
+
+static inline int ucs_arch_get_cpu_flag()
+{
+    return UCS_CPU_FLAG_UNKNOWN;
+}
+
+double ucs_arch_get_clocks_per_sec();
+
+#define ucs_arch_wait_mem ucs_arch_generic_wait_mem
+
+static inline void ucs_cpu_init()
+{
+}
+
+static inline void *ucs_memcpy_relaxed(void *dst, const void *src, size_t len,
+                                       ucs_arch_memcpy_hint_t hint,
+                                       size_t total_len)
+{
+    return memcpy(dst, src, len);
+}
+
+static UCS_F_ALWAYS_INLINE void
+ucs_memcpy_nontemporal(void *dst, const void *src, size_t len)
+{
+    memcpy(dst, src, len);
+}
+
+static inline ucs_status_t ucs_arch_get_cache_size(size_t *cache_sizes)
+{
+    return UCS_ERR_UNSUPPORTED;
+}
+
+END_C_DECLS
+
+#endif
diff --git src/ucs/arch/s390x/global_opts.c src/ucs/arch/s390x/global_opts.c
new file mode 100644
index 000000000000..4fa0c74034a7
--- /dev/null
+++ src/ucs/arch/s390x/global_opts.c
@@ -0,0 +1,24 @@
+/**
+* Copyright (C) Mellanox Technologies Ltd. 2019.  ALL RIGHTS RESERVED.
+*
+* See file LICENSE for terms.
+*/
+
+#if defined(__s390x__)
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include <ucs/arch/global_opts.h>
+#include <ucs/config/parser.h>
+
+ucs_config_field_t ucs_arch_global_opts_table[] = {
+  {NULL}
+};
+
+void ucs_arch_print_memcpy_limits(ucs_arch_global_opts_t *config)
+{
+}
+
+#endif
diff --git src/ucs/arch/s390x/global_opts.h src/ucs/arch/s390x/global_opts.h
new file mode 100644
index 000000000000..225e4e5e896a
--- /dev/null
+++ src/ucs/arch/s390x/global_opts.h
@@ -0,0 +1,25 @@
+/**
+* Copyright (C) Mellanox Technologies Ltd. 2019.  ALL RIGHTS RESERVED.
+*
+* See file LICENSE for terms.
+*/
+
+
+#ifndef UCS_PPC64_GLOBAL_OPTS_H_
+#define UCS_PPC64_GLOBAL_OPTS_H_
+
+#include <ucs/sys/compiler_def.h>
+
+BEGIN_C_DECLS
+
+#define UCS_ARCH_GLOBAL_OPTS_INITALIZER {}
+
+/* built-in memcpy config */
+typedef struct ucs_arch_global_opts {
+    char dummy;
+} ucs_arch_global_opts_t;
+
+END_C_DECLS
+
+#endif
+
diff --git src/ucs/sys/sys.c src/ucs/sys/sys.c
index d0b5effe11a3..ce22a2097f18 100644
--- src/ucs/sys/sys.c
+++ src/ucs/sys/sys.c
@@ -1258,8 +1258,19 @@ void *ucs_sys_realloc(void *old_ptr, size_t old_length, size_t new_length)
     if (old_ptr == NULL) {
         /* Note: Must pass the 0 offset as "long", otherwise it will be
          * partially undefined when converted to syscall arguments */
+#if defined(__s390x__)
+		long int _args[6] = {
+			(long int) NULL,
+			(long int) new_length,
+			(long int) PROT_READ|PROT_WRITE,
+			(long int) MAP_PRIVATE|MAP_ANONYMOUS,
+			(long int) -1,
+			(long int) 0ul};
+        ptr = (void*)syscall(__NR_mmap, _args);
+#else
         ptr = (void*)syscall(__NR_mmap, NULL, new_length, PROT_READ|PROT_WRITE,
                              MAP_PRIVATE|MAP_ANONYMOUS, -1, 0ul);
+#endif
         if (ptr == MAP_FAILED) {
             ucs_log_fatal_error("mmap(NULL, %zu, READ|WRITE, PRIVATE|ANON) failed: %m",
                                 new_length);
openSUSE Build Service is sponsored by