Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* Getting rid of AT_SYMBOL inferior call method
@ 2012-05-03 19:03 Joel Brobecker
  2012-05-03 19:03 ` [commit 2/2] Remove AT_SYMBOL Joel Brobecker
  2012-05-03 19:03 ` [RFA 1/2] mips: Switch inferior function calls to ON_STACK method Joel Brobecker
  0 siblings, 2 replies; 33+ messages in thread
From: Joel Brobecker @ 2012-05-03 19:03 UTC (permalink / raw)
  To: gdb-patches; +Cc: macro

Hello,

This is something I promised I'd help with someday on a rainy day:
http://www.sourceware.org/ml/gdb-patches/2011-12/msg00896.html

There are two patches:
  . Patch #1 transitions mips targets to using ON_STACK instead of AT_SYMBOL;
  . Patch #2 removes AT_SYMBOL and AT_SYMBOL support.

The patch series was tested on mips-irix, no regression.


^ permalink raw reply	[flat|nested] 33+ messages in thread

* [RFA 1/2] mips: Switch inferior function calls to ON_STACK method.
  2012-05-03 19:03 Getting rid of AT_SYMBOL inferior call method Joel Brobecker
  2012-05-03 19:03 ` [commit 2/2] Remove AT_SYMBOL Joel Brobecker
@ 2012-05-03 19:03 ` Joel Brobecker
  2012-05-03 21:09   ` Maciej W. Rozycki
                     ` (2 more replies)
  1 sibling, 3 replies; 33+ messages in thread
From: Joel Brobecker @ 2012-05-03 19:03 UTC (permalink / raw)
  To: gdb-patches; +Cc: macro, Joel Brobecker

This patch switches the mips code to use the ON_STACK method
for function calls instead of AT_SYMBOL, which we want to remove.

The one difficulty came from the fact that we needed to make sure
that the area on the stack just before where we insert the breakpoint
instruction does not look like a branch instruction.  Otherwise,
we get an automatic breakpoint adjustment which breaks everything.

Another little detail on the implementation of mips_push_dummy_code.
It starts by aligning the stack.  AFAIK, the stack is supposed to
always be aligned to at least 4 bytes (4 bytes for mips32, 8 bytes
for mips64). So, the initial alignment shouldn't be necessary, since
that's good enough aligment for our breakpoint instruction.  But
in the end, I chose to keep it, JIC. We could possibly change the
code to align to 4 instead of 16 like mips_frame_align does, if
we want to.

gdb/ChangeLog:

        * mips-tdep.c (mips_push_dummy_code): New function.
        (mips_gdbarch_init): Set the gdbarch call_dummy_location to
        ON_STACK and install mips_push_dummy_code as our gdbarch
        push_dummy_code routine.

Tested on mips-irix.  It might be nice to test on other mips targets
as well, although it should not be necessary. OK to commit?

Thanks,
-- 
Joel

---
 gdb/mips-tdep.c |   36 ++++++++++++++++++++++++++++++++----
 1 files changed, 32 insertions(+), 4 deletions(-)

diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c
index 9a3c7fb..3e6b00b 100644
--- a/gdb/mips-tdep.c
+++ b/gdb/mips-tdep.c
@@ -3009,6 +3009,36 @@ mips_frame_align (struct gdbarch *gdbarch, CORE_ADDR addr)
   return align_down (addr, 16);
 }
 
+/* Implement the push_dummy_code gdbarch method for mips targets.  */
+
+static CORE_ADDR
+mips_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp,
+		      CORE_ADDR funaddr, struct value **args,
+		      int nargs, struct type *value_type,
+		      CORE_ADDR *real_pc, CORE_ADDR *bp_addr,
+		      struct regcache *regcache)
+{
+  int bp_len;
+  gdb_byte null_insn[4] = {0};
+
+  *bp_addr = mips_frame_align (gdbarch, sp);
+  gdbarch_breakpoint_from_pc (gdbarch, bp_addr, &bp_len);
+
+  /* The breakpoint layer automatically adjusts the address of
+     breakpoints inserted in a branch delay slot.  With enough
+     bad luck, the 4 bytes located just before our breakpoint
+     instruction could look like a branch instruction, and thus
+     trigger the adjustement, and break the function call entirely.
+     So, we reserve those 4 bytes and write a null instruction
+     to prevent that from happening.  */
+  write_memory (*bp_addr - bp_len, null_insn, sizeof (null_insn));
+  sp = mips_frame_align (gdbarch, *bp_addr - 2 * bp_len);
+
+  /* Inferior resumes at the function entry point.  */
+  *real_pc = funaddr;
+
+  return sp;
+}
 static CORE_ADDR
 mips_eabi_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 			   struct regcache *regcache, CORE_ADDR bp_addr,
@@ -6906,10 +6936,8 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 
   /* MIPS version of CALL_DUMMY.  */
 
-  /* NOTE: cagney/2003-08-05: Eventually call dummy location will be
-     replaced by a command, and all targets will default to on stack
-     (regardless of the stack's execute status).  */
-  set_gdbarch_call_dummy_location (gdbarch, AT_SYMBOL);
+  set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
+  set_gdbarch_push_dummy_code (gdbarch, mips_push_dummy_code);
   set_gdbarch_frame_align (gdbarch, mips_frame_align);
 
   set_gdbarch_convert_register_p (gdbarch, mips_convert_register_p);
-- 
1.7.0.4


^ permalink raw reply	[flat|nested] 33+ messages in thread

* [commit 2/2] Remove AT_SYMBOL
  2012-05-03 19:03 Getting rid of AT_SYMBOL inferior call method Joel Brobecker
@ 2012-05-03 19:03 ` Joel Brobecker
  2012-05-09 14:37   ` Joel Brobecker
  2012-05-03 19:03 ` [RFA 1/2] mips: Switch inferior function calls to ON_STACK method Joel Brobecker
  1 sibling, 1 reply; 33+ messages in thread
From: Joel Brobecker @ 2012-05-03 19:03 UTC (permalink / raw)
  To: gdb-patches; +Cc: macro, Joel Brobecker

Now that this method is no longer used by any architecture,
we can remove its support.

gdb/ChangeLog:

        * infcall.c (call_function_by_hand): Remove AT_SYMBOL handling.
        * inferior.h (AT_SYMBOL): Delete.

Will commit as soon as the mips-tdep patch gets checked in.

---
 gdb/infcall.c  |   27 ---------------------------
 gdb/inferior.h |    1 -
 2 files changed, 0 insertions(+), 28 deletions(-)

diff --git a/gdb/infcall.c b/gdb/infcall.c
index 6c250e3..e0195c9 100644
--- a/gdb/infcall.c
+++ b/gdb/infcall.c
@@ -640,33 +640,6 @@ call_function_by_hand (struct value *function, int nargs, struct value **args)
 	bp_addr = dummy_addr;
 	break;
       }
-    case AT_SYMBOL:
-      /* Some executables define a symbol __CALL_DUMMY_ADDRESS whose
-	 address is the location where the breakpoint should be
-	 placed.  Once all targets are using the overhauled frame code
-	 this can be deleted - ON_STACK is a better option.  */
-      {
-	struct minimal_symbol *sym;
-	CORE_ADDR dummy_addr;
-
-	sym = lookup_minimal_symbol ("__CALL_DUMMY_ADDRESS", NULL, NULL);
-	real_pc = funaddr;
-	if (sym)
-	  {
-	    dummy_addr = SYMBOL_VALUE_ADDRESS (sym);
-	    /* Make certain that the address points at real code, and not
-	       a function descriptor.  */
-	    dummy_addr = gdbarch_convert_from_func_ptr_addr (gdbarch,
-							     dummy_addr,
-							     &current_target);
-	  }
-	else
-	  dummy_addr = entry_point_address ();
-	/* A call dummy always consists of just a single breakpoint,
-	   so it's address is the same as the address of the dummy.  */
-	bp_addr = dummy_addr;
-	break;
-      }
     default:
       internal_error (__FILE__, __LINE__, _("bad switch"));
     }
diff --git a/gdb/inferior.h b/gdb/inferior.h
index 63245a2..8c90f96 100644
--- a/gdb/inferior.h
+++ b/gdb/inferior.h
@@ -357,7 +357,6 @@ struct displaced_step_closure *get_displaced_step_closure_by_addr (CORE_ADDR add
 /* Possible values for gdbarch_call_dummy_location.  */
 #define ON_STACK 1
 #define AT_ENTRY_POINT 4
-#define AT_SYMBOL 5
 
 /* If STARTUP_WITH_SHELL is set, GDB's "run"
    will attempts to start up the debugee under a shell.
-- 
1.7.0.4


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [RFA 1/2] mips: Switch inferior function calls to ON_STACK method.
  2012-05-03 19:03 ` [RFA 1/2] mips: Switch inferior function calls to ON_STACK method Joel Brobecker
@ 2012-05-03 21:09   ` Maciej W. Rozycki
  2012-05-03 21:50     ` Joel Brobecker
  2012-05-04 21:34     ` Mark Kettenis
  2012-05-03 21:44   ` Mark Kettenis
  2012-05-03 22:03   ` Joel Brobecker
  2 siblings, 2 replies; 33+ messages in thread
From: Maciej W. Rozycki @ 2012-05-03 21:09 UTC (permalink / raw)
  To: Joel Brobecker; +Cc: gdb-patches

Joel,

> This patch switches the mips code to use the ON_STACK method
> for function calls instead of AT_SYMBOL, which we want to remove.

 Thanks for this work -- can you give me a reference to some background 
information as to why exactly we want to remove the AT_SYMBOL method?

> Another little detail on the implementation of mips_push_dummy_code.
> It starts by aligning the stack.  AFAIK, the stack is supposed to
> always be aligned to at least 4 bytes (4 bytes for mips32, 8 bytes
> for mips64). So, the initial alignment shouldn't be necessary, since
> that's good enough aligment for our breakpoint instruction.  But
> in the end, I chose to keep it, JIC. We could possibly change the
> code to align to 4 instead of 16 like mips_frame_align does, if
> we want to.

 For the record: the respective ABIs mandate that the stack is aligned to 
8 bytes for 32-bit targets and to 16 bytes for 64-bit targets.  However 
the user may have fiddled with SP, so I think it's better to stay safe 
and therefore I agree it's better if we prealign the stack and avoid 
crashing the debuggee in this context.

> gdb/ChangeLog:
> 
>         * mips-tdep.c (mips_push_dummy_code): New function.
>         (mips_gdbarch_init): Set the gdbarch call_dummy_location to
>         ON_STACK and install mips_push_dummy_code as our gdbarch
>         push_dummy_code routine.
> 
> Tested on mips-irix.  It might be nice to test on other mips targets
> as well, although it should not be necessary. OK to commit?

 There's one fundamental problem with this change -- software breakpoints 
must not be used unconditionally, because some configurations do not 
expect or support them.  This affects remote JTAG targets and simulators, 
appropriate `Z0' packets should be used -- this is because JTAG uses SDBBP 
instructions rather than BREAK instructions -- the latters are ordinary 
instructions as far as JTAG debugging is considered and do not trap into 
the debug mode (this is so that you can debug an OS that uses BREAK 
instructions for user debugging); simulators may use yet other means, 
typically they don't use memory breakpoints at all (again, to allow users 
to debug their software within the simulator, e.g. the simulator runs 
Linux and the user debugs some userland app within that instance of 
Linux).

> diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c
> index 9a3c7fb..3e6b00b 100644
> --- a/gdb/mips-tdep.c
> +++ b/gdb/mips-tdep.c
> @@ -3009,6 +3009,36 @@ mips_frame_align (struct gdbarch *gdbarch, CORE_ADDR addr)
>    return align_down (addr, 16);
>  }
>  
> +/* Implement the push_dummy_code gdbarch method for mips targets.  */
> +
> +static CORE_ADDR
> +mips_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp,
> +		      CORE_ADDR funaddr, struct value **args,
> +		      int nargs, struct type *value_type,
> +		      CORE_ADDR *real_pc, CORE_ADDR *bp_addr,
> +		      struct regcache *regcache)
> +{
> +  int bp_len;
> +  gdb_byte null_insn[4] = {0};
> +
> +  *bp_addr = mips_frame_align (gdbarch, sp);
> +  gdbarch_breakpoint_from_pc (gdbarch, bp_addr, &bp_len);
> +
> +  /* The breakpoint layer automatically adjusts the address of
> +     breakpoints inserted in a branch delay slot.  With enough
> +     bad luck, the 4 bytes located just before our breakpoint
> +     instruction could look like a branch instruction, and thus
> +     trigger the adjustement, and break the function call entirely.
> +     So, we reserve those 4 bytes and write a null instruction
> +     to prevent that from happening.  */
> +  write_memory (*bp_addr - bp_len, null_insn, sizeof (null_insn));
> +  sp = mips_frame_align (gdbarch, *bp_addr - 2 * bp_len);
> +
> +  /* Inferior resumes at the function entry point.  */
> +  *real_pc = funaddr;
> +
> +  return sp;
> +}
>  static CORE_ADDR
>  mips_eabi_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
>  			   struct regcache *regcache, CORE_ADDR bp_addr,

 So essentially gdbarch_breakpoint_from_pc may only be used on targets 
known to use software breakpoints.

 Additionally once microMIPS support is in the above must execute as 
microMIPS code where appropriate to support processors that do not have 
the standard MIPS mode implemented -- no such processor currently exists, 
but the architecture spec explicitly permits pure-microMIPS 
implementations and some are expected to happen sooner or later.

 IOW the callee must return to an address that has the ISA bit set 
