Bug#1059602: sphde: pleas add support for loong64
Source: sphde
Followup-For: Bug #1059602
X-Debbugs-Cc: debian-loongarch@lists.debian.org
Dear Maintainer,
Make a patch based on the upstream merged PR and pass the local test
wuruilong
--- /dev/null
+++ sphde-1.4.0/ChangeLog.md
@@ -0,0 +1 @@
+# ChangeLog
--- sphde-1.4.0.orig/config.sub
+++ sphde-1.4.0/config.sub
@@ -268,6 +268,7 @@ case $basic_machine in
| k1om \
| le32 | le64 \
| lm32 \
+ | loongarch \
| m32c | m32r | m32rle | m68000 | m68k | m88k \
| maxq | mb | microblaze | microblazeel | mcore | mep | metag \
| mips | mipsbe | mipseb | mipsel | mipsle \
--- sphde-1.4.0.orig/src/sasatom.h
+++ sphde-1.4.0/src/sasatom.h
@@ -41,6 +41,8 @@ typedef void* sas_lock_ptr_t;
#include "sasatom_x86_64.h"
#elif defined(__i386__)
#include "sasatom_i386.h"
+#elif defined(__loongarch__)
+#include "sasatom_loongarch.h"
#else
#include "sasatom_generic.h"
#endif
--- /dev/null
+++ sphde-1.4.0/src/sasatom_loongarch.h
@@ -0,0 +1,181 @@
+/*
+ * Copyright (c) 1995-2014 IBM Corporation.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+
+#ifndef _SASATOMIC_LOONGARCH_H
+#define _SASATOMIC_LOONGARCH_H
+
+#define __arch_sas_write_barrier() __sync_synchronize()
+#define __arch_sas_read_barrier() __sync_synchronize()
+#define __arch_sas_full_barrier() __sync_synchronize()
+
+static inline void
+__arch_pause (void)
+{
+ __asm__ (
+ " nop;"
+ :
+ :
+ : "memory"
+ );
+}
+
+#if GCC_VERSION >= 40700
+static inline void *
+__arch_fetch_and_add_ptr(void **pointer, long int delta)
+{
+ return __atomic_fetch_add (pointer, delta, __ATOMIC_RELAXED);
+}
+#else
+static inline void *
+__arch_fetch_and_add_ptr(void **pointer, long int delta)
+{
+ return (void*)__sync_fetch_and_add((long int*)*pointer, delta);
+}
+#endif
+
+#if GCC_VERSION >= 40700
+static inline long int
+__arch_fetch_and_add(long int *pointer, long int delta)
+{
+ return __atomic_fetch_add (pointer, delta, __ATOMIC_RELAXED);
+}
+#else
+static inline long int
+__arch_fetch_and_add(void *pointer, long int delta)
+{
+ return __sync_fetch_and_add((long int*)pointer, delta);
+}
+#endif
+
+#if GCC_VERSION >= 40700
+static inline int
+__arch_compare_and_swap (volatile long int *pointer,
+ long int oldval, long int newval)
+{
+ long int temp = oldval;
+ return __atomic_compare_exchange_n (pointer, &temp, newval, 1, __ATOMIC_ACQUIRE, __ATOMIC_RELAXED);
+}
+#else
+static inline int
+__arch_compare_and_swap (volatile long int *p, long int oldval, long int newval)
+{
+ return __sync_val_compare_and_swap(p, oldval, newval);
+}
+#endif
+
+#if GCC_VERSION >= 40700
+static inline long int
+__arch_atomic_swap (long int *pointer, long int replace)
+{
+ return __atomic_exchange_n (pointer, replace, __ATOMIC_RELAXED);
+}
+#else
+static inline long int __arch_atomic_swap(long int *p, long int replace)
+{
+ long temp = *p;
+ int success = 0;
+ //*p = replace;
+ do {
+ temp = *p;
+ success = __sync_bool_compare_and_swap (p, temp, replace);
+ }while (!success);
+
+ return temp;
+}
+#endif
+
+#if GCC_VERSION >= 40700
+static inline void
+__arch_atomic_inc(long int *pointer)
+{
+ const long int inc_val = 1L;
+
+ __atomic_fetch_add (pointer, inc_val, __ATOMIC_RELAXED);
+}
+#else
+static inline void
+__arch_atomic_inc (long int *pointer)
+{
+ const long int inc_val = 1L;
+ //(*p)++;
+ __sync_fetch_and_add (pointer, inc_val);
+}
+#endif
+
+#if GCC_VERSION >= 40700
+static inline void
+__arch_atomic_dec(long int *pointer)
+{
+ const long int inc_val = -1L;
+
+ __atomic_fetch_add (pointer, inc_val, __ATOMIC_RELAXED);
+}
+#else
+static inline void
+__arch_atomic_dec (long int *pointer)
+{
+ const long int inc_val = -1L;
+ //(*p)--;
+ __sync_fetch_and_add (pointer, inc_val);
+}
+#endif
+
+#if GCC_VERSION >= 40700
+static inline void
+__arch_sas_spin_lock (volatile sas_spin_lock_t *lock)
+{
+ int oldval = 0;
+ int newval = 1;
+ int success = 0;
+
+ do {
+ success = __atomic_compare_exchange_n (lock, &oldval, newval, 1,
+ __ATOMIC_ACQUIRE, __ATOMIC_RELAXED);
+ } while (!success);
+}
+#else
+static inline void
+__arch_sas_spin_lock (volatile sas_spin_lock_t *lock)
+{
+ int oldval = 0;
+ int newval = 1;
+ int success = 0;
+
+ do {
+ success = __sync_bool_compare_and_swap (lock, oldval, newval);
+ } while (!success);
+}
+#endif
+
+#if GCC_VERSION >= 40700
+static inline int
+__arch_sas_spin_trylock (volatile sas_spin_lock_t *lock)
+{
+ int oldval = 0;
+ int newval = 1;
+ int success = 0;
+
+ success = __atomic_compare_exchange_n (lock, &oldval, newval, 1,
+ __ATOMIC_ACQUIRE, __ATOMIC_RELAXED);
+
+ return (!success);
+}
+#else
+static inline int
+__arch_sas_spin_trylock (volatile sas_spin_lock_t *lock)
+{
+ int oldval = 0;
+ int newval = 1;
+ int success;
+
+ success = __sync_bool_compare_and_swap (lock, oldval, newval);
+
+ return (!success);
+}
+#endif
+#endif // _SASATOMIC_LOONGARCH_H
--- sphde-1.4.0.orig/src/sasconf.h
+++ sphde-1.4.0/src/sasconf.h
@@ -108,6 +108,14 @@
# endif
#endif
+#ifdef __loongarch__
+# define __WORDSIZE_64
+# define __SAS_BASE_ADDRESS 0x4000000000L
+# define RegionSize 0x2000000000L /* 128GB */
+# define SegmentSize 0x0010000000L /* 256MB */
+# define __SAS_SHMAP_MAX 0x0001000000L /* 16MB */
+#endif
+
/*
* If the platform is not recognized above, select some resonable default.
*/
--- sphde-1.4.0.orig/src/sassim.cpp
+++ sphde-1.4.0/src/sassim.cpp
@@ -125,7 +125,8 @@ typedef struct
#if defined (__x86_64__) || \
(defined (__LITTLE_ENDIAN__) && defined (__powerpc64__)) \
|| defined (__aarch64__) || defined (__arm__) \
- || ((__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) && defined(__mips64))
+ || ((__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) && defined(__mips64)) \
+ || defined (__loongarch__)
unsigned long offset:56;
unsigned int size:8;
#else
Reply to: