[newlib-cygwin] Cygwin: implement spinlock pause for AArch64

Jeremy Drake via Cygwin-cvs <[email protected]>
Newsgroups gmane.os.cygwin.cvs
Message-ID <[email protected]>
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=557e7cf22612e3a9e2d8abe032c0c57a39029ad3

commit 557e7cf22612e3a9e2d8abe032c0c57a39029ad3
Author: Radek Bartoň <[email protected]>
Date:   Thu Jun 5 12:41:37 2025 +0200

    Cygwin: implement spinlock pause for AArch64
    
    Signed-off-by: Radek Bartoň <[email protected]>

Diff:
---
 winsup/cygwin/local_includes/cygtls.h           | 5 ++++-
 winsup/cygwin/thread.cc                         | 5 +++++
 winsup/testsuite/winsup.api/pthread/cpu_relax.h | 3 ++-
 3 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/winsup/cygwin/local_includes/cygtls.h b/winsup/cygwin/local_includes/cygtls.h
index 29a539d83..44bd44e72 100644
--- a/winsup/cygwin/local_includes/cygtls.h
+++ b/winsup/cygwin/local_includes/cygtls.h
@@ -243,8 +243,11 @@ public: /* Do NOT remove this public: line, it's a marker for gentls_offsets. */
   {
     while (InterlockedExchange (&stacklock, 1))
       {
-#ifdef __x86_64__
+#if defined(__x86_64__)
 	__asm__ ("pause");
+#elif defined(__aarch64__)
+	__asm__ ("dmb ishst\n"
+                 "yield");
 #else
 #error unimplemented for this target
 #endif
diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc
index fea6079b8..510e2be93 100644
--- a/winsup/cygwin/thread.cc
+++ b/winsup/cygwin/thread.cc
@@ -1968,7 +1968,12 @@ pthread_spinlock::lock ()
       else if (spins < FAST_SPINS_LIMIT)
         {
           ++spins;
+#if defined(__x86_64__)
           __asm__ volatile ("pause":::);
+#elif defined(__aarch64__)
+          __asm__ volatile ("dmb ishst\n"
+                            "yield":::);
+#endif
         }
       else
 	{
diff --git a/winsup/testsuite/winsup.api/pthread/cpu_relax.h b/winsup/testsuite/winsup.api/pthread/cpu_relax.h
index 1936dc5f4..71cec0b2b 100644
--- a/winsup/testsuite/winsup.api/pthread/cpu_relax.h
+++ b/winsup/testsuite/winsup.api/pthread/cpu_relax.h
@@ -4,7 +4,8 @@
 #if defined(__x86_64__) || defined(__i386__)  // Check for x86 architectures
    #define CPU_RELAX() __asm__ volatile ("pause" :::)
 #elif defined(__aarch64__) || defined(__arm__)  // Check for ARM architectures
-   #define CPU_RELAX() __asm__ volatile ("yield" :::)
+   #define CPU_RELAX() __asm__ volatile ("dmb ishst \
+                                          yield" :::)
 #else
    #error unimplemented for this target
 #endif
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.