Re: [PATCH 1/2] Move the pt_regs_offset struct definition from arch to common include file

2015-07-22 Thread David Long

On 07/22/15 01:11, Michael Ellerman wrote:

On Wed, 2015-07-22 at 00:46 -0400, David Long wrote:

On 06/29/15 23:29, Michael Ellerman wrote:

On Wed, 2015-06-17 at 14:30 -0400, David Long wrote:

On 06/16/15 09:17, Rob Herring wrote:

On Mon, Jun 15, 2015 at 11:42 AM, David Long dave.l...@linaro.org wrote:


#define REG_OFFSET_NAME(r) \
   {.name = #r, .offset = offsetof(struct pt_regs, ARM_##r)}
#define REG_OFFSET_END {.name = NULL, .offset = 0}


Can't you also move these? ARM is complicated with the ARM_
prefixing, but the others appear to be the same. Maybe you can remove
the prefix or redefine the macro for ARM.


That would mandate that all the architecture-specific pt_regs structures
would have to use a top-level named field for each named register.


Why does it mandate that?

See eg. powerpc where we use REG_OFFSET_NAME for the top-level named fields and
then a different macro for the array elements:

#define REG_OFFSET_NAME(r) {.name = #r, .offset = offsetof(struct pt_regs, 
r)}
#define GPR_OFFSET_NAME(num)\
{.name = STR(gpr##num), .offset = offsetof(struct pt_regs, gpr[num])}

static const struct pt_regs_offset regoffset_table[] = {
GPR_OFFSET_NAME(0),
GPR_OFFSET_NAME(1),
GPR_OFFSET_NAME(2),
GPR_OFFSET_NAME(3),
...
REG_OFFSET_NAME(nip),
REG_OFFSET_NAME(msr),


So I don't see why REG_OFFSET_NAME couldn't be common.



Sorry for the delay in responding to this.

OK, so you're saying architectures that don't want this constraint can
make their own macro.  Seems to make this whole exercise slightly less
useful, but whatever.


Well yeah.

In fact of the 4 arches that use REG_OFFSET_NAME, 2 already have another macro
for specially named registers (powerpc  sh).


I see three ways to go here:

1) Leave it as is.
2) Force all architectures to use a common definition.
3) Provide a common definition that all architectures (except arm)
currently using this functionality will use.

I have a v2 patch to implement #3, ready to post.  Do we think this is
the way to go?


Yeah I think it is. How are you making it conditional? Just #ifndef 
REG_OFFSET_NAME?



I'm just defining a new macro for arm.  The macro is only invoked in one 
arm file.  Then the REG_OFFSET_NAME macro goes unused for this architecture.



I don't like #2 because I really don't want to rename all
uses of the current register fields for arm since this is
architecture-specific code to begin with and since it affects code in 39
arm source files.


I guess you're talking about renaming all the ARM_x regs to x. That would
likely cause problems because they're implemented as #defines,
eg. #define r0 uregs[0] would probably confuse your assembler.



Yeah, and I had not looked further to the implications of doing that but 
I see you've found where it is a genuine problem.



The clean thing to do would be to have the in-kernel struct pt_regs have actual
named members, but that would still be an intrusive change.

cheers




Thanks,
-dl

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: [PATCH 1/2] Move the pt_regs_offset struct definition from arch to common include file

2015-07-21 Thread David Long

On 06/29/15 23:29, Michael Ellerman wrote:

On Wed, 2015-06-17 at 14:30 -0400, David Long wrote:

On 06/16/15 09:17, Rob Herring wrote:

On Mon, Jun 15, 2015 at 11:42 AM, David Long dave.l...@linaro.org wrote:


   #define REG_OFFSET_NAME(r) \
  {.name = #r, .offset = offsetof(struct pt_regs, ARM_##r)}
   #define REG_OFFSET_END {.name = NULL, .offset = 0}


Can't you also move these? ARM is complicated with the ARM_
prefixing, but the others appear to be the same. Maybe you can remove
the prefix or redefine the macro for ARM.


That would mandate that all the architecture-specific pt_regs structures
would have to use a top-level named field for each named register.


Why does it mandate that?

See eg. powerpc where we use REG_OFFSET_NAME for the top-level named fields and
then a different macro for the array elements:

   #define REG_OFFSET_NAME(r) {.name = #r, .offset = offsetof(struct pt_regs, 
r)}
   #define GPR_OFFSET_NAME(num) \
{.name = STR(gpr##num), .offset = offsetof(struct pt_regs, gpr[num])}

   static const struct pt_regs_offset regoffset_table[] = {
GPR_OFFSET_NAME(0),
GPR_OFFSET_NAME(1),
GPR_OFFSET_NAME(2),
GPR_OFFSET_NAME(3),
...
REG_OFFSET_NAME(nip),
REG_OFFSET_NAME(msr),


So I don't see why REG_OFFSET_NAME couldn't be common.



Sorry for the delay in responding to this.

OK, so you're saying architectures that don't want this constraint can 
make their own macro.  Seems to make this whole exercise slightly less 
useful, but whatever.


I see three ways to go here:

1) Leave it as is.
2) Force all architectures to use a common definition.
3) Provide a common definition that all architectures (except arm) 
currently using this functionality will use.


