Source: python-greenlet
Version: 3.0.1-3
Severity: normal
Tags: patch
User: debian-sup...@lists.debian.org
Usertags: sh4
X-Debbugs-Cc: debian-sup...@lists.debian.org

Hi,

the attached patch adds support for building python-greenlet on sh4, it's
a modified (fixed) version that is currently open for review upstream [1].

The fixed version can be found here [2].

Thanks,
Adrian

> [1] https://github.com/python-greenlet/greenlet/pull/398
> [2] 
> https://github.com/glaubitz/greenlet/commit/e73592dec7950ad9fcdb5c0287ef3758df010f11

--
 .''`.  John Paul Adrian Glaubitz
: :' :  Debian Developer
`. `'   Physicist
  `-    GPG: 62FF 8A75 84E0 2956 9546  0006 7426 3B37 F5B5 F913
>From e73592dec7950ad9fcdb5c0287ef3758df010f11 Mon Sep 17 00:00:00 2001
From: Pietro Monteiro <pie...@sociotechnical.xyz>
Date: Wed, 6 Mar 2024 21:59:14 -0500
Subject: [PATCH] Add support for SuperH

---
 src/greenlet/platform/switch_sh_gcc.h | 36 +++++++++++++++++++++++++++
 src/greenlet/slp_platformselect.h     |  2 ++
 2 files changed, 38 insertions(+)
 create mode 100644 src/greenlet/platform/switch_sh_gcc.h

diff --git a/src/greenlet/platform/switch_sh_gcc.h 
b/src/greenlet/platform/switch_sh_gcc.h
new file mode 100644
index 0000000..5ecc3b3
--- /dev/null
+++ b/src/greenlet/platform/switch_sh_gcc.h
@@ -0,0 +1,36 @@
+#define STACK_REFPLUS 1
+
+#ifdef SLP_EVAL
+#define STACK_MAGIC 0
+#define REGS_TO_SAVE "r8", "r9", "r10", "r11", "r13", \
+                     "fr12", "fr13", "fr14", "fr15"
+
+// r12 Global context pointer, GP
+// r14 Frame pointer, FP
+// r15 Stack pointer, SP
+
+static int
+slp_switch(void)
+{
+    int err;
+    void* fp;
+    int *stackref, stsizediff;
+    __asm__ volatile("" : : : REGS_TO_SAVE);
+    __asm__ volatile("mov.l r14, %0" : "=m"(fp) : :);
+    __asm__("mov r15, %0" : "=r"(stackref));
+    {
+        SLP_SAVE_STATE(stackref, stsizediff);
+        __asm__ volatile(
+            "add %0, r15\n"
+            "add %0, r14\n"
+            : /* no outputs */
+            : "r"(stsizediff));
+        SLP_RESTORE_STATE();
+        __asm__ volatile("mov r0, %0" : "=r"(err) : :);
+    }
+    __asm__ volatile("mov.l %0, r14" : : "m"(fp) :);
+    __asm__ volatile("" : : : REGS_TO_SAVE);
+    return err;
+}
+
+#endif
diff --git a/src/greenlet/slp_platformselect.h 
b/src/greenlet/slp_platformselect.h
index c959f0f..8a77328 100644
--- a/src/greenlet/slp_platformselect.h
+++ b/src/greenlet/slp_platformselect.h
@@ -64,6 +64,8 @@ extern "C" {
 # include "platform/switch_aarch64_gcc.h" /* LLVM Aarch64 ABI for Windows */
 #elif defined(__GNUC__) && defined(__loongarch64) && defined(__linux__)
 # include "platform/switch_loongarch64_linux.h" /* LoongArch64 */
+#elif defined(__GNUC__) && defined(__sh__)
+# include "platform/switch_sh_gcc.h" /* SuperH */
 #endif
 
 #ifdef __cplusplus
-- 
2.44.0

Reply via email to