From: Magnus Lindholm <linmag7@gmail.com>
To: davem@davemloft.net, andreas@gaisler.com, sparclinux@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, gregkh@linuxfoundation.org,
jirislaby@kernel.org, linux-serial@vger.kernel.org,
linuxppc-dev@lists.ozlabs.org, krzk@kernel.org, oleg@redhat.com,
linmag7@gmail.com, stable@vger.kernel.org
Subject: [PATCH v3 2/8] sparc64: honor queued spinlock layout in secondary startup
Date: Mon, 12 Oct 2026 20:48:03 +0200 [thread overview]
Message-ID: <20261012184826.986050-3-linmag7@gmail.com> (raw)
In-Reply-To: <20261012184826.986050-1-linmag7@gmail.com>
The trampoline's ldstub modifies the queue-tail byte of prom_entry_lock,
not its locked byte, because SPARC64 uses big-endian queued spinlocks.
Acquire the word with CASA, release byte three and poll while contended.
Retain the predicted-branch barriers for Spitfire erratum 51.
See qspinlock_types.h for the layout and JPS2 A.10/A.35 for CASA/MEMBAR.
Fixes: 145d97858597 ("arch/sparc: Enable queued spinlock support for SPARC")
Cc: stable@vger.kernel.org
Signed-off-by: Magnus Lindholm <linmag7@gmail.com>
---
arch/sparc/kernel/trampoline_64.S | 34 +++++++++++++++++++++++++++----
1 file changed, 30 insertions(+), 4 deletions(-)
diff --git a/arch/sparc/kernel/trampoline_64.S b/arch/sparc/kernel/trampoline_64.S
index 51bf1eb92a36..62f404b3079a 100644
--- a/arch/sparc/kernel/trampoline_64.S
+++ b/arch/sparc/kernel/trampoline_64.S
@@ -106,9 +106,19 @@ startup_continue:
* We lock 'num_kernel_image_mappings' consequetive entries.
*/
sethi %hi(prom_entry_lock), %g2
-1: ldstub [%g2 + %lo(prom_entry_lock)], %g1
+ /* Big-endian qspinlock: acquire the whole 32-bit value, not byte 0. */
+ or %g2, %lo(prom_entry_lock), %g2
+1: lduw [%g2], %g1
brnz,pn %g1, 1b
nop
+ mov 1, %g1
+ casa [%g2] ASI_P, %g0, %g1
+ brnz,pn %g1, 1b
+ nop
+ /* Spitfire erratum 51: barrier in a predicted-taken delay slot. */
+ ba,pt %xcc, 2f
+ membar #Sync
+2:
/* Get onto temporary stack which will be in the locked
* kernel image.
@@ -212,7 +222,10 @@ startup_continue:
nop
sethi %hi(prom_entry_lock), %g2
- stb %g0, [%g2 + %lo(prom_entry_lock)]
+ /* Match membar_safe() for Spitfire erratum 51. */
+ ba,pt %xcc, 2f
+ membar #StoreStore | #LoadStore
+2: stb %g0, [%g2 + %lo(prom_entry_lock) + 3]
ba,pt %xcc, after_lock_tlb
nop
@@ -326,9 +339,19 @@ after_lock_tlb:
wrpr %g0, 0, %wstate
sethi %hi(prom_entry_lock), %g2
-1: ldstub [%g2 + %lo(prom_entry_lock)], %g1
+ /* Big-endian qspinlock: acquire the whole 32-bit value, not byte 0. */
+ or %g2, %lo(prom_entry_lock), %g2
+1: lduw [%g2], %g1
brnz,pn %g1, 1b
nop
+ mov 1, %g1
+ casa [%g2] ASI_P, %g0, %g1
+ brnz,pn %g1, 1b
+ nop
+ /* Spitfire erratum 51: barrier in a predicted-taken delay slot. */
+ ba,pt %xcc, 2f
+ membar #Sync
+2:
/* As a hack, put &init_thread_union into %g6.
* prom_world() loads from here to restore the %asi
@@ -389,7 +412,10 @@ after_lock_tlb:
add %sp, (2047 + 128), %o0
3: sethi %hi(prom_entry_lock), %g2
- stb %g0, [%g2 + %lo(prom_entry_lock)]
+ /* Match membar_safe() for Spitfire erratum 51. */
+ ba,pt %xcc, 2f
+ membar #StoreStore | #LoadStore
+2: stb %g0, [%g2 + %lo(prom_entry_lock) + 3]
ldx [%l0], %g6
ldx [%g6 + TI_TASK], %g4
next prev parent reply other threads:[~2026-10-12 18:48 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-12 18:48 [PATCH v3 0/8] sparc64: add Fujitsu M3000 support Magnus Lindholm
2026-10-12 18:48 ` [PATCH v3 1/8] sparc64: return from the generic clear_page implementation Magnus Lindholm
2026-10-12 18:55 ` sashiko-bot
2026-10-12 18:48 ` Magnus Lindholm [this message]
2026-10-12 18:55 ` [PATCH v3 2/8] sparc64: honor queued spinlock layout in secondary startup sashiko-bot
2026-10-12 18:48 ` [PATCH v3 3/8] sparc64: avoid huge kernel PUD mappings on sun4u Magnus Lindholm
2026-10-12 18:55 ` sashiko-bot
2026-10-12 18:48 ` [PATCH v3 4/8] sparc64: stop IRQ setup when descriptor allocation fails Magnus Lindholm
2026-10-12 19:03 ` sashiko-bot
2026-10-12 18:48 ` [PATCH v3 5/8] sparc64: validate Fire register properties before initialization Magnus Lindholm
2026-10-12 18:55 ` sashiko-bot
2026-10-12 18:48 ` [PATCH v3 6/8] sparc64: add SPARC64 VII CPU, MMU and SMP support Magnus Lindholm
2026-10-12 19:03 ` sashiko-bot
2026-10-12 18:48 ` [PATCH v3 7/8] sparc64: add M3000 Oberon PCIe support Magnus Lindholm
2026-10-12 19:01 ` sashiko-bot
2026-10-12 18:48 ` [PATCH v3 8/8] hvc: add an M3000 firmware console backend Magnus Lindholm
2026-10-12 18:57 ` sashiko-bot
2026-10-13 13:04 ` Greg KH
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261012184826.986050-3-linmag7@gmail.com \
--to=linmag7@gmail.com \
--cc=andreas@gaisler.com \
--cc=davem@davemloft.net \
--cc=gregkh@linuxfoundation.org \
--cc=jirislaby@kernel.org \
--cc=krzk@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-serial@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=oleg@redhat.com \
--cc=sparclinux@vger.kernel.org \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.