https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=5effc7a9bff3a6756292ce273c6845107fd6958e
commit 5effc7a9bff3a6756292ce273c6845107fd6958e Author: Radek Bartoň <[email protected]> AuthorDate: Sat Dec 6 19:20:10 2025 +0530 Commit: Corinna Vinschen <[email protected]> CommitDate: Wed Mar 11 15:49:15 2026 +0100 Cygwin: gendef: Implement stabilize_sig_stack for aarch64 Co-authored-by: Thirumalai Nagalingam <[email protected]> Signed-off-by: Radek Bartoň <[email protected]> Signed-off-by: Thirumalai Nagalingam <[email protected]> Diff: --- winsup/cygwin/scripts/gendef | 76 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/winsup/cygwin/scripts/gendef b/winsup/cygwin/scripts/gendef index 7ff26e498e1e..d7426c008473 100755 --- a/winsup/cygwin/scripts/gendef +++ b/winsup/cygwin/scripts/gendef @@ -622,7 +622,83 @@ sigdelayed: .seh_endproc _sigdelayed_end: .global _sigdelayed_end + .seh_proc stabilize_sig_stack stabilize_sig_stack: + // prologue + stp fp, lr, [sp, #-0x10]! // save FP and LR registers + .seh_save_fplr_x 0x10 + mov fp, sp // set frame pointer for unwinder + .seh_set_fp + .seh_endprologue + + ldr x10, [x18, #0x8] // load TLS block base pointer into x10 + + // try to acquire the lock + mov w9, #1 // value to store (1 == locked) + ldr x11, =_cygtls.stacklock // load the symbol offset + add x12, x10, x11 // x12 = tls_base + &stacklock +1: + ldaxr w13, [x12] // load old lock value + stlxr w14, w9, [x12] // attempt to store 1 + cbnz w14, 1b // if store failed, retry + cbz w13, 2f // if lock was acquired, continue + yield // yield to allow other threads to run + b 1b // retry acquiring the lock + +2: + // lock acquired, increment incyg counter + ldr x11, =_cygtls.incyg // load the symbol offset + add x12, x10, x11 // x12 = tls_base + &incyg + ldr w9, [x12] // load current value of incyg + add w9, w9, #1 // increment incyg counter + str w9, [x12] // store back incremented value + + // check current_sig + ldr x11, =_cygtls.current_sig // load the symbol offset + ldr w9, [x10, x11] // load current value of current_sig + cbz w9, 3f // if no current signal, jump to cleanup + + // release lock before calling signal handler + ldr x11, =_cygtls.stacklock // load the symbol offset + add x12, x10, x11 // x12 = tls_base + &stacklock + ldr w9, [x12] // load current value of stacklock + sub w9, w9, #1 // decrement stacklock + stlr w9, [x12] // store with release semantics + + // prepare arg and call handler + ldr x0, =_cygtls.start_offset // load the symbol offset + add x0, x10, x0 // x0 = tls_base + &start_offset + bl _ZN7_cygtls19call_signal_handlerEv + + // call may clobber x10, restore TLS base + ldr x10, [x18, #0x8] // reload tls_base + + // decrement incyg + ldr x11, =_cygtls.incyg + add x12, x10, x11 + ldr w9, [x12] + sub w9, w9, #1 + str w9, [x12] + + // loop to handle another signal + b 1b + +3: + // no signal to handle, decrement incyg counter + ldr x11, =_cygtls.incyg + add x12, x10, x11 + ldr w9, [x12] + sub w9, w9, #1 + str w9, [x12] + + mov x0, x10 // return TLS address in x0 (return register) + + // epilogue + .seh_startepilogue + ldp fp, lr, [sp], #0x10 + .seh_endepilogue + ret + .seh_endproc EOF } }
