[newlib-cygwin/main] Cygwin: gendef: Implement longjmp for AArch64
Corinna Vinschen
corinna@sourceware.org
Wed Mar 11 14:53:06 GMT 2026
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=9c4a7780bfdb0276b1ff83058d0b99877262004b
commit 9c4a7780bfdb0276b1ff83058d0b99877262004b
Author: Thirumalai Nagalingam <thirumalai.nagalingam@multicorewareinc.com>
AuthorDate: Sat Dec 6 18:14:37 2025 +0530
Commit: Corinna Vinschen <corinna@vinschen.de>
CommitDate: Wed Mar 11 15:49:25 2026 +0100
Cygwin: gendef: Implement longjmp for AArch64
Author: Radek Bartoň <radek.barton@microsoft.com>
Co-authored-by: Thirumalai Nagalingam <thirumalai.nagalingam@multicorewareinc.com>
Signed-off-by: Thirumalai Nagalingam <thirumalai.nagalingam@multicorewareinc.com>
Diff:
---
winsup/cygwin/scripts/gendef | 64 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 64 insertions(+)
diff --git a/winsup/cygwin/scripts/gendef b/winsup/cygwin/scripts/gendef
index 826d76e75d90..fb325ea01f73 100755
--- a/winsup/cygwin/scripts/gendef
+++ b/winsup/cygwin/scripts/gendef
@@ -949,7 +949,71 @@ siglongjmp:
.seh_endproc
.globl longjmp
+ .seh_proc longjmp
longjmp:
+ // prologue
+ stp fp, lr, [sp, #-0x20]! // save FP and LR registers, allocate additional 16 bytes for function arguments
+ stp x0, x1, [sp, #0x10] // save function arguments (jump buffer and return value)
+ mov fp, sp // establishing frame chain
+ .seh_endprologue
+1:
+ bl stabilize_sig_stack // call stabilize_sig_stack which returns TLS pointer in x0
+ ldr x2, [sp, #0x10] // get jump buffer pointer from stack
+ ldr x10, [x2] // get old signal stack from jump buffer
+
+ // restore stack pointer in TLS
+ ldr x11, =_cygtls.stackptr
+ add x11, x0, x11
+ str x10, [x11]
+
+ // release lock by decrementing counter
+ ldr x11, =_cygtls.stacklock
+ add x11, x0, x11
+ ldr w12, [x11]
+ sub w12, w12, #1
+ str w12, [x11]
+
+ // we're not in cygwin anymore, clear "in cygwin" flag
+ ldr x11, =_cygtls.incyg
+ add x11, x0, x11
+ mov w12, #0
+ str w12, [x11]
+
+ // get saved return value before SP is restored
+ ldr x0, [sp, #0x10]
+
+ // restore callee-saved registers from jump buffer
+ ldp x19, x20, [x2, #0x08] // restore x19, x20
+ ldp x21, x22, [x2, #0x18] // restore x21, x22
+ ldp x23, x24, [x2, #0x28] // restore x23, x24
+ ldp x25, x26, [x2, #0x38] // restore x25, x26
+ ldp x27, x28, [x2, #0x48] // restore x27, x28
+ ldp fp, lr, [x2, #0x58] // restore x29 (frame pointer) and x30 (link register)
+ ldr x10, [x2, #0x68] // get saved stack pointer
+ mov sp, x10 // restore stack pointer
+ ldr x10, [x2, #0x70] // load floating-point control register
+ msr fpcr, x10 // restore FPCR
+ ldr x10, [x2, #0x78] // load floating-point status register
+ msr fpsr, x10 // restore FPSR
+
+ // restore floating-point registers (d8-d15)
+ ldp d8, d9, [x2, #0x80]
+ ldp d10, d11, [x2, #0x90]
+ ldp d12, d13, [x2, #0xA0]
+ ldp d14, d15, [x2, #0xB0]
+
+ // restore TLS stack pointer
+ ldr x1, [x0, #0xB8]
+ str x1, [sp]
+
+ // ensure return value is non-zero (C standard requirement)
+ cbnz x0, 0f
+ mov x0, #1
+0:
+ // epilogue
+ add sp, sp, #0x10 // FP and LR are already restored, just restore SP as it would be popped
+ ret
+ .seh_endproc
EOF
}
}
More information about the Cygwin-cvs
mailing list