(that'll be the address of the breakpoint above ORed with 1) or otherwise 
SIGBUS may be thrown (hardware signals an Address Error exception if the 
ISA bit is clear).  Is that going to work with an update to the piece 
above like:

[...]
  if (APPROPRIATE)
    sp = make_compact_addr (sp);
  return sp;
}

(plus a corresponding update to the breakpoint address) or is more surgery 
required, especially to any generic code?  I guess not as I gather the 
return value will not only be used as the return address, but as the stack 
pointer as well, right?

 For simplicity I think:

#define APPROPRIATE is_micromips_addr (gdbarch, funaddr)

will do.

 Finally, I'd be happier if the unpredictability of the microMIPS 
breakpoint kind selection was avoided (there are two software and JTAG 
breakpoints each, BREAK16/BREAK32 and SDBBP16/SDBBP32, used by GDB 
like-for-like with 16-bit and 32-bit microMIPS instructions being 
replaced), so I suggest that the stack frame is preallocated and 
preinitialised along the lines of:

{
  gdb_byte *null_insn;
  CORE_ADDR new_sp;

  sp = mips_frame_align (gdbarch, sp);
  new_sp = mips_frame_align (gdbarch, sp - 2 * MIPS_INSN32_SIZE);
  null_insn = alloca (sp - new_sp);
  memset (null_insn, 0, sp - new_sp);
  write_memory (new_sp, null_insn, sp - new_sp);
[...]

-- that applies to remote targets that use `Z0' too as the expected 
breakpoint length will be encoded by GDB as appropriate in the request.

 I can address all these microMIPS issues if you like as I'm likely more 
familiar with that stuff, but please find a solution to the software 
breakpoint problem.

> @@ -6906,10 +6936,8 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  
>    /* MIPS version of CALL_DUMMY.  */
>  
> -  /* NOTE: cagney/2003-08-05: Eventually call dummy location will be
> -     replaced by a command, and all targets will default to on stack
> -     (regardless of the stack's execute status).  */
> -  set_gdbarch_call_dummy_location (gdbarch, AT_SYMBOL);
> +  set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
> +  set_gdbarch_push_dummy_code (gdbarch, mips_push_dummy_code);
>    set_gdbarch_frame_align (gdbarch, mips_frame_align);
>  
>    set_gdbarch_convert_register_p (gdbarch, mips_convert_register_p);

 So what if the stack pages are indeed not executable (their page entries 
have the XI aka Execute Inhibit bit set)?

  Maciej


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [RFA 1/2] mips: Switch inferior function calls to ON_STACK method.
  2012-05-03 19:03 ` [RFA 1/2] mips: Switch inferior function calls to ON_STACK method Joel Brobecker
  2012-05-03 21:09   ` Maciej W. Rozycki
@ 2012-05-03 21:44   ` Mark Kettenis
  2012-05-03 21:58     ` Joel Brobecker
  2012-05-03 22:03   ` Joel Brobecker
  2 siblings, 1 reply; 33+ messages in thread
From: Mark Kettenis @ 2012-05-03 21:44 UTC (permalink / raw)
  To: brobecker; +Cc: gdb-patches, macro, brobecker

> From: Joel Brobecker <brobecker@adacore.com>
> Date: Thu,  3 May 2012 15:03:21 -0400
> 
> This patch switches the mips code to use the ON_STACK method
> for function calls instead of AT_SYMBOL, which we want to remove.
> 
> The one difficulty came from the fact that we needed to make sure
> that the area on the stack just before where we insert the breakpoint
> instruction does not look like a branch instruction.  Otherwise,
> we get an automatic breakpoint adjustment which breaks everything.
> 
> Another little detail on the implementation of mips_push_dummy_code.
> It starts by aligning the stack.  AFAIK, the stack is supposed to
> always be aligned to at least 4 bytes (4 bytes for mips32, 8 bytes
> for mips64). So, the initial alignment shouldn't be necessary, since
> that's good enough aligment for our breakpoint instruction.  But
> in the end, I chose to keep it, JIC. We could possibly change the
> code to align to 4 instead of 16 like mips_frame_align does, if
> we want to.
> 
> gdb/ChangeLog:
> 
>         * mips-tdep.c (mips_push_dummy_code): New function.
>         (mips_gdbarch_init): Set the gdbarch call_dummy_location to
>         ON_STACK and install mips_push_dummy_code as our gdbarch
>         push_dummy_code routine.
> 
> Tested on mips-irix.  It might be nice to test on other mips targets
> as well, although it should not be necessary. OK to commit?
> 
> Thanks,
> -- 
> Joel
> 
> ---
>  gdb/mips-tdep.c |   36 ++++++++++++++++++++++++++++++++----
>  1 files changed, 32 insertions(+), 4 deletions(-)
> 
> diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c
> index 9a3c7fb..3e6b00b 100644
> --- a/gdb/mips-tdep.c
> +++ b/gdb/mips-tdep.c
> @@ -3009,6 +3009,36 @@ mips_frame_align (struct gdbarch *gdbarch, CORE_ADDR addr)
>    return align_down (addr, 16);
>  }
>  
> +/* Implement the push_dummy_code gdbarch method for mips targets.  */

I notice people have been adding this style of comment in some other
newly contributed targets.  Do people really feel that having these is
useful?  If so, can we at least settle on a consitent style?

> +
> +static CORE_ADDR
> +mips_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp,
> +		      CORE_ADDR funaddr, struct value **args,
> +		      int nargs, struct type *value_type,
> +		      CORE_ADDR *real_pc, CORE_ADDR *bp_addr,
> +		      struct regcache *regcache)
> +{
> +  int bp_len;
> +  gdb_byte null_insn[4] = {0};

Missing spaces around the 0.

> +  *bp_addr = mips_frame_align (gdbarch, sp);

SP is guaranteed to be properly aligned here (see
infcall.c:call_function_by_hand()).

> +  gdbarch_breakpoint_from_pc (gdbarch, bp_addr, &bp_len);
> +
> +  /* The breakpoint layer automatically adjusts the address of
> +     breakpoints inserted in a branch delay slot.  With enough
> +     bad luck, the 4 bytes located just before our breakpoint
> +     instruction could look like a branch instruction, and thus
> +     trigger the adjustement, and break the function call entirely.
> +     So, we reserve those 4 bytes and write a null instruction
> +     to prevent that from happening.  */
> +  write_memory (*bp_addr - bp_len, null_insn, sizeof (null_insn));
> +  sp = mips_frame_align (gdbarch, *bp_addr - 2 * bp_len);
> +
> +  /* Inferior resumes at the function entry point.  */
> +  *real_pc = funaddr;
> +
> +  return sp;
> +}

Please add a blank line here.

>  static CORE_ADDR
>  mips_eabi_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
>  			   struct regcache *regcache, CORE_ADDR bp_addr,
> @@ -6906,10 +6936,8 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>  
>    /* MIPS version of CALL_DUMMY.  */
>  
> -  /* NOTE: cagney/2003-08-05: Eventually call dummy location will be
> -     replaced by a command, and all targets will default to on stack
> -     (regardless of the stack's execute status).  */
> -  set_gdbarch_call_dummy_location (gdbarch, AT_SYMBOL);
> +  set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
> +  set_gdbarch_push_dummy_code (gdbarch, mips_push_dummy_code);
>    set_gdbarch_frame_align (gdbarch, mips_frame_align);
>  
>    set_gdbarch_convert_register_p (gdbarch, mips_convert_register_p);
> -- 
> 1.7.0.4
> 
> 


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [RFA 1/2] mips: Switch inferior function calls to ON_STACK method.
  2012-05-03 21:09   ` Maciej W. Rozycki
@ 2012-05-03 21:50     ` Joel Brobecker
  2012-05-03 23:29       ` Maciej W. Rozycki
  2012-05-04 21:34     ` Mark Kettenis
  1 sibling, 1 reply; 33+ messages in thread
From: Joel Brobecker @ 2012-05-03 21:50 UTC (permalink / raw)
  To: Maciej W. Rozycki; +Cc: gdb-patches

Thanks for the detailed feedback :)

>  Thanks for this work -- can you give me a reference to some background 
> information as to why exactly we want to remove the AT_SYMBOL method?

I do not have a specific reference. Only the fact that it's always
been a method that we wanted to deprecate and then remove support for...

>  For the record: the respective ABIs mandate that the stack is aligned
>  to 8 bytes for 32-bit targets and to 16 bytes for 64-bit targets.

Ah, that explains why mips_frame_align aligned to 16 bytes boundaries...
I googled that question instead of looking that information up in my
manuals - my bad.

> There's one fundamental problem with this change -- software breakpoints 
> must not be used unconditionally, because some configurations do not 
> expect or support them.

I think that we will be fine, because the code is not actually inserting
the breakpoint, merely reserving the room for it on the stack. Later
on, the target layer then inserts the breakpoint for us, using the
appropriate method. If you're connected to a board via JTAG, it should
do the right thing.

>  I can address all these microMIPS issues if you like as I'm likely
>  more familiar with that stuff,

I'd feel more comfortable if you did. I think I understand a little
better what you mean by microMIPS, although I thought it was what
the code called mips16. But I realize now that it's something
different, because IIRC you can switch between mips16 and mips32
by simply using odd addresses (or not).

> > @@ -6906,10 +6936,8 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
> >  
> >    /* MIPS version of CALL_DUMMY.  */
> >  
> > -  /* NOTE: cagney/2003-08-05: Eventually call dummy location will be
> > -     replaced by a command, and all targets will default to on stack
> > -     (regardless of the stack's execute status).  */
> > -  set_gdbarch_call_dummy_location (gdbarch, AT_SYMBOL);
> > +  set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
> > +  set_gdbarch_push_dummy_code (gdbarch, mips_push_dummy_code);
> >    set_gdbarch_frame_align (gdbarch, mips_frame_align);
> >  
> >    set_gdbarch_convert_register_p (gdbarch, mips_convert_register_p);
> 
>  So what if the stack pages are indeed not executable (their page entries 
> have the XI aka Execute Inhibit bit set)?

The only time when we are executing an instruction on the stack is
when the function being called returns and hits the breakpoint.
IIRC, there has been some testing done against this situation,
and things just worked. I suspect that we get a trap, and that trap
correctly gets interpreted. I can see ourselves receiving a signal
instead, but I think this can also be correctly interpreted. Maybe
we'll have to make some adjustement to GDB's core, but I'd rather
fix that if I have a way to reproduce and therefore test...

Cheers,
-- 
Joel


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [RFA 1/2] mips: Switch inferior function calls to ON_STACK method.
  2012-05-03 21:44   ` Mark Kettenis
@ 2012-05-03 21:58     ` Joel Brobecker
  2012-05-04  2:11       ` Yao Qi
  0 siblings, 1 reply; 33+ messages in thread
From: Joel Brobecker @ 2012-05-03 21:58 UTC (permalink / raw)
  To: Mark Kettenis; +Cc: gdb-patches, macro

> > +/* Implement the push_dummy_code gdbarch method for mips targets.  */
> 
> I notice people have been adding this style of comment in some other
> newly contributed targets.  Do people really feel that having these is
> useful?  If so, can we at least settle on a consitent style?

I think they are useful, because they allow us to tell people that
new functions should ALL be documented, even the obvious ones
that are used to implement a given hook.  And since we do not
want to repeat the hook's documentation, this tells the reader
where to look.

I am happy to standardize on any format, as long as we all agree.

I will adjust the two style issues that you pointed out.

Thank Mark.
-- 
Joel


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [RFA 1/2] mips: Switch inferior function calls to ON_STACK method.
  2012-05-03 19:03 ` [RFA 1/2] mips: Switch inferior function calls to ON_STACK method Joel Brobecker
  2012-05-03 21:09   ` Maciej W. Rozycki
  2012-05-03 21:44   ` Mark Kettenis
@ 2012-05-03 22:03   ` Joel Brobecker
  2 siblings, 0 replies; 33+ messages in thread
From: Joel Brobecker @ 2012-05-03 22:03 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 332 bytes --]

> gdb/ChangeLog:
> 
>         * mips-tdep.c (mips_push_dummy_code): New function.
>         (mips_gdbarch_init): Set the gdbarch call_dummy_location to
>         ON_STACK and install mips_push_dummy_code as our gdbarch
>         push_dummy_code routine.

Second version of this patch with Mark's style comments addressed.

-- 
Joel

[-- Attachment #2: mips-on-stack-v2.diff --]
[-- Type: text/x-diff, Size: 2787 bytes --]

commit d7f93872c27075342da02ab2ee57062d8b9511c9
Author: Joel Brobecker <brobecker@adacore.com>
Date:   Wed May 2 20:39:57 2012 -0400

    mips: Switch inferior function calls to ON_STACK method.
    
    This patch switches the mips code to use the ON_STACK method
    for function calls instead of AT_SYMBOL, which we want to remove.
    
    gdb/ChangeLog:
    
            * mips-tdep.c (mips_push_dummy_code): New function.
            (mips_gdbarch_init): Set the gdbarch call_dummy_location to
            ON_STACK and install mips_push_dummy_code as our gdbarch
            push_dummy_code routine.

diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c
index 9a3c7fb..5faf114 100644
--- a/gdb/mips-tdep.c
+++ b/gdb/mips-tdep.c
@@ -3009,6 +3009,37 @@ mips_frame_align (struct gdbarch *gdbarch, CORE_ADDR addr)
   return align_down (addr, 16);
 }
 
+/* Implement the push_dummy_code gdbarch method for mips targets.  */
+
+static CORE_ADDR
+mips_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp,
+		      CORE_ADDR funaddr, struct value **args,
+		      int nargs, struct type *value_type,
+		      CORE_ADDR *real_pc, CORE_ADDR *bp_addr,
+		      struct regcache *regcache)
+{
+  int bp_len;
+  gdb_byte null_insn[4] = { 0 };
+
+  *bp_addr = mips_frame_align (gdbarch, sp);
+  gdbarch_breakpoint_from_pc (gdbarch, bp_addr, &bp_len);
+
+  /* The breakpoint layer automatically adjusts the address of
+     breakpoints inserted in a branch delay slot.  With enough
+     bad luck, the 4 bytes located just before our breakpoint
+     instruction could look like a branch instruction, and thus
+     trigger the adjustement, and break the function call entirely.
+     So, we reserve those 4 bytes and write a null instruction
+     to prevent that from happening.  */
+  write_memory (*bp_addr - bp_len, null_insn, sizeof (null_insn));
+  sp = mips_frame_align (gdbarch, *bp_addr - 2 * bp_len);
+
+  /* Inferior resumes at the function entry point.  */
+  *real_pc = funaddr;
+
+  return sp;
+}
+
 static CORE_ADDR
 mips_eabi_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 			   struct regcache *regcache, CORE_ADDR bp_addr,
@@ -6906,10 +6937,8 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 
   /* MIPS version of CALL_DUMMY.  */
 
-  /* NOTE: cagney/2003-08-05: Eventually call dummy location will be
-     replaced by a command, and all targets will default to on stack
-     (regardless of the stack's execute status).  */
-  set_gdbarch_call_dummy_location (gdbarch, AT_SYMBOL);
+  set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
+  set_gdbarch_push_dummy_code (gdbarch, mips_push_dummy_code);
   set_gdbarch_frame_align (gdbarch, mips_frame_align);
 
   set_gdbarch_convert_register_p (gdbarch, mips_convert_register_p);

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [RFA 1/2] mips: Switch inferior function calls to ON_STACK method.
  2012-05-03 21:50     ` Joel Brobecker
@ 2012-05-03 23:29       ` Maciej W. Rozycki
  2012-05-04 20:58         ` Joel Brobecker
  0 siblings, 1 reply; 33+ messages in thread
From: Maciej W. Rozycki @ 2012-05-03 23:29 UTC (permalink / raw)
  To: Joel Brobecker; +Cc: gdb-patches

Joel

> >  Thanks for this work -- can you give me a reference to some background 
> > information as to why exactly we want to remove the AT_SYMBOL method?
> 
> I do not have a specific reference. Only the fact that it's always
> been a method that we wanted to deprecate and then remove support for...

 OK, fair enough.  I'll see if I can find anything relevant myself to feed 
my curiosity.

> I think that we will be fine, because the code is not actually inserting
> the breakpoint, merely reserving the room for it on the stack. Later
> on, the target layer then inserts the breakpoint for us, using the
> appropriate method. If you're connected to a board via JTAG, it should
> do the right thing.

 Indeed, I realised that shortly after posting my reply.  I got tricked 
into thinking this is needed for a reason, but I think it's really not.  
I think it is safe to assume a MIPS software breakpoint will always fit in 
a single machine instruction, so it should be enough to reserve space for 
two 32-bit instructions just as in the snippet I proposed -- one for the 
place to put the breakpoint at and the other for the delay slot avoidance.

> >  I can address all these microMIPS issues if you like as I'm likely
> >  more familiar with that stuff,
> 
> I'd feel more comfortable if you did. I think I understand a little
> better what you mean by microMIPS, although I thought it was what
> the code called mips16. But I realize now that it's something
> different, because IIRC you can switch between mips16 and mips32
> by simply using odd addresses (or not).

 Well, the microMIPS instruction set is a new encoding of all the existing 
MIPS instructions, with some new instructions added.  It is intended to be 
source-compatible with the existing MIPS software, up to handwritten 
assembly (in the macro mode).

 Overall there are four categories of instructions in the microMIPS set:

* newly-added 16-bit instructions,

* newly-added 32-bit instructions,

* reencoded 32-bit instructions,

* newly-added 48-bit instructions.

 Most of 16-bit instructions are shortened forms of frequently used 
instructions that already existed in the original MIPS instruction set.  
Some are genuinely new operations (e.g. MOVEP, move a pair of registers).  
Also most of 16-bit instructions have equivalent 32-bit encodings that 
have a wider range of their immediate argument and/or can address more 
registers.

 There isn't much to say about newly-added 32-bit instructions -- in most 
cases they are widened forms of some 16-bit instructions, though again, 
there are some unique exception (ADDIUPC, add immediate to PC, comes to my 
mind).

 All the reencoded 32-bit instructions already existed in the original 
MIPS instruction set.  Some particularily infrequently used have the range 
of their immediate argument narrowed compared to the original (e.g. DADDI, 
double-word add with overflow detection).  The use of an auxiliary 
register is required to use an immediate outside the range as is with 
values outside the signed 16-bit range in the original MIPS instruction 
set.  GAS handles this peculiarity transparently in the macro mode.

 One 48-bit instruction has been defined, LI32, to load a 32-bit immediate 
into a register with a single instruction.  It's a part of the 64-bit 
architecture spec, you won't get it on 32-bit processors.

 We don't have to care about MIPS16 support here because any processor 
that supports the MIPS16 instruction set will also support the standard 
MIPS set.  This is not going to be true for microMIPS support.

 And for the record, the ISA bit is used for microMIPS code just as it is 
for MIPS16 execution, by using odd addresses you switch the processor into 
"the other" mode, whichever of MIPS16 or microMIPS one it supports.  
However for pure-microMIPS processors the ISA bit is hardwired to 1 -- all 
code addresses are always odd.

 Coincidentally all-zeroes is a 32-bit NOP instruction both in the 
standard MIPS and the microMIPS mode -- there's a 16-bit encoding of NOP 
in the microMIPS mode naturally as well.

> > > @@ -6906,10 +6936,8 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
> > >  
> > >    /* MIPS version of CALL_DUMMY.  */
> > >  
> > > -  /* NOTE: cagney/2003-08-05: Eventually call dummy location will be
> > > -     replaced by a command, and all targets will default to on stack
> > > -     (regardless of the stack's execute status).  */
> > > -  set_gdbarch_call_dummy_location (gdbarch, AT_SYMBOL);
> > > +  set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
> > > +  set_gdbarch_push_dummy_code (gdbarch, mips_push_dummy_code);
> > >    set_gdbarch_frame_align (gdbarch, mips_frame_align);
> > >  
> > >    set_gdbarch_convert_register_p (gdbarch, mips_convert_register_p);
> > 
> >  So what if the stack pages are indeed not executable (their page entries 
> > have the XI aka Execute Inhibit bit set)?
> 
> The only time when we are executing an instruction on the stack is
> when the function being called returns and hits the breakpoint.
> IIRC, there has been some testing done against this situation,
> and things just worked. I suspect that we get a trap, and that trap
> correctly gets interpreted. I can see ourselves receiving a signal
> instead, but I think this can also be correctly interpreted. Maybe
> we'll have to make some adjustement to GDB's core, but I'd rather
> fix that if I have a way to reproduce and therefore test...

 Understood, but I'd be happier if the comment you're removing or a 
similar stayed in place.  If by trap you mean SIGTRAP, then I think this 
is not going to be the case.

 For the record: if the XI bit is set and execution is attempted, then the 
Execute-Inhibit exception is triggered.  Depending on how the processor 
has been configured, this will map either to the TLBL exception, just as 
with any TLB fault on an instruction fetch, or a newly-defined exception 
(see below).  This will probably be translated to SIGSEGV by any OS; any 
bare-iron application may not be as flexible, but certainly will handle it 
somehow if it set XI in the first place.

 The Execute-Inhibit exception certainly has a precedence over software 
breakpoints (both BREAK and SDBBP) because the respective instruction has 
to execute for the breakpoint exception to trigger.  However hardware 
instruction breakpoints, both EJTAG and CP0 Watch register ones, do take 
precedence over Execute-Inhibit.

 The XI feature itself is a moderately new addition to the MIPS 
architecture, originally introduced with the SmartMIPS ASE (a security 
enhancement intended for smart cards, I'm told) and with revision #3 
merged into the base architecture.  There is a corresponding RI feature, 
intended to read-protect pages holding code.

 The Execute-Inhibit and Read-Inhibit exceptions are new codes (20 and 19, 
respectively) added to the CP0 Cause register with the merge of the 
feature into the base architecture (they were not defined for the original 
SmartMIPS ASE), so there is little if any existing practice as to how they 
are handled by OSes, my SIGSEGV assumption above is how I would handle it 
myself.  Upstream Linux kernel does not handle the new codes for once, but 
does handle the XI bit itself in some configurations.  I don't think I 
have access to any hardware I could test it with though.

 I know that some architectures have supported such fine-grained access to 
virtual memory for quite a while now, so I would have assumed we have got 
it sorted out already somehow in a generic way.

  Maciej


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [RFA 1/2] mips: Switch inferior function calls to ON_STACK method.
  2012-05-03 21:58     ` Joel Brobecker
@ 2012-05-04  2:11       ` Yao Qi
  0 siblings, 0 replies; 33+ messages in thread
From: Yao Qi @ 2012-05-04  2:11 UTC (permalink / raw)
  To: Joel Brobecker; +Cc: Mark Kettenis, gdb-patches, macro

On 05/04/2012 05:57 AM, Joel Brobecker wrote:
>>> > > +/* Implement the push_dummy_code gdbarch method for mips targets.  */
>> > 
>> > I notice people have been adding this style of comment in some other
>> > newly contributed targets.  Do people really feel that having these is
>> > useful?  If so, can we at least settle on a consitent style?
> I think they are useful, because they allow us to tell people that
> new functions should ALL be documented, even the obvious ones
> that are used to implement a given hook.  And since we do not
> want to repeat the hook's documentation, this tells the reader
> where to look.

Yes, they are useful.  Beyond Joel's description, it still quite useful
when  hook method's comment or parameter is changed, we don't have to
change in every *-tdep.c files.

> 
> I am happy to standardize on any format, as long as we all agree.

+1.

If hook is ABI or target variant specific, such as push_dummy_call in
mips-tdep.c, BAR is the name of ABI or target variant,

  /* Implement the FOO gdbarch method for BAR.  */

If hook is for the whole port, we can simply say this,

  /* Implement the FOO gdbarch method.  */

-- 
Yao (齐尧)


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [RFA 1/2] mips: Switch inferior function calls to ON_STACK method.
  2012-05-03 23:29       ` Maciej W. Rozycki
@ 2012-05-04 20:58         ` Joel Brobecker
  2012-05-04 21:19           ` Mark Kettenis
  2012-05-04 22:41           ` Maciej W. Rozycki
  0 siblings, 2 replies; 33+ messages in thread
From: Joel Brobecker @ 2012-05-04 20:58 UTC (permalink / raw)
  To: Maciej W. Rozycki; +Cc: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 1348 bytes --]

Now I know why I was told you are a MIPS expert :-). I never really
had the chance or need to delve into the details of any specific
architecture. Even for the ia64-hpux port, I could do with just
a superficial knowledge of that CPU.

> * newly-added 48-bit instructions.

I am wondering if this addition is going to hurt in terms of our
support...  From what I could tell from my mips64 manual, even
on this CPU the instructions are still 32bit long... But I'm
digressing, sorry.

>  Coincidentally all-zeroes is a 32-bit NOP instruction both in the 
> standard MIPS and the microMIPS mode -- there's a 16-bit encoding of NOP 
> in the microMIPS mode naturally as well.

I'm wondering if you'd like me to rename "null_insn" into "nop_insn"
in my patch. I didn't do it, because I'd expect the instruction size
to depend on the mode. As of today, we know that the breakpoint we
are inserting is always going to be at an even address, so it's always
going to be 4 bytes. So maybe it does make sense to rename it. Let
me know.

>  Understood, but I'd be happier if the comment you're removing or a 
> similar stayed in place.  If by trap you mean SIGTRAP, then I think this 
> is not going to be the case.

I think you refer to the comment from Andrew Cagney? I've put it back
as is.

OK to commit, modulo the possible rename above?

Thanks,
-- 
Joel

[-- Attachment #2: mips-on-stack-v3.diff --]
[-- Type: text/x-diff, Size: 2744 bytes --]

commit b78a75e1442a349531a017036a02f43c4df71427
Author: Joel Brobecker <brobecker@adacore.com>
Date:   Wed May 2 20:39:57 2012 -0400

    mips: Switch inferior function calls to ON_STACK method.
    
    This patch switches the mips code to use the ON_STACK method
    for function calls instead of AT_SYMBOL, which we want to remove.
    
    gdb/ChangeLog:
    
            * mips-tdep.c (mips_push_dummy_code): New function.
            (mips_gdbarch_init): Set the gdbarch call_dummy_location to
            ON_STACK and install mips_push_dummy_code as our gdbarch
            push_dummy_code routine.

diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c
index 9a3c7fb..5e9a6ed 100644
--- a/gdb/mips-tdep.c
+++ b/gdb/mips-tdep.c
@@ -3009,6 +3009,37 @@ mips_frame_align (struct gdbarch *gdbarch, CORE_ADDR addr)
   return align_down (addr, 16);
 }
 
+/* Implement the push_dummy_code gdbarch method for mips targets.  */
+
+static CORE_ADDR
+mips_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp,
+		      CORE_ADDR funaddr, struct value **args,
+		      int nargs, struct type *value_type,
+		      CORE_ADDR *real_pc, CORE_ADDR *bp_addr,
+		      struct regcache *regcache)
+{
+  int bp_len;
+  gdb_byte null_insn[4] = { 0 };
+
+  *bp_addr = mips_frame_align (gdbarch, sp);
+  gdbarch_breakpoint_from_pc (gdbarch, bp_addr, &bp_len);
+
+  /* The breakpoint layer automatically adjusts the address of
+     breakpoints inserted in a branch delay slot.  With enough
+     bad luck, the 4 bytes located just before our breakpoint
+     instruction could look like a branch instruction, and thus
+     trigger the adjustement, and break the function call entirely.
+     So, we reserve those 4 bytes and write a null instruction
+     to prevent that from happening.  */
+  write_memory (*bp_addr - bp_len, null_insn, sizeof (null_insn));
+  sp = mips_frame_align (gdbarch, *bp_addr - 2 * bp_len);
+
+  /* Inferior resumes at the function entry point.  */
+  *real_pc = funaddr;
+
+  return sp;
+}
+
 static CORE_ADDR
 mips_eabi_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 			   struct regcache *regcache, CORE_ADDR bp_addr,
@@ -6909,7 +6940,8 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   /* NOTE: cagney/2003-08-05: Eventually call dummy location will be
      replaced by a command, and all targets will default to on stack
      (regardless of the stack's execute status).  */
-  set_gdbarch_call_dummy_location (gdbarch, AT_SYMBOL);
+  set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
+  set_gdbarch_push_dummy_code (gdbarch, mips_push_dummy_code);
   set_gdbarch_frame_align (gdbarch, mips_frame_align);
 
   set_gdbarch_convert_register_p (gdbarch, mips_convert_register_p);

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [RFA 1/2] mips: Switch inferior function calls to ON_STACK method.
  2012-05-04 20:58         ` Joel Brobecker
@ 2012-05-04 21:19           ` Mark Kettenis
  2012-05-04 23:25             ` Maciej W. Rozycki
  2012-05-04 22:41           ` Maciej W. Rozycki
  1 sibling, 1 reply; 33+ messages in thread
From: Mark Kettenis @ 2012-05-04 21:19 UTC (permalink / raw)
  To: brobecker; +Cc: macro, gdb-patches

> Date: Fri, 4 May 2012 13:58:18 -0700
> From: Joel Brobecker <brobecker@adacore.com>
> 
> >  Understood, but I'd be happier if the comment you're removing or a 
> > similar stayed in place.  If by trap you mean SIGTRAP, then I think this 
> > is not going to be the case.
> 
> I think you refer to the comment from Andrew Cagney? I've put it back
> as is.

I really don't think that comment is helpful anymore.  Almost ten
years have gone by without anyone feeling the need to implement the
command Andrew is alluding to here,

> OK to commit, modulo the possible rename above?

Seems you missed my comment about the the mips_frame_align() call.
It's unecessary since the frame is already properly aligned by the
calles of push_dummy_code().

> commit b78a75e1442a349531a017036a02f43c4df71427
> Author: Joel Brobecker <brobecker@adacore.com>
> Date:   Wed May 2 20:39:57 2012 -0400
> 
>     mips: Switch inferior function calls to ON_STACK method.
>     
>     This patch switches the mips code to use the ON_STACK method
>     for function calls instead of AT_SYMBOL, which we want to remove.
>     
>     gdb/ChangeLog:
>     
>             * mips-tdep.c (mips_push_dummy_code): New function.
>             (mips_gdbarch_init): Set the gdbarch call_dummy_location to
>             ON_STACK and install mips_push_dummy_code as our gdbarch
>             push_dummy_code routine.
> 
> diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c
> index 9a3c7fb..5e9a6ed 100644
> --- a/gdb/mips-tdep.c
> +++ b/gdb/mips-tdep.c
> @@ -3009,6 +3009,37 @@ mips_frame_align (struct gdbarch *gdbarch, CORE_ADDR addr)
>    return align_down (addr, 16);
>  }
>  
> +/* Implement the push_dummy_code gdbarch method for mips targets.  */

Perhaps change that comment into:

  /* Implement the "push_dummy_call" gdbarch method.  */

such that it is consistent with the style of comments in rl78-tdep.c
and rx-tdep.c and moxie-tdep.c?  The "for mips targets" isn't really
adding any information (and might end up accidentally being copied).

> +
> +static CORE_ADDR
> +mips_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp,
> +		      CORE_ADDR funaddr, struct value **args,
> +		      int nargs, struct type *value_type,
> +		      CORE_ADDR *real_pc, CORE_ADDR *bp_addr,
> +		      struct regcache *regcache)
> +{
> +  int bp_len;
> +  gdb_byte null_insn[4] = { 0 };
> +
> +  *bp_addr = mips_frame_align (gdbarch, sp);
> +  gdbarch_breakpoint_from_pc (gdbarch, bp_addr, &bp_len);
> +
> +  /* The breakpoint layer automatically adjusts the address of
> +     breakpoints inserted in a branch delay slot.  With enough
> +     bad luck, the 4 bytes located just before our breakpoint
> +     instruction could look like a branch instruction, and thus
> +     trigger the adjustement, and break the function call entirely.
> +     So, we reserve those 4 bytes and write a null instruction
> +     to prevent that from happening.  */
> +  write_memory (*bp_addr - bp_len, null_insn, sizeof (null_insn));
> +  sp = mips_frame_align (gdbarch, *bp_addr - 2 * bp_len);
> +
> +  /* Inferior resumes at the function entry point.  */
> +  *real_pc = funaddr;
> +
> +  return sp;
> +}
> +
>  static CORE_ADDR
>  mips_eabi_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
>  			   struct regcache *regcache, CORE_ADDR bp_addr,
> @@ -6909,7 +6940,8 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>    /* NOTE: cagney/2003-08-05: Eventually call dummy location will be
>       replaced by a command, and all targets will default to on stack
>       (regardless of the stack's execute status).  */
> -  set_gdbarch_call_dummy_location (gdbarch, AT_SYMBOL);
> +  set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
> +  set_gdbarch_push_dummy_code (gdbarch, mips_push_dummy_code);
>    set_gdbarch_frame_align (gdbarch, mips_frame_align);
>  
>    set_gdbarch_convert_register_p (gdbarch, mips_convert_register_p);
> 
> --fXStkuK2IQBfcDe+--
> 


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [RFA 1/2] mips: Switch inferior function calls to ON_STACK method.
  2012-05-03 21:09   ` Maciej W. Rozycki
  2012-05-03 21:50     ` Joel Brobecker
@ 2012-05-04 21:34     ` Mark Kettenis
  2012-05-05  1:31       ` Maciej W. Rozycki
  1 sibling, 1 reply; 33+ messages in thread
From: Mark Kettenis @ 2012-05-04 21:34 UTC (permalink / raw)
  To: macro; +Cc: brobecker, gdb-patches

> Date: Thu, 3 May 2012 22:08:58 +0100
> From: "Maciej W. Rozycki" <macro@codesourcery.com>
> 
> Joel,
> 
> > This patch switches the mips code to use the ON_STACK method
> > for function calls instead of AT_SYMBOL, which we want to remove.
> 
>  Thanks for this work -- can you give me a reference to some background 
> information as to why exactly we want to remove the AT_SYMBOL method?

The AT_SYMBOL method relies on a magic symbol being present in the
binarie that's being debugged.  There is no guarantee that that magic
symbol is actually present in your binary.

> > Another little detail on the implementation of mips_push_dummy_code.
> > It starts by aligning the stack.  AFAIK, the stack is supposed to
> > always be aligned to at least 4 bytes (4 bytes for mips32, 8 bytes
> > for mips64). So, the initial alignment shouldn't be necessary, since
> > that's good enough aligment for our breakpoint instruction.  But
> > in the end, I chose to keep it, JIC. We could possibly change the
> > code to align to 4 instead of 16 like mips_frame_align does, if
> > we want to.
> 
>  For the record: the respective ABIs mandate that the stack is aligned to 
> 8 bytes for 32-bit targets and to 16 bytes for 64-bit targets.  However 
> the user may have fiddled with SP, so I think it's better to stay safe 
> and therefore I agree it's better if we prealign the stack and avoid 
> crashing the debuggee in this context.

Like I wrote elsewhere, the generic code that calls push_dummy_code()
already alignes the stack, so it isn't necessary to do it again here.

> >    /* MIPS version of CALL_DUMMY.  */
> >  
> > -  /* NOTE: cagney/2003-08-05: Eventually call dummy location will be
> > -     replaced by a command, and all targets will default to on stack
> > -     (regardless of the stack's execute status).  */
> > -  set_gdbarch_call_dummy_location (gdbarch, AT_SYMBOL);
> > +  set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
> > +  set_gdbarch_push_dummy_code (gdbarch, mips_push_dummy_code);
> >    set_gdbarch_frame_align (gdbarch, mips_frame_align);
> >  
> >    set_gdbarch_convert_register_p (gdbarch, mips_convert_register_p);
> 
>  So what if the stack pages are indeed not executable (their page entries 
> have the XI aka Execute Inhibit bit set)?

The resulting SIGSEGV will be recognized by GDB and handled
appropriately; see infrun.c:handle_inferior_event().


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [RFA 1/2] mips: Switch inferior function calls to ON_STACK method.
  2012-05-04 20:58         ` Joel Brobecker
  2012-05-04 21:19           ` Mark Kettenis
@ 2012-05-04 22:41           ` Maciej W. Rozycki
  1 sibling, 0 replies; 33+ messages in thread
From: Maciej W. Rozycki @ 2012-05-04 22:41 UTC (permalink / raw)
  To: Joel Brobecker; +Cc: gdb-patches

On Fri, 4 May 2012, Joel Brobecker wrote:

> Now I know why I was told you are a MIPS expert :-). I never really
> had the chance or need to delve into the details of any specific
> architecture. Even for the ia64-hpux port, I could do with just
> a superficial knowledge of that CPU.

 It just started the other way round for me -- I got pulled into toolchain 
hacking as a result of my hopeless attempts to bring up the then current 
version of Linux kernel on my DECstation box (a MIPS R3000 class system).  
Of course you can't really use a kernel without userland and as it turned 
out that meant porting upcoming glibc 2.2 unless I wanted to downgrade 
back to long obsolete 2.0 (which I did not).

 Of course binutils at that point did not support symbol versioning in the 
MIPS port yet (it couldn't use the generic ELF versioning stuff all the 
other ports used because of some peculiarities of the IRIX ELF variation), 
so I had to fix that first and that's how it started rolling...  So I'm 
really a low-level kernel developer who just happens to do something else. 
;)

 I still have that DECstation and can check any original MIPS I ISA stuff 
at the run time should there be such a need.

> > * newly-added 48-bit instructions.
> 
> I am wondering if this addition is going to hurt in terms of our
> support...  From what I could tell from my mips64 manual, even
> on this CPU the instructions are still 32bit long... But I'm
> digressing, sorry.

 My GDB patch handles it just fine as the major opcode for any 48-bit 
instructions has been already allocated by the architecture (you can see 
some parts in my change that classify instructions according to their 
length for example), except there has been no hardware or simulator 
available to test it yet.  QEMU might be closest to getting there.  For 
the purpose of software breakpoints any 48-bit instruction is I reckon 
replaced with a 32-bit breakpoint.  This is safe because 48-bit 
instructions cannot be placed in any fixed-width branch delay slots, so 
the choice of the width of the breakpoint does not matter (not that we put 
any breakpoints in delay slots anyway, but it doesn't hurt to play safe 
anyway).

 Worse, however, that the lack of permission for C99 code in opcodes 
precludes the use of the long long type to hold instruction patterns and 
opcode masks there.  And redefining "struct mips_opcode" to split 
instructions/masks across multiple members (or worse yet, using some hack 
to split them acros multiple opcode table entries) means rewriting lots of 
stuff at least in opcodes itself and in GAS.

 That's sort of discouraging for a single instruction (and no 64-bit 
microMIPS hardware yet), especially given that I think we will eventually 
permit at least the type itself if not other C99 features sometime.  This 
is even more disappointing given these members are defined as the long 
type -- already wasting 32-bits twice per each entry throughout the table 
on 64-bit hosts...

 The end result is binutils do not support the LI32 instruction now, so 
while we do in GDB, there's actually no reasonable way to produce it (of 
course you can still handcode it as data with the .half directive -- note 
that just like MIPS16 extended instructions (and unlike standard MIPS 
ones) 32-bit and 48-bit microMIPS instructions are encoded as sequences of 
16-bit halfwords each of which is in the processor's endianness).

> >  Coincidentally all-zeroes is a 32-bit NOP instruction both in the 
> > standard MIPS and the microMIPS mode -- there's a 16-bit encoding of NOP 
> > in the microMIPS mode naturally as well.
> 
> I'm wondering if you'd like me to rename "null_insn" into "nop_insn"
> in my patch. I didn't do it, because I'd expect the instruction size
> to depend on the mode. As of today, we know that the breakpoint we
> are inserting is always going to be at an even address, so it's always
> going to be 4 bytes. So maybe it does make sense to rename it. Let
> me know.

 I think "nop_insn" might be better; we handle different encodings of the 
NOP intruction in GAS already (used for .align padding among others) but 
from my understanding of this piece this is never going to be necessary 
here as we'll only ever need a standard MIPS and a 32-bit microMIPS 
breakpoint here.  I think however that initialising it like this:

  static gdb_byte nop_insn[] = { 0, 0, 0, 0 };

may express the intent a bit better (this is what we do in 
mips_breakpoint_from_pc where we initialise all array elements explicitly 
even where we could let the compiler default to zeros).

> >  Understood, but I'd be happier if the comment you're removing or a 
> > similar stayed in place.  If by trap you mean SIGTRAP, then I think this 
> > is not going to be the case.
> 
> I think you refer to the comment from Andrew Cagney? I've put it back
> as is.

 Yes, however following Mark's note I think it'll be better to state that 
it's OK if we get SIGSEGV for a non-executable stack and refer to 
handle_inferior_event (look for SIGSEGV there for a detailed explanation).  
Furthermore, given that it is supported I think it should simply be 
documented in the function's description instead.

> OK to commit, modulo the possible rename above?

 OK with these changes; once you've checked your patch in I'll update the 
outstanding microMIPS change according to my earlier notes (and will 
probably come back with issues and haunt everybody here).

  Maciej


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [RFA 1/2] mips: Switch inferior function calls to ON_STACK method.
  2012-05-04 21:19           ` Mark Kettenis
@ 2012-05-04 23:25             ` Maciej W. Rozycki
  2012-05-05 11:45               ` Mark Kettenis
  0 siblings, 1 reply; 33+ messages in thread
From: Maciej W. Rozycki @ 2012-05-04 23:25 UTC (permalink / raw)
  To: Mark Kettenis; +Cc: brobecker, gdb-patches

On Fri, 4 May 2012, Mark Kettenis wrote:

> > >  Understood, but I'd be happier if the comment you're removing or a 
> > > similar stayed in place.  If by trap you mean SIGTRAP, then I think this 
> > > is not going to be the case.
> > 
> > I think you refer to the comment from Andrew Cagney? I've put it back
> > as is.
> 
> I really don't think that comment is helpful anymore.  Almost ten
> years have gone by without anyone feeling the need to implement the
> command Andrew is alluding to here,

 I referred to the non-executable stack behaviour, not the command wished 
for, sorry if I worded that ambiguously.

> > OK to commit, modulo the possible rename above?
> 
> Seems you missed my comment about the the mips_frame_align() call.
> It's unecessary since the frame is already properly aligned by the
> calles of push_dummy_code().

 Indeed.

> > +/* Implement the push_dummy_code gdbarch method for mips targets.  */
> 
> Perhaps change that comment into:
> 
>   /* Implement the "push_dummy_call" gdbarch method.  */
> 
> such that it is consistent with the style of comments in rl78-tdep.c
> and rx-tdep.c and moxie-tdep.c?  The "for mips targets" isn't really
> adding any information (and might end up accidentally being copied).

 As per my suggestion I think it makes sense to document any peculiarities 
of this specific implementation here as well (in this case the safety to 
use with non-executable stack).

  Maciej


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [RFA 1/2] mips: Switch inferior function calls to ON_STACK method.
  2012-05-04 21:34     ` Mark Kettenis
@ 2012-05-05  1:31       ` Maciej W. Rozycki
  0 siblings, 0 replies; 33+ messages in thread
From: Maciej W. Rozycki @ 2012-05-05  1:31 UTC (permalink / raw)
  To: Mark Kettenis; +Cc: Joel Brobecker, gdb-patches

Mark,

> >  Thanks for this work -- can you give me a reference to some background 
> > information as to why exactly we want to remove the AT_SYMBOL method?
> 
> The AT_SYMBOL method relies on a magic symbol being present in the
> binarie that's being debugged.  There is no guarantee that that magic
> symbol is actually present in your binary.

 And failing that the executable's entry point.  Actually I have yet to 
see a binary that has that magic __CALL_DUMMY_ADDRESS symbol, so the 
fallback must have worked pretty well.  Interestingly enough it was the 
MIPS target AT_SYMBOL was specifically added for:

http://sourceware.org/ml/gdb-patches/2003-08/msg00076.html

And that very patch regrettably removed the explanation of the actual 
reason of the whole arrangement -- the need to be able to debug a program 
in ROM that does not have an entry point (or I think, probably more 
accurately, rather has a read-only entry point such as the reset vector, 
so a breakpoint is not guaranteed to work there).

 Of course ON_STACK solves that in a more general manner, so that's the 
actual benefit from this change.  That removes any doubt I might have had.

 Thanks for your input, including your other comments.

  Maciej


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [RFA 1/2] mips: Switch inferior function calls to ON_STACK method.
  2012-05-04 23:25             ` Maciej W. Rozycki
@ 2012-05-05 11:45               ` Mark Kettenis
  2012-05-08 15:08                 ` Maciej W. Rozycki
  0 siblings, 1 reply; 33+ messages in thread
From: Mark Kettenis @ 2012-05-05 11:45 UTC (permalink / raw)
  To: macro; +Cc: brobecker, gdb-patches

> Date: Sat, 5 May 2012 00:25:04 +0100
> From: "Maciej W. Rozycki" <macro@codesourcery.com>
>
> > > +/* Implement the push_dummy_code gdbarch method for mips targets.  */
> > 
> > Perhaps change that comment into:
> > 
> >   /* Implement the "push_dummy_call" gdbarch method.  */
> > 
> > such that it is consistent with the style of comments in rl78-tdep.c
> > and rx-tdep.c and moxie-tdep.c?  The "for mips targets" isn't really
> > adding any information (and might end up accidentally being copied).
> 
>  As per my suggestion I think it makes sense to document any peculiarities 
> of this specific implementation here as well (in this case the safety to 
> use with non-executable stack).

The non-executable stack issue really isn't specific to this
implementation though.  On OpenBSD the stack is non-executable on all
architectures where it is possible (including through a clever trick
on i386).  I haven't tried ON_STACK on all of them, but it works on
all of them.


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [RFA 1/2] mips: Switch inferior function calls to ON_STACK method.
  2012-05-05 11:45               ` Mark Kettenis
@ 2012-05-08 15:08                 ` Maciej W. Rozycki
  2012-05-08 16:06                   ` Joel Brobecker
  0 siblings, 1 reply; 33+ messages in thread
From: Maciej W. Rozycki @ 2012-05-08 15:08 UTC (permalink / raw)
  To: Mark Kettenis; +Cc: Joel Brobecker, gdb-patches

On Sat, 5 May 2012, Mark Kettenis wrote:

> >  As per my suggestion I think it makes sense to document any peculiarities 
> > of this specific implementation here as well (in this case the safety to 
> > use with non-executable stack).
> 
> The non-executable stack issue really isn't specific to this
> implementation though.  On OpenBSD the stack is non-executable on all
> architectures where it is possible (including through a clever trick
> on i386).  I haven't tried ON_STACK on all of them, but it works on
> all of them.

 After some thinking I realised that the reliance on signal delivery to 
work properly to trap non-executable stack may actually be a problem for 
bare-iron targets.  I'd expect TLB exceptions not to be forwarded up the 
debug stack in a typical JTAG debugging scenario -- it's not obvious how 
they should be mapped to signals even, the low-level hardware has no way 
to classify them and not all have to be fatal; in about the most 
sophisticated scenario (which is not unlikely, I did that many times 
myself) consider debugging Linux (the kernel) through JTAG.

 Instead you'll have the joy of running or stepping through the exception 
handler (from the probe's point of view it's really no different to an 
ordinary jump; in the hardware stepping mode the processor will just trap 
at the exception handler's entry point instead of the intended breakpoint 
location) on the target and your device being debugged may go astray, e.g. 
panic blinking LEDs or trigger hardware reset.

 Given that this feature in the MIPS case comes from the SmartMIPS ASE 
(that as noted earlier has been designed with smart cards in mind) I think 
such a scenario is actually not unlikely, even though, as I say, I have 
never had an opportunity to deal with a MIPS processor that had this 
non-executable stack feature implemented.

  Maciej


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [RFA 1/2] mips: Switch inferior function calls to ON_STACK method.
  2012-05-08 15:08                 ` Maciej W. Rozycki
@ 2012-05-08 16:06                   ` Joel Brobecker
  2012-05-08 20:26                     ` Maciej W. Rozycki
  0 siblings, 1 reply; 33+ messages in thread
From: Joel Brobecker @ 2012-05-08 16:06 UTC (permalink / raw)
  To: Maciej W. Rozycki; +Cc: Mark Kettenis, gdb-patches

[-- Attachment #1: Type: text/plain, Size: 782 bytes --]

> After some thinking I realised that the reliance on signal delivery to 
> work properly to trap non-executable stack may actually be a problem for 
> bare-iron targets.

IMO, I think we can start worrying about those when we actually
encounter the problem; and I am assuming that this is not going to
be specific to mips.

Are we still good to go with this patch? Attached is the latest
version. For any additional comments that you'd like to be added
(in particular, with respect to what you just pointed out), I suggest
add them as a followup patch.  This way, this one is out of the way,
and we can just focus on the comments themselves.

I am also adding a second patch, which shows the changes I made
in this iteration.

Tested on mips-irix, no regression.

Thanks,
-- 
Joel

[-- Attachment #2: 0001-mips-Switch-inferior-function-calls-to-ON_STACK-meth.patch --]
[-- Type: text/x-diff, Size: 2877 bytes --]

From ddb25412f122ca8180238f188536b3027182cb31 Mon Sep 17 00:00:00 2001
From: Joel Brobecker <brobecker@adacore.com>
Date: Wed, 2 May 2012 20:39:57 -0400
Subject: [PATCH] mips: Switch inferior function calls to ON_STACK method.

This patch switches the mips code to use the ON_STACK method
for function calls instead of AT_SYMBOL, which we want to remove.

gdb/ChangeLog:

        * mips-tdep.c (mips_push_dummy_code): New function.
        (mips_gdbarch_init): Set the gdbarch call_dummy_location to
        ON_STACK and install mips_push_dummy_code as our gdbarch
        push_dummy_code routine.
---
 gdb/mips-tdep.c |   37 +++++++++++++++++++++++++++++++++----
 1 files changed, 33 insertions(+), 4 deletions(-)

diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c
index 9a3c7fb..68ac858 100644
--- a/gdb/mips-tdep.c
+++ b/gdb/mips-tdep.c
@@ -3009,6 +3009,37 @@ mips_frame_align (struct gdbarch *gdbarch, CORE_ADDR addr)
   return align_down (addr, 16);
 }
 
+/* Implement the "push_dummy_call" gdbarch method.  */
+
+static CORE_ADDR
+mips_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp,
+		      CORE_ADDR funaddr, struct value **args,
+		      int nargs, struct type *value_type,
+		      CORE_ADDR *real_pc, CORE_ADDR *bp_addr,
+		      struct regcache *regcache)
+{
+  int bp_len;
+  static gdb_byte nop_insn[] = { 0, 0, 0, 0 };
+
+  *bp_addr = sp;
+  gdbarch_breakpoint_from_pc (gdbarch, bp_addr, &bp_len);
+
+  /* The breakpoint layer automatically adjusts the address of
+     breakpoints inserted in a branch delay slot.  With enough
+     bad luck, the 4 bytes located just before our breakpoint
+     instruction could look like a branch instruction, and thus
+     trigger the adjustement, and break the function call entirely.
+     So, we reserve those 4 bytes and write a nop instruction
+     to prevent that from happening.  */
+  write_memory (*bp_addr - bp_len, nop_insn, sizeof (nop_insn));
+  sp = mips_frame_align (gdbarch, *bp_addr - 2 * bp_len);
+
+  /* Inferior resumes at the function entry point.  */
+  *real_pc = funaddr;
+
+  return sp;
+}
+
 static CORE_ADDR
 mips_eabi_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 			   struct regcache *regcache, CORE_ADDR bp_addr,
@@ -6906,10 +6937,8 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 
   /* MIPS version of CALL_DUMMY.  */
 
-  /* NOTE: cagney/2003-08-05: Eventually call dummy location will be
-     replaced by a command, and all targets will default to on stack
-     (regardless of the stack's execute status).  */
-  set_gdbarch_call_dummy_location (gdbarch, AT_SYMBOL);
+  set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
+  set_gdbarch_push_dummy_code (gdbarch, mips_push_dummy_code);
   set_gdbarch_frame_align (gdbarch, mips_frame_align);
 
   set_gdbarch_convert_register_p (gdbarch, mips_convert_register_p);
-- 
1.7.0.4


[-- Attachment #3: 0001-mips-tdeps-ON_STACK-push_dummy_call-adjustements.patch --]
[-- Type: text/x-diff, Size: 2394 bytes --]

From 758b0c5b1dfab824516badb3f8b238b40905732f Mon Sep 17 00:00:00 2001
From: Joel Brobecker <brobecker@adacore.com>
Date: Mon, 7 May 2012 18:54:27 -0400
Subject: [PATCH] mips-tdeps ON_STACK push_dummy_call adjustements.

---
 gdb/mips-tdep.c |   13 +++++--------
 1 files changed, 5 insertions(+), 8 deletions(-)

diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c
index 5e9a6ed..68ac858 100644
--- a/gdb/mips-tdep.c
+++ b/gdb/mips-tdep.c
@@ -3009,7 +3009,7 @@ mips_frame_align (struct gdbarch *gdbarch, CORE_ADDR addr)
   return align_down (addr, 16);
 }
 
-/* Implement the push_dummy_code gdbarch method for mips targets.  */
+/* Implement the "push_dummy_call" gdbarch method.  */
 
 static CORE_ADDR
 mips_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp,
@@ -3019,9 +3019,9 @@ mips_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp,
 		      struct regcache *regcache)
 {
   int bp_len;
-  gdb_byte null_insn[4] = { 0 };
+  static gdb_byte nop_insn[] = { 0, 0, 0, 0 };
 
-  *bp_addr = mips_frame_align (gdbarch, sp);
+  *bp_addr = sp;
   gdbarch_breakpoint_from_pc (gdbarch, bp_addr, &bp_len);
 
   /* The breakpoint layer automatically adjusts the address of
@@ -3029,9 +3029,9 @@ mips_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp,
      bad luck, the 4 bytes located just before our breakpoint
      instruction could look like a branch instruction, and thus
      trigger the adjustement, and break the function call entirely.
-     So, we reserve those 4 bytes and write a null instruction
+     So, we reserve those 4 bytes and write a nop instruction
      to prevent that from happening.  */
-  write_memory (*bp_addr - bp_len, null_insn, sizeof (null_insn));
+  write_memory (*bp_addr - bp_len, nop_insn, sizeof (nop_insn));
   sp = mips_frame_align (gdbarch, *bp_addr - 2 * bp_len);
 
   /* Inferior resumes at the function entry point.  */
@@ -6937,9 +6937,6 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 
   /* MIPS version of CALL_DUMMY.  */
 
-  /* NOTE: cagney/2003-08-05: Eventually call dummy location will be
-     replaced by a command, and all targets will default to on stack
-     (regardless of the stack's execute status).  */
   set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
   set_gdbarch_push_dummy_code (gdbarch, mips_push_dummy_code);
   set_gdbarch_frame_align (gdbarch, mips_frame_align);
-- 
1.7.0.4


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [RFA 1/2] mips: Switch inferior function calls to ON_STACK method.
  2012-05-08 16:06                   ` Joel Brobecker
@ 2012-05-08 20:26                     ` Maciej W. Rozycki
  2012-05-08 20:43                       ` Joel Brobecker
  0 siblings, 1 reply; 33+ messages in thread
From: Maciej W. Rozycki @ 2012-05-08 20:26 UTC (permalink / raw)
  To: Joel Brobecker; +Cc: Mark Kettenis, gdb-patches

On Tue, 8 May 2012, Joel Brobecker wrote:

> > After some thinking I realised that the reliance on signal delivery to 
> > work properly to trap non-executable stack may actually be a problem for 
> > bare-iron targets.
> 
> IMO, I think we can start worrying about those when we actually
> encounter the problem; and I am assuming that this is not going to
> be specific to mips.

 I don't consider this a showstopper for your change either; in particular 
it does not apply to Linux kernel debugging because except from one or two 
obscure corner cases of some very old hardware that did not have memory at 
0 (except from a page worth shadow area for exception handlers) Linux runs 
its own code using unmapped segments so no memory access permissions 
apply.

 But I decided the issue had to be noted.

> Are we still good to go with this patch? Attached is the latest
> version. For any additional comments that you'd like to be added
> (in particular, with respect to what you just pointed out), I suggest
> add them as a followup patch.  This way, this one is out of the way,
> and we can just focus on the comments themselves.

 I agree about the comments.  However it's just struck me there's 
something weird about your code, see below.

> I am also adding a second patch, which shows the changes I made
> in this iteration.

 Thanks, that's useful.

> diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c
> index 9a3c7fb..68ac858 100644
> --- a/gdb/mips-tdep.c
> +++ b/gdb/mips-tdep.c
> @@ -3009,6 +3009,37 @@ mips_frame_align (struct gdbarch *gdbarch, CORE_ADDR addr)
>    return align_down (addr, 16);
>  }
>  
> +/* Implement the "push_dummy_call" gdbarch method.  */
> +
> +static CORE_ADDR
> +mips_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp,
> +		      CORE_ADDR funaddr, struct value **args,
> +		      int nargs, struct type *value_type,
> +		      CORE_ADDR *real_pc, CORE_ADDR *bp_addr,
> +		      struct regcache *regcache)
> +{
> +  int bp_len;
> +  static gdb_byte nop_insn[] = { 0, 0, 0, 0 };
> +
> +  *bp_addr = sp;
> +  gdbarch_breakpoint_from_pc (gdbarch, bp_addr, &bp_len);

 You set bp_addr to SP here, so you rely on the stack pointer to have been 
implicitly adjusted down below the current frame by call_function_by_hand 
(or otherwise the breakpoint would occupy a valid stack frame location at 
this point -- which is dangerous if software breakpoints are used).  I 
find it a bit fragile, how about putting the breakpoint entirely in space 
allocated here?

 Then I think that you can avoid the call to gdbarch_breakpoint_from_pc, 
just as I noted in the microMIPS consideration.  We know that for an 
aligned stack location it's always going to return 4 in bp_len anyway and 
if we want to go below the top of the stack, then we sort of get into a 
chicken and egg problem -- we'll only know how far to go below SP once 
we've called this function, but to call it we need to know the location to 
ask about first.

 Fortunately getting this value exactly right does not really matter -- we 
just need enough space to cover the worst case.  So I suggest this 
instead:

  CORE_ADDR addr;

  addr = sp - sizeof (nop_insn);

so that the breakpoint itself is below the requested SP...

> +
> +  /* The breakpoint layer automatically adjusts the address of
> +     breakpoints inserted in a branch delay slot.  With enough
> +     bad luck, the 4 bytes located just before our breakpoint
> +     instruction could look like a branch instruction, and thus
> +     trigger the adjustement, and break the function call entirely.
> +     So, we reserve those 4 bytes and write a nop instruction
> +     to prevent that from happening.  */
> +  write_memory (*bp_addr - bp_len, nop_insn, sizeof (nop_insn));
> +  sp = mips_frame_align (gdbarch, *bp_addr - 2 * bp_len);

... and then, consequently:

  write_memory (addr - sizeof (nop_insn), nop_insn, sizeof (nop_insn));
  sp = mips_frame_align (gdbarch, addr - sizeof (nop_insn));

  *bp_addr = addr;

(note that in your variation you write the NOP into space of bp_len bytes 
-- as noted above we know that this is going to be 4 anyway, but strictly 
speaking this is risky as it does not tie the number of bytes written to 
the space available).

 OK with these adjustments and sorry that I missed this previously.

  Maciej


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [RFA 1/2] mips: Switch inferior function calls to ON_STACK method.
  2012-05-08 20:26                     ` Maciej W. Rozycki
@ 2012-05-08 20:43                       ` Joel Brobecker
  2012-05-08 22:08                         ` Joel Brobecker
  2012-05-09  6:21                         ` Maciej W. Rozycki
  0 siblings, 2 replies; 33+ messages in thread
From: Joel Brobecker @ 2012-05-08 20:43 UTC (permalink / raw)
  To: Maciej W. Rozycki; +Cc: Mark Kettenis, gdb-patches

> You set bp_addr to SP here, so you rely on the stack pointer to have
> been implicitly adjusted down below the current frame [...]

I was actually confused, as I thought that SP pointed to the first
unused slot in the stack.

I will make the changes that you suggest and re-test.

One thing that just occured to me while driving home is why not
also use the AT_ENTRY_POINT approach. I figured that there must
have been a reason why we used AT_SYMBOL instead of AT_ENTRY_POINT.
But then, there is your comment that makes me think that the symbol
isn't usually defined, which means that most of (all?) the time,
we actually end up using AT_ENTRY_POINT. Do we know of any reason
why AT_ENTRY_POINT would not work? I'd assume that as long as the
object format is ELF, we'd have one, and so we could use that as
well.

Geee, are we ever going to reach a conclusion on this discussion? :-/

-- 
Joel


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [RFA 1/2] mips: Switch inferior function calls to ON_STACK method.
  2012-05-08 20:43                       ` Joel Brobecker
@ 2012-05-08 22:08                         ` Joel Brobecker
  2012-05-09  7:32                           ` Maciej W. Rozycki
  2012-05-09  6:21                         ` Maciej W. Rozycki
  1 sibling, 1 reply; 33+ messages in thread
From: Joel Brobecker @ 2012-05-08 22:08 UTC (permalink / raw)
  To: Maciej W. Rozycki; +Cc: Mark Kettenis, gdb-patches

[-- Attachment #1: Type: text/plain, Size: 721 bytes --]

Attached is the latest version.

It's very very slightly different from the version you suggested,
in the fact that I didn't create a local variable for the breakpoint
address, and stored it in *bp_addr directly.  I didn't see a real
purpose for having a local variable in this case.  I did create
a local variable for the nop instruction address, however. I found
that it did make things a little clearer for that one.

As before, I'm attaching two patches, the first being the last
version of the patch, and the second being the changes introduced
by this iteration.

Testec on mips-irix with no regression.  If we'd rather go with
AT_ENTRY_POINT instead, at least the patch is available here for
the record.

-- 
Joel

[-- Attachment #2: 0001-mips-Switch-inferior-function-calls-to-ON_STACK-meth.patch --]
[-- Type: text/x-diff, Size: 2944 bytes --]

From 19ebe2e03aab266ddd3771fbd7aeff430c32079a Mon Sep 17 00:00:00 2001
From: Joel Brobecker <brobecker@adacore.com>
Date: Wed, 2 May 2012 20:39:57 -0400
Subject: [PATCH] mips: Switch inferior function calls to ON_STACK method.

This patch switches the mips code to use the ON_STACK method
for function calls instead of AT_SYMBOL, which we want to remove.

gdb/ChangeLog:

        * mips-tdep.c (mips_push_dummy_code): New function.
        (mips_gdbarch_init): Set the gdbarch call_dummy_location to
        ON_STACK and install mips_push_dummy_code as our gdbarch
        push_dummy_code routine.
---
 gdb/mips-tdep.c |   38 ++++++++++++++++++++++++++++++++++----
 1 files changed, 34 insertions(+), 4 deletions(-)

diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c
index 9a3c7fb..ebf7c48 100644
--- a/gdb/mips-tdep.c
+++ b/gdb/mips-tdep.c
@@ -3009,6 +3009,38 @@ mips_frame_align (struct gdbarch *gdbarch, CORE_ADDR addr)
   return align_down (addr, 16);
 }
 
+/* Implement the "push_dummy_call" gdbarch method.  */
+
+static CORE_ADDR
+mips_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp,
+		      CORE_ADDR funaddr, struct value **args,
+		      int nargs, struct type *value_type,
+		      CORE_ADDR *real_pc, CORE_ADDR *bp_addr,
+		      struct regcache *regcache)
+{
+  CORE_ADDR nop_addr;
+  static gdb_byte nop_insn[] = { 0, 0, 0, 0 };
+
+  /* Reserve enough room on the stack for our breakpoint instruction.  */
+  *bp_addr = sp - sizeof (nop_insn);
+
+  /* The breakpoint layer automatically adjusts the address of
+     breakpoints inserted in a branch delay slot.  With enough
+     bad luck, the 4 bytes located just before our breakpoint
+     instruction could look like a branch instruction, and thus
+     trigger the adjustement, and break the function call entirely.
+     So, we reserve those 4 bytes and write a nop instruction
+     to prevent that from happening.  */
+  nop_addr = *bp_addr - sizeof (nop_insn);
+  write_memory (nop_addr, nop_insn, sizeof (nop_insn));
+  sp = mips_frame_align (gdbarch, nop_addr);
+
+  /* Inferior resumes at the function entry point.  */
+  *real_pc = funaddr;
+
+  return sp;
+}
+
 static CORE_ADDR
 mips_eabi_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 			   struct regcache *regcache, CORE_ADDR bp_addr,
@@ -6906,10 +6938,8 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 
   /* MIPS version of CALL_DUMMY.  */
 
-  /* NOTE: cagney/2003-08-05: Eventually call dummy location will be
-     replaced by a command, and all targets will default to on stack
-     (regardless of the stack's execute status).  */
-  set_gdbarch_call_dummy_location (gdbarch, AT_SYMBOL);
+  set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
+  set_gdbarch_push_dummy_code (gdbarch, mips_push_dummy_code);
   set_gdbarch_frame_align (gdbarch, mips_frame_align);
 
   set_gdbarch_convert_register_p (gdbarch, mips_convert_register_p);
-- 
1.7.0.4


[-- Attachment #3: 0001-More-mods-to-mips-ON_STACK-function-call.patch --]
[-- Type: text/x-diff, Size: 1629 bytes --]

From 0e907377fff968693ff42d3cab61cafa4d50521b Mon Sep 17 00:00:00 2001
From: Joel Brobecker <brobecker@adacore.com>
Date: Tue, 8 May 2012 17:57:56 -0400
Subject: [PATCH] More mods to mips ON_STACK function call.

---
 gdb/mips-tdep.c |   11 ++++++-----
 1 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c
index 68ac858..ebf7c48 100644
--- a/gdb/mips-tdep.c
+++ b/gdb/mips-tdep.c
@@ -3018,11 +3018,11 @@ mips_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp,
 		      CORE_ADDR *real_pc, CORE_ADDR *bp_addr,
 		      struct regcache *regcache)
 {
-  int bp_len;
+  CORE_ADDR nop_addr;
   static gdb_byte nop_insn[] = { 0, 0, 0, 0 };
 
-  *bp_addr = sp;
-  gdbarch_breakpoint_from_pc (gdbarch, bp_addr, &bp_len);
+  /* Reserve enough room on the stack for our breakpoint instruction.  */
+  *bp_addr = sp - sizeof (nop_insn);
 
   /* The breakpoint layer automatically adjusts the address of
      breakpoints inserted in a branch delay slot.  With enough
@@ -3031,8 +3031,9 @@ mips_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp,
      trigger the adjustement, and break the function call entirely.
      So, we reserve those 4 bytes and write a nop instruction
      to prevent that from happening.  */
-  write_memory (*bp_addr - bp_len, nop_insn, sizeof (nop_insn));
-  sp = mips_frame_align (gdbarch, *bp_addr - 2 * bp_len);
+  nop_addr = *bp_addr - sizeof (nop_insn);
+  write_memory (nop_addr, nop_insn, sizeof (nop_insn));
+  sp = mips_frame_align (gdbarch, nop_addr);
 
   /* Inferior resumes at the function entry point.  */
   *real_pc = funaddr;
-- 
1.7.0.4


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [RFA 1/2] mips: Switch inferior function calls to ON_STACK method.
  2012-05-08 20:43                       ` Joel Brobecker
  2012-05-08 22:08                         ` Joel Brobecker
@ 2012-05-09  6:21                         ` Maciej W. Rozycki
  1 sibling, 0 replies; 33+ messages in thread
From: Maciej W. Rozycki @ 2012-05-09  6:21 UTC (permalink / raw)
  To: Joel Brobecker; +Cc: Mark Kettenis, gdb-patches

On Tue, 8 May 2012, Joel Brobecker wrote:

> > You set bp_addr to SP here, so you rely on the stack pointer to have
> > been implicitly adjusted down below the current frame [...]
> 
> I was actually confused, as I thought that SP pointed to the first
> unused slot in the stack.

 Correct, but stack grows downwards.  So SP points to the end of the first 
unused slot.  This is best shown with an illustration, e.g. for 32 bits:

       |           | +12
       +           + 
       |   . . .   |  +8
       +           +
       |  current  |  +4
       +           +
       |   frame   |   0
SP --> +-----------+
       |   free    |  -4
       +           +
       |   . . .   |  -8
       +           +
       |           | -12

For example for a nested o32 function at SP + 0 you'll have the next 
frame's $a0 argument save slot.

 This is really no different to how some architectures with hardware stack 
support interpret the SP register, e.g. Intel pieces like 8080 or x86 or 
DEC VAX.

> I will make the changes that you suggest and re-test.

 Great!

> One thing that just occured to me while driving home is why not
> also use the AT_ENTRY_POINT approach. I figured that there must
> have been a reason why we used AT_SYMBOL instead of AT_ENTRY_POINT.
> But then, there is your comment that makes me think that the symbol
> isn't usually defined, which means that most of (all?) the time,
> we actually end up using AT_ENTRY_POINT. Do we know of any reason
> why AT_ENTRY_POINT would not work? I'd assume that as long as the
> object format is ELF, we'd have one, and so we could use that as
> well.

 I mentioned that in one of the replies -- there was a comment originally 
that stated that AT_ENTRY_POINT wouldn't work if it was located in a ROM.  
With software breakpoints that is, but support for hardware breakpoints is 
not mandatory in MIPS processors (and I think we don't use them for 
internal breakpoints anyway).  The comment was removed with the addition 
of AT_SYMBOL.  Presumably that magic symbol would be arranged by a ROM 
image generation toolkit.  As I say, I've never actually encountered it.

> Geee, are we ever going to reach a conclusion on this discussion? :-/

 Well, we'll die off eventually, so certainly there's some finite limit.

  Maciej


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [RFA 1/2] mips: Switch inferior function calls to ON_STACK method.
  2012-05-08 22:08                         ` Joel Brobecker
@ 2012-05-09  7:32                           ` Maciej W. Rozycki
  2012-05-09  8:24                             ` Mark Kettenis
  0 siblings, 1 reply; 33+ messages in thread
From: Maciej W. Rozycki @ 2012-05-09  7:32 UTC (permalink / raw)
  To: Joel Brobecker; +Cc: Mark Kettenis, gdb-patches

On Tue, 8 May 2012, Joel Brobecker wrote:

> Attached is the latest version.
> 
> It's very very slightly different from the version you suggested,
> in the fact that I didn't create a local variable for the breakpoint
> address, and stored it in *bp_addr directly.  I didn't see a real
> purpose for having a local variable in this case.  I did create
> a local variable for the nop instruction address, however. I found
> that it did make things a little clearer for that one.

 That variable was expected to save some memory accesses.  Your version 
should be equally good, I think -- there's no function call between 
setting *bp_addr and reading it back, it's not volatile, so any sane 
compiler should keep it in a register and do not really make that 
read-back while optimising.  While not optimising that probably does not 
matter.  And given it's your code, you're of course free to write it your 
style as long as it's functionally correct and comprehensible for the 
average GDB developer.

> As before, I'm attaching two patches, the first being the last
> version of the patch, and the second being the changes introduced
> by this iteration.

 I'm fine with this version.

> Testec on mips-irix with no regression.  If we'd rather go with
> AT_ENTRY_POINT instead, at least the patch is available here for
> the record.

 I have no strong opinion either way -- as we discussed both choices work 
equally well for the common cases and both have their corner-case 
advantages and disadvantages, none of which seem to directly hit any one 
of us.  What are the reasons for other targets we support to have chosen 
their particular way?

  Maciej


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [RFA 1/2] mips: Switch inferior function calls to ON_STACK method.
  2012-05-09  7:32                           ` Maciej W. Rozycki
@ 2012-05-09  8:24                             ` Mark Kettenis
  2012-05-09  9:14                               ` Maciej W. Rozycki
  2012-05-09 14:35                               ` Joel Brobecker
  0 siblings, 2 replies; 33+ messages in thread
From: Mark Kettenis @ 2012-05-09  8:24 UTC (permalink / raw)
  To: macro; +Cc: brobecker, mark.kettenis, gdb-patches

> Date: Wed, 9 May 2012 08:31:47 +0100
> From: "Maciej W. Rozycki" <macro@codesourcery.com>
> 
> On Tue, 8 May 2012, Joel Brobecker wrote:
> 
> > Testec on mips-irix with no regression.  If we'd rather go with
> > AT_ENTRY_POINT instead, at least the patch is available here for
> > the record.
> 
>  I have no strong opinion either way -- as we discussed both choices work 
> equally well for the common cases and both have their corner-case 
> advantages and disadvantages, none of which seem to directly hit any one 
> of us.  What are the reasons for other targets we support to have chosen 
> their particular way?

Not too long ago, Jan Kratochvil pointed out a problem with
AT_ENTRY_POINT.  The entry point address might be covered by DWARF CFI
embedded in the binary.  Now if the called function throws an
exception, it will use this CFI to unwind the stack with potential
disastrous consequences.  Now I'm not sure how serious that problem
actually is; calling functions that throw exceptions from within GDB
seems like a really bad idea in the first place (did I ever mention
that C++ code is basically undebuggable? ;)).  But ON_STACK doesn't
have this limitation.


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [RFA 1/2] mips: Switch inferior function calls to ON_STACK method.
  2012-05-09  8:24                             ` Mark Kettenis
@ 2012-05-09  9:14                               ` Maciej W. Rozycki
  2012-05-09 16:08                                 ` Tom Tromey
  2012-05-09 14:35                               ` Joel Brobecker
  1 sibling, 1 reply; 33+ messages in thread
From: Maciej W. Rozycki @ 2012-05-09  9:14 UTC (permalink / raw)
  To: Mark Kettenis; +Cc: Joel Brobecker, gdb-patches

On Wed, 9 May 2012, Mark Kettenis wrote:

> >  I have no strong opinion either way -- as we discussed both choices work 
> > equally well for the common cases and both have their corner-case 
> > advantages and disadvantages, none of which seem to directly hit any one 
> > of us.  What are the reasons for other targets we support to have chosen 
> > their particular way?
> 
> Not too long ago, Jan Kratochvil pointed out a problem with
> AT_ENTRY_POINT.  The entry point address might be covered by DWARF CFI
> embedded in the binary.  Now if the called function throws an
> exception, it will use this CFI to unwind the stack with potential
> disastrous consequences.  Now I'm not sure how serious that problem
> actually is; calling functions that throw exceptions from within GDB
> seems like a really bad idea in the first place (did I ever mention
> that C++ code is basically undebuggable? ;)).  But ON_STACK doesn't
> have this limitation.

 OK, that looks like an advantage that actually matters in practice.  So 
unless someone comes with a counterargument I think that we should go for 
this change.

 FWIW I don't find it unreasonable to manually call functions that can 
throw exceptions -- that's just a centralised error recovery mechanism 
that's alternative to the standard procedural language's series of IFs 
checking the error status after each relevant subprocedure call (or other 
action that could score as a failure) and bailing out if unsuccessful 
before proceeding with any further actions.

 It would make sense IMHO though if GDB was capable to catch that 
exception and report that the function returned with such rather than 
normally (if it already does not, that is -- I don't deal with C++ or 
other code using exceptions much, so I don't know).

  Maciej


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [RFA 1/2] mips: Switch inferior function calls to ON_STACK method.
  2012-05-09  8:24                             ` Mark Kettenis
  2012-05-09  9:14                               ` Maciej W. Rozycki
@ 2012-05-09 14:35                               ` Joel Brobecker
  2012-05-14  9:44                                 ` Maciej W. Rozycki
  1 sibling, 1 reply; 33+ messages in thread
From: Joel Brobecker @ 2012-05-09 14:35 UTC (permalink / raw)
  To: Mark Kettenis; +Cc: macro, gdb-patches

I have now checked this patch in.

> Not too long ago, Jan Kratochvil pointed out a problem with
> AT_ENTRY_POINT.

Yeah - I thought we had fixed that by switching the x86/amd64 targets
to using ON_STACK.  But then when I grep'ed around, I didn't find that.
So I thought perhaps we went a different route, because I was sure we
had checked a fix in.  But in fact, reviewing the history, I think
that this issue is still open, probably one of these low-priority
issues that one looks at when there is free moment.

In my opinion, the point about not being able to write the breakpoint
if the program is executed from ROM, combined with the fact that entry
points may have CFI info, clinches it.

OK - now that this is out of the way, which comments did we want to add?

-- 
Joel


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [commit 2/2] Remove AT_SYMBOL
  2012-05-03 19:03 ` [commit 2/2] Remove AT_SYMBOL Joel Brobecker
@ 2012-05-09 14:37   ` Joel Brobecker
  0 siblings, 0 replies; 33+ messages in thread
From: Joel Brobecker @ 2012-05-09 14:37 UTC (permalink / raw)
  To: gdb-patches

> gdb/ChangeLog:
> 
>         * infcall.c (call_function_by_hand): Remove AT_SYMBOL handling.
>         * inferior.h (AT_SYMBOL): Delete.

This patch is now in as well.

-- 
Joel


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [RFA 1/2] mips: Switch inferior function calls to ON_STACK method.
  2012-05-09  9:14                               ` Maciej W. Rozycki
@ 2012-05-09 16:08                                 ` Tom Tromey
  0 siblings, 0 replies; 33+ messages in thread
From: Tom Tromey @ 2012-05-09 16:08 UTC (permalink / raw)
  To: Maciej W. Rozycki; +Cc: Mark Kettenis, Joel Brobecker, gdb-patches

>>>>> "Maciej" == Maciej W Rozycki <macro@codesourcery.com> writes:

Maciej>  It would make sense IMHO though if GDB was capable to catch that 
Maciej> exception and report that the function returned with such rather than 
Maciej> normally (if it already does not, that is -- I don't deal with C++ or 
Maciej> other code using exceptions much, so I don't know).

GDB tries, see "help show unwind-on-terminating-exception".

The problem here is that gdb doesn't try to modify the unwind data when
making an inferior call.  So, if the inferior call reuses memory covered
by the unwind data, then the unwinder will go ahead and try to use this
data, resulting in weird behavior.

It is probably possible to fix the problem other ways, but ON_STACK is
pretty simple in comparison to modifying the unwind data or hooking into
the unwinder.

Tom


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [RFA 1/2] mips: Switch inferior function calls to ON_STACK method.
  2012-05-09 14:35                               ` Joel Brobecker
@ 2012-05-14  9:44                                 ` Maciej W. Rozycki
  2012-05-14 15:01                                   ` Joel Brobecker
  2012-06-11 10:14                                   ` Maciej W. Rozycki
  0 siblings, 2 replies; 33+ messages in thread
From: Maciej W. Rozycki @ 2012-05-14  9:44 UTC (permalink / raw)
  To: Joel Brobecker; +Cc: Mark Kettenis, gdb-patches

On Wed, 9 May 2012, Joel Brobecker wrote:

> I have now checked this patch in.

 Thanks.  It looks like a typo has crept in in the review process and 
nobody noticed.  I have now fixed it with the change below.

Index: gdb-fsf-trunk-quilt/gdb/mips-tdep.c
===================================================================
--- gdb-fsf-trunk-quilt.orig/gdb/mips-tdep.c	2012-05-12 22:50:59.375649586 +0100
+++ gdb-fsf-trunk-quilt/gdb/mips-tdep.c	2012-05-12 22:51:22.565626048 +0100
@@ -3009,7 +3009,7 @@ mips_frame_align (struct gdbarch *gdbarc
   return align_down (addr, 16);
 }
 
-/* Implement the "push_dummy_call" gdbarch method.  */
+/* Implement the "push_dummy_code" gdbarch method.  */
 
 static CORE_ADDR
 mips_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp,

> > Not too long ago, Jan Kratochvil pointed out a problem with
> > AT_ENTRY_POINT.
> 
> Yeah - I thought we had fixed that by switching the x86/amd64 targets
> to using ON_STACK.  But then when I grep'ed around, I didn't find that.
> So I thought perhaps we went a different route, because I was sure we
> had checked a fix in.  But in fact, reviewing the history, I think
> that this issue is still open, probably one of these low-priority
> issues that one looks at when there is free moment.
> 
> In my opinion, the point about not being able to write the breakpoint
> if the program is executed from ROM, combined with the fact that entry
> points may have CFI info, clinches it.

 I gave it yet more thinking and came to the conclusion that at least for 
the MIPS target, where it is safe to use either way, but both have some 
drawbacks, we should really apply both, switching dynamically.  The reason 
is the stack may be unwritable for whatever reason (e.g. not correctly set 
up), so we should try ON_STACK first and if that fails (e.g. SP is NULL or 
writing to the stack has faulted), then fall back to AT_ENTRY_POINT.  
This is another corner case however and I don't feel compelled to 
implement it right now.  Let's leave it for another sunny day in 
Cambridgeshire. ;)

> OK - now that this is out of the way, which comments did we want to add?

 I've lost track, sorry, however here is the promised update I will 
include with the microMIPS change.  I used a local variable to hold the 
address of the breakpoint slot after all lest the result be horrible.  No 
regressions on mips-sde-elf or mips-linux-gnu, checked the usual set of 
standard MIPS, MIPS16 and microMIPS multilibs.

 Since this is recent code and I was changing it anyway I have reordered 
the local variables to follow the "reverse Christmas tree" style -- I find 
the definitions easier to read this way (of course initialisers may 
prevent this style to be fully applied in some cases).  The style has been 
used in the various places of the Linux kernel recently and I believe 
there is nothing said about how local variable definitions are meant to be 
ordered in the GNU Coding Style, so it should be fine to use it in GDB 
(at least in places I am concerned about).  I do not plan to specifically 
revamp existing code though.

2012-05-14  Maciej W. Rozycki  <macro@codesourcery.com>

	gdb/
	* mips-tdep.c (mips_push_dummy_code): Handle microMIPS code.

  Maciej

gdb-micromips-on-stack.diff
Index: gdb-fsf-trunk-quilt/gdb/mips-tdep.c
===================================================================
--- gdb-fsf-trunk-quilt.orig/gdb/mips-tdep.c	2012-05-12 21:21:38.000000000 +0100
+++ gdb-fsf-trunk-quilt/gdb/mips-tdep.c	2012-05-12 22:45:37.355619042 +0100
@@ -4198,11 +4198,18 @@ mips_push_dummy_code (struct gdbarch *gd
 		      CORE_ADDR *real_pc, CORE_ADDR *bp_addr,
 		      struct regcache *regcache)
 {
-  CORE_ADDR nop_addr;
   static gdb_byte nop_insn[] = { 0, 0, 0, 0 };
+  CORE_ADDR nop_addr;
+  CORE_ADDR bp_slot;
 
   /* Reserve enough room on the stack for our breakpoint instruction.  */
-  *bp_addr = sp - sizeof (nop_insn);
+  bp_slot = sp - sizeof (nop_insn);
+
+  /* Return to microMIPS mode if calling microMIPS code to avoid
+     triggering an address error exception on processors that only
+     support microMIPS execution.  */
+  *bp_addr = (mips_pc_is_micromips (gdbarch, funaddr)
+	      ? make_compact_addr (bp_slot) : bp_slot);
 
   /* The breakpoint layer automatically adjusts the address of
      breakpoints inserted in a branch delay slot.  With enough
@@ -4211,7 +4218,7 @@ mips_push_dummy_code (struct gdbarch *gd
      trigger the adjustement, and break the function call entirely.
      So, we reserve those 4 bytes and write a nop instruction
      to prevent that from happening.  */
-  nop_addr = *bp_addr - sizeof (nop_insn);
+  nop_addr = bp_slot - sizeof (nop_insn);
   write_memory (nop_addr, nop_insn, sizeof (nop_insn));
   sp = mips_frame_align (gdbarch, nop_addr);
 


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [RFA 1/2] mips: Switch inferior function calls to ON_STACK method.
  2012-05-14  9:44                                 ` Maciej W. Rozycki
@ 2012-05-14 15:01                                   ` Joel Brobecker
  2012-05-14 16:48                                     ` Maciej W. Rozycki
  2012-06-11 10:14                                   ` Maciej W. Rozycki
  1 sibling, 1 reply; 33+ messages in thread
From: Joel Brobecker @ 2012-05-14 15:01 UTC (permalink / raw)
  To: Maciej W. Rozycki; +Cc: Mark Kettenis, gdb-patches

>  I gave it yet more thinking and came to the conclusion that at least
>  for the MIPS target, where it is safe to use either way, but both
>  have some drawbacks, we should really apply both, switching
>  dynamically.  The reason is the stack may be unwritable for whatever
>  reason (e.g. not correctly set up), so we should try ON_STACK first
>  and if that fails (e.g. SP is NULL or writing to the stack has
>  faulted), then fall back to AT_ENTRY_POINT.  This is another corner
>  case however and I don't feel compelled to implement it right now.
>  Let's leave it for another sunny day in Cambridgeshire. ;)

Is that something we could detect at gdbarch init? (I don't think we
have a process at init time)

> 2012-05-14  Maciej W. Rozycki  <macro@codesourcery.com>
> 
> 	gdb/
> 	* mips-tdep.c (mips_push_dummy_code): Handle microMIPS code.

FWIW, the change looks good to me.

-- 
Joel


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [RFA 1/2] mips: Switch inferior function calls to ON_STACK method.
  2012-05-14 15:01                                   ` Joel Brobecker
@ 2012-05-14 16:48                                     ` Maciej W. Rozycki
  0 siblings, 0 replies; 33+ messages in thread
From: Maciej W. Rozycki @ 2012-05-14 16:48 UTC (permalink / raw)
  To: Joel Brobecker; +Cc: Mark Kettenis, gdb-patches

On Mon, 14 May 2012, Joel Brobecker wrote:

> >  I gave it yet more thinking and came to the conclusion that at least
> >  for the MIPS target, where it is safe to use either way, but both
> >  have some drawbacks, we should really apply both, switching
> >  dynamically.  The reason is the stack may be unwritable for whatever
> >  reason (e.g. not correctly set up), so we should try ON_STACK first
> >  and if that fails (e.g. SP is NULL or writing to the stack has
> >  faulted), then fall back to AT_ENTRY_POINT.  This is another corner
> >  case however and I don't feel compelled to implement it right now.
> >  Let's leave it for another sunny day in Cambridgeshire. ;)
> 
> Is that something we could detect at gdbarch init? (I don't think we
> have a process at init time)

 That has to be done every time a request for a manual call is made -- 
according to current conditions.  The stack may be in oblivion during 
early startup for example, but get into working state later on.  Of course 
the callee may need to use the stack too, in which case it's not going to 
work anyway.  So it is really leaf functions only that could be called and 
then not even all of them.

 Therefore I'll just reiterate the unimportance of this corner case.  I 
guess nobody will really notice, it looks to me the manual call feature is 
not used by people that often in the first place.  I've looked through our 
bugzilla and the long-lived breakage of MIPS16 manual calls I posted fixes 
for recently (both the FP ABI fix and the ISA bit fix) has never been 
reported by anyone.

> > 2012-05-14  Maciej W. Rozycki  <macro@codesourcery.com>
> > 
> > 	gdb/
> > 	* mips-tdep.c (mips_push_dummy_code): Handle microMIPS code.
> 
> FWIW, the change looks good to me.

 Thanks for checking and confirming.

  Maciej


^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [RFA 1/2] mips: Switch inferior function calls to ON_STACK method.
  2012-05-14  9:44                                 ` Maciej W. Rozycki
  2012-05-14 15:01                                   ` Joel Brobecker
@ 2012-06-11 10:14                                   ` Maciej W. Rozycki
  1 sibling, 0 replies; 33+ messages in thread
From: Maciej W. Rozycki @ 2012-06-11 10:14 UTC (permalink / raw)
  To: Joel Brobecker; +Cc: Mark Kettenis, gdb-patches

On Mon, 14 May 2012, Maciej W. Rozycki wrote:

>  I've lost track, sorry, however here is the promised update I will 
> include with the microMIPS change.  I used a local variable to hold the 
> address of the breakpoint slot after all lest the result be horrible.  No 
> regressions on mips-sde-elf or mips-linux-gnu, checked the usual set of 
> standard MIPS, MIPS16 and microMIPS multilibs.

 Hmm, I intended to fold this update into the original microMIPS change 
before committing, but somehow I did not.  I have checked it now instead.

2012-06-11  Maciej W. Rozycki  <macro@codesourcery.com>

	gdb/
	* mips-tdep.c (mips_push_dummy_code): Handle microMIPS code.

  Maciej

gdb-micromips-on-stack.diff
Index: gdb-fsf-trunk-quilt/gdb/mips-tdep.c
===================================================================
--- gdb-fsf-trunk-quilt.orig/gdb/mips-tdep.c	2012-05-12 21:21:38.000000000 +0100
+++ gdb-fsf-trunk-quilt/gdb/mips-tdep.c	2012-05-12 22:45:37.355619042 +0100
@@ -4198,11 +4198,18 @@ mips_push_dummy_code (struct gdbarch *gd
 		      CORE_ADDR *real_pc, CORE_ADDR *bp_addr,
 		      struct regcache *regcache)
 {
-  CORE_ADDR nop_addr;
   static gdb_byte nop_insn[] = { 0, 0, 0, 0 };
+  CORE_ADDR nop_addr;
+  CORE_ADDR bp_slot;
 
   /* Reserve enough room on the stack for our breakpoint instruction.  */
-  *bp_addr = sp - sizeof (nop_insn);
+  bp_slot = sp - sizeof (nop_insn);
+
+  /* Return to microMIPS mode if calling microMIPS code to avoid
+     triggering an address error exception on processors that only
+     support microMIPS execution.  */
+  *bp_addr = (mips_pc_is_micromips (gdbarch, funaddr)
+	      ? make_compact_addr (bp_slot) : bp_slot);
 
   /* The breakpoint layer automatically adjusts the address of
      breakpoints inserted in a branch delay slot.  With enough
@@ -4211,7 +4218,7 @@ mips_push_dummy_code (struct gdbarch *gd
      trigger the adjustement, and break the function call entirely.
      So, we reserve those 4 bytes and write a nop instruction
      to prevent that from happening.  */
-  nop_addr = *bp_addr - sizeof (nop_insn);
+  nop_addr = bp_slot - sizeof (nop_insn);
   write_memory (nop_addr, nop_insn, sizeof (nop_insn));
   sp = mips_frame_align (gdbarch, nop_addr);
 


^ permalink raw reply	[flat|nested] 33+ messages in thread

end of thread, other threads:[~2012-06-11 10:14 UTC | newest]

Thread overview: 33+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-05-03 19:03 Getting rid of AT_SYMBOL inferior call method Joel Brobecker
2012-05-03 19:03 ` [commit 2/2] Remove AT_SYMBOL Joel Brobecker
2012-05-09 14:37   ` Joel Brobecker
2012-05-03 19:03 ` [RFA 1/2] mips: Switch inferior function calls to ON_STACK method Joel Brobecker
2012-05-03 21:09   ` Maciej W. Rozycki
2012-05-03 21:50     ` Joel Brobecker
2012-05-03 23:29       ` Maciej W. Rozycki
2012-05-04 20:58         ` Joel Brobecker
2012-05-04 21:19           ` Mark Kettenis
2012-05-04 23:25             ` Maciej W. Rozycki
2012-05-05 11:45               ` Mark Kettenis
2012-05-08 15:08                 ` Maciej W. Rozycki
2012-05-08 16:06                   ` Joel Brobecker
2012-05-08 20:26                     ` Maciej W. Rozycki
2012-05-08 20:43                       ` Joel Brobecker
2012-05-08 22:08                         ` Joel Brobecker
2012-05-09  7:32                           ` Maciej W. Rozycki
2012-05-09  8:24                             ` Mark Kettenis
2012-05-09  9:14                               ` Maciej W. Rozycki
2012-05-09 16:08                                 ` Tom Tromey
2012-05-09 14:35                               ` Joel Brobecker
2012-05-14  9:44                                 ` Maciej W. Rozycki
2012-05-14 15:01                                   ` Joel Brobecker
2012-05-14 16:48                                     ` Maciej W. Rozycki
2012-06-11 10:14                                   ` Maciej W. Rozycki
2012-05-09  6:21                         ` Maciej W. Rozycki
2012-05-04 22:41           ` Maciej W. Rozycki
2012-05-04 21:34     ` Mark Kettenis
2012-05-05  1:31       ` Maciej W. Rozycki
2012-05-03 21:44   ` Mark Kettenis
2012-05-03 21:58     ` Joel Brobecker
2012-05-04  2:11       ` Yao Qi
2012-05-03 22:03   ` Joel Brobecker

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox