Here are the steps I have in mind.  I think this work should be pretty well
clear to merge upstream without much controversy.  Basically, this is the
arch parts now done in the tracehook and regset patches, with a little
sugar.  Several of these steps can be done in parallel and merged upstream
independently.

First, the common groundwork (maybe 2 or 3 arch-independent patches): I
envision a new linux/regset.h defining the regset types and helpers from
linux/tracehook.h, but with utrace_regset renamed user_regset throughout.
Next, the ptrace_layout stuff and helpers from the utrace-ptrace-compat
patch go into linux/ptrace.h in fairly similar form (but no utrace references).

Also, I will make another generic patch to fs/binfmt_elf.c giving it the
option to use user_regset as its only access to machine state (instead of
the current asm/elf.h macros on each arch).  

Next, each arch has several steps.  It would be good if someone took my old
write-up http://people.redhat.com/roland/utrace/utrace-arch-porting-howto.txt
and these notes and synthesized new instructions for doing the "user_regset"
cleanups from scratch on an arch (independent of utrace).

1. asm/tracehook.h functions, i.e. single_step et al.
   Define these called user_* instead of tracehook_*, declare them in
   the __KERNEL__ part of asm/ptrace.h.  I'll probably simplify the macro
   bits a bit and drop the is-enabled hook that nothing uses.

   The tracehook_{enable,disable}_syscall_trace functions can just be
   dropped.  Everything uses TIF_SYSCALL_TRACE uniformly for that now.

   You're just taking the bits from your arch's utrace-tracehook or
   utrace-regset patch that does this and changing the names.  Most of
   those patches were just renaming existing functions anyway.  In some
   cases the arch code has to change so it can be called on current and
   not just on another stopped thread.  This is not strictly necessary for
   ptrace cleanup, but will be required for the full generality of
   something like utrace.  It's already done in your arch utrace-tracehook
   patch, since utrace requires it now, so you do have the code on hand
   and have tested it.  But convincing an arch maintainer to accept that
   part of the patch has to rely on the argument that it will be good for
   the future benefit of new debugger features and their future
   implementation details staying out of the arch maintainers' hair.

   Update the calls in your arch's old ptrace code to the new names.

   When every arch has consolidated its code into user_enable_single_step
   et al functions with standard signatures, we can move PTRACE_SINGLESTEP,
   PTRACE_CONT, etc. from the arch ptrace code into the generic code.

   #1 depends on nothing else.

2. arch regset functions, and define task_user_regset_view (new name for
   utrace_native_view).  This is in the utrace-regset patch for your arch
   now.  How to organize this for upstream submission will depend on the
   details of the code for your arch and what your arch maintainers want.

   If your utrace-regset patch mostly adds entirely new functions for the
   utrace_regset (now user_regset) accessor style, then you can do an
   incremental patch just adding new stuff without changing anything to
   actually use it yet.  If your patch reuses old ptrace code more directly
   by turning it directly into the regset functions, then you may need to
   roll this into one patch with the ptrace_layout bits (below) to have
   something to send upstream in one patch that doesn't break anything.

   Note that these functions need to incorporate one wrinkle beyond just
   wrapping the old code in the new accessor signatures.  This is already
   handled in your utrace-regset patch (and is noted in the old porting
   howto), but may need careful attention to preserve and justify in the
   upstream arch maintainers' merge.  That is, the accessors can be called
   on current.  For the get calls, this is necessary to use them for core
   dumps, so that should be an easy argument to make.  For the set calls,
   you have to rely on the argument that it will be good for the future
   benefit of new debugger features and their future implementation
   details staying out of the arch maintainers' hair.

   #2 depends on nothing else but the generic patch adding linux/regset.h

3. Use regset functions for core dump.  This will just be defining a new
   macro in asm/elf.h that tells the new fs/binfmt_elf.c code that's what
   you want.  For each arch it could probably be one patch adding that
   macro and a second patch removing all the asm/elf.h macros no longer
   used.  For arch's with compat, another pair doing that for its compat
   hack that #include's fs/binfmt_elf.c.

   #3 depends on #2

4. Use regset functions for ptrace.  This is in the utrace-ptrace-compat
   patch for your arch now.  Depending on your code, you might need to roll
   this into #2 to avoid breaking anything in that patch while still
   avoiding unpleasant duplication of code that should be cleaned up directly.

   This should be trivial, and hopefully noncontroversial upstream if #2
   has any traction.  It's just making arch_ptrace use the ptrace_layout
   stuff or ptrace_regset helpers for its PEEKUSR, GETREGS, etc.

   Depending on your arch maintainers' taste, this might be several little
   patches for each read/write pair of ptrace requests, or just one patch.

   #4 depends on #2 and the generic patches providing the ptrace_layout helpers

5. arch cruft removal.  After all those have been merged, there may be
   some unused code or macros lingering around from the old ptrace or
   core-dump support that can be cleaned out.  Make it tidy.


Except for the dependencies noted, all of these things across the various
arch's can proceed in parallel.  I hope that these patches will have some
appeal to arch maintainers as pure cleanup and consolidation.  It reduces
the duplication between ptrace and core-dump that arch code has to provide
functions and easy-to-miss magic macros for.  It provides a single
coherent place for an arch maintainer to look for what they should do to
cover all userland needs for debugging and dumps.  The non-regset cleanups
will make it possible to reduce the amount of arch ptrace code now required
and keep non-arch ptrace details out of that arch code.  

This work can be merged into each arch tree more or less right now.  That
takes me, and any hairy issues about utrace/ptrace, out of the loop for
upstream review and merging.  I'd still like to stay CC'd on patches
related to this sort of thing.  But now we can really have the arch
maintainers (and the people on this list interested in each arch) "own"
this arch code.  (That was my hope from the beginning, but in practice
they've all been "my baby" and others working on them go through me.)
Once the first arch adopts the work to get the ball rolling, I hope for
each arch an advocate (other than me) can take the lead in ironing out
these cleanups with the upstream arch maintainers.

I will get started on the groundwork patches and do x86 to set the
example.  I think I can get this going in the next few days (next few
business days anyway, not sure about the holiday weekend right now).

Once upstream arch code has merged all the steps above, there will be no
more arch changes--or very nearly none, anyway--required to work with a
later merging of utrace or something else like it.  I've thought about
ways to be more incremental about the core changes, too.  But if we can
get the ball rolling with the arch changes and get a majority of upstream
arch trees converted over, that will be a first big win.


Thanks,
Roland

Reply via email to