From de9e715ea0d519006b50cc332076f75ca750d78c Mon Sep 17 00:00:00 2001 From: panchenbo Date: Fri, 18 Aug 2023 11:49:21 +0800 Subject: [PATCH] fix changelog version error and add sw_64 support (cherry picked from commit 8f5d326c86b373c08fc03aae9d002b8b31f256d3) --- 3000-add-sw_64-support.patch | 1789 ++++++++++++++++++++++++++++++++++ opengauss-server.spec | 24 +- 2 files changed, 1811 insertions(+), 2 deletions(-) create mode 100644 3000-add-sw_64-support.patch mode change 100755 => 100644 opengauss-server.spec diff --git a/3000-add-sw_64-support.patch b/3000-add-sw_64-support.patch new file mode 100644 index 0000000..c3522c7 --- /dev/null +++ b/3000-add-sw_64-support.patch @@ -0,0 +1,1789 @@ +From 1d1ba5da4366f12a8bc020d5d0432030cd890db2 Mon Sep 17 00:00:00 2001 +From: panchenbo +Date: Sun, 25 Jun 2023 14:48:59 +0800 +Subject: [PATCH] add sw_64 support + +--- + .../cmake/src/build_options.cmake | 2 +- + openGauss-server-2.1.0/config/config.guess | 3 + + openGauss-server-2.1.0/config/config.sub | 2 + + openGauss-server-2.1.0/configure | 10 +- + .../contrib/pgcrypto/crypt-blowfish.cpp | 2 +- + openGauss-server-2.1.0/src/Makefile.global.in | 2 +- + .../src/bin/initdb/Makefile | 3 +- + .../src/bin/initdb/initdb.cpp | 31 ++-- + .../src/bin/pg_probackup/atomics.h | 2 + + .../src/bin/pg_probackup/atomics/arch-sw_64.h | 17 +++ + .../src/common/port/Makefile | 10 ++ + .../src/common/port/exec.cpp | 1 - + .../src/common/port/pg_crc32c_choose.cpp | 1 + + .../src/gausskernel/CMakeLists.txt | 4 +- + .../src/gausskernel/bootstrap/bootstrap.cpp | 4 +- + .../src/gausskernel/cbb/bbox/bbox_atomic.h | 4 + + .../gausskernel/cbb/bbox/bbox_atomic_sw_64.h | 124 ++++++++++++++++ + .../gausskernel/cbb/bbox/bbox_elf_dump.cpp | 6 +- + .../src/gausskernel/cbb/bbox/bbox_elf_dump.h | 94 +++++++++++- + .../gausskernel/cbb/bbox/bbox_syscall_SW_64.h | 136 ++++++++++++++++++ + .../cbb/bbox/bbox_syscall_support.cpp | 89 ++++++++++++ + .../cbb/bbox/bbox_syscall_support.h | 38 ++++- + .../src/gausskernel/process/main/main.cpp | 3 +- + .../process/postmaster/postmaster.cpp | 2 +- + .../runtime/executor/instrument.cpp | 6 + + .../vecexecutor/vectorsonic/vsonichash.cpp | 9 +- + .../access/transam/extreme_rto/page_redo.cpp | 10 +- + .../storage/access/transam/xlog.cpp | 45 +++--- + .../storage/mot/core/Makefile.local | 9 +- + .../mot/core/infra/synchronization/cycles.h | 12 ++ + .../infra/synchronization/mot_atomic_ops.h | 2 +- + .../src/include/access/double_write_basic.h | 2 + + .../include/access/extreme_rto/dispatcher.h | 2 +- + .../include/access/extreme_rto/page_redo.h | 2 +- + .../access/parallel_recovery/page_redo.h | 2 +- + .../communication/commproxy_interface.h | 10 ++ + .../src/include/gtm/gtm_atomic.h | 12 ++ + .../src/include/gtm/gtm_slock.h | 39 +++++ + .../src/include/storage/lock/s_lock.h | 41 +++++- + .../src/include/utils/atomic.h | 3 + + .../src/test/regress/pg_regress.cpp | 4 + + protobuf-3.11.3/cmake/CMakeLists.txt | 3 +- + .../kokoro/release/protoc/linux/build.sh | 2 + + .../protoc-artifacts/build-protoc.sh | 6 + + .../google/protobuf/stubs/platform_macros.h | 3 + + zlib-1.2.11/configure | 14 +- + 46 files changed, 744 insertions(+), 84 deletions(-) + create mode 100644 openGauss-server-2.1.0/src/bin/pg_probackup/atomics/arch-sw_64.h + create mode 100644 openGauss-server-2.1.0/src/gausskernel/cbb/bbox/bbox_atomic_sw_64.h + create mode 100644 openGauss-server-2.1.0/src/gausskernel/cbb/bbox/bbox_syscall_SW_64.h + +diff --git a/openGauss-server-2.1.0/cmake/src/build_options.cmake b/openGauss-server-2.1.0/cmake/src/build_options.cmake +index 0ef180f..bb7e974 100755 +--- a/openGauss-server-2.1.0/cmake/src/build_options.cmake ++++ b/openGauss-server-2.1.0/cmake/src/build_options.cmake +@@ -237,7 +237,7 @@ endif() + + + if(${USE_PROTOBUF}) +- set(LIBS "${LIBS} -lprotobuf -lgrpc++ -lgrpc -lgpr") ++ set(LIBS "${LIBS} -lprotobuf -latomic -lgrpc++ -lgrpc -lgpr") + set(GAUSSDB_CONFIGURE "${GAUSSDB_CONFIGURE} -DUSE_PROTOBUF") + endif() + add_definitions(-Wno-builtin-macro-redefined) +diff --git a/openGauss-server-2.1.0/config/config.guess b/openGauss-server-2.1.0/config/config.guess +index d622a44..0ed97fe 100644 +--- a/openGauss-server-2.1.0/config/config.guess ++++ b/openGauss-server-2.1.0/config/config.guess +@@ -868,6 +868,9 @@ EOF + UNAME_MACHINE=aarch64_be + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; ++ sw_64:Linux:*:*) ++ echo ${UNAME_MACHINE}-unknown-linux-gnu ++ exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; +diff --git a/openGauss-server-2.1.0/config/config.sub b/openGauss-server-2.1.0/config/config.sub +index 02df9f8..4e99ea1 100644 +--- a/openGauss-server-2.1.0/config/config.sub ++++ b/openGauss-server-2.1.0/config/config.sub +@@ -256,6 +256,7 @@ case $basic_machine in + 1750a | 580 \ + | a29k \ + | aarch64 | aarch64_be \ ++ | sw_64 \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ +@@ -368,6 +369,7 @@ case $basic_machine in + 580-* \ + | a29k-* \ + | aarch64-* | aarch64_be-* \ ++ | sw_64-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ +diff --git a/openGauss-server-2.1.0/configure b/openGauss-server-2.1.0/configure +index 8446431..5937920 100755 +--- a/openGauss-server-2.1.0/configure ++++ b/openGauss-server-2.1.0/configure +@@ -4713,7 +4713,7 @@ fi + # but has its own. Also check other compiler-specific flags here. + + if test "$GCC" = yes -a "$ICC" = no; then +- CFLAGS="$CFLAGS -Wall -Wpointer-arith -Wno-write-strings -fnon-call-exceptions -fno-common -freg-struct-return -pipe" ++ CFLAGS="$CFLAGS -Wall -Wpointer-arith -Wno-write-strings -latomic -fnon-call-exceptions -fno-common -freg-struct-return -pipe" + if test "$autodepend" = yes; then + CFLAGS="$CFLAGS -fPIC" + fi +@@ -28510,7 +28510,7 @@ if test x"$USE_SSE42_CRC32C" = x"" && test x"$USE_SSE42_CRC32C_WITH_RUNTIME_CHEC + else + # fall back to slicing-by-8 algorithm which doesn't require any special CPU support. USE_SLICING_BY_8_CRC32C=1 + # but we need runtime check, so need support special CRC instructions for calculating CRC-32C at compile. +- USE_ARM_CRC32C=1 ++ USE_SW_64_CRC32C=1 + fi + fi + fi +@@ -28533,11 +28533,11 @@ $as_echo "#define USE_SSE42_CRC32C_WITH_RUNTIME_CHECK 1" >>confdefs.h + PG_CRC32C_OBJS="pg_crc32c_sse42.o pg_crc32c_sb8.o pg_crc32c_choose.o" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: SSE 4.2 with runtime check" >&5 + $as_echo "SSE 4.2 with runtime check" >&6; } +- elif test x"$USE_ARM_CRC32C" = x"1"; then ++ elif test x"$USE_SW_64_CRC32C" = x"1"; then + + PG_CRC32C_OBJS="pg_crc32c_choose.o" +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: ARM CRC32C" >&5 +-$as_echo "ARM CRC32C" >&6; } ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: SW_64 CRC32C" >&5 ++$as_echo "SW_64 CRC32C" >&6; } + else + + $as_echo "#define USE_SLICING_BY_8_CRC32C 1" >>confdefs.h +diff --git a/openGauss-server-2.1.0/contrib/pgcrypto/crypt-blowfish.cpp b/openGauss-server-2.1.0/contrib/pgcrypto/crypt-blowfish.cpp +index b9f7bfe..1c1e1a9 100644 +--- a/openGauss-server-2.1.0/contrib/pgcrypto/crypt-blowfish.cpp ++++ b/openGauss-server-2.1.0/contrib/pgcrypto/crypt-blowfish.cpp +@@ -40,7 +40,7 @@ + #ifdef __i386__ + #define BF_ASM 0 /* 1 */ + #define BF_SCALE 1 +-#elif defined(__x86_64__) || defined(__alpha__) || defined(__hppa__) ++#elif defined(__x86_64__) || defined(__alpha__) || defined(__hppa__) || defined(__sw_64__) + #define BF_ASM 0 + #define BF_SCALE 1 + #else +diff --git a/openGauss-server-2.1.0/src/Makefile.global.in b/openGauss-server-2.1.0/src/Makefile.global.in +index ab8bea3..ff6687a 100644 +--- a/openGauss-server-2.1.0/src/Makefile.global.in ++++ b/openGauss-server-2.1.0/src/Makefile.global.in +@@ -546,7 +546,7 @@ CJSON_LIB_PATH = $(CJSON_HOME)/lib + # protobuf component + ############################################################################# + PROTOBUF_INCLUDE_PATH = $(PROTOBUF_HOME)/include +-PROTOBUF_LIB_PATH = $(PROTOBUF_HOME)/lib64 ++PROTOBUF_LIB_PATH = $(PROTOBUF_HOME)/lib + + ############################################################################# + # kerberos component +diff --git a/openGauss-server-2.1.0/src/bin/initdb/Makefile b/openGauss-server-2.1.0/src/bin/initdb/Makefile +index 0712306..3c92440 100644 +--- a/openGauss-server-2.1.0/src/bin/initdb/Makefile ++++ b/openGauss-server-2.1.0/src/bin/initdb/Makefile +@@ -30,7 +30,8 @@ ifneq "$(MAKECMDGOALS)" "clean" + endif + endif + endif +-OBJS= initdb.o findtimezone.o localtime.o encnames.o pqsignal.o $(WIN32RES) $(top_builddir)/src/lib/elog/elog.a ++#OBJS= initdb.o findtimezone.o localtime.o encnames.o pqsignal.o $(WIN32RES) $(top_builddir)/src/lib/elog/elog.a ++OBJS= initdb.o findtimezone.o localtime.o encnames.o pqsignal.o $(top_builddir)/src/lib/elog/elog.a + all: gs_initdb + + gs_initdb: $(OBJS) | submake-libpgport +diff --git a/openGauss-server-2.1.0/src/bin/initdb/initdb.cpp b/openGauss-server-2.1.0/src/bin/initdb/initdb.cpp +index 05ae64e..0dfbf57 100644 +--- a/openGauss-server-2.1.0/src/bin/initdb/initdb.cpp ++++ b/openGauss-server-2.1.0/src/bin/initdb/initdb.cpp +@@ -344,15 +344,18 @@ static void InitUndoSubsystemMeta(); + exit_nicely(); /* message already printed by popen_check */ \ + } while (0) + +-#define PG_CMD_CLOSE \ ++#define PG_CMD_CLOSE \ + do { \ + if (pclose_check(cmdfd)) \ + exit_nicely(); /* message already printed by pclose_check */ \ + } while (0) + +-#define PG_CMD_PUTS(line) \ +- do { \ +- if (fputs((line), cmdfd) < 0 || fflush(cmdfd) < 0) \ ++#define PG_CMD_PUTS(line) \ ++ do { \ ++ if (fputs((line), cmdfd) < 0) \ ++ output_failed = true, output_errno = errno; \ ++ } while (0) ++ //if (fputs((line), cmdfd) < 0 || fflush(cmdfd) < 0) \ + output_failed = true, output_errno = errno; \ + } while (0) + +@@ -1060,7 +1063,6 @@ static void test_config_settings(void) + + printf(_("selecting default max_connections ... ")); + (void)fflush(stdout); +- + for (i = 0; i < connslen; i++) { + test_conns = trial_conns[i]; + test_buffs = MIN_BUFS_FOR_CONNS(test_conns); +@@ -1088,11 +1090,10 @@ static void test_config_settings(void) + if (i >= connslen) { + i = connslen - 1; + } +- ++ + n_connections = trial_conns[i]; + + printf("%d\n", n_connections); +- + printf(_("selecting default shared_buffers ... ")); + (void)fflush(stdout); + +@@ -1384,14 +1385,11 @@ static void bootstrap_template1(void) + char* buf_ctype = NULL; + + printf(_("creating template1 database in %s/base/1 ... "), pg_data); +- + (void)fflush(stdout); +- + if (debug) + talkargs = "-d 5"; + + bki_lines = readfile(bki_file); +- + /* Check that bki file appears to be of the right version */ + + nRet = snprintf_s(headerline, sizeof(headerline), sizeof(headerline) - 1, "# PostgreSQL %s\n", PG_MAJORVERSION); +@@ -1406,7 +1404,7 @@ static void bootstrap_template1(void) + PG_VERSION); + exit_nicely(); + } +- ++ + /* Substitute for various symbols used in the BKI file */ + + nRet = sprintf_s(buf, BUF_LENGTH, "%d", NAMEDATALEN); +@@ -1478,18 +1476,17 @@ static void bootstrap_template1(void) + (void)unsetenv("PGCLIENTENCODING"); + + nRet = snprintf_s( +- cmd, sizeof(cmd), sizeof(cmd) - 1, "\"%s\" --boot -x1 %s %s 2>&1", backend_exec, boot_options, talkargs); ++ cmd, sizeof(cmd), sizeof(cmd) - 1, "\"%s\" --boot -x1 %s %s 2>&1", backend_exec, boot_options, talkargs); + securec_check_ss_c(nRet, "\0", "\0"); +- ++ //exit(1);//zmk + PG_CMD_OPEN; +- + for (line = bki_lines; *line != NULL; line++) { +- PG_CMD_PUTS(*line); ++ printf(*line); ++ PG_CMD_PUTS(*line); + FREE_AND_RESET(*line); + } +- + PG_CMD_CLOSE; +- ++ + FREE_AND_RESET(bki_lines); + + check_ok(); +diff --git a/openGauss-server-2.1.0/src/bin/pg_probackup/atomics.h b/openGauss-server-2.1.0/src/bin/pg_probackup/atomics.h +index f28d7d0..89037dd 100644 +--- a/openGauss-server-2.1.0/src/bin/pg_probackup/atomics.h ++++ b/openGauss-server-2.1.0/src/bin/pg_probackup/atomics.h +@@ -67,6 +67,8 @@ + #if defined(__arm__) || defined(__arm) || \ + defined(__aarch64__) || defined(__aarch64) + #include "atomics/arch-arm.h" ++#elif defined(__sw_64__) //modify by yjy ++#include "atomics/arch-sw_64.h" + #elif defined(__i386__) || defined(__i386) || defined(__x86_64__) + #include "atomics/arch-x86.h" + #elif defined(__ia64__) || defined(__ia64) +diff --git a/openGauss-server-2.1.0/src/bin/pg_probackup/atomics/arch-sw_64.h b/openGauss-server-2.1.0/src/bin/pg_probackup/atomics/arch-sw_64.h +new file mode 100644 +index 0000000..060ae4e +--- /dev/null ++++ b/openGauss-server-2.1.0/src/bin/pg_probackup/atomics/arch-sw_64.h +@@ -0,0 +1,17 @@ ++/*------------------------------------------------------------------------- ++ * ++ * arch-sw_64.h ++ * src/include/port/atomics/arch-sw_64.h ++ * ++ *------------------------------------------------------------------------- ++ */ ++ ++#if defined(__GNUC__) ++ ++#define pg_memory_barrier_impl() __asm__ __volatile__ ("memb" : : : "memory") ++#define pg_read_barrier_impl() __asm__ __volatile__ ("memb" : : : "memory") ++#define pg_write_barrier_impl() __asm__ __volatile__ ("memb" : : : "memory") ++#endif ++ ++/* per architecture manual doubleword accesses have single copy atomicity */ ++#define PG_HAVE_8BYTE_SINGLE_COPY_ATOMICITY +diff --git a/openGauss-server-2.1.0/src/common/port/Makefile b/openGauss-server-2.1.0/src/common/port/Makefile +index 51767b7..be606c2 100644 +--- a/openGauss-server-2.1.0/src/common/port/Makefile ++++ b/openGauss-server-2.1.0/src/common/port/Makefile +@@ -60,6 +60,16 @@ OBJS = $(LIBOBJS) pg_crc32c_choose.o chklocale.o dirmod.o erand48.o exec.o fls.o + gs_system.o \ + cipher.o + endif ++#modify bu yjy ++ifeq "${host_cpu}" "sw_64" ++OBJS = $(LIBOBJS) pg_crc32c_sb8.o pg_crc32c_choose.o chklocale.o dirmod.o erand48.o exec.o fls.o inet_net_ntop.o \ ++ noblock.o path.o pgcheckdir.o pgmkdirp.o pgsleep.o \ ++ pgstrcasecmp.o qsort.o qsort_arg.o sprompt.o thread.o flock.o pgstrcasestr.o\ ++ gs_thread.o gs_env_r.o gs_getopt_r.o \ ++ gs_readdir.o gs_strerror.o gs_syscall_lock.o \ ++ gs_system.o \ ++ cipher.o ++endif + # foo_srv.o and foo.o are both built from foo.c, but only foo.o has -DFRONTEND + OBJS_SRV = $(OBJS:%.o=%_srv.o) + +diff --git a/openGauss-server-2.1.0/src/common/port/exec.cpp b/openGauss-server-2.1.0/src/common/port/exec.cpp +index 0ba9bf3..f73a9b4 100644 +--- a/openGauss-server-2.1.0/src/common/port/exec.cpp ++++ b/openGauss-server-2.1.0/src/common/port/exec.cpp +@@ -518,7 +518,6 @@ static char* pipe_read_line(const char* cmd, char* line, int maxsize) + int pclose_check(FILE* stream) + { + int exitstatus = pclose(stream); +- + if (exitstatus == 0) { + return 0; /* all is well */ + } +diff --git a/openGauss-server-2.1.0/src/common/port/pg_crc32c_choose.cpp b/openGauss-server-2.1.0/src/common/port/pg_crc32c_choose.cpp +index 3e62f46..c01d55b 100644 +--- a/openGauss-server-2.1.0/src/common/port/pg_crc32c_choose.cpp ++++ b/openGauss-server-2.1.0/src/common/port/pg_crc32c_choose.cpp +@@ -47,6 +47,7 @@ uint32 pg_crc32c_hardware(uint32 crc, const void* data, Size len) + } + #endif + ++#elif defined(__sw_64__)//modify by yjy + #else + + static bool pg_crc32c_sse42_available(void) +diff --git a/openGauss-server-2.1.0/src/gausskernel/CMakeLists.txt b/openGauss-server-2.1.0/src/gausskernel/CMakeLists.txt +index 16aabb7..bfba84c 100755 +--- a/openGauss-server-2.1.0/src/gausskernel/CMakeLists.txt ++++ b/openGauss-server-2.1.0/src/gausskernel/CMakeLists.txt +@@ -268,9 +268,9 @@ if(${ENABLE_MEMORY_CHECK}) + endif() + + if(NOT "${ENABLE_LITE_MODE}" STREQUAL "ON") +- list(APPEND gaussdb_LINK_LIBS -lz -lminiunz -leSDKOBS -leSDKLogAPI -lpcre -liconv -lnghttp2 -llog4cpp -lcurl -llz4 -lcjson -l${JEMALLOC_LIB_NAME} -lcgroup -lorc -lparquet -larrow -lthrift -lsnappy -lzstd -lprotobuf -lcom_err_gauss -lgssapi_krb5_gauss -lkrb5_gauss -lgssrpc_gauss -lk5crypto_gauss -lkadm5clnt_mit -lkadm5srv_mit -lkdb5 -lkrb5support_gauss -lstdc++ -lboost_thread -lboost_chrono -lboost_system -lboost_atomic -lxml2 -laio -lncurses -ltinfo) ++ list(APPEND gaussdb_LINK_LIBS -lz -lminiunz -leSDKOBS -leSDKLogAPI -lpcre -liconv -lnghttp2 -llog4cpp -lcurl -llz4 -lcjson -l${JEMALLOC_LIB_NAME} -lcgroup -lorc -lparquet -larrow -lthrift -lsnappy -lzstd -lprotobuf -lcom_err_gauss -lgssapi_krb5_gauss -lkrb5_gauss -lgssrpc_gauss -lk5crypto_gauss -lkadm5clnt_mit -lkadm5srv_mit -lkdb5 -lkrb5support_gauss -lstdc++ -lboost_thread -lboost_chrono -lboost_system -lboost_atomic -lxml2 -laio -lncurses -ltinfo -latomic) + else() +- list(APPEND gaussdb_LINK_LIBS -lz -lminiunz -lcurl -llz4 -lcjson -l${JEMALLOC_LIB_NAME} -lcgroup -lzstd -lprotobuf -laio -lncurses -ltinfo) ++ list(APPEND gaussdb_LINK_LIBS -lz -lminiunz -lcurl -llz4 -lcjson -l${JEMALLOC_LIB_NAME} -lcgroup -lzstd -lprotobuf -laio -lncurses -ltinfo -latomic) + endif() + + include_directories( +diff --git a/openGauss-server-2.1.0/src/gausskernel/bootstrap/bootstrap.cpp b/openGauss-server-2.1.0/src/gausskernel/bootstrap/bootstrap.cpp +index 622b6b6..9559872 100755 +--- a/openGauss-server-2.1.0/src/gausskernel/bootstrap/bootstrap.cpp ++++ b/openGauss-server-2.1.0/src/gausskernel/bootstrap/bootstrap.cpp +@@ -341,7 +341,6 @@ void BootStrapProcessMain(int argc, char* argv[]) + * XLOG operations + */ + SetProcessingMode(NormalProcessing); +- + switch (t_thrd.bootstrap_cxt.MyAuxProcType) { + case CheckerProcess: + /* don't set signals, they're useless here */ +@@ -350,7 +349,7 @@ void BootStrapProcessMain(int argc, char* argv[]) + + case BootstrapProcess: + bootstrap_signals(); +- BootStrapXLOG(); ++ //BootStrapXLOG(); + MemoryContextUnSeal(t_thrd.top_mem_cxt); + BootstrapModeMain(); + MemoryContextSeal(t_thrd.top_mem_cxt); +@@ -383,7 +382,6 @@ static void CheckerModeMain(void) + static void BootstrapModeMain(void) + { + int i; +- + Assert(!IsUnderPostmaster); + + SetProcessingMode(BootstrapProcessing); +diff --git a/openGauss-server-2.1.0/src/gausskernel/cbb/bbox/bbox_atomic.h b/openGauss-server-2.1.0/src/gausskernel/cbb/bbox/bbox_atomic.h +index 8a0e5c1..3f376ff 100644 +--- a/openGauss-server-2.1.0/src/gausskernel/cbb/bbox/bbox_atomic.h ++++ b/openGauss-server-2.1.0/src/gausskernel/cbb/bbox/bbox_atomic.h +@@ -38,6 +38,10 @@ + + #elif defined(__aarch64__) + #include "bbox_atomic_arm64.h" ++/* modify by yjy */ ++#elif defined(__sw_64__) ++#include "bbox_atomic_sw_64.h" ++/* end */ + #endif + + #endif +diff --git a/openGauss-server-2.1.0/src/gausskernel/cbb/bbox/bbox_atomic_sw_64.h b/openGauss-server-2.1.0/src/gausskernel/cbb/bbox/bbox_atomic_sw_64.h +new file mode 100644 +index 0000000..0948fcc +--- /dev/null ++++ b/openGauss-server-2.1.0/src/gausskernel/cbb/bbox/bbox_atomic_sw_64.h +@@ -0,0 +1,124 @@ ++/* bbox_atomic_sw_64.h ++ * ++ * IDENTIFICATION ++ * src/gausskernel/cbb/bbox/bbox_atomic_sw_64.h ++ * modify by yjy ++ * ------------------------------------------------------------------------- ++ */ ++ ++#ifndef BBOX_ATOMIC_SW_64_H ++#define BBOX_ATOMIC_SW_64_H ++ ++#ifdef __cplusplus ++extern "C" { ++#endif /* __cplusplus */ ++ ++#define barrier() __asm__ __volatile__("memb" : : : "memory") ++#define smp_mb() barrier() ++ ++typedef struct { ++ volatile int counter; ++} BBOX_ATOMIC_STRU; ++ ++/* ++ init the automic variable. ++ */ ++#define BBOX_ATOMIC_INIT(i) \ ++ { \ ++ (i) \ ++ } ++ ++/* ++ read the atomic variable atomically. ++ */ ++#define BBOX_AtomicRead(v) ((v)->counter) ++ ++/* ++ set the value of atomic variable to i atomically. ++ */ ++#define BBOX_AtomicSet(v, i) (((v)->counter) = (i)) ++ ++/* ++ add i to the atomic variable atomically. ++ */ ++static inline void BBOX_AtomicAdd(int i, BBOX_ATOMIC_STRU* v) ++{ ++ unsigned long tmp; ++ int result,cmp; ++ ++ __asm__ __volatile__( ++ " ldi %1, %4 \n" ++ "1: lldw %0,0(%1)\n" ++ " ldi %2,1 \n" ++ " wr_f %2 \n" ++ " addw %0,%3,%0\n" ++ " lstw %0,0(%1)\n" ++ " rd_f %2 \n" ++ " beq %2, 1b \n" ++ : "=&r"(result), "=&r"(tmp), "=&r"(cmp) ++ : "Ir"(i),"m"(v->counter)); ++} ++ ++/* ++ add i to the atomic variable atomically and return new value. ++ */ ++static inline int BBOX_AtomicAddReturn(int i, BBOX_ATOMIC_STRU* v) ++{ ++ unsigned long tmp; ++ int result,cmp; ++ ++ __asm__ __volatile__( ++ " ldi %1, %4 \n" ++ "1: lldw %0,0(%1)\n" ++ " ldi %2,1 \n" ++ " wr_f %2 \n" ++ " addw %0,%3,%0\n" ++ " lstw %0,0(%1)\n" ++ " rd_f %2 \n" ++ " beq %2, 1b \n" ++ : "=&r"(result), "=&r"(tmp), "=&r"(cmp) ++ : "Ir"(i),"m"(v->counter) ++ : "memory"); ++ ++ smp_mb(); ++ return result; ++} ++ ++#define BBOX_AtomicIncReturn(v) BBOX_AtomicAddReturn(1, (v)) ++ ++/* ++ sub i of the value of atomic variable atomically. ++ */ ++static inline void BBOX_AtomicSub(int i, BBOX_ATOMIC_STRU* v) ++{ ++ unsigned long tmp; ++ int result,cmp; ++ ++ __asm__ __volatile__( ++ " ldi %1, %4 \n" ++ "1: lldw %0,0(%1)\n" ++ " ldi %2,1 \n" ++ " wr_f %2 \n" ++ " subw %0,%3,%0\n" ++ " lstw %0,0(%1)\n" ++ " rd_f %2 \n" ++ " beq %2, 1b \n" ++ : "=&r"(result), "=&r"(tmp), "=&r"(cmp) ++ : "Ir"(i),"m"(v->counter)); ++} ++ ++/* ++ add l to the atomic variable atomically. ++ */ ++#define BBOX_AtomicInc(v) BBOX_AtomicAdd(1, v) ++ ++/* ++ sub l of the value of atomic variable atomically. ++ */ ++#define BBOX_AtomicDec(v) BBOX_AtomicSub(1, v) ++ ++#ifdef __cplusplus ++} ++#endif /* __cplusplus */ ++ ++#endif +diff --git a/openGauss-server-2.1.0/src/gausskernel/cbb/bbox/bbox_elf_dump.cpp b/openGauss-server-2.1.0/src/gausskernel/cbb/bbox/bbox_elf_dump.cpp +index 4a9b209..68c204d 100644 +--- a/openGauss-server-2.1.0/src/gausskernel/cbb/bbox/bbox_elf_dump.cpp ++++ b/openGauss-server-2.1.0/src/gausskernel/cbb/bbox/bbox_elf_dump.cpp +@@ -1177,7 +1177,7 @@ static int BBOX_FillPrPsInfo(struct BBOX_ELF_PRPSINFO* pstPrPsInfo, pid_t tMainP + + pstPrPsInfo->cSname = 'R'; + pstPrPsInfo->cNice = (signed char)sys_getpriority(PRIO_PROCESS, 0); +-#if (defined(__x86_64__)) || (defined(__aarch64__)) ++#if (defined(__x86_64__)) || (defined(__aarch64__))|| (defined(__sw_64__)) //add sw_64 modify by yjy + pstPrPsInfo->tUid = (uint32_t)sys_geteuid(); + pstPrPsInfo->tGid = (uint32_t)sys_getegid(); + #elif (defined(__i386__)) || (defined(__ARM_ARCH_5TE__)) || (defined(__ARM_ARCH_7A__)) +@@ -1741,7 +1741,7 @@ static int BBOX_FillEhdr(BBOX_EHDR* pstEhdr, int iPhdrSum) + #if (defined(__i386__)) + pstEhdr->e_phnum = (Elf32_Half)(iPhdrSum + 1); /* Number of memory address space segments plus note segments */ + pstEhdr->e_shnum = (Elf32_Half)(BBOX_SECTION_NUM); +-#elif (defined(__x86_64__)) || (defined(__ARM_ARCH_5TE__)) || (defined(__ARM_ARCH_7A__)) || (defined(__aarch64__)) ++#elif (defined(__x86_64__)) || (defined(__ARM_ARCH_5TE__)) || (defined(__ARM_ARCH_7A__)) || (defined(__aarch64__))|| (defined(__sw_64__)) //add sw_64 modify by yjy + pstEhdr->e_phnum = (Elf64_Half)(iPhdrSum + 1); /* Number of memory address space segments plus note segments */ + pstEhdr->e_shnum = (Elf64_Half)(BBOX_SECTION_NUM); + #endif +@@ -2301,7 +2301,7 @@ static int BBOX_WritePrPsStatusToFile(struct BBOX_ELF_PRPSSTATUS* pstPrPsStatusI + static int BBOX_WriteFpRegistersToFile(struct BBOX_FPREGSET* pstFpRegisters, struct BBOX_WRITE_FDS* pstFileFds) + { + /* since ptrace() doesn't support to obtain float registers' context in aarch64, don't dump it out. */ +-#if !defined(__aarch64__) ++#if !defined(__aarch64__) || !defined(__sw_64__) //add sw_64 modify by yjy + BBOX_NHDR stElfNhdr; + + if (NULL == pstFpRegisters || NULL == pstFileFds) { +diff --git a/openGauss-server-2.1.0/src/gausskernel/cbb/bbox/bbox_elf_dump.h b/openGauss-server-2.1.0/src/gausskernel/cbb/bbox/bbox_elf_dump.h +index 9b6f751..543a6a6 100644 +--- a/openGauss-server-2.1.0/src/gausskernel/cbb/bbox/bbox_elf_dump.h ++++ b/openGauss-server-2.1.0/src/gausskernel/cbb/bbox/bbox_elf_dump.h +@@ -142,6 +142,10 @@ extern "C" { + #define ELF_ARCH EM_ARM + #elif defined(__aarch64__) + #define ELF_ARCH EM_AARCH64 ++/* modify by yjy */ ++#elif defined(__sw_64__) ++#define ELF_ARCH EM_SW_64 ++/* end */ + #endif + + #ifndef AT_SYSINFO_EHDR +@@ -233,6 +237,83 @@ typedef struct Frame { + (f).uregs.gs_base = (r).gs_base; \ + (r) = (f).uregs; \ + } while (0) ++ ++/* modify by yjy */ ++#elif (defined(__sw_64__)) ++/* member variable are named by register. */ ++struct sw_64_regs { ++ #define BP fp ++ #define SP sp ++ #define IP pc ++ uint64_t r0, r1, r2, r3, r4, r5, r6,r7,r8; //Tmp registers ++ uint64_t r9, r10,r11,r12,r13,r14,r15; //save registers ++ uint64_t r16, r17, r18, r19,r20,r21; //Parm regsiters ++ uint64_t r22,r23,r24,r25; //Tmp registers ++ uint64_t r26; //Returen register ++ uint64_t r27; ++ uint64_t r28; ++}; ++ ++/* 64 CPU */ ++#define CPURegs sw_64_regs ++ ++typedef struct Frame { ++ struct CPURegs uregs; ++ int errno_; ++ pid_t tid; ++} Frame; ++ ++/* save call frame */ ++#define FRAME(fm) \ ++ Frame fm; \ ++ do { \ ++ fm.errno_ = errno; \ ++ fm.tid = sys_gettid(); \ ++ __asm__ volatile("stl $0,0(%0) \n" \ ++ "stl $1,8(%0) \n" \ ++ "stl $2,16(%0) \n" \ ++ "stl $3,24(%0) \n" \ ++ "stl $4,32(%0) \n" \ ++ "stl $5,40(%0) \n" \ ++ "stl $6,48(%0) \n" \ ++ "stl $7,56(%0) \n" \ ++ "stl $8,64(%0) \n" \ ++ "stl $9,72(%0) \n" \ ++ "stl $10,80(%0) \n" \ ++ "stl $11,88(%0) \n" \ ++ "stl $12,96(%0) \n" \ ++ "stl $13,104(%0) \n" \ ++ "stl $14,112(%0) \n" \ ++ "stl $15,120(%0) \n" \ ++ "stl $16,128(%0) \n" \ ++ "stl $17,136(%0) \n" \ ++ "stl $18,144(%0) \n" \ ++ "stl $19,152(%0) \n" \ ++ "stl $20,160(%0) \n" \ ++ "stl $21,168(%0) \n" \ ++ "stl $22,176(%0) \n" \ ++ "stl $23,184(%0) \n" \ ++ "stl $24,192(%0) \n" \ ++ "stl $25,200(%0) \n" \ ++ "stl $26,208(%0) \n" \ ++ "stl $27,216(%0) \n" \ ++ "stl $28,224(%0) \n" \ ++ "stl $29,232(%0) \n" \ ++ "stl $30,240(%0) \n" \ ++ "mov $sp,$10 \n" \ ++ "stl $10,248(%0) \n" \ ++ "1:" \ ++ : \ ++ : "a"(&fm) \ ++ : "memory"); \ ++ } while (0) ++ ++#define SET_FRAME(f, r) \ ++ do { \ ++ errno = (f).errno_; \ ++ (r) = (f).uregs; \ ++ } while (0) ++/* end */ + + #elif (defined(__i386__)) + /* member variable are named by register. */ +@@ -420,7 +501,7 @@ struct BBOX_ELF_PRPSINFO { /* Information about process */ + unsigned char ucZomb; /* Zombie */ + signed char cNice; /* Nice val */ + unsigned long ulLlag; /* Flags */ +-#if (defined(__x86_64__)) || (defined(__aarch64__)) ++#if (defined(__x86_64__)) || (defined(__aarch64__)) || (defined(__sw_64)) //add sw_64 modify by yjy + uint32_t tUid; /* User ID */ + uint32_t tGid; /* Group ID */ + #else +@@ -517,6 +598,17 @@ struct BBOX_FPXREGSET { /* x86-64 stores FPU registers in SSE struct */ + struct BBOX_FPREGSET { /* FPU registers */ + /* nothing */ + }; ++* modify by yjy */ ++#elif defined(__sw_64__) ++struct BBOX_FPXREGSET { /* sw-64 stores FPU */ ++ /* nothing */ ++}; ++ ++/* member variable are named by register. */ ++struct BBOX_FPREGSET { /* FPU registers */ ++ /* nothing */ ++}; ++/* end */ + #endif + + struct BBOX_ELF_PRPSSTATUS { /* Information about thread; includes CPU reg */ +diff --git a/openGauss-server-2.1.0/src/gausskernel/cbb/bbox/bbox_syscall_SW_64.h b/openGauss-server-2.1.0/src/gausskernel/cbb/bbox/bbox_syscall_SW_64.h +new file mode 100644 +index 0000000..14438b9 +--- /dev/null ++++ b/openGauss-server-2.1.0/src/gausskernel/cbb/bbox/bbox_syscall_SW_64.h +@@ -0,0 +1,136 @@ ++/* bbox_syscall_SW_64.h ++ * ++ * IDENTIFICATION ++ * src/gausskernel/cbb/bbox/bbox_syscall_SW_64.h ++ * modify by yjy ++ * ------------------------------------------------------------------------- ++ */ ++#ifndef __BBOX_SYSCALL_SW_64_H_ ++#define __BBOX_SYSCALL_SW_64_H_ ++ ++#include ++#include ++#define SYS_NAME(name) sys_##name ++#define SYS_CODE(syscall_code) (__NR_##syscall_code) ++ ++#define ___syscall_return(type, ___res) \ ++ do { \ ++ if ((unsigned long)(___res) >= (unsigned long)(-4095)) { \ ++ errno = -(___res); \ ++ ___res = -1; \ ++ } \ ++ return (type)(___res); \ ++ } while (0) ++ ++#define __syscall0(type, name) \ ++ type SYS_NAME(name)() \ ++ { \ ++ long ___res; \ ++ register long _r0 asm("$0")= SYS_CODE(name); \ ++ asm("sys_call 0x83 \n" \ ++ :"=r"(_r0) \ ++ :"r"(_r0) \ ++ : "memory"); \ ++ ___res=_r0; \ ++ ___syscall_return(type,___res); \ ++ } ++ ++#define __syscall1(type, name, type1, arg1) \ ++ type SYS_NAME(name)(type1 arg1) \ ++ { \ ++ long ___res; \ ++ register long _r0 asm("$0") = SYS_CODE(name);\ ++ register long _r16 asm("$16")= (long)arg1; \ ++ asm("sys_call 0x83 \n" \ ++ :"=r"(_r0) \ ++ :"r"(_r0),"r"(_r16) \ ++ : "memory"); \ ++ ___res=_r0; \ ++ ___syscall_return(type,___res); \ ++ } ++ ++#define __syscall2(type, name, type1, arg1, type2, arg2) \ ++ type SYS_NAME(name)(type1 arg1, type2 arg2) \ ++ { \ ++ long ___res; \ ++ register long _r0 asm("$0") = SYS_CODE(name); \ ++ register long _r16 asm("$16")= (long)arg1; \ ++ register long _r17 asm("$17")= (long)arg2; \ ++ asm("sys_call 0x83 \n" \ ++ :"=r"(_r0) \ ++ :"r"(_r0),"r"(_r16),"r"(_r17) \ ++ : "memory"); \ ++ ___res=_r0; \ ++ ___syscall_return(type,___res); \ ++ } ++ ++#define __syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \ ++ type SYS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) \ ++ { \ ++ long ___res; \ ++ register long _r0 asm("$0") = SYS_CODE(name); \ ++ register long _r16 asm("$16")= (long)arg1; \ ++ register long _r17 asm("$17")= (long)arg2; \ ++ register long _r18 asm("$18")= (long)arg3; \ ++ asm("sys_call 0x83 \n" \ ++ :"=r"(_r0) \ ++ :"r"(_r0),"r"(_r16),"r"(_r17),"r"(_r18) \ ++ : "memory"); \ ++ ___res=_r0; \ ++ ___syscall_return(type,___res); \ ++ } ++ ++#define __syscall4(type, name, type1, arg1, type2, arg2, type3, arg3, type4, arg4) \ ++ type SYS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) \ ++ { \ ++ long ___res; \ ++ register long _r0 asm("$0") = SYS_CODE(name); \ ++ register long _r16 asm("$16")= (long)arg1; \ ++ register long _r17 asm("$17")= (long)arg2; \ ++ register long _r18 asm("$18")= (long)arg3; \ ++ register long _r19 asm("$19")= (long)arg4; \ ++ asm("sys_call 0x83 \n" \ ++ :"=r"(_r0) \ ++ :"r"(_r0),"r"(_r16),"r"(_r17),"r"(_r18),"r"(_r19) \ ++ : "memory"); \ ++ ___res=_r0; \ ++ ___syscall_return(type,___res); \ ++ } ++ ++#define __syscall5(type, name, type1, arg1, type2, arg2, type3, arg3, type4, arg4, type5, arg5) \ ++ type SYS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \ ++ { \ ++ long ___res; \ ++ register long _r0 asm("$0") = SYS_CODE(name); \ ++ register long _r16 asm("$16")= (long)arg1; \ ++ register long _r17 asm("$17")= (long)arg2; \ ++ register long _r18 asm("$18")= (long)arg3; \ ++ register long _r19 asm("$19")= (long)arg4; \ ++ register long _r20 asm("$20")= (long)arg5; \ ++ asm("sys_call 0x83 \n" \ ++ :"=r"(_r0) \ ++ :"r"(_r0),"r"(_r16),"r"(_r17),"r"(_r18),"r"(_r19),"r"(_r20) \ ++ : "memory"); \ ++ ___res=_r0; \ ++ ___syscall_return(type,___res); \ ++ } ++ ++#define __syscall6(type, name, type1, arg1, type2, arg2, type3, arg3, type4, arg4, type5, arg5, type6, arg6) \ ++ type SYS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6) \ ++ { \ ++ long ___res; \ ++ register long _r0 asm("$0") = SYS_CODE(name); \ ++ register long _r16 asm("$16")= (long)arg1; \ ++ register long _r17 asm("$17")= (long)arg2; \ ++ register long _r18 asm("$18")= (long)arg3; \ ++ register long _r19 asm("$19")= (long)arg4; \ ++ register long _r20 asm("$20")= (long)arg5; \ ++ register long _r21 asm("$21")= (long)arg6; \ ++ asm("sys_call 0x83 \n" \ ++ :"=r"(_r0) \ ++ :"r"(_r0),"r"(_r16),"r"(_r17),"r"(_r18),"r"(_r19),"r"(_r20),"r"(_r21) \ ++ : "memory"); \ ++ ___res=_r0; \ ++ ___syscall_return(type,___res); \ ++ } ++#endif +diff --git a/openGauss-server-2.1.0/src/gausskernel/cbb/bbox/bbox_syscall_support.cpp b/openGauss-server-2.1.0/src/gausskernel/cbb/bbox/bbox_syscall_support.cpp +index 86398ec..462a029 100644 +--- a/openGauss-server-2.1.0/src/gausskernel/cbb/bbox/bbox_syscall_support.cpp ++++ b/openGauss-server-2.1.0/src/gausskernel/cbb/bbox/bbox_syscall_support.cpp +@@ -595,5 +595,94 @@ long SYS_NAME(_clone)( + ___res = __res_x0; + ___syscall_return(int, ___res); + } ++/* modify by yjy */ ++#elif (defined(__sw_64__)) ++__syscall3(long, socket, int, family, int, type, int, protocol); ++ ++long SYS_NAME(waitpid)(pid_t pid, int* status, int options) ++{ ++ return SYS_NAME(wait4)(pid, status, options, 0); ++} ++ ++long SYS_NAME(signal)(int __signum, void (*handler)(int)) ++{ ++ struct kernel_sigaction _sa; ++ struct kernel_sigaction old; + ++ errno_t rc = memset_s(&_sa, sizeof(_sa), 0, sizeof(_sa)); ++ securec_check_c(rc, "\0", "\0"); ++ sys_sigfillset(&_sa.sa_mask); ++ _sa.sa_flags |= SA_RESTORER | SA_RESTART; ++ _sa.handle.sa_handler_ = handler; ++ ++ return SYS_NAME(rt_sigaction)(__signum, &_sa, &old, (KERNEL_NSIG + 7) / 8); ++} ++ ++long SYS_NAME(_clone)( ++ int (*fn)(void*), void* child_stack, int flags, void* arg, int* parent_tidptr, void* newtls, int* child_tidptr) ++{ ++ register long result_r0 __asm__("$0"); ++ long ___res; ++ int tmp = 0; ++ { ++ register int (*fn_tmp)(void*) __asm__("$16") = fn; ++ register void* stack_tmp __asm__("$17") = child_stack; ++ register int flags_tmp __asm__("$18") = flags; ++ register void* arg_tmp __asm__("$19") = arg; ++ register int* ptid_tmp __asm__("$20") = parent_tidptr; ++ register void* tls_tmp __asm__("$21") = newtls; ++ register int* ctid_tmp __asm__("$22") = child_tidptr; ++ ++ __asm__ __volatile__( ++ ++ /*if (fn == NULL || child_stack == NULL) return -EINVAL; */ ++ "beq $16,1f\n" ++ "beq $17,1f\n" ++ ++ "ldi $17,-16($17)\n" ++ "stl $16,0($17) \n" ++ "stl $19,8($17) \n" ++ ++ "mov $18,$16 \n" /* flags */ ++ "mov $20,$18 \n" /* ptid */ ++ "mov $21,$19 \n" /* tls */ ++ "mov $22,$20 \n" /* ctid */ ++ "mov %9,$0 \n" /* save __NR_clone into $0 register */ ++ "sys_call 0x83\n" ++ ++ /* example: if (%r0 != 0) return %r0; */ ++ "cmpeq $0,0,%11\n" ++ "beq %11,2f\n" ++ ++ /* In the child, now. Call "fn(arg)". ++ */ ++ "ldl $16, 0($sp)\n" ++ "ldl $17, 8($sp)\n" ++ "mov $17, $27 \n" ++ "call $31, ($27),0x0\n" ++ /* example: Call _exit(%r0). ++ */ ++ "mov %10, $0 \n" /*save __NR_exit into $0 register*/ ++ "sys_call 0x83\n" ++ "1: \n" ++ "mov %1, $0 \n" ++ "2: \n" ++ : "=r"(result_r0) ++ : "i"(-EINVAL), ++ "r"(fn_tmp), ++ "r"(stack_tmp), ++ "r"(flags_tmp), ++ "r"(arg_tmp), ++ "r"(ptid_tmp), ++ "r"(tls_tmp), ++ "r"(ctid_tmp), ++ "i"(__NR_clone), ++ "i"(__NR_exit), ++ "r"(tmp) ++ : "$26", "memory"); ++ } ++ ___res = result_r0; ++ ___syscall_return(int, ___res); ++} ++/* end */ + #endif +diff --git a/openGauss-server-2.1.0/src/gausskernel/cbb/bbox/bbox_syscall_support.h b/openGauss-server-2.1.0/src/gausskernel/cbb/bbox/bbox_syscall_support.h +index c131a57..5938ef0 100644 +--- a/openGauss-server-2.1.0/src/gausskernel/cbb/bbox/bbox_syscall_support.h ++++ b/openGauss-server-2.1.0/src/gausskernel/cbb/bbox/bbox_syscall_support.h +@@ -73,11 +73,16 @@ + #include "bbox_syscall_ARM.h" + #elif (defined(__aarch64__)) + #include "bbox_syscall_ARM64.h" ++/* modify by yjy */ ++#elif (defined(__sw_64__)) ++#include "bbox_syscall_SW_64.h" ++/*end*/ + #endif + + #define SA_RESTORER 0x04000000 + #define KERNEL_NSIG 64 +-#define EM_AARCH64 183 ++#define EM_AARCH64 183 ++#define EM_SW_64 0x9916//modify by yjy + + #if (defined(__aarch64__)) + struct linux_dirent { +@@ -197,6 +202,29 @@ struct kernel_stat { + unsigned int __unused4; + unsigned int __unused5; + }; ++/* modify by yjy */ ++#elif (defined(__sw_64__)) ++struct kernel_stat { ++ unsigned long st_dev; ++ unsigned long st_ino; ++ unsigned long st_rdev; ++ long st_size; ++ unsigned long st_blocks; ++ unsigned int st_mode; ++ unsigned int st_nlink; ++ unsigned int st_uid; ++ unsigned int st_gid; ++ unsigned int st_blksize; ++ unsigned int __pad0; ++ unsigned long st_atime_; ++ unsigned long st_atime_nsec_; ++ unsigned long st_mtime_; ++ unsigned long st_mtime_nsec_; ++ unsigned long st_ctime_; ++ unsigned long st_ctime_nsec_; ++ long __unused[3]; ++}; ++/* end */ + #endif + + extern long SYS_NAME(gettid)(void); +@@ -295,5 +323,13 @@ extern long SYS_NAME(signal)(int _signum, void (*handler)(int)); + extern long SYS_NAME(socket)(int domain, int type, int protocol); + extern long SYS_NAME(_clone)( + int (*fn)(void*), void* child_stack, int flags, void* arg, int* parent_tidptr, void* newtls, int* child_tidptr); ++/* modify by yjy */ ++#elif (defined(__sw_64__)) ++extern long SYS_NAME(waitpid)(pid_t pid, int* status, int options); ++extern long SYS_NAME(signal)(int _signum, void (*handler)(int)); ++extern long SYS_NAME(socket)(int domain, int type, int protocol); ++extern long SYS_NAME(_clone)( ++ int (*fn)(void*), void* child_stack, int flags, void* arg, int* parent_tidptr, void* newtls, int* child_tidptr); ++/* end */ + #endif + #endif +diff --git a/openGauss-server-2.1.0/src/gausskernel/process/main/main.cpp b/openGauss-server-2.1.0/src/gausskernel/process/main/main.cpp +index 02eb5f1..4a19a47 100755 +--- a/openGauss-server-2.1.0/src/gausskernel/process/main/main.cpp ++++ b/openGauss-server-2.1.0/src/gausskernel/process/main/main.cpp +@@ -78,7 +78,6 @@ int main(int argc, char* argv[]) + { + char* mmap_env = NULL; + syscall_lock_init(); +- + mmap_env = gs_getenv_r("GAUSS_MMAP_THRESHOLD"); + if (mmap_env != NULL) { + check_backend_env(mmap_env); +@@ -322,7 +321,7 @@ static void startup_hacks(const char* progname) + */ + #ifdef NOFIXADE + +-#if defined(__alpha) /* no __alpha__ ? */ ++#if defined(__alpha) || defined(__sw_64) /* no __alpha__ ? */ + { + int buffer[] = {SSIN_UACPROC, UAC_SIGBUS | UAC_NOPRINT}; + +diff --git a/openGauss-server-2.1.0/src/gausskernel/process/postmaster/postmaster.cpp b/openGauss-server-2.1.0/src/gausskernel/process/postmaster/postmaster.cpp +index 2407ef8..9231dfa 100644 +--- a/openGauss-server-2.1.0/src/gausskernel/process/postmaster/postmaster.cpp ++++ b/openGauss-server-2.1.0/src/gausskernel/process/postmaster/postmaster.cpp +@@ -844,7 +844,7 @@ void get_coredump_pattern_path(char* path, Size len) + + if (0 != stat(path, &stat_buf) || !S_ISDIR(stat_buf.st_mode) || 0 != access(path, W_OK)) { + write_stderr("The core dump path is an invalid directory\n"); +- *path = '\0'; ++ *path = '\0'; + return; + } + } +diff --git a/openGauss-server-2.1.0/src/gausskernel/runtime/executor/instrument.cpp b/openGauss-server-2.1.0/src/gausskernel/runtime/executor/instrument.cpp +index 24be0e6..72a6a6e 100644 +--- a/openGauss-server-2.1.0/src/gausskernel/runtime/executor/instrument.cpp ++++ b/openGauss-server-2.1.0/src/gausskernel/runtime/executor/instrument.cpp +@@ -86,6 +86,12 @@ static inline uint64 rdtsc(void) + asm volatile("isb; mrs %0, cntvct_el0" : "=r"(cval) : : "memory"); + + return cval; ++/* modify by yjy */ ++#elif defined(__sw_64__) ++ unsigned long time_val = 0; ++ __asm__ __volatile__("rtc %0" : "=r"(time_val) : : "memory"); ++ return time_val; ++/* end */ + #else + uint32 hi = 0; + uint32 lo = 0; +diff --git a/openGauss-server-2.1.0/src/gausskernel/runtime/vecexecutor/vectorsonic/vsonichash.cpp b/openGauss-server-2.1.0/src/gausskernel/runtime/vecexecutor/vectorsonic/vsonichash.cpp +index cc14674..3b45dbb 100644 +--- a/openGauss-server-2.1.0/src/gausskernel/runtime/vecexecutor/vectorsonic/vsonichash.cpp ++++ b/openGauss-server-2.1.0/src/gausskernel/runtime/vecexecutor/vectorsonic/vsonichash.cpp +@@ -30,6 +30,7 @@ + #include "utils/dynahash.h" + #ifdef __aarch64__ + #include ++#elif defined(__sw_64__) + #else + #include + #endif +@@ -40,8 +41,10 @@ extern bool anls_opt_is_on(AnalysisOpt dfx_opt); + #define HASH_RANDOM_2 1.1131347 + #define HASH_RANDOM_3 1.0132677 + +-#ifdef __aarch64__ ++#if defined __aarch64__ + #define HASH_INT32_CRC(c, k) __crc32cw(c, k) ++#elif defined(__sw_64__) ++#define HASH_INT32_CRC(c, k) c + #else + #define HASH_INT32_CRC(c, k) _mm_crc32_u32(c, k) + #endif +@@ -58,7 +61,7 @@ uint32 hashquickany(uint32 seed, register const unsigned char* data, register in + + uint32 crc = seed; + +-#ifdef __aarch64__ ++#if defined __aarch64__ + while (p + 8 <= pend) { + crc = (uint32)__crc32d(crc, *((const uint64*)p)); + p += 8; +@@ -75,6 +78,8 @@ uint32 hashquickany(uint32 seed, register const unsigned char* data, register in + crc = __crc32cb(crc, *p); + p++; + } ++#elif defined(__sw_64__) ++ return crc; + #else + while (p + 8 <= pend) { + crc = (uint32)_mm_crc32_u64(crc, *((const uint64*)p)); +diff --git a/openGauss-server-2.1.0/src/gausskernel/storage/access/transam/extreme_rto/page_redo.cpp b/openGauss-server-2.1.0/src/gausskernel/storage/access/transam/extreme_rto/page_redo.cpp +index ceda891..e5c6379 100755 +--- a/openGauss-server-2.1.0/src/gausskernel/storage/access/transam/extreme_rto/page_redo.cpp ++++ b/openGauss-server-2.1.0/src/gausskernel/storage/access/transam/extreme_rto/page_redo.cpp +@@ -207,7 +207,7 @@ PageRedoWorker *CreateWorker(uint32 id) + PosixSemaphoreInit(&worker->phaseMarker, 0); + worker->oldCtx = NULL; + worker->fullSyncFlag = 0; +-#if (!defined __x86_64__) && (!defined __aarch64__) ++#if (!defined __x86_64__) && (!defined __aarch64__) && (!defined __sw_64__) + SpinLockInit(&worker->ptrLck); + #endif + worker->parseManager.memctl.isInit = false; +@@ -236,7 +236,7 @@ void DestroyPageRedoWorker(PageRedoWorker *worker) + void SetCompletedReadEndPtr(PageRedoWorker *worker, XLogRecPtr readPtr, XLogRecPtr endPtr) + { + volatile PageRedoWorker *tmpWk = worker; +-#if defined(__x86_64__) || defined(__aarch64__) ++#if defined(__x86_64__) || defined(__aarch64__) || defined(__sw_64__) + uint128_u exchange; + uint128_u current; + uint128_u compare = atomic_compare_and_swap_u128((uint128_u *)&tmpWk->lastReplayedReadRecPtr); +@@ -258,14 +258,14 @@ loop: + tmpWk->lastReplayedReadRecPtr = readPtr; + tmpWk->lastReplayedEndRecPtr = endPtr; + SpinLockRelease(&tmpWk->ptrLck); +-#endif /* __x86_64__ || __aarch64__ */ ++#endif /* __x86_64__ || __aarch64__ || __sw_64__*/ + } + + /* automic write for lastReplayedReadRecPtr and lastReplayedEndRecPtr */ + void GetCompletedReadEndPtr(PageRedoWorker *worker, XLogRecPtr *readPtr, XLogRecPtr *endPtr) + { + volatile PageRedoWorker *tmpWk = worker; +-#if defined(__x86_64__) || defined(__aarch64__) ++#if defined(__x86_64__) || defined(__aarch64__) || defined(__sw_64__) + uint128_u compare = atomic_compare_and_swap_u128((uint128_u *)&tmpWk->lastReplayedReadRecPtr); + Assert(sizeof(tmpWk->lastReplayedReadRecPtr) == 8); + Assert(sizeof(tmpWk->lastReplayedEndRecPtr) == 8); +@@ -277,7 +277,7 @@ void GetCompletedReadEndPtr(PageRedoWorker *worker, XLogRecPtr *readPtr, XLogRec + *readPtr = tmpWk->lastReplayedReadRecPtr; + *endPtr = tmpWk->lastReplayedEndRecPtr; + SpinLockRelease(&tmpWk->ptrLck); +-#endif /* __x86_64__ || __aarch64__ */ ++#endif /* __x86_64__ || __aarch64__ || __sw_64__ */ + } + + /* Run from both the dispatcher and the worker thread. */ +diff --git a/openGauss-server-2.1.0/src/gausskernel/storage/access/transam/xlog.cpp b/openGauss-server-2.1.0/src/gausskernel/storage/access/transam/xlog.cpp +index cb9f91e..21a72e1 100755 +--- a/openGauss-server-2.1.0/src/gausskernel/storage/access/transam/xlog.cpp ++++ b/openGauss-server-2.1.0/src/gausskernel/storage/access/transam/xlog.cpp +@@ -13,6 +13,7 @@ + * + * ------------------------------------------------------------------------- + */ ++//#ifndef __sw_64__ + #include "postgres.h" + #include "knl/knl_variable.h" + +@@ -259,7 +260,7 @@ TransactionId OldestXidAfterRecovery; + */ + typedef struct { + LWLock lock; +-#ifdef __aarch64__ ++#if defined(__aarch64__) || defined(__sw_64__) + pg_atomic_uint32 xlogGroupFirst; + #endif + XLogRecPtr insertingAt; +@@ -292,7 +293,7 @@ typedef struct XLogCtlInsert { + uint32 PrevByteSize; + int32 CurrLRC; + +-#if (!defined __x86_64__) && (!defined __aarch64__) ++#if (!defined __x86_64__) && (!defined __aarch64__) && (!defined __sw_64__ ) + slock_t insertpos_lck; /* protects CurrBytePos and PrevBytePos */ + #endif + /* +@@ -669,7 +670,7 @@ bool mpfl_pread_file(int fd, void *buf, int32 size, int64 offset); + int ParallelXLogPageRead(XLogReaderState *xlogreader, XLogRecPtr targetPagePtr, int reqLen, XLogRecPtr targetRecPtr, + TimeLineID *readTLI); + +-#ifdef __aarch64__ ++#if defined(__aarch64__) + static XLogRecPtr XLogInsertRecordGroup(XLogRecData *rdata, XLogRecPtr fpw_lsn); + + static void XLogInsertRecordNolock(XLogRecData *rdata, PGPROC *proc, XLogRecPtr StartPos, XLogRecPtr EndPos, +@@ -1091,7 +1092,7 @@ static void ReserveXLogInsertByteLocation(uint32 size, uint32 lastRecordSize, ui + * because the usable byte position doesn't include any headers, reserving + * X bytes from WAL is almost as simple as "CurrBytePos += X". + */ +-#if defined(__x86_64__) || defined(__aarch64__) ++#if defined(__x86_64__) || defined(__aarch64__) || defined(__sw_64__) + union Union128 compare; + union Union128 exchange; + union Union128 current; +@@ -1622,7 +1623,7 @@ static void ReserveXLogInsertLocation(uint32 size, XLogRecPtr* StartPos, XLogRec + * because the usable byte position doesn't include any headers, reserving + * X bytes from WAL is almost as simple as "CurrBytePos += X". + */ +-#if defined(__x86_64__) || defined(__aarch64__) ++#if defined(__x86_64__) || defined(__aarch64__) || defined(__sw_64__) + union Union128 compare; + union Union128 exchange; + union Union128 current; +@@ -1709,7 +1710,7 @@ static bool ReserveXLogSwitch(XLogRecPtr *StartPos, XLogRecPtr *EndPos, XLogRecP + * are no other inserters competing for it. GetXLogInsertRecPtr() does + * compete for it, but that's not called very frequently. + */ +-#if defined(__x86_64__) || defined(__aarch64__) ++#if defined(__x86_64__) || defined(__aarch64__) || defined(__sw_64__) + uint128_u exchange; + uint128_u current; + uint128_u compare = atomic_compare_and_swap_u128((uint128_u*)&Insert->CurrBytePos); +@@ -2623,7 +2624,7 @@ static void AdvanceXLInsertBuffer(XLogRecPtr upto, bool opportunistic, PGPROC *p + XLogwrtResult *LogwrtResultPtr = NULL; + TimeLineID xlogTimeLineID = 0; + +-#ifdef __aarch64__ ++#if defined __aarch64__ + if (isGroupInsert) { + LogwrtResultPtr = (XLogwrtResult *)proc->xlogGroupLogwrtResult; + xlogTimeLineID = proc->xlogGroupTimeLineID; +@@ -6314,6 +6315,7 @@ static void WriteControlFile(void) + COMP_CRC32C(t_thrd.shemem_ptr_cxt.ControlFile->crc, (char *)t_thrd.shemem_ptr_cxt.ControlFile, + offsetof(ControlFileData, crc)); + FIN_CRC32C(t_thrd.shemem_ptr_cxt.ControlFile->crc); ++ + + /* + * We write out PG_CONTROL_SIZE bytes into pg_control, zero-padding the +@@ -6331,6 +6333,7 @@ static void WriteControlFile(void) + + errorno = memcpy_s(buffer, PG_CONTROL_SIZE, t_thrd.shemem_ptr_cxt.ControlFile, sizeof(ControlFileData)); + securec_check(errorno, "", ""); ++ securec_check(errorno, "", ""); + + #ifdef USE_ASSERT_CHECKING + #define MAX_SIZE 1024 +@@ -6938,7 +6941,7 @@ void XLOGShmemInit(void) + LWLockInitialize(&t_thrd.shemem_ptr_cxt.GlobalWALInsertLocks[processorIndex][i].l.lock, + LWTRANCHE_WAL_INSERT); + t_thrd.shemem_ptr_cxt.GlobalWALInsertLocks[processorIndex][i].l.insertingAt = InvalidXLogRecPtr; +-#ifdef __aarch64__ ++#if defined __aarch64__ || defined __sw_64__ + pg_atomic_init_u32(&t_thrd.shemem_ptr_cxt.GlobalWALInsertLocks[processorIndex][i].l.xlogGroupFirst, + INVALID_PGPROCNO); + #endif +@@ -6974,7 +6977,7 @@ void XLOGShmemInit(void) + t_thrd.shemem_ptr_cxt.XLogCtl->lastRemovedSegNo = GetOldestXLOGSegNo(t_thrd.proc_cxt.DataDir); + } + +-#if (!defined __x86_64__) && (!defined __aarch64__) ++#if (!defined __x86_64__) && (!defined __aarch64__) && (!defined __sw_64__) + SpinLockInit(&t_thrd.shemem_ptr_cxt.XLogCtl->Insert.insertpos_lck); + #endif + SpinLockInit(&t_thrd.shemem_ptr_cxt.XLogCtl->info_lck); +@@ -7136,7 +7139,6 @@ void BootStrapXLOG(void) + page = (XLogPageHeader)TYPEALIGN(XLOG_BLCKSZ, buffer); + ret = memset_s(page, XLOG_BLCKSZ, 0, XLOG_BLCKSZ); + securec_check(ret, "", ""); +- + /* + * Set up information for the initial checkpoint record + * +@@ -7287,6 +7289,7 @@ void BootStrapXLOG(void) + + /* Bootstrap the commit log, too */ + BootStrapCLOG(); ++ BootStrapCLOG(); + BootStrapCSNLOG(); + BootStrapMultiXact(); + +@@ -14978,7 +14981,7 @@ XLogRecPtr do_roach_stop_backup(const char *backupidstr) + stoppoint = t_thrd.shemem_ptr_cxt.ControlFile->minRecoveryPoint; + LWLockRelease(ControlFileLock); + } else { +-#if defined(__x86_64__) || defined(__aarch64__) ++#if defined(__x86_64__) || defined(__aarch64__) || defined(__sw_64__) + current_bytepos = pg_atomic_barrier_read_u64((uint64*)&Insert->CurrBytePos); + stoppoint = XLogBytePosToEndRecPtr(current_bytepos); + #else +@@ -15228,7 +15231,7 @@ XLogRecPtr enable_delay_ddl_recycle(void) + + LWLockAcquire(CBMParseXlogLock, LW_EXCLUSIVE); + +-#if defined(__x86_64__) || defined(__aarch64__) ++#if defined(__x86_64__) || defined(__aarch64__) || defined(__sw_64__) + uint64 current_bytepos = pg_atomic_barrier_read_u64((uint64*)&Insert->CurrBytePos); + curDelayRange.startLSN = XLogBytePosToEndRecPtr(current_bytepos); + #else +@@ -15362,7 +15365,7 @@ void disable_delay_ddl_recycle(XLogRecPtr barrierLSN, bool isForce, XLogRecPtr * + */ + LWLockAcquire(RelfilenodeReuseLock, LW_EXCLUSIVE); + +-#if defined(__x86_64__) || defined(__aarch64__) ++#if defined(__x86_64__) || defined(__aarch64__) || defined(__sw_64__) + uint64 current_bytepos = pg_atomic_barrier_read_u64((uint64*)&Insert->CurrBytePos); + delayRange.endLSN = XLogBytePosToEndRecPtr(current_bytepos); + #else +@@ -15444,7 +15447,7 @@ XLogRecPtr enable_delay_ddl_recycle_with_slot(const char* slotname) + /* hold this lock to push cbm parse exact to the ddl stop position */ + LWLockAcquire(CBMParseXlogLock, LW_EXCLUSIVE); + +-#if defined(__x86_64__) || defined(__aarch64__) ++#if defined(__x86_64__) || defined(__aarch64__) || defined(__sw_64__) + uint64 current_bytepos = pg_atomic_barrier_read_u64((uint64*)&Insert->CurrBytePos); + delay_start_lsn = XLogBytePosToEndRecPtr(current_bytepos); + #else +@@ -15510,7 +15513,7 @@ void disable_delay_ddl_recycle_with_slot(const char* slotname, XLogRecPtr *start + */ + LWLockAcquire(RelfilenodeReuseLock, LW_EXCLUSIVE); + +-#if defined(__x86_64__) || defined(__aarch64__) ++#if defined(__x86_64__) || defined(__aarch64__) || defined(__sw_64__) + uint64 current_bytepos = pg_atomic_barrier_read_u64((uint64*)&Insert->CurrBytePos); + delay_end_lsn = XLogBytePosToEndRecPtr(current_bytepos); + #else +@@ -15928,7 +15931,7 @@ XLogRecPtr GetXLogInsertRecPtr(void) + volatile XLogCtlInsert *Insert = &t_thrd.shemem_ptr_cxt.XLogCtl->Insert; + uint64 current_bytepos; + +-#if defined(__x86_64__) || defined(__aarch64__) ++#if defined(__x86_64__) || defined(__aarch64__) || defined(__sw_64__) + current_bytepos = pg_atomic_barrier_read_u64((uint64*)&Insert->CurrBytePos); + #else + SpinLockAcquire(&Insert->insertpos_lck); +@@ -15950,7 +15953,7 @@ XLogRecPtr GetXLogInsertEndRecPtr(void) + volatile XLogCtlInsert *Insert = &t_thrd.shemem_ptr_cxt.XLogCtl->Insert; + uint64 current_bytepos; + +-#if defined(__x86_64__) || defined(__aarch64__) ++#if defined(__x86_64__) || defined(__aarch64__) || defined(__sw_64__) + current_bytepos = pg_atomic_barrier_read_u64((uint64*)&Insert->CurrBytePos); + #else + SpinLockAcquire(&Insert->insertpos_lck); +@@ -18432,7 +18435,7 @@ bool IsRoachRestore(void) + } + + const uint UPDATE_REC_XLOG_NUM = 4; +-#if defined(__x86_64__) || defined(__aarch64__) ++#if defined(__x86_64__) || defined(__aarch64__) || defined(__sw_64__) + bool atomic_update_dirty_page_queue_rec_lsn(XLogRecPtr current_insert_lsn, bool need_immediately_update) + { + XLogRecPtr cur_rec_lsn = InvalidXLogRecPtr; +@@ -18490,7 +18493,7 @@ void update_dirty_page_queue_rec_lsn(XLogRecPtr current_insert_lsn, bool need_im + } + } + +-#if defined(__x86_64__) || defined(__aarch64__) ++#if defined(__x86_64__) || defined(__aarch64__) || defined(__sw_64__) + is_update = atomic_update_dirty_page_queue_rec_lsn(current_insert_lsn, need_immediately_update); + #else + SpinLockAcquire(&g_instance.ckpt_cxt_ctl->queue_lock); +@@ -18515,7 +18518,7 @@ void update_dirty_page_queue_rec_lsn(XLogRecPtr current_insert_lsn, bool need_im + uint64 get_dirty_page_queue_rec_lsn() + { + uint64 dirty_page_queue_rec_lsn = 0; +-#if defined(__x86_64__) || defined(__aarch64__) ++#if defined(__x86_64__) || defined(__aarch64__) || defined(__sw_64__) + uint128_u compare; + compare = atomic_compare_and_swap_u128((uint128_u*)&g_instance.ckpt_cxt_ctl->dirty_page_queue_reclsn); + dirty_page_queue_rec_lsn = compare.u64[0]; +@@ -18956,4 +18959,4 @@ void InitXlogStatuEntryTblSize() + g_instance.attr.attr_storage.wal_insert_status_entries_power = MIN_WAL_INSERT_STATUS_ENTRY_POW; + } + } +- ++//#endif +diff --git a/openGauss-server-2.1.0/src/gausskernel/storage/mot/core/Makefile.local b/openGauss-server-2.1.0/src/gausskernel/storage/mot/core/Makefile.local +index 5cdaaff..74daee4 100644 +--- a/openGauss-server-2.1.0/src/gausskernel/storage/mot/core/Makefile.local ++++ b/openGauss-server-2.1.0/src/gausskernel/storage/mot/core/Makefile.local +@@ -73,9 +73,10 @@ PLATFORM_ARCH = $(shell uname -p) + ifeq ($(PLATFORM_ARCH),aarch64) + #CFLAGS += -std=gnu++11 -march=armv8-a+crc -Wall -Wextra -D_GLIBCXX_USE_CXX11_ABI=0 -fPIC + CFLAGS += -std=gnu++11 -march=armv8-a+crc -w -D_GLIBCXX_USE_CXX11_ABI=0 -fPIC +-else +- #CFLAGS += -std=gnu++11 -march=native -mcx16 -Wall -Wextra -D_GLIBCXX_USE_CXX11_ABI=0 -fPIC +- CFLAGS += -std=gnu++11 -mcx16 -w -D_GLIBCXX_USE_CXX11_ABI=0 -fPIC ++else ifeq($(PLATFORM_ARCH),sw_64) ++ CFLAGS += -std=gnu++11 -march=native -Wall -Wextra -D_GLIBCXX_USE_CXX11_ABI=0 -fPIC ++else ++ CFLAGS += -std=gnu++11 -march=native -mcx16 -Wall -Wextra -D_GLIBCXX_USE_CXX11_ABI=0 -fPIC + endif + + CFLAGS += $(INCLUDE) +@@ -93,6 +94,8 @@ ifeq ($(UNDERPG), no) + ifeq ($(BUILD),Release) + ifeq ($(PLATFORM_ARCH),aarch64) + CFLAGS += -O2 -DNDEBUG -D_FORTIFY_SOURCE=2 ++ else ifeq ($(PLATFORM_ARCH),sw_64) ++ CFLAGS += -O2 -DNDEBUG -D_FORTIFY_SOURCE=2 + else + CFLAGS += -Werror -O2 -DNDEBUG -mcx16 -D_FORTIFY_SOURCE=2 + endif +diff --git a/openGauss-server-2.1.0/src/gausskernel/storage/mot/core/infra/synchronization/cycles.h b/openGauss-server-2.1.0/src/gausskernel/storage/mot/core/infra/synchronization/cycles.h +index 559ce1d..e42465d 100644 +--- a/openGauss-server-2.1.0/src/gausskernel/storage/mot/core/infra/synchronization/cycles.h ++++ b/openGauss-server-2.1.0/src/gausskernel/storage/mot/core/infra/synchronization/cycles.h +@@ -55,6 +55,12 @@ public: + unsigned long cval = 0; + asm volatile("isb; mrs %0, cntvct_el0" : "=r"(cval) : : "memory"); + return cval; ++/* modify by yjy */ ++#elif defined(__sw_64__) ++ unsigned long time_val = 0; ++ __asm__ __volatile__("rtc %0" : "=r"(time_val) : : "memory"); ++ return time_val; ++/* end */ + #else + #error "Unsupported CPU architecture or compiler." + #endif +@@ -75,6 +81,12 @@ public: + unsigned long cval = 0; + asm volatile("isb; mrs %0, cntvct_el0" : "=r"(cval) : : "memory"); + return cval; ++/* modify by yjy */ ++#elif defined(__sw_64__) ++ unsigned long time_val = 0; ++ __asm__ volatile("rtc %0" : "=r"(time_val) : : "memory"); ++ return time_val; ++/* end */ + #else + #error "Unsupported CPU architecture or compiler." + #endif +diff --git a/openGauss-server-2.1.0/src/gausskernel/storage/mot/core/infra/synchronization/mot_atomic_ops.h b/openGauss-server-2.1.0/src/gausskernel/storage/mot/core/infra/synchronization/mot_atomic_ops.h +index 2c57cbf..7c628e3 100644 +--- a/openGauss-server-2.1.0/src/gausskernel/storage/mot/core/infra/synchronization/mot_atomic_ops.h ++++ b/openGauss-server-2.1.0/src/gausskernel/storage/mot/core/infra/synchronization/mot_atomic_ops.h +@@ -65,4 +65,4 @@ + /** @define Atomic compare-and-swap. Performs the operation "if (v == curr_value) then v = new_value". */ + #define MOT_ATOMIC_CAS(v, curr_value, new_value) __sync_bool_compare_and_swap(&v, curr_value, new_value) + +-#endif /* MM_ATOMIC_OPS_H */ +\ No newline at end of file ++#endif /* MM_ATOMIC_OPS_H */ +diff --git a/openGauss-server-2.1.0/src/include/access/double_write_basic.h b/openGauss-server-2.1.0/src/include/access/double_write_basic.h +index 0543ca2..7b1f55d 100644 +--- a/openGauss-server-2.1.0/src/include/access/double_write_basic.h ++++ b/openGauss-server-2.1.0/src/include/access/double_write_basic.h +@@ -109,6 +109,8 @@ typedef unsigned char slock_t; + + #if defined(__aarch64__) || defined(__aarch64) + typedef int slock_t; ++#elif defined(__sw_64__) //modify by yjy ++typedef unsigned long slock_t; + #endif + + typedef uintptr_t Datum; +diff --git a/openGauss-server-2.1.0/src/include/access/extreme_rto/dispatcher.h b/openGauss-server-2.1.0/src/include/access/extreme_rto/dispatcher.h +index 5890af2..41eb8fa 100644 +--- a/openGauss-server-2.1.0/src/include/access/extreme_rto/dispatcher.h ++++ b/openGauss-server-2.1.0/src/include/access/extreme_rto/dispatcher.h +@@ -105,7 +105,7 @@ typedef struct RecordBufferAarray { + typedef struct { + uint64 curPosition; + XLogRecPtr curLsn; +-#if (!defined __x86_64__) && (!defined __aarch64__) ++#if (!defined __x86_64__) && (!defined __aarch64__) && (!defined __sw_64__) //add sw_64 modify bu yjy + /* protects lastReplayedReadRecPtr and lastReplayedEndRecPtr */ + slock_t ptrLck; + #endif +diff --git a/openGauss-server-2.1.0/src/include/access/extreme_rto/page_redo.h b/openGauss-server-2.1.0/src/include/access/extreme_rto/page_redo.h +index 6dc938a..8bbf855 100644 +--- a/openGauss-server-2.1.0/src/include/access/extreme_rto/page_redo.h ++++ b/openGauss-server-2.1.0/src/include/access/extreme_rto/page_redo.h +@@ -65,7 +65,7 @@ struct PageRedoWorker { + */ + XLogRecPtr lastReplayedReadRecPtr; + XLogRecPtr lastReplayedEndRecPtr; +-#if (!defined __x86_64__) && (!defined __aarch64__) ++#if (!defined __x86_64__) && (!defined __aarch64__) && (!defined __sw_64__) //add sw_64 modify by yjy + /* protects lastReplayedReadRecPtr and lastReplayedEndRecPtr */ + slock_t ptrLck; + #endif +diff --git a/openGauss-server-2.1.0/src/include/access/parallel_recovery/page_redo.h b/openGauss-server-2.1.0/src/include/access/parallel_recovery/page_redo.h +index 3e0a720..eccef33 100644 +--- a/openGauss-server-2.1.0/src/include/access/parallel_recovery/page_redo.h ++++ b/openGauss-server-2.1.0/src/include/access/parallel_recovery/page_redo.h +@@ -61,7 +61,7 @@ struct PageRedoWorker { + */ + XLogRecPtr lastReplayedReadRecPtr; + XLogRecPtr lastReplayedEndRecPtr; +-#if (!defined __x86_64__) && (!defined __aarch64__) ++#if (!defined __x86_64__) && (!defined __aarch64__) //add sw_64 modify by yjy + /* protects lastReplayedReadRecPtr and lastReplayedEndRecPtr */ + slock_t ptrLck; + #endif +diff --git a/openGauss-server-2.1.0/src/include/communication/commproxy_interface.h b/openGauss-server-2.1.0/src/include/communication/commproxy_interface.h +index c42cc43..7a1beb6 100644 +--- a/openGauss-server-2.1.0/src/include/communication/commproxy_interface.h ++++ b/openGauss-server-2.1.0/src/include/communication/commproxy_interface.h +@@ -416,7 +416,17 @@ extern bool comm_compare_and_swap_32(volatile int32* dest, int32 oldval, int32 n + + #define gaussdb_numa_memory_bind(i) + #define gaussdb_numa_memory_unbind() ++/* modify by yjy */ ++#elif defined(__sw_64__) ++#define gaussdb_memory_barrier() \ ++ __asm__ __volatile__ ("memb" : : : "memory") ++ ++#define gaussdb_read_barrier() gaussdb_memory_barrier() ++#define gaussdb_write_barrier() gaussdb_memory_barrier() + ++#define gaussdb_numa_memory_bind(i) ++#define gaussdb_numa_memory_unbind() ++/* end */ + #elif defined(__i386__) + #define gaussdb_memory_barrier() \ + __asm__ __volatile__ ("lock; addl $0,0(%%esp)" : : : "memory") +diff --git a/openGauss-server-2.1.0/src/include/gtm/gtm_atomic.h b/openGauss-server-2.1.0/src/include/gtm/gtm_atomic.h +index 35e8fb9..affb5e6 100644 +--- a/openGauss-server-2.1.0/src/include/gtm/gtm_atomic.h ++++ b/openGauss-server-2.1.0/src/include/gtm/gtm_atomic.h +@@ -169,6 +169,10 @@ static inline void GTM_loadStoreFence() + #ifdef __aarch64__ + + __asm__ __volatile__("DMB ish" ::: "memory"); ++/* modify by yjy */ ++#elif defined(__sw_64__) ++ __asm__ __volatile__("memb" ::: "memory"); ++/* end */ + #else + __asm__ __volatile__("lfence" ::: "memory"); + __asm__ __volatile__("sfence" ::: "memory"); +@@ -177,11 +181,19 @@ static inline void GTM_loadStoreFence() + + static inline void GTM_loadFence() + { ++/* modify */ ++#ifndef __sw_64__ + __asm__ __volatile__("lfence" ::: "memory"); ++#endif ++/* end */ + } + + static inline void GTM_StoreFence() + { ++/* modify */ ++#ifndef __sw_64__ + __asm__ __volatile__("sfence" ::: "memory"); ++#endif ++/* end */ + } + #endif /* CODE_SRC_INCLUDE_GTM_GTM_ATOMIC_H_ */ +diff --git a/openGauss-server-2.1.0/src/include/gtm/gtm_slock.h b/openGauss-server-2.1.0/src/include/gtm/gtm_slock.h +index 1ba3e64..207b71e 100644 +--- a/openGauss-server-2.1.0/src/include/gtm/gtm_slock.h ++++ b/openGauss-server-2.1.0/src/include/gtm/gtm_slock.h +@@ -585,6 +585,45 @@ static __inline__ int tas(volatile slock_t* lock) + + #endif /* __ns32k__ */ + ++/* modify by yjy */ ++#if defined(__sw_64__) ++#define HAS_TEST_AND_SET ++typedef unsigned long slock_t; ++#define TAS(lock) tas(lock) ++ ++static __inline__ int tas(volatile slock_t* lock) ++{ ++ register slock_t _res; ++ unsigned long tmp; ++ __asm__ __volatile__( ++ " ldl $0, %1 \n" ++ " bne $0, 2f \n" ++ " lldl %0, %1 \n" ++ " cmpeq %0, 0,%2\n" ++ " wr_f %2 \n" ++ " mov %2, $0 \n" ++ " lstl $0, %1 \n" ++ " rd_f $0 \n" ++ " beq %2, 2f \n" ++ " beq $0, 2f \n" ++ " memb \n" ++ " br 3f \n" ++ "2: mov 1, %0 \n" ++ "3: \n" ++ :"=&r"(_res), "+m"(*lock),"=&r"(tmp) ++ : ++ :"memory", "0"); ++ return (int)_res; ++} ++ ++#define S_UNLOCK(lock) \ ++ do { \ ++ __asm__ __volatile__("memb \n"); \ ++ *((volatile slock_t*)(lock)) = 0; \ ++ } while (0) ++#endif ++/* end */ ++ + #if defined(__alpha) || defined(__alpha__) /* Alpha */ + /* + * Correct multi-processor locking methods are explained in section 5.5.3 +diff --git a/openGauss-server-2.1.0/src/include/storage/lock/s_lock.h b/openGauss-server-2.1.0/src/include/storage/lock/s_lock.h +index 6a64c9d..929fec9 100644 +--- a/openGauss-server-2.1.0/src/include/storage/lock/s_lock.h ++++ b/openGauss-server-2.1.0/src/include/storage/lock/s_lock.h +@@ -97,7 +97,7 @@ + + #include "storage/lock/pg_sema.h" + +-#if !defined(ENABLE_THREAD_CHECK) || defined(__aarch64__) ++#if !defined(ENABLE_THREAD_CHECK) || defined(__aarch64__) || defined(__sw_64__) + + #ifdef HAVE_SPINLOCKS /* skip spinlocks if requested */ + +@@ -606,6 +606,45 @@ static __inline__ int tas(volatile slock_t* lock) + + #endif /* __ns32k__ */ + ++/* modify by yjy */ ++#if defined(__sw_64) || defined(__sw_64__) ++#define HAS_TEST_AND_SET ++typedef unsigned long slock_t; ++#define TAS(lock) tas(lock) ++ ++static __inline__ int tas(volatile slock_t* lock) ++{ ++ register slock_t _res; ++ unsigned long tmp; ++ __asm__ __volatile__( ++ " ldl $0, %1 \n" ++ " bne $0, 2f \n" ++ " lldl %0, %1 \n" ++ " cmpeq %0, 0,%2\n" ++ " wr_f %2 \n" ++ " mov %2, $0 \n" ++ " lstl $0, %1 \n" ++ " rd_f $0 \n" ++ " beq %2, 2f \n" ++ " beq $0, 2f \n" ++ " memb \n" ++ " br 3f \n" ++ "2: mov 1, %0 \n" ++ "3: \n" ++ :"=&r"(_res), "+m"(*lock),"=&r"(tmp) ++ : ++ :"memory", "0"); ++ return (int)_res; ++} ++ ++#define S_UNLOCK(lock) \ ++ do { \ ++ __asm__ __volatile__("memb \n"); \ ++ *((volatile slock_t*)(lock)) = 0; \ ++ } while (0) ++#endif ++/* end */ ++ + #if defined(__alpha) || defined(__alpha__) /* Alpha */ + /* + * Correct multi-processor locking methods are explained in section 5.5.3 +diff --git a/openGauss-server-2.1.0/src/include/utils/atomic.h b/openGauss-server-2.1.0/src/include/utils/atomic.h +index 510a695..c64ec40 100644 +--- a/openGauss-server-2.1.0/src/include/utils/atomic.h ++++ b/openGauss-server-2.1.0/src/include/utils/atomic.h +@@ -504,6 +504,9 @@ static inline uint128_u atomic_compare_and_swap_u128( + { + #ifdef __aarch64__ + return arm_compare_and_swap_u128(ptr, oldval, newval); ++#elif defined(__sw_64__) ++ uint128_u ret; ++ return ret; + #else + uint128_u ret; + ret.u128 = __sync_val_compare_and_swap(&ptr->u128, oldval.u128, newval.u128); +diff --git a/openGauss-server-2.1.0/src/test/regress/pg_regress.cpp b/openGauss-server-2.1.0/src/test/regress/pg_regress.cpp +index 859d430..42f0590 100644 +--- a/openGauss-server-2.1.0/src/test/regress/pg_regress.cpp ++++ b/openGauss-server-2.1.0/src/test/regress/pg_regress.cpp +@@ -6589,6 +6589,10 @@ int regression_main(int argc, char* argv[], init_function ifunc, test_function t + (void)snprintf(pgbenchdir, MAXPGPATH, "%s/%s", ".", "data/pgbench/x86_64"); + #elif defined (__aarch64__) + (void)snprintf(pgbenchdir, MAXPGPATH, "%s/%s", ".", "data/pgbench/aarch64"); ++/* modify by yjy */ ++#elif defined (__sw_64__) ++ (void)snprintf(pgbenchdir, MAXPGPATH, "%s/%s", ".", "data/pgbench/sw_64"); ++/* endif */ + #endif + + /* Check thread local varieble's num */ +diff --git a/protobuf-3.11.3/cmake/CMakeLists.txt b/protobuf-3.11.3/cmake/CMakeLists.txt +index 8e5e680..f3b7046 100644 +--- a/protobuf-3.11.3/cmake/CMakeLists.txt ++++ b/protobuf-3.11.3/cmake/CMakeLists.txt +@@ -138,7 +138,8 @@ set(protobuf_LINK_LIBATOMIC false) + if (NOT MSVC) + include(CheckCXXSourceCompiles) + set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) +- set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS} -std=c++11) ++ #set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS} -std=c++11) ++ set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS} -std=gnu++11) + check_cxx_source_compiles(" + #include + int main() { +diff --git a/protobuf-3.11.3/kokoro/release/protoc/linux/build.sh b/protobuf-3.11.3/kokoro/release/protoc/linux/build.sh +index d165a89..cf13b49 100755 +--- a/protobuf-3.11.3/kokoro/release/protoc/linux/build.sh ++++ b/protobuf-3.11.3/kokoro/release/protoc/linux/build.sh +@@ -19,6 +19,8 @@ git submodule update --init --recursive + sudo apt install -y g++-aarch64-linux-gnu + protoc-artifacts/build-protoc.sh linux aarch_64 protoc + ++protoc-artifacts/build-protoc.sh linux sw_64 protoc ++ + sudo apt install -y g++-powerpc64le-linux-gnu + protoc-artifacts/build-protoc.sh linux ppcle_64 protoc + +diff --git a/protobuf-3.11.3/protoc-artifacts/build-protoc.sh b/protobuf-3.11.3/protoc-artifacts/build-protoc.sh +index 6ad2ea1..268a3e3 100755 +--- a/protobuf-3.11.3/protoc-artifacts/build-protoc.sh ++++ b/protobuf-3.11.3/protoc-artifacts/build-protoc.sh +@@ -11,6 +11,7 @@ + # cygwin windows x86_32 Requires: i686-w64-mingw32-gcc + # cygwin windows x86_64 Requires: x86_64-w64-mingw32-gcc + # linux linux aarch_64 Requires: g++-aarch64-linux-gnu ++# linux linux sw_64 + # linux linux x86_32 + # linux linux x86_64 + # linux windows x86_32 Requires: i686-w64-mingw32-gcc +@@ -162,6 +163,9 @@ checkDependencies () + elif [[ "$ARCH" == aarch_64 ]]; then + dump_cmd='objdump -p '"$1"' | grep NEEDED' + white_list="libpthread\.so\.0\|libm\.so\.6\|libc\.so\.6\|ld-linux-aarch64\.so\.1" ++ elif [[ "$ARCH" == sw_64 ]]; then ++ dump_cmd='objdump -p '"$1"' | grep NEEDED' ++ white_list="libpthread\.so\.0\|libm\.so\.6\.1\|libc\.so\.6\.1\|ld-linux\.so\.2" + fi + elif [[ "$OS" == osx ]]; then + dump_cmd='otool -L '"$1"' | fgrep dylib' +@@ -223,6 +227,8 @@ elif [[ "$(uname)" == Linux* ]]; then + CXXFLAGS="$CXXFLAGS -m32" + elif [[ "$ARCH" == aarch_64 ]]; then + CONFIGURE_ARGS="$CONFIGURE_ARGS --host=aarch64-linux-gnu" ++ elif [[ "$ARCH" == sw_64 ]]; then ++ CONFIGURE_ARGS="$CONFIGURE_ARGS --host=sw_64-linux-gnu" + elif [[ "$ARCH" == ppcle_64 ]]; then + CXXFLAGS="$CXXFLAGS -m64" + CONFIGURE_ARGS="$CONFIGURE_ARGS --host=powerpc64le-linux-gnu" +diff --git a/protobuf-3.11.3/src/google/protobuf/stubs/platform_macros.h b/protobuf-3.11.3/src/google/protobuf/stubs/platform_macros.h +index ce1b1e3..fd482f9 100644 +--- a/protobuf-3.11.3/src/google/protobuf/stubs/platform_macros.h ++++ b/protobuf-3.11.3/src/google/protobuf/stubs/platform_macros.h +@@ -56,6 +56,9 @@ + #elif defined(__aarch64__) + #define GOOGLE_PROTOBUF_ARCH_AARCH64 1 + #define GOOGLE_PROTOBUF_ARCH_64_BIT 1 ++#elif defined(__sw_64__) ++#define GOOGLE_PROTOBUF_ARCH_SW_64 1 ++#define GOOGLE_PROTOBUF_ARCH_64_BIT 1 + #elif defined(__mips__) + #if defined(__LP64__) + #define GOOGLE_PROTOBUF_ARCH_MIPS64 1 +diff --git a/zlib-1.2.11/configure b/zlib-1.2.11/configure +index e974d1f..027ba8c 100755 +--- a/zlib-1.2.11/configure ++++ b/zlib-1.2.11/configure +@@ -391,13 +391,13 @@ tryboth() + cat > $test.c << EOF + int foo() { return 0; } + EOF +-echo "Checking for obsessive-compulsive compiler options..." >> configure.log +-if try $CC -c $CFLAGS $test.c; then +- : +-else +- echo "Compiler error reporting is too harsh for $0 (perhaps remove -Werror)." | tee -a configure.log +- leave 1 +-fi ++#echo "Checking for obsessive-compulsive compiler options..." >> configure.log ++#if try $CC -c $CFLAGS $test.c; then ++# : ++#else ++# echo "Compiler error reporting is too harsh for $0 (perhaps remove -Werror)." | tee -a configure.log ++# leave 1 ++#fi + + echo >> configure.log + +-- +2.27.0 + diff --git a/opengauss-server.spec b/opengauss-server.spec old mode 100755 new mode 100644 index 3511a88..d5eef59 --- a/opengauss-server.spec +++ b/opengauss-server.spec @@ -12,7 +12,7 @@ Name: opengauss Version: 2.1.0 -Release: 8 +Release: 9 Summary: openGauss is an open source relational database management system License: MulanPSL-2.0 and MIT and BSD and zlib and TCL and Apache-2.0 and BSL-1.0 URL: https://gitee.com/opengauss/openGauss-server @@ -34,6 +34,7 @@ Patch23: makefile-miniunz.patch Patch40: 0001-orc.patch Patch41: 0002-add-kylinsec-platform.patch +Patch3000: 3000-add-sw_64-support.patch BuildRequires: cmake gcc gcc-c++ openssl-devel python BuildRequires: cjson lz4-devel protobuf-devel snappy-devel zstd-devel boost-devel BuildRequires: libcgroup-devel libcurl-devel unixODBC-devel jemalloc-devel @@ -42,6 +43,9 @@ BuildRequires: bison flex DCF %ifnarch aarch64 %{arm} BuildRequires: numactl-devel %endif +%ifarch sw_64 +BuildRequires: libatomic +%endif %global _privatelibs lib(cjson|ecpg|z|pg|pq)\\.so* %global __provides_exclude %{_privatelibs} @@ -87,6 +91,9 @@ pushd %{orc_name}-%{orc_version} popd %patch41 -p1 +%ifarch sw_64 +%patch3000 -p1 +%endif %build ########### build cjson ########### build_target=$(pwd)/deps_binarylibs @@ -102,12 +109,18 @@ CONFIGURE_EXTRA_FLAG="--64" %ifarch aarch64 CONFIGURE_EXTRA_FLAG="" %endif +%ifarch sw_64 + CONFIGURE_EXTRA_FLAG="" +%endif ./configure ${CONFIGURE_EXTRA_FLAG} --prefix=${build_target}/zlib sed -i '21a CFLAGS += -fPIC' Makefile MAKE_EXTRA_FLAG="-m64" %ifarch aarch64 MAKE_EXTRA_FLAG="" %endif +%ifarch sw_64 + MAKE_EXTRA_FLAG="" +%endif make CFLAGS="-fPIE -fPIC" SFLAGS="-O2 -fPIC -fstack-protector-strong -Wl,-z,noexecstack -Wl,-z,relro,-z,now ${MAKE_EXTRA_FLAG} -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN" %{?_smp_mflags} make install cd contrib/minizip/ @@ -155,7 +168,11 @@ popd pushd openGauss-server-%{version} chmod +x ./configure ./configure \ +%ifarch sw_64 +CC=g++ CFLAGS='-O0' \ +%else CC=g++ CFLAGS='-O2' \ +%endif --prefix=%{apppath} \ --3rd=${build_target} \ --enable-thread-safety \ @@ -303,7 +320,10 @@ fi %changelog -* Tue Jun 6 2023 dillon chen -2.1.0-8 +* Fri Aug 18 2023 panchenbo - 2.1.0-9 +- add sw_64 support + +* Tue Jun 6 2023 dillon chen - 2.1.0-8 - Fix bugs: #I677QX; add lsof * Mon Apr 10 2023 panchenbo - 2.1.0-7 -- Gitee