Fix PR 8841 for nios2-linux
Commit Message
This patch is to use gdbarch method code_of_frame_writable, to skip
signal trampoline frame for breakpoint setting on nios2-linux. The patch
was written last year, but forgot to upstream it.
I don't have the env to test this patch, so Sandra could you try this
patch?
gdb:
2017-10-16 Yao Qi <yao.qi@linaro.org>
PR gdb/8841
* nios2-linux-tdep.c (nios2_linux_code_of_frame_writable): New
function.
(nios2_linux_init_abi): Install gdbarch code_of_frame_writable.
---
gdb/nios2-linux-tdep.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
Comments
On 10/16/2017 05:50 AM, Yao Qi wrote:
> This patch is to use gdbarch method code_of_frame_writable, to skip
> signal trampoline frame for breakpoint setting on nios2-linux. The patch
> was written last year, but forgot to upstream it.
>
> I don't have the env to test this patch, so Sandra could you try this
> patch?
>
> gdb:
>
> 2017-10-16 Yao Qi <yao.qi@linaro.org>
>
> PR gdb/8841
> * nios2-linux-tdep.c (nios2_linux_code_of_frame_writable): New
> function.
> (nios2_linux_init_abi): Install gdbarch code_of_frame_writable.
Thanks for looking at this! :-) The patch does seem to have the
intended behavior for "finish", but there are multiple new FAILs in the
test case sigaltstack.exp, which hasn't been adjusted to know that it's
valid for "finish" to skip frames. Plus that test has KFAILs for the
existing behavior of being unable to set the breakpoint at an unwritable
address that ought to be removed, too.
It also looks like this fix doesn't work for "step" out of a signal
handler -- this shows up in sigstep.exp. And there are new FAILs in
that testcase where "finish" is doing unexpected things now too.
-Sandra
@@ -185,6 +185,22 @@ static struct tramp_frame nios2_r2_linux_rt_sigreturn_tramp_frame =
nios2_linux_rt_sigreturn_init
};
+/* Implement the code_of_frame_writable gdbarch method. */
+
+static int
+nios2_linux_code_of_frame_writable (struct gdbarch *gdbarch,
+ struct frame_info *frame)
+{
+ if (get_frame_type (frame) == SIGTRAMP_FRAME)
+ {
+ /* The kernel creates a signal trampoline at address 0x1044
+ that GDB cannot write to to set a software breakpoint. */
+ return 0;
+ }
+ else
+ return 1;
+}
+
/* When FRAME is at a syscall instruction, return the PC of the next
instruction to be executed. */
@@ -234,6 +250,9 @@ nios2_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
tdep->syscall_next_pc = nios2_linux_syscall_next_pc;
+ set_gdbarch_code_of_frame_writable (gdbarch,
+ nios2_linux_code_of_frame_writable);
+
/* Index of target address word in glibc jmp_buf. */
tdep->jb_pc = 10;
}