On Thu, Jul 10, 2025 at 06:35:18PM +0200, Jens Remus wrote:
quoted hunk ↗ jump to hunk
@@ -66,12 +73,20 @@ static int unwind_user_next(struct unwind_user_state *state)
/* sframe expects the frame to be local storage */
frame = &_frame;
if (sframe_find(state->ip, frame, topmost)) {
- if (!IS_ENABLED(CONFIG_HAVE_UNWIND_USER_FP))
- goto done;
- frame = &fp_frame;
+ if (IS_ENABLED(CONFIG_HAVE_UNWIND_USER_FP)) {
+ frame = &fp_frame;
+ } else if (IS_ENABLED(CONFIG_HAVE_UNWIND_USER_BACKCHAIN)) {
+ if (unwind_user_backchain_next(state))
+ goto done;
+ goto done_backchain;
+ }
}
} else if (fp_state(state)) {
frame = &fp_frame;
+ } else if (backchain_state(state)) {
+ if (unwind_user_backchain_next(state))
+ goto done;
+ goto done_backchain;
} else {
goto done;
}@@ -153,6 +168,7 @@ static int unwind_user_next(struct unwind_user_state *state)
arch_unwind_user_next(state);
+done_backchain:
state->topmost = false;
return 0;
This feels very grafted on, is there not some way to make it more
generic, i.e., to just work with CONFIG_HAVE_UNWIND_USER_FP?
Also, if distros aren't even compiling with -mbackchain, I wonder if we
can just not do this altogether :-)
--
Josh