Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Mark Kettenis <kettenis@gnu.org>
To: cagney@gnu.org
Cc: drow@false.org, gdb-patches@sources.redhat.com
Subject: Re: [RFC] Use target vector inheritance for GNU/Linux
Date: Sun, 12 Dec 2004 21:45:00 -0000	[thread overview]
Message-ID: <200412122107.iBCL7KEi011314@elgar.sibelius.xs4all.nl> (raw)
In-Reply-To: <41BC8521.9060107@gnu.org> (message from Andrew Cagney on Sun, 12 Dec 2004 12:51:29 -0500)

   Date: Sun, 12 Dec 2004 12:51:29 -0500
   From: Andrew Cagney <cagney@gnu.org>

   > -LONGEST 
   > -ia64_linux_xfer_unwind_table (struct target_ops *ops,
   > -			      enum target_object object,
   > -			      const char *annex,
   > -			      void *readbuf, const void *writebuf,
   > -			      ULONGEST offset, LONGEST len)
   > +LONGEST (*saved_xfer_partial) (struct target_ops *, enum target_object,
   > +			       const char *, void *, const void *,
   > +			       ULONGEST, LONGEST);
   > +
   > +static LONGEST 
   > +ia64_linux_xfer_partial (struct target_ops *ops,
   > +			 enum target_object object,
   > +			 const char *annex,
   > +			 void *readbuf, const void *writebuf,
   > +			 ULONGEST offset, LONGEST len)
   >  {
   > -  return syscall (__NR_getunwind, readbuf, len);
   > +  if (object == TARGET_OBJECT_UNWIND_TABLE && writebuf == NULL && offset == 0)
   > +    return syscall (__NR_getunwind, readbuf, len);
   > +
   > +  return saved_xfer_partial (ops, object, annex, readbuf, writebuf,
   > +			     offset, len);
   > +}

   Can you rename saved_xfer_partial to super_xfer_partial_hack and add a 
   FIXME.  It should be calling super.xfer_partial but that's not available :-(

Can you explain what you're hinting at here Andrew?  What makes this
specific saved_xfer_partial so different from the other saved_xxx
instances that the patch introduces?

   +#ifndef FETCH_INFERIOR_REGISTERS
   +
   +/* Fetch register REGNUM from the inferior.  */
   +
   +static void
   +fetch_register (int regnum)
   +{

   Why is this wrapped in in an #ifdef?

Some of the Linux target still need the crufty old code to read
registers using PTRACE_PEEKUSR.  The new inf-ptrace.c doesn't provide
that functionality, so I guess Daniel inlined that bit of code here.
This is related to the FIXME below, and of course only temporary.

I'm working on something that will help resolving this problem, by
re-adding PT_READ_U support back into inf-ptrace.c in a clean fashion.
In the meantime, this hack allows us to go forwards.

   +/* Create a generic GNU/Linux target vector.  If T is non-NULL, base
   +   the new target vector on it.  */
   +
   +struct target_ops *
   +linux_target (struct target_ops *t)

   Can this be renamed to inf_linux_target (to be consistent with the other 
   inf_*_target() methods?

Apparently I don't agre with this since I already introduced
i386bsd_target and sparc_target; linux_target is consistent with that.

   > A new function, linux_target, is added to linux-nat.c.  Then any GNU/Linux
   > target can call it, and pass the result to add_target - after specializing
   > whatever methods it needs to.  Sometimes it's necessary to specialize a
   > method between inf_ptrace_target and linux_target, so it accepts an optional
   > argument.  This wouldn't be necessary if all target methods took a
   > target_ops parameter, so they could call the overridden method.

   As in this?

   > +void
   > +_initialize_i386_linux_nat (void)
   > +{
   > +  struct target_ops *t = inf_ptrace_target ();
   > +
   > +  /* Override the default ptrace resume method.  */
   > +  t->to_resume = i386_linux_resume;
   > +
   > +  /* Fill in the generic GNU/Linux methods.  */
   > +  t = linux_target (t);

   which is violating the inheritance structure.  Can you instead add a 
   one-of method (deprecated_set_super_linux_resume?) to handle this case? 
     We can then see about fixing the problem (I'm left wondering if that 
   method is still needed).

No it isn't.  At a very low level, all Linux ports are slightly
different.  Most ports will need to adjust the generic ptrace target
before it can be inherited by the generic Linux target.  In fact I
think that when the FETCH_INFERIOR_REGISTERS issue above is sorted
out, you'll see that *all* Linux ports will need to do this trick of
adjusting the ptrace target before passing it to linux_target().

(And yes, I'm fairly certain the method is still needed.  While the
problem may have been fixed in recent kernels, there are many older
Linux kernels out there.)

   > +  /* FIXME drow/2004-12-04: For now, these functions must keep the standard
   > +     names because only some GNU/Linux targets use inf-ptrace.o.  When all
   > +     have been converted, these functions can be renamed and made static.  */

   Is this still true?  I thought the patch was so large because it touched 
   all the linux targets.

Yes it is true.  Daniels patch touches most (if not all) Linux
targets, but doesn't resolve all the issues.  Some more work is
necessary.  However, most of that work is non-mechanical.  Given the
fact that many Linux targets are not actively maintained making the
acceptance of this patch depend on this patch depend on that work
would probably mean it will be dropped.

Mark


  reply	other threads:[~2004-12-12 21:07 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-12-05 18:48 Daniel Jacobowitz
2004-12-06 14:41 ` Mark Kettenis
2004-12-06 14:43   ` Daniel Jacobowitz
2004-12-12 17:53 ` Andrew Cagney
2004-12-12 17:59 ` Andrew Cagney
2004-12-12 21:45   ` Mark Kettenis [this message]
2004-12-13 20:45     ` Andrew Cagney
2004-12-13 22:29       ` Mark Kettenis
2004-12-13 22:57         ` Andrew Cagney
2004-12-14  2:06           ` Mark Kettenis
2004-12-14 15:41             ` Andrew Cagney
2004-12-15  0:07               ` Mark Kettenis

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200412122107.iBCL7KEi011314@elgar.sibelius.xs4all.nl \
    --to=kettenis@gnu.org \
    --cc=cagney@gnu.org \
    --cc=drow@false.org \
    --cc=gdb-patches@sources.redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox