Fix PR 8841 for nios2-linux

Message ID 1508154626-389-1-git-send-email-yao.qi@linaro.org
State New, archived
Headers

Commit Message

Yao Qi Oct. 16, 2017, 11:50 a.m. UTC
  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

Sandra Loosemore Oct. 19, 2017, 5:37 p.m. UTC | #1
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
  

Patch

diff --git a/gdb/nios2-linux-tdep.c b/gdb/nios2-linux-tdep.c
index 8cada54..788d711 100644
--- a/gdb/nios2-linux-tdep.c
+++ b/gdb/nios2-linux-tdep.c
@@ -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;
 }