summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn-Mark Bell <jmb@netsurf-browser.org>2022-06-03 20:24:10 +0100
committerJohn-Mark Bell <jmb@netsurf-browser.org>2022-11-03 13:22:32 +0000
commit0c55e052846ffb84e58934dbeb043c122ad1c457 (patch)
treec58ccdaed61d8559a3f0117ec02ba483dfe5d029
parentff87f146d76999d156f9313937018aa6e957688a (diff)
downloadtoolchains-0c55e052846ffb84e58934dbeb043c122ad1c457.tar.gz
toolchains-0c55e052846ffb84e58934dbeb043c122ad1c457.tar.bz2
Fix stack backtraces from UnixLib
The frame pointer to the signal stack frame was off-by-one resulting in unwinding terminating early. Additionally, we can dump the register state at the point of the abort now.
-rw-r--r--arm-riscos-gnueabihf/recipes/patches/gccsdk/unixlib-backtrace.p37
1 files changed, 37 insertions, 0 deletions
diff --git a/arm-riscos-gnueabihf/recipes/patches/gccsdk/unixlib-backtrace.p b/arm-riscos-gnueabihf/recipes/patches/gccsdk/unixlib-backtrace.p
new file mode 100644
index 0000000..2c971cd
--- /dev/null
+++ b/arm-riscos-gnueabihf/recipes/patches/gccsdk/unixlib-backtrace.p
@@ -0,0 +1,37 @@
+--- libunixlib/signal/post.c 2021-06-15 21:42:03.000000000 +0100
++++ libunixlib/signal/post.c 2022-06-03 19:52:18.316234729 +0100
+@@ -307,6 +307,7 @@
+ }
+
+ #ifdef __ARM_EABI__
++ const unsigned int *pc = NULL;
+ const unsigned int * const lr = (unsigned int *)fp[LR_OFFSET];
+ fprintf (stderr, " (%8x) lr: %8x",
+ (unsigned int)fp, (unsigned int)lr);
+@@ -350,7 +351,6 @@
+ #endif
+ oldfp = fp;
+ fp = (const unsigned int *)fp[FP_OFFSET];
+-#ifndef __ARM_EABI__
+ if (__ul_callbackfp != NULL && fp == __ul_callbackfp)
+ {
+ /* At &oldfp[1] = cpsr, a1-a4, v1-v6, sl, fp, ip, sp, lr, pc */
+@@ -424,7 +424,6 @@
+
+ fputs ("\n\n", stderr);
+ }
+-#endif
+ }
+
+ fputc ('\n', stderr);
+--- libunixlib/signal/_signal.s 2020-05-31 20:11:06.000000000 +0100
++++ libunixlib/signal/_signal.s 2022-06-03 19:45:32.872892834 +0100
+@@ -761,7 +761,7 @@
+ LDR a3, [sp, #14*4 + 4] @ saved USR lr
+ LDR a1, [sp, #11*4 + 4] @ saved USR fp
+ STMFD sp!, {a1, a3} @ create signal frame
+- MOV fp, sp @ FIXME: check this with compiler output for similar function
++ ADD fp, sp, #4 @ FIXME: check this with compiler output for similar function
+ #else
+ @ Create an APCS-32 compilant signal stack frame
+ ADR a4, __h_cback + 4*3 @ point at handler name for backtrace