File og-more-arch-support.patch of Package opengauss

diff --git a/src/common/port/CMakeLists.txt b/src/common/port/CMakeLists.txt
index b9a6a28..e511eb0 100755
--- a/src/common/port/CMakeLists.txt
+++ b/src/common/port/CMakeLists.txt
@@ -90,10 +90,31 @@ if("${BUILD_TUPLE}" STREQUAL "aarch64")
     set(TGT_crc32_arm_parallel_SRC ${CMAKE_CURRENT_SOURCE_DIR}/crc32_arm_parallel.S)
 endif()
 
+if("${BUILD_TUPLE}" STREQUAL "armv7l")
+    list(REMOVE_ITEM TGT_port_SRC ${CMAKE_CURRENT_SOURCE_DIR}/pg_crc32c_sb8.cpp ${CMAKE_CURRENT_SOURCE_DIR}/pg_crc32c_sse42.cpp)
+    set(TGT_crc32_arm_parallel_SRC ${CMAKE_CURRENT_SOURCE_DIR}/crc32_arm_parallel.S)
+endif()
+
 if("${BUILD_TUPLE}" STREQUAL "loongarch64")
     list(REMOVE_ITEM TGT_port_SRC ${CMAKE_CURRENT_SOURCE_DIR}/pg_crc32c_choose.cpp ${CMAKE_CURRENT_SOURCE_DIR}/pg_crc32c_sse42.cpp)
 endif()
 
+if("${BUILD_TUPLE}" STREQUAL "riscv64")
+    list(REMOVE_ITEM TGT_port_SRC ${CMAKE_CURRENT_SOURCE_DIR}/pg_crc32c_choose.cpp ${CMAKE_CURRENT_SOURCE_DIR}/pg_crc32c_sse42.cpp)
+endif()
+
+if("${BUILD_TUPLE}" STREQUAL "ppc64le")
+    list(REMOVE_ITEM TGT_port_SRC ${CMAKE_CURRENT_SOURCE_DIR}/pg_crc32c_choose.cpp ${CMAKE_CURRENT_SOURCE_DIR}/pg_crc32c_sse42.cpp)
+endif()
+
+if("${BUILD_TUPLE}" STREQUAL "s390x")
+    list(REMOVE_ITEM TGT_port_SRC ${CMAKE_CURRENT_SOURCE_DIR}/pg_crc32c_choose.cpp ${CMAKE_CURRENT_SOURCE_DIR}/pg_crc32c_sse42.cpp)
+endif()
+
+if("${BUILD_TUPLE}" STREQUAL "i586")
+    list(REMOVE_ITEM TGT_port_SRC ${CMAKE_CURRENT_SOURCE_DIR}/pg_crc32c_choose.cpp ${CMAKE_CURRENT_SOURCE_DIR}/pg_crc32c_sse42.cpp)
+endif()
+
 SET(TGT_pgport_INC 
     ${PROJECT_SRC_DIR}/common/backend
     ${PROJECT_SRC_DIR}/common/port
@@ -163,10 +184,31 @@ if("${BUILD_TUPLE}" STREQUAL "aarch64")
     set(TGT_crc32_arm_parallel_srv_SRC ${CMAKE_CURRENT_SOURCE_DIR}/port_srv/crc32_arm_parallel.S)
 endif()
 
+if("${BUILD_TUPLE}" STREQUAL "armv7l")
+    list(REMOVE_ITEM TGT_pgport_srv_SRC ${CMAKE_CURRENT_SOURCE_DIR}/port_srv/pg_crc32c_sb8.cpp ${CMAKE_CURRENT_SOURCE_DIR}/port_srv/pg_crc32c_sse42.cpp)
+    set(TGT_crc32_arm_parallel_srv_SRC ${CMAKE_CURRENT_SOURCE_DIR}/port_srv/crc32_arm_parallel.S)
+endif()
+
 if("${BUILD_TUPLE}" STREQUAL "loongarch64")
     list(REMOVE_ITEM TGT_pgport_srv_SRC ${CMAKE_CURRENT_SOURCE_DIR}/port_srv/pg_crc32c_choose.cpp ${CMAKE_CURRENT_SOURCE_DIR}/port_srv/pg_crc32c_sse42.cpp)
 endif()
 
+if("${BUILD_TUPLE}" STREQUAL "riscv64")
+    list(REMOVE_ITEM TGT_pgport_srv_SRC ${CMAKE_CURRENT_SOURCE_DIR}/port_srv/pg_crc32c_choose.cpp ${CMAKE_CURRENT_SOURCE_DIR}/port_srv/pg_crc32c_sse42.cpp)
+endif()
+
+if("${BUILD_TUPLE}" STREQUAL "ppc64le")
+    list(REMOVE_ITEM TGT_pgport_srv_SRC ${CMAKE_CURRENT_SOURCE_DIR}/port_srv/pg_crc32c_choose.cpp ${CMAKE_CURRENT_SOURCE_DIR}/port_srv/pg_crc32c_sse42.cpp)
+endif()
+
+if("${BUILD_TUPLE}" STREQUAL "s390x")
+    list(REMOVE_ITEM TGT_pgport_srv_SRC ${CMAKE_CURRENT_SOURCE_DIR}/port_srv/pg_crc32c_choose.cpp ${CMAKE_CURRENT_SOURCE_DIR}/port_srv/pg_crc32c_sse42.cpp)
+endif()
+
+if("${BUILD_TUPLE}" STREQUAL "i586")
+    list(REMOVE_ITEM TGT_pgport_srv_SRC ${CMAKE_CURRENT_SOURCE_DIR}/port_srv/pg_crc32c_choose.cpp ${CMAKE_CURRENT_SOURCE_DIR}/port_srv/pg_crc32c_sse42.cpp)
+endif()
+
 SET(TGT_pgport_srv_INC 
     ${PROJECT_SRC_DIR}/common/backend
     ${PROJECT_SRC_DIR}/common/port

diff --git a/src/include/storage/lock/s_lock.h b/src/include/storage/lock/s_lock.h
index 715d84a..bf7b041 100644
--- a/src/include/storage/lock/s_lock.h
+++ b/src/include/storage/lock/s_lock.h
@@ -283,7 +283,7 @@ static __inline__ int tas(volatile slock_t* lock)
  * the int-width variant of the builtin works on more chips than other widths.
  */
 
-#if defined(__aarch64__) || defined(__aarch64)
+#if defined(__aarch64__) || defined(__aarch64) || defined(__riscv)
 
 #ifdef ENABLE_THREAD_CHECK
 extern "C" {
diff --git a/src/gausskernel/storage/buffer/bufmgr.cpp b/src/gausskernel/storage/buffer/bufmgr.cpp
index c6a4c2c2..3b71a381 100644
--- a/src/gausskernel/storage/buffer/bufmgr.cpp
+++ b/src/gausskernel/storage/buffer/bufmgr.cpp
@@ -1962,7 +1962,13 @@ Buffer ReadBuffer_common_for_localbuf(RelFileNode rnode, char relpersistence, Fo
 
         Assert(buf_state & BM_VALID);
         buf_state &= ~BM_VALID;
-        pg_atomic_write_u32(((volatile uint32 *)&bufHdr->state) + 1, buf_state >> 32);
+        pg_atomic_write_u32(
+#ifndef WORDS_BIGENDIAN
+            ((volatile uint32 *)&bufHdr->state) + 1,
+#else
+            ((volatile uint32 *)&bufHdr->state),
+#endif
+        buf_state >> 32);
     }
 
     /*
@@ -1986,7 +1992,13 @@ Buffer ReadBuffer_common_for_localbuf(RelFileNode rnode, char relpersistence, Fo
 
     uint64 buf_state = pg_atomic_read_u64(&bufHdr->state);
     buf_state |= BM_VALID;
-    pg_atomic_write_u32(((volatile uint32 *)&bufHdr->state) + 1, buf_state >> 32);
+        pg_atomic_write_u32(
+#ifndef WORDS_BIGENDIAN
+            ((volatile uint32 *)&bufHdr->state) + 1,
+#else
+            ((volatile uint32 *)&bufHdr->state),
+#endif
+        buf_state >> 32);
 
     return BufferDescriptorGetBuffer(bufHdr);
 }
@@ -2703,7 +2715,13 @@ found_branch:
 
             Assert(buf_state & BM_VALID);
             buf_state &= ~BM_VALID;
-            pg_atomic_write_u32(((volatile uint32 *)&bufHdr->state) + 1, buf_state >> 32);
+        pg_atomic_write_u32(
+#ifndef WORDS_BIGENDIAN
+            ((volatile uint32 *)&bufHdr->state) + 1,
+#else
+            ((volatile uint32 *)&bufHdr->state),
+#endif
+        buf_state >> 32);
         } else {
             /*
              * Loop to handle the very small possibility that someone re-sets
@@ -2856,7 +2874,13 @@ found_branch:
         uint64 buf_state = pg_atomic_read_u64(&bufHdr->state);
 
         buf_state |= BM_VALID;
-        pg_atomic_write_u32(((volatile uint32 *)&bufHdr->state) + 1, buf_state >> 32);
+        pg_atomic_write_u32(
+#ifndef WORDS_BIGENDIAN
+            ((volatile uint32 *)&bufHdr->state) + 1,
+#else
+            ((volatile uint32 *)&bufHdr->state),
+#endif
+        buf_state >> 32);
     } else {
         bufHdr->extra->lsn_on_disk = PageGetLSN(bufBlock);
 #ifdef USE_ASSERT_CHECKING
diff --git a/src/gausskernel/storage/lmgr/lwlock.cpp b/src/gausskernel/storage/lmgr/lwlock.cpp
index d84b4334..7b547c4d 100644
--- a/src/gausskernel/storage/lmgr/lwlock.cpp
+++ b/src/gausskernel/storage/lmgr/lwlock.cpp
@@ -893,7 +893,13 @@ static bool LWLockAttemptLock(LWLock *lock, LWLockMode mode)
             if ((desired_state & (LW_VAL_EXCLUSIVE)) != 0) {
                 return true;
             }
-        } while (!pg_atomic_compare_exchange_u8((((volatile uint8*)&lock->state) + maskId), ((uint8*)&old_state) + maskId, (desired_state >> (8 * maskId))));
+        } while (!pg_atomic_compare_exchange_u8(
+#ifndef WORDS_BIGENDIAN
+            (((volatile uint8*)&lock->state) + maskId), ((uint8*)&old_state) + maskId,
+#else
+            (((volatile uint8*)&lock->state) + sizeof(lock->state) - maskId - 1), ((uint8*)&old_state) + sizeof(lock->state) - maskId - 1,
+#endif
+        (desired_state >> (8 * maskId))));
     } else if (mode == LW_EXCLUSIVE) {
         old_state = pg_atomic_read_u64(&lock->state);
         do {
diff --git a/src/include/port/pg_bswap.h b/src/include/port/pg_bswap.h
index e82cb6be..51107e71 100644
--- a/src/include/port/pg_bswap.h
+++ b/src/include/port/pg_bswap.h
@@ -24,6 +24,11 @@
 #ifndef PG_BSWAP_H
 #define PG_BSWAP_H
 
+#ifdef __s390x__
+#define HAVE__BUILTIN_BSWAP32
+#define HAVE__BUILTIN_BSWAP64
+#endif // __s390x__
+
 #ifdef HAVE__BUILTIN_BSWAP32
 #define BSWAP32(x) __builtin_bswap32(x)
 #else
diff --git a/src/include/port/pg_crc32c.h b/src/include/port/pg_crc32c.h
index 1801e35e..a1519813 100644
--- a/src/include/port/pg_crc32c.h
+++ b/src/include/port/pg_crc32c.h
@@ -91,7 +91,7 @@ extern pg_crc32c (*pg_comp_crc32c)(pg_crc32c crc, const void* data, size_t len);
  */
 #define COMP_CRC32C(crc, data, len) ((crc) = pg_comp_crc32c_sb8((crc), (data), (len)))
 #ifdef WORDS_BIGENDIAN
-#define FIN_CRC32C(crc) ((crc) = pg_bswap32(crc) ^ 0xFFFFFFFF)
+#define FIN_CRC32C(crc) ((crc) = BSWAP32(crc) ^ 0xFFFFFFFF)
 #else
 #define FIN_CRC32C(crc) ((crc) ^= 0xFFFFFFFF)
 #endif
diff --git a/src/include/postgres.h b/src/include/postgres.h
index 15d4ade6..04cb1198 100644
--- a/src/include/postgres.h
+++ b/src/include/postgres.h
@@ -343,6 +343,7 @@ typedef enum {
 #define VARSIZE_4B(PTR) (((varattrib_4b*)(PTR))->va_4byte.va_header & 0x3FFFFFFF)
 #define VARSIZE_1B(PTR) (((varattrib_1b*)(PTR))->va_header & 0x7F)
 #define VARSIZE_1B_E(PTR) (((varattrib_1b_e*)(PTR))->va_len_1be)
+#define VARTAG_1B_E(PTR) (((varattrib_1b_e*) (PTR))->va_tag)
 
 #define SET_VARSIZE_4B(PTR, len) (((varattrib_4b*)(PTR))->va_4byte.va_header = (len)&0x3FFFFFFF)
 #define SET_VARSIZE_4B_C(PTR, len) (((varattrib_4b*)(PTR))->va_4byte.va_header = ((len)&0x3FFFFFFF) | 0x40000000)
diff --git a/src/include/storage/buf/buf_internals.h b/src/include/storage/buf/buf_internals.h
index 10063fa2..95e26e0c 100644
--- a/src/include/storage/buf/buf_internals.h
+++ b/src/include/storage/buf/buf_internals.h
@@ -282,6 +282,7 @@ extern "C" {
 #define TsAnnotateHappensBefore(addr)
 #endif
 
+#ifndef WORDS_BIGENDIAN
 #define UnlockBufHdr(desc, s)                                    \
     do {                                                         \
         /* ENABLE_THREAD_CHECK only, release semantic */         \
@@ -289,6 +290,15 @@ extern "C" {
         pg_write_barrier();                                      \
         pg_atomic_write_u32((((volatile uint32 *)&(desc)->state) + 1), ( ( (s) & (~BM_LOCKED) ) >> 32) ); \
     } while (0)
+#else
+#define UnlockBufHdr(desc, s)                                    \
+    do {                                                         \
+        /* ENABLE_THREAD_CHECK only, release semantic */         \
+        TsAnnotateHappensBefore(&desc->state);                   \
+        pg_write_barrier();                                      \
+        pg_atomic_write_u32((((volatile uint32 *)&(desc)->state)), ( ( (s) & (~BM_LOCKED) ) >> 32) ); \
+    } while (0)
+#endif
 
 #define FIX_SEG_BUFFER_TAG(node, tag, rel_node, block_num) \
     do {                                              \
openSUSE Build Service is sponsored by