From 1d1ba5da4366f12a8bc020d5d0432030cd890db2 Mon Sep 17 00:00:00 2001
From: panchenbo <panchenbo@kylinsec.com.cn>
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 <sys/syscall.h>
+#include <sys/errno.h>
+#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 <arm_acle.h>
+#elif defined(__sw_64__)
 #else
 #include <nmmintrin.h>
 #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 <atomic>
     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