I have a v2 patch to implement #3, ready to post.  Do we think this is 
the way to go? I don't like #2 because I really don't want to rename all 
uses of the current register fields for arm since this is 
architecture-specific code to begin with and since it affects code in 39 
arm source files.



cheers




Thanks,
-dl

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: [PATCH 1/2] Move the pt_regs_offset struct definition from arch to common include file

2015-07-21 Thread Michael Ellerman
On Wed, 2015-07-22 at 00:46 -0400, David Long wrote:
 On 06/29/15 23:29, Michael Ellerman wrote:
  On Wed, 2015-06-17 at 14:30 -0400, David Long wrote:
  On 06/16/15 09:17, Rob Herring wrote:
  On Mon, Jun 15, 2015 at 11:42 AM, David Long dave.l...@linaro.org wrote:
 
 #define REG_OFFSET_NAME(r) \
{.name = #r, .offset = offsetof(struct pt_regs, ARM_##r)}
 #define REG_OFFSET_END {.name = NULL, .offset = 0}
 
  Can't you also move these? ARM is complicated with the ARM_
  prefixing, but the others appear to be the same. Maybe you can remove
  the prefix or redefine the macro for ARM.
 
  That would mandate that all the architecture-specific pt_regs structures
  would have to use a top-level named field for each named register.
 
  Why does it mandate that?
 
  See eg. powerpc where we use REG_OFFSET_NAME for the top-level named fields 
  and
  then a different macro for the array elements:
 
 #define REG_OFFSET_NAME(r) {.name = #r, .offset = offsetof(struct 
  pt_regs, r)}
 #define GPR_OFFSET_NAME(num) \
  {.name = STR(gpr##num), .offset = offsetof(struct pt_regs, gpr[num])}
 
 static const struct pt_regs_offset regoffset_table[] = {
  GPR_OFFSET_NAME(0),
  GPR_OFFSET_NAME(1),
  GPR_OFFSET_NAME(2),
  GPR_OFFSET_NAME(3),
  ...
  REG_OFFSET_NAME(nip),
  REG_OFFSET_NAME(msr),
 
 
  So I don't see why REG_OFFSET_NAME couldn't be common.
 
 
 Sorry for the delay in responding to this.
 
 OK, so you're saying architectures that don't want this constraint can 
 make their own macro.  Seems to make this whole exercise slightly less 
 useful, but whatever.

Well yeah.

In fact of the 4 arches that use REG_OFFSET_NAME, 2 already have another macro
for specially named registers (powerpc  sh).

 I see three ways to go here:
 
 1) Leave it as is.
 2) Force all architectures to use a common definition.
 3) Provide a common definition that all architectures (except arm) 
 currently using this functionality will use.
 
 I have a v2 patch to implement #3, ready to post.  Do we think this is 
 the way to go?

Yeah I think it is. How are you making it conditional? Just #ifndef 
REG_OFFSET_NAME?

 I don't like #2 because I really don't want to rename all 
 uses of the current register fields for arm since this is 
 architecture-specific code to begin with and since it affects code in 39 
 arm source files.

I guess you're talking about renaming all the ARM_x regs to x. That would
likely cause problems because they're implemented as #defines,
eg. #define r0 uregs[0] would probably confuse your assembler.

The clean thing to do would be to have the in-kernel struct pt_regs have actual
named members, but that would still be an intrusive change.

cheers


___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: [PATCH 1/2] Move the pt_regs_offset struct definition from arch to common include file

2015-06-29 Thread Michael Ellerman
On Wed, 2015-06-17 at 14:30 -0400, David Long wrote:
 On 06/16/15 09:17, Rob Herring wrote:
  On Mon, Jun 15, 2015 at 11:42 AM, David Long dave.l...@linaro.org wrote:
 
#define REG_OFFSET_NAME(r) \
   {.name = #r, .offset = offsetof(struct pt_regs, ARM_##r)}
#define REG_OFFSET_END {.name = NULL, .offset = 0}
 
  Can't you also move these? ARM is complicated with the ARM_
  prefixing, but the others appear to be the same. Maybe you can remove
  the prefix or redefine the macro for ARM.
 
 That would mandate that all the architecture-specific pt_regs structures 
 would have to use a top-level named field for each named register.

Why does it mandate that?

See eg. powerpc where we use REG_OFFSET_NAME for the top-level named fields and
then a different macro for the array elements:

  #define REG_OFFSET_NAME(r) {.name = #r, .offset = offsetof(struct pt_regs, r)}
  #define GPR_OFFSET_NAME(num)  \
{.name = STR(gpr##num), .offset = offsetof(struct pt_regs, gpr[num])}
  
  static const struct pt_regs_offset regoffset_table[] = {
GPR_OFFSET_NAME(0),
GPR_OFFSET_NAME(1),
GPR_OFFSET_NAME(2),
GPR_OFFSET_NAME(3),
...
REG_OFFSET_NAME(nip),
REG_OFFSET_NAME(msr),


So I don't see why REG_OFFSET_NAME couldn't be common.

cheers




___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: [PATCH 1/2] Move the pt_regs_offset struct definition from arch to common include file

2015-06-26 Thread David Long

On 06/19/15 12:58, Kees Cook wrote:

On Fri, Jun 19, 2015 at 7:12 AM, David Long dave.l...@linaro.org wrote:

On 06/19/15 00:19, Michael Ellerman wrote:


On Mon, 2015-06-15 at 12:42 -0400, David Long wrote:


From: David A. Long dave.l...@linaro.org

The pt_regs_offset structure is used for HAVE_REGS_AND_STACK_ACCESS_API
   feature and has identical definitions in four different arch ptrace.h
include files. It seems unlikely that definition would ever need to be
changed regardless of architecture so lets move it into
include/linux/ptrace.h.

Signed-off-by: David A. Long dave.l...@linaro.org
---
   arch/powerpc/kernel/ptrace.c | 5 -



Built and booted on powerpc, but is there an easy way to actually test the
code
paths in question?



There is an easy way to smoke test it on all archiectures that also
implement kprobes (which powerpc does).  If I'm understanding the powerpc
code correctly (WRT register naming conventions) just do the following:

cd /sys/kernel/debug/tracing
echo 'p do_fork %gpr0'  kprobe_events
echo 1  events/kprobes/enable
ls
cat trace
echo 0  events/kprobes/enable

Every fork() call done on the system between those two echo commands (hence
the ls) should append a line to the trace file.  For a more exhaustive
test one could repeat this sequence for every register in the architecture.

This should work the same on all architectures supporting kprobes.  You just
have to use the appropriate register names for your architecture after the
%.


Is this something we could codify into the selftests directory? It
seems like a great thing to capture in a single place somewhere (the
register lists, that is).
e
-Kees



Due to the architecture-specific naming of registers this would have to 
be added to the architecture subdirectories.  I only see powerpc and x86 
subdirs at this time so extending that infrastructure would have to be 
part of this.  Verifying the register contents would also require some 
change to the kernel, possibly a simple test module, which would have to 
be unique to each architecture.  Without that we could only check for 
recognition of the register name, although maybe that's good enough.





Acked-by: Michael Ellerman m...@ellerman.id.au

cheers




Thanks,
-dl




-dl


___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: [PATCH 1/2] Move the pt_regs_offset struct definition from arch to common include file

2015-06-24 Thread David Long

On 06/24/15 00:07, Michael Ellerman wrote:

On Tue, 2015-06-23 at 09:48 -0400, David Long wrote:

On 06/22/15 23:32, Michael Ellerman wrote:

On Fri, 2015-06-19 at 10:12 -0400, David Long wrote:

On 06/19/15 00:19, Michael Ellerman wrote:

On Mon, 2015-06-15 at 12:42 -0400, David Long wrote:

From: David A. Long dave.l...@linaro.org

The pt_regs_offset structure is used for HAVE_REGS_AND_STACK_ACCESS_API
feature and has identical definitions in four different arch ptrace.h
include files. It seems unlikely that definition would ever need to be
changed regardless of architecture so lets move it into
include/linux/ptrace.h.

Signed-off-by: David A. Long dave.l...@linaro.org
---
arch/powerpc/kernel/ptrace.c | 5 -


Built and booted on powerpc, but is there an easy way to actually test the code
paths in question?


There is an easy way to smoke test it on all archiectures that also
implement kprobes (which powerpc does).  If I'm understanding the
powerpc code correctly (WRT register naming conventions) just do the
following:

cd /sys/kernel/debug/tracing
echo 'p do_fork %gpr0'  kprobe_events
echo 1  events/kprobes/enable
ls
cat trace
echo 0  events/kprobes/enable

Every fork() call done on the system between those two echo commands
(hence the ls) should append a line to the trace file.  For a more
exhaustive test one could repeat this sequence for every register in the
architecture.


OK, so I went the whole hog and did:

$ echo 'p do_fork %gpr0 %gpr1 %gpr2 %gpr3 %gpr4 %gpr5 %gpr6 %gpr7 %gpr8 %gpr9 
%gpr10 %gpr11 %gpr12 %gpr13 %gpr14 %gpr15 %gpr16 %gpr17 %gpr18 %gpr19 %gpr20 
%gpr21 %gpr22 %gpr23 %gpr24 %gpr25 %gpr26 %gpr27 %gpr28 %gpr29 %gpr30 %gpr31 %nip 
%msr %ctr %link %xer %ccr %softe %trap %dar %dsisr'  kprobe_events

And I get:

  bash-2057  [001] d...   535.433941: p_do_fork_0: 
(do_fork+0x8/0x490) arg1=0xc00094d0 arg2=0xc001fbe9be30 
arg3=0xc1133bb8 arg4=0x1200011 arg5=0x0 arg6=0x0 arg7=0x0 
arg8=0x3fff7c885940 arg9=0x1 arg10=0xc001fbe9bea0 arg11=0x0 arg12=0xc01 
arg13=0xc00094c8 arg14=0xcfdc0480 arg15=0x0 arg16=0x2200 
arg17=0x1016d6e8 arg18=0x0 arg19=0x4400 arg20=0x0 arg21=0x10037c82208 
arg22=0x1017b008 arg23=0x10143d18 arg24=0x10178854 arg25=0x10144f90 
arg26=0x10037c821e8 arg27=0x0 arg28=0x0 arg29=0x0 arg30=0x0 arg31=0x809 
arg32=0x3788c010 arg33=0xc00a7fe8 arg34=0x80029033 
arg35=0xc00094c8 arg36=0xc00094d0 arg37=0x0 arg38=0x4844 
arg39=0x1 arg40=0x700 arg41=0xc001fbe9bd50 arg42=0xc001fbe9bd30

Which is ugly as hell, but appears unchanged since before your patch.



Excellent.  Many thanks.


No worries.

Did I already send you an ack? Have another one in case:

Acked-by: Michael Ellerman m...@ellerman.id.au




Thanks.


I take it it's expected that the names are not decoded in the output?


Yes.


In fact I don't see anywhere that uses the reverse decoding, ie.
regs_query_register_name().



Neither did I.  I assumed it was intended to support either future 
kernel code or custom debug modules.



cheers




-dl

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: [PATCH 1/2] Move the pt_regs_offset struct definition from arch to common include file

2015-06-23 Thread David Long

On 06/22/15 23:32, Michael Ellerman wrote:

On Fri, 2015-06-19 at 10:12 -0400, David Long wrote:

On 06/19/15 00:19, Michael Ellerman wrote:

On Mon, 2015-06-15 at 12:42 -0400, David Long wrote:

From: David A. Long dave.l...@linaro.org

The pt_regs_offset structure is used for HAVE_REGS_AND_STACK_ACCESS_API
   feature and has identical definitions in four different arch ptrace.h
include files. It seems unlikely that definition would ever need to be
changed regardless of architecture so lets move it into
include/linux/ptrace.h.

Signed-off-by: David A. Long dave.l...@linaro.org
---
   arch/powerpc/kernel/ptrace.c | 5 -


Built and booted on powerpc, but is there an easy way to actually test the code
paths in question?



There is an easy way to smoke test it on all archiectures that also
implement kprobes (which powerpc does).  If I'm understanding the
powerpc code correctly (WRT register naming conventions) just do the
following:

cd /sys/kernel/debug/tracing
echo 'p do_fork %gpr0'  kprobe_events
echo 1  events/kprobes/enable
ls
cat trace
echo 0  events/kprobes/enable

Every fork() call done on the system between those two echo commands
(hence the ls) should append a line to the trace file.  For a more
exhaustive test one could repeat this sequence for every register in the
architecture.


OK, so I went the whole hog and did:

$ echo 'p do_fork %gpr0 %gpr1 %gpr2 %gpr3 %gpr4 %gpr5 %gpr6 %gpr7 %gpr8 %gpr9 
%gpr10 %gpr11 %gpr12 %gpr13 %gpr14 %gpr15 %gpr16 %gpr17 %gpr18 %gpr19 %gpr20 
%gpr21 %gpr22 %gpr23 %gpr24 %gpr25 %gpr26 %gpr27 %gpr28 %gpr29 %gpr30 %gpr31 %nip 
%msr %ctr %link %xer %ccr %softe %trap %dar %dsisr'  kprobe_events

And I get:

 bash-2057  [001] d...   535.433941: p_do_fork_0: 
(do_fork+0x8/0x490) arg1=0xc00094d0 arg2=0xc001fbe9be30 
arg3=0xc1133bb8 arg4=0x1200011 arg5=0x0 arg6=0x0 arg7=0x0 
arg8=0x3fff7c885940 arg9=0x1 arg10=0xc001fbe9bea0 arg11=0x0 arg12=0xc01 
arg13=0xc00094c8 arg14=0xcfdc0480 arg15=0x0 arg16=0x2200 
arg17=0x1016d6e8 arg18=0x0 arg19=0x4400 arg20=0x0 arg21=0x10037c82208 
arg22=0x1017b008 arg23=0x10143d18 arg24=0x10178854 arg25=0x10144f90 
arg26=0x10037c821e8 arg27=0x0 arg28=0x0 arg29=0x0 arg30=0x0 arg31=0x809 
arg32=0x3788c010 arg33=0xc00a7fe8 arg34=0x80029033 
arg35=0xc00094c8 arg36=0xc00094d0 arg37=0x0 arg38=0x4844 
arg39=0x1 arg40=0x700 arg41=0xc001fbe9bd50 arg42=0xc001fbe9bd30

Which is ugly as hell, but appears unchanged since before your patch.



Excellent.  Many thanks.


I take it it's expected that the names are not decoded in the output?



Yes.


Also I wonder why we choose gpr when r is the more usual prefix on powerpc.
I guess we can add new aliases to the table.



Yeah I can't answer that, this is just what the preexisting code is 
written to do. I believe you could add aliases to the table, perhaps as 
a step in migrating to supporting only the more common naming.  The 
reverse translation would have to return one or the other though.


-dl


___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: [PATCH 1/2] Move the pt_regs_offset struct definition from arch to common include file

2015-06-23 Thread Michael Ellerman
On Tue, 2015-06-23 at 09:48 -0400, David Long wrote:
 On 06/22/15 23:32, Michael Ellerman wrote:
  On Fri, 2015-06-19 at 10:12 -0400, David Long wrote:
  On 06/19/15 00:19, Michael Ellerman wrote:
  On Mon, 2015-06-15 at 12:42 -0400, David Long wrote:
  From: David A. Long dave.l...@linaro.org
 
  The pt_regs_offset structure is used for HAVE_REGS_AND_STACK_ACCESS_API
 feature and has identical definitions in four different arch ptrace.h
  include files. It seems unlikely that definition would ever need to be
  changed regardless of architecture so lets move it into
  include/linux/ptrace.h.
 
  Signed-off-by: David A. Long dave.l...@linaro.org
  ---
 arch/powerpc/kernel/ptrace.c | 5 -
 
  Built and booted on powerpc, but is there an easy way to actually test 
  the code
  paths in question?
 
  There is an easy way to smoke test it on all archiectures that also
  implement kprobes (which powerpc does).  If I'm understanding the
  powerpc code correctly (WRT register naming conventions) just do the
  following:
 
  cd /sys/kernel/debug/tracing
  echo 'p do_fork %gpr0'  kprobe_events
  echo 1  events/kprobes/enable
  ls
  cat trace
  echo 0  events/kprobes/enable
 
  Every fork() call done on the system between those two echo commands
  (hence the ls) should append a line to the trace file.  For a more
  exhaustive test one could repeat this sequence for every register in the
  architecture.
 
  OK, so I went the whole hog and did:
 
  $ echo 'p do_fork %gpr0 %gpr1 %gpr2 %gpr3 %gpr4 %gpr5 %gpr6 %gpr7 %gpr8 
  %gpr9 %gpr10 %gpr11 %gpr12 %gpr13 %gpr14 %gpr15 %gpr16 %gpr17 %gpr18 %gpr19 
  %gpr20 %gpr21 %gpr22 %gpr23 %gpr24 %gpr25 %gpr26 %gpr27 %gpr28 %gpr29 
  %gpr30 %gpr31 %nip %msr %ctr %link %xer %ccr %softe %trap %dar %dsisr'  
  kprobe_events
 
  And I get:
 
   bash-2057  [001] d...   535.433941: p_do_fork_0: 
  (do_fork+0x8/0x490) arg1=0xc00094d0 arg2=0xc001fbe9be30 
  arg3=0xc1133bb8 arg4=0x1200011 arg5=0x0 arg6=0x0 arg7=0x0 
  arg8=0x3fff7c885940 arg9=0x1 arg10=0xc001fbe9bea0 arg11=0x0 arg12=0xc01 
  arg13=0xc00094c8 arg14=0xcfdc0480 arg15=0x0 
  arg16=0x2200 arg17=0x1016d6e8 arg18=0x0 arg19=0x4400 arg20=0x0 
  arg21=0x10037c82208 arg22=0x1017b008 arg23=0x10143d18 arg24=0x10178854 
  arg25=0x10144f90 arg26=0x10037c821e8 arg27=0x0 arg28=0x0 arg29=0x0 
  arg30=0x0 arg31=0x809 arg32=0x3788c010 arg33=0xc00a7fe8 
  arg34=0x80029033 arg35=0xc00094c8 arg36=0xc00094d0 
  arg37=0x0 arg38=0x4844 arg39=0x1 arg40=0x700 arg41=0xc001fbe9bd50 
  arg42=0xc001fbe9bd30
 
  Which is ugly as hell, but appears unchanged since before your patch.
 
 
 Excellent.  Many thanks.

No worries.

Did I already send you an ack? Have another one in case:

Acked-by: Michael Ellerman m...@ellerman.id.au


  I take it it's expected that the names are not decoded in the output?

 Yes.

In fact I don't see anywhere that uses the reverse decoding, ie.
regs_query_register_name().

cheers


___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: [PATCH 1/2] Move the pt_regs_offset struct definition from arch to common include file

2015-06-22 Thread Michael Ellerman
On Fri, 2015-06-19 at 10:12 -0400, David Long wrote:
 On 06/19/15 00:19, Michael Ellerman wrote:
  On Mon, 2015-06-15 at 12:42 -0400, David Long wrote:
  From: David A. Long dave.l...@linaro.org
 
  The pt_regs_offset structure is used for HAVE_REGS_AND_STACK_ACCESS_API
feature and has identical definitions in four different arch ptrace.h
  include files. It seems unlikely that definition would ever need to be
  changed regardless of architecture so lets move it into
  include/linux/ptrace.h.
 
  Signed-off-by: David A. Long dave.l...@linaro.org
  ---
arch/powerpc/kernel/ptrace.c | 5 -
 
  Built and booted on powerpc, but is there an easy way to actually test the 
  code
  paths in question?
 
 
 There is an easy way to smoke test it on all archiectures that also 
 implement kprobes (which powerpc does).  If I'm understanding the 
 powerpc code correctly (WRT register naming conventions) just do the 
 following:
 
 cd /sys/kernel/debug/tracing
 echo 'p do_fork %gpr0'  kprobe_events
 echo 1  events/kprobes/enable
 ls
 cat trace
 echo 0  events/kprobes/enable
 
 Every fork() call done on the system between those two echo commands 
 (hence the ls) should append a line to the trace file.  For a more 
 exhaustive test one could repeat this sequence for every register in the 
 architecture.

OK, so I went the whole hog and did:

$ echo 'p do_fork %gpr0 %gpr1 %gpr2 %gpr3 %gpr4 %gpr5 %gpr6 %gpr7 %gpr8 %gpr9 
%gpr10 %gpr11 %gpr12 %gpr13 %gpr14 %gpr15 %gpr16 %gpr17 %gpr18 %gpr19 %gpr20 
%gpr21 %gpr22 %gpr23 %gpr24 %gpr25 %gpr26 %gpr27 %gpr28 %gpr29 %gpr30 %gpr31 
%nip %msr %ctr %link %xer %ccr %softe %trap %dar %dsisr'  kprobe_events

And I get:

bash-2057  [001] d...   535.433941: p_do_fork_0: 
(do_fork+0x8/0x490) arg1=0xc00094d0 arg2=0xc001fbe9be30 
arg3=0xc1133bb8 arg4=0x1200011 arg5=0x0 arg6=0x0 arg7=0x0 
arg8=0x3fff7c885940 arg9=0x1 arg10=0xc001fbe9bea0 arg11=0x0 arg12=0xc01 
arg13=0xc00094c8 arg14=0xcfdc0480 arg15=0x0 arg16=0x2200 
arg17=0x1016d6e8 arg18=0x0 arg19=0x4400 arg20=0x0 arg21=0x10037c82208 
arg22=0x1017b008 arg23=0x10143d18 arg24=0x10178854 arg25=0x10144f90 
arg26=0x10037c821e8 arg27=0x0 arg28=0x0 arg29=0x0 arg30=0x0 arg31=0x809 
arg32=0x3788c010 arg33=0xc00a7fe8 arg34=0x80029033 
arg35=0xc00094c8 arg36=0xc00094d0 arg37=0x0 arg38=0x4844 
arg39=0x1 arg40=0x700 arg41=0xc001fbe9bd50 arg42=0xc001fbe9bd30

Which is ugly as hell, but appears unchanged since before your patch.

I take it it's expected that the names are not decoded in the output?

Also I wonder why we choose gpr when r is the more usual prefix on powerpc.
I guess we can add new aliases to the table.

cheers


___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: [PATCH 1/2] Move the pt_regs_offset struct definition from arch to common include file

2015-06-19 Thread David Long

On 06/19/15 00:19, Michael Ellerman wrote:

On Mon, 2015-06-15 at 12:42 -0400, David Long wrote:

From: David A. Long dave.l...@linaro.org

The pt_regs_offset structure is used for HAVE_REGS_AND_STACK_ACCESS_API
  feature and has identical definitions in four different arch ptrace.h
include files. It seems unlikely that definition would ever need to be
changed regardless of architecture so lets move it into
include/linux/ptrace.h.

Signed-off-by: David A. Long dave.l...@linaro.org
---
  arch/powerpc/kernel/ptrace.c | 5 -


Built and booted on powerpc, but is there an easy way to actually test the code
paths in question?



There is an easy way to smoke test it on all archiectures that also 
implement kprobes (which powerpc does).  If I'm understanding the 
powerpc code correctly (WRT register naming conventions) just do the 
following:


cd /sys/kernel/debug/tracing
echo 'p do_fork %gpr0'  kprobe_events
echo 1  events/kprobes/enable
ls
cat trace
echo 0  events/kprobes/enable

Every fork() call done on the system between those two echo commands 
(hence the ls) should append a line to the trace file.  For a more 
exhaustive test one could repeat this sequence for every register in the 
architecture.


This should work the same on all architectures supporting kprobes.  You 
just have to use the appropriate register names for your architecture 
after the %.



Acked-by: Michael Ellerman m...@ellerman.id.au

cheers




Thanks,
-dl

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: [PATCH 1/2] Move the pt_regs_offset struct definition from arch to common include file

2015-06-19 Thread Kees Cook
On Fri, Jun 19, 2015 at 7:12 AM, David Long dave.l...@linaro.org wrote:
 On 06/19/15 00:19, Michael Ellerman wrote:

 On Mon, 2015-06-15 at 12:42 -0400, David Long wrote:

 From: David A. Long dave.l...@linaro.org

 The pt_regs_offset structure is used for HAVE_REGS_AND_STACK_ACCESS_API
   feature and has identical definitions in four different arch ptrace.h
 include files. It seems unlikely that definition would ever need to be
 changed regardless of architecture so lets move it into
 include/linux/ptrace.h.

 Signed-off-by: David A. Long dave.l...@linaro.org
 ---
   arch/powerpc/kernel/ptrace.c | 5 -


 Built and booted on powerpc, but is there an easy way to actually test the
 code
 paths in question?


 There is an easy way to smoke test it on all archiectures that also
 implement kprobes (which powerpc does).  If I'm understanding the powerpc
 code correctly (WRT register naming conventions) just do the following:

 cd /sys/kernel/debug/tracing
 echo 'p do_fork %gpr0'  kprobe_events
 echo 1  events/kprobes/enable
 ls
 cat trace
 echo 0  events/kprobes/enable

 Every fork() call done on the system between those two echo commands (hence
 the ls) should append a line to the trace file.  For a more exhaustive
 test one could repeat this sequence for every register in the architecture.

 This should work the same on all architectures supporting kprobes.  You just
 have to use the appropriate register names for your architecture after the
 %.

Is this something we could codify into the selftests directory? It
seems like a great thing to capture in a single place somewhere (the
register lists, that is).

-Kees


 Acked-by: Michael Ellerman m...@ellerman.id.au

 cheers



 Thanks,
 -dl




-- 
Kees Cook
Chrome OS Security
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: [PATCH 1/2] Move the pt_regs_offset struct definition from arch to common include file

2015-06-18 Thread Michael Ellerman
On Mon, 2015-06-15 at 12:42 -0400, David Long wrote:
 From: David A. Long dave.l...@linaro.org
 
 The pt_regs_offset structure is used for HAVE_REGS_AND_STACK_ACCESS_API
  feature and has identical definitions in four different arch ptrace.h
 include files. It seems unlikely that definition would ever need to be
 changed regardless of architecture so lets move it into
 include/linux/ptrace.h.
 
 Signed-off-by: David A. Long dave.l...@linaro.org
 ---
  arch/powerpc/kernel/ptrace.c | 5 -

Built and booted on powerpc, but is there an easy way to actually test the code
paths in question?

Acked-by: Michael Ellerman m...@ellerman.id.au

cheers


___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: [PATCH 1/2] Move the pt_regs_offset struct definition from arch to common include file

2015-06-17 Thread David Long

On 06/16/15 09:17, Rob Herring wrote:

On Mon, Jun 15, 2015 at 11:42 AM, David Long dave.l...@linaro.org wrote:

From: David A. Long dave.l...@linaro.org

The pt_regs_offset structure is used for HAVE_REGS_AND_STACK_ACCESS_API
  feature and has identical definitions in four different arch ptrace.h
include files. It seems unlikely that definition would ever need to be
changed regardless of architecture so lets move it into
include/linux/ptrace.h.

Signed-off-by: David A. Long dave.l...@linaro.org
---
  arch/arm/kernel/ptrace.c | 5 -
  arch/powerpc/kernel/ptrace.c | 5 -
  arch/sh/include/asm/ptrace.h | 5 -
  arch/x86/kernel/ptrace.c | 5 -
  include/linux/ptrace.h   | 9 +
  5 files changed, 9 insertions(+), 20 deletions(-)

diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c
index ef9119f..fb45cf1 100644
--- a/arch/arm/kernel/ptrace.c
+++ b/arch/arm/kernel/ptrace.c
@@ -59,11 +59,6 @@
  #define BREAKINST_THUMB0xde01
  #endif

-struct pt_regs_offset {
-   const char *name;
-   int offset;
-};
-
  #define REG_OFFSET_NAME(r) \
 {.name = #r, .offset = offsetof(struct pt_regs, ARM_##r)}
  #define REG_OFFSET_END {.name = NULL, .offset = 0}


Can't you also move these? ARM is complicated with the ARM_
prefixing, but the others appear to be the same. Maybe you can remove
the prefix or redefine the macro for ARM.

Rob



That would mandate that all the architecture-specific pt_regs structures 
would have to use a top-level named field for each named register.  That 
seems to me like an unnecessary restriction when the point of 
regs_offset_table is to provide the offset of the register inside an 
arbitarily complex pt_regs struct.  The often redundant definition of 
these two macros doesn't seem to me that high a price for that.


-dl

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: [PATCH 1/2] Move the pt_regs_offset struct definition from arch to common include file

2015-06-16 Thread Rob Herring
On Mon, Jun 15, 2015 at 11:42 AM, David Long dave.l...@linaro.org wrote:
 From: David A. Long dave.l...@linaro.org

 The pt_regs_offset structure is used for HAVE_REGS_AND_STACK_ACCESS_API
  feature and has identical definitions in four different arch ptrace.h
 include files. It seems unlikely that definition would ever need to be
 changed regardless of architecture so lets move it into
 include/linux/ptrace.h.

 Signed-off-by: David A. Long dave.l...@linaro.org
 ---
  arch/arm/kernel/ptrace.c | 5 -
  arch/powerpc/kernel/ptrace.c | 5 -
  arch/sh/include/asm/ptrace.h | 5 -
  arch/x86/kernel/ptrace.c | 5 -
  include/linux/ptrace.h   | 9 +
  5 files changed, 9 insertions(+), 20 deletions(-)

 diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c
 index ef9119f..fb45cf1 100644
 --- a/arch/arm/kernel/ptrace.c
 +++ b/arch/arm/kernel/ptrace.c
 @@ -59,11 +59,6 @@
  #define BREAKINST_THUMB0xde01
  #endif

 -struct pt_regs_offset {
 -   const char *name;
 -   int offset;
 -};
 -
  #define REG_OFFSET_NAME(r) \
 {.name = #r, .offset = offsetof(struct pt_regs, ARM_##r)}
  #define REG_OFFSET_END {.name = NULL, .offset = 0}

Can't you also move these? ARM is complicated with the ARM_
prefixing, but the others appear to be the same. Maybe you can remove
the prefix or redefine the macro for ARM.

Rob
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev