x86: add arch-dep register and stack access API to ptrace
Subsystems (3)
PATCH v4 2/6 x86: add arch-dep register and stack access API to ptrace
Add following APIs for accessing registers and stack entries from pt_regs.
- query_register_offset(const char *name)
Query the offset of "name" register.
- query_register_name(unsigned offset)
Query the name of register by its offset.
- get_register(struct pt_regs *regs, unsigned offset) Get the value of a register by its offset.
- valid_stack_address(struct pt_regs *regs, unsigned long addr) Check the address is in the stack.
- get_stack_nth(struct pt_regs *reg, unsigned nth) Get Nth entry of the stack. (N >= 0)
- get_argument_nth(struct pt_regs *reg, unsigned nth) Get Nth argument at function call. (N >= 0)
---
arch/x86/include/asm/ptrace.h | 66 +++++++++++++++++++++++++++++++++++++++++ arch/x86/kernel/ptrace.c | 59 +++++++++++++++++++++++++++++++++++++ 2 files changed, 125 insertions(+), 0 deletions(-)
arch/x86/include/asm/ptrace.h +66 -0
@@ -7,6 +7,7 @@#ifdef __KERNEL__#include <asm/segment.h> +#include <asm/page_types.h> #endif #ifndef __ASSEMBLY__
@@ -215,6 +216,71 @@ static inline unsigned long user_stack_pointer(struct pt_regs *regs)return regs->sp; } +/* Query offset/name of register from its name/offset */ +extern int query_register_offset (const char *name); +extern const char *query_register_name (unsigned offset); +#define MAX_REG_OFFSET (offsetof(struct pt_regs, sp)) + +/* Get register value from its offset */ +static inline unsigned long get_register (struct pt_regs *regs,unsigned offset) +{ +if (unlikely (offset >MAX_REG_OFFSET )) +return 0 ; +return *(unsigned long *)((unsigned long )regs + offset); +} + +/* Check the address in the stack */ +static inline int valid_stack_address (struct pt_regs *regs,unsigned long addr) +{ +return ((addr & ~(THREAD_SIZE -1 )) == + (kernel_trap_sp (regs) & ~(THREAD_SIZE -1 ))); +} + +/* Get Nth entry of the stack */ +static inline unsigned long get_stack_nth (struct pt_regs *regs,unsigned n) +{ +unsigned long *addr = (unsigned long *)kernel_trap_sp (regs); + addr += n; +if (valid_stack_address (regs, (unsigned long )addr)) +return *addr; +else +return 0 ; +} + +/* Get Nth argument at function call */ +static inline unsigned long get_argument_nth (struct pt_regs *regs,unsigned n) +{ +#ifdef CONFIG_X86_32 +#define NR_REGPARMS 3 +if (n <NR_REGPARMS ) { +switch (n) { +case 0 :return regs->ax; +case 1 :return regs->dx; +case 2 :return regs->cx; + } +return 0 ; +#else /* CONFIG_X86_64 */ +#define NR_REGPARMS 6 +if (n <NR_REGPARMS ) { +switch (n) { +case 0 :return regs->di; +case 1 :return regs->si; +case 2 :return regs->dx; +case 3 :return regs->cx; +case 4 :return regs->r8; +case 5 :return regs->r9; + } +return 0 ; +#endif + }else { +/* +* The typical case: arg n is on the stack. +* (Note: stack[0] = return address, so skip it) +*/ +return get_stack_nth (regs,1 + n -NR_REGPARMS ); + } +} +/* * These are defined as per linux/ptrace.h, which see. */
arch/x86/kernel/ptrace.c +59 -0
65 lines not on this page · raw message
Signature · 7 lines
Masami Hiramatsu Software Engineer Hitachi Computer Products (America) Inc. Software Solutions Division e-mail: [email protected]
Quoted 149 lines · Masami Hiramatsu
Add following APIs for accessing registers and stack entries from
pt_regs.
-query_register_offset(const char *name)
Query the offset of "name" register.-
query_register_name(unsigned offset)
Query the name of register by its offset.-
get_register(struct pt_regs *regs, unsigned offset)Get the value of a register by its offset.-
valid_stack_address(struct pt_regs *regs, unsigned long addr)Check the address is in the stack.-
get_stack_nth(struct pt_regs *reg, unsigned nth)Get Nth entry of the stack. (N >= 0)-
get_argument_nth(struct pt_regs *reg, unsigned nth)Get Nth argument at function call. (N >= 0)Signed-off-by Masami Hiramatsu <[email protected]>Cc Steven Rostedt <[email protected]>Cc Ananth N Mavinakayanahalli <[email protected]>Cc Ingo Molnar <[email protected]>Cc Frederic Weisbecker <[email protected]>---
arch/x86/include/asm/ptrace.h | 66 +++++++++++++++++++++++++++++++++++++++++ arch/x86/kernel/ptrace.c | 59 +++++++++++++++++++++++++++++++++++++ 2 files changed, 125 insertions(+), 0 deletions(-)arch/x86/include/asm/ptrace.h +66
-0@@ -7,6 +7,7 @@#ifdef __KERNEL__#include <asm/segment.h> +#include <asm/page_types.h> #endif #ifndef __ASSEMBLY__@@ -215,6 +216,71 @@ static inline unsigned long user_stack_pointer(struct pt_regs *regs)return regs->sp; } +/* Query offset/name of register from its name/offset */ +extern int query_register_offset (const char *name); +extern const char *query_register_name (unsigned offset); +#define MAX_REG_OFFSET (offsetof(struct pt_regs, sp)) + +/* Get register value from its offset */ +static inline unsigned long get_register (struct pt_regs *regs,unsigned offset) +{ +if (unlikely (offset >MAX_REG_OFFSET )) +return 0 ; +return *(unsigned long *)((unsigned long )regs + offset); +} + +/* Check the address in the stack */ +static inline int valid_stack_address (struct pt_regs *regs,unsigned long addr) +{ +return ((addr & ~(THREAD_SIZE -1 )) == + (kernel_trap_sp (regs) & ~(THREAD_SIZE -1 ))); +} + +/* Get Nth entry of the stack */ +static inline unsigned long get_stack_nth (struct pt_regs *regs,unsigned n) +{ +unsigned long *addr = (unsigned long *)kernel_trap_sp (regs); + addr += n; +if (valid_stack_address (regs, (unsigned long )addr)) +return *addr; +else +return 0 ; +} + +/* Get Nth argument at function call */ +static inline unsigned long get_argument_nth (struct pt_regs *regs,unsigned n) +{ +#ifdef CONFIG_X86_32 +#define NR_REGPARMS 3 +if (n <NR_REGPARMS ) { +switch (n) { +case 0 :return regs->ax; +case 1 :return regs->dx; +case 2 :return regs->cx; + } +return 0 ; +#else /* CONFIG_X86_64 */ +#define NR_REGPARMS 6 +if (n <NR_REGPARMS ) { +switch (n) { +case 0 :return regs->di; +case 1 :return regs->si; +case 2 :return regs->dx; +case 3 :return regs->cx; +case 4 :return regs->r8; +case 5 :return regs->r9; + } +return 0 ; +#endif + }else { +/* +* The typical case: arg n is on the stack. +* (Note: stack[0] = return address, so skip it) +*/ +return get_stack_nth (regs,1 + n -NR_REGPARMS ); + } +} +/* * These are defined as per linux/ptrace.h, which see. */ arch/x86/kernel/ptrace.c +26
-0@@ -46,6 +46,65 @@ enum x86_regset { REGSET_IOPERM32, }; +struct pt_regs_offset { + const char *name; + int offset; +}; + +#define REG_OFFSET(r) offsetof(struct pt_regs, r) +#define REG_OFFSET_NAME(r) {.name = #r, .offset = REG_OFFSET(r)} +#define REG_OFFSET_END {.name = NULL, .offset = 0} + +static struct pt_regs_offset regoffset_table[] = { +#ifdef CONFIG_X86_64 + REG_OFFSET_NAME(r15), + REG_OFFSET_NAME(r14), + REG_OFFSET_NAME(r13), + REG_OFFSET_NAME(r12), + REG_OFFSET_NAME(r11), + REG_OFFSET_NAME(r10), + REG_OFFSET_NAME(r9), + REG_OFFSET_NAME(r8), +#endif + REG_OFFSET_NAME(bx), + REG_OFFSET_NAME(cx), + REG_OFFSET_NAME(dx), + REG_OFFSET_NAME(si), + REG_OFFSET_NAME(di), + REG_OFFSET_NAME(bp),
arch/x86/kernel/ptrace.c enum x86_regset { · line 84
Quoted 10 lines
arch/x86/kernel/ptrace.c +10
-0+ REG_OFFSET_NAME(ax), +#ifdef CONFIG_X86_32 +REG_OFFSET_NAME (ds), +REG_OFFSET_NAME (es), +REG_OFFSET_NAME (fs), +REG_OFFSET_NAME (gs), +#endif +REG_OFFSET_NAME (orig_ax), +REG_OFFSET_NAME (ip), + REG_OFFSET_NAME(cs),
You seem to have also forgotten ss here.
arch/x86/kernel/ptrace.c enum x86_regset { · line 95
Quoted 11 lines
arch/x86/kernel/ptrace.c +11
-0+REG_OFFSET_NAME (flags), +REG_OFFSET_NAME (sp), + REG_OFFSET_END, +}; + +int query_register_offset (const char *name) +{ +struct pt_regs_offset *roff = regoffset_table; +for (roff = regoffset_table; roff->name !=NULL ; roff++) +if (!strcmp (roff->name, name)) +return (unsigned )roff->offset;
Tiny thing here: could you set the full (unsigned int) cast?
Quoted 5 lines
arch/x86/kernel/ptrace.c +5
-0+return -EINVAL ; +} + +const char *query_register_name (unsigned offset) +{
arch/x86/kernel/ptrace.c enum x86_regset { · line 110
Quoted 10 lines
arch/x86/kernel/ptrace.c +7
-0+struct pt_regs_offset *roff = regoffset_table; +for (roff = regoffset_table; roff->name !=NULL ; roff++) +if (roff->offset == offset) +return roff->name; +return NULL ; +} +/* * does not yet catch signals sent when the child dies. * in exit.c or in signal.c.
All in one it looks good!
Frederic.
Quoted 156 lines · Frederic Weisbecker
Quoted 155 lines · Masami Hiramatsu
Add following APIs for accessing registers and stack entries from
pt_regs.
-query_register_offset(const char *name)
Query the offset of "name" register.-
query_register_name(unsigned offset)
Query the name of register by its offset.-
get_register(struct pt_regs *regs, unsigned offset)Get the value of a register by its offset.-
valid_stack_address(struct pt_regs *regs, unsigned long addr)Check the address is in the stack.-
get_stack_nth(struct pt_regs *reg, unsigned nth)Get Nth entry of the stack. (N >= 0)-
get_argument_nth(struct pt_regs *reg, unsigned nth)Get Nth argument at function call. (N >= 0)Signed-off-by Masami Hiramatsu <[email protected]>Cc Steven Rostedt <[email protected]>Cc Ananth N Mavinakayanahalli <[email protected]>Cc Ingo Molnar <[email protected]>Cc Frederic Weisbecker <[email protected]>---
arch/x86/include/asm/ptrace.h | 66 +++++++++++++++++++++++++++++++++++++++++ arch/x86/kernel/ptrace.c | 59 +++++++++++++++++++++++++++++++++++++ 2 files changed, 125 insertions(+), 0 deletions(-)arch/x86/include/asm/ptrace.h +66
-0@@ -7,6 +7,7 @@#ifdef __KERNEL__#include <asm/segment.h> +#include <asm/page_types.h> #endif #ifndef __ASSEMBLY__@@ -215,6 +216,71 @@ static inline unsigned long user_stack_pointer(struct pt_regs *regs)return regs->sp; } +/* Query offset/name of register from its name/offset */ +extern int query_register_offset (const char *name); +extern const char *query_register_name (unsigned offset); +#define MAX_REG_OFFSET (offsetof(struct pt_regs, sp)) + +/* Get register value from its offset */ +static inline unsigned long get_register (struct pt_regs *regs,unsigned offset) +{ +if (unlikely (offset >MAX_REG_OFFSET )) +return 0 ; +return *(unsigned long *)((unsigned long )regs + offset); +} + +/* Check the address in the stack */ +static inline int valid_stack_address (struct pt_regs *regs,unsigned long addr) +{ +return ((addr & ~(THREAD_SIZE -1 )) == + (kernel_trap_sp (regs) & ~(THREAD_SIZE -1 ))); +} + +/* Get Nth entry of the stack */ +static inline unsigned long get_stack_nth (struct pt_regs *regs,unsigned n) +{ +unsigned long *addr = (unsigned long *)kernel_trap_sp (regs); + addr += n; +if (valid_stack_address (regs, (unsigned long )addr)) +return *addr; +else +return 0 ; +} + +/* Get Nth argument at function call */ +static inline unsigned long get_argument_nth (struct pt_regs *regs,unsigned n) +{ +#ifdef CONFIG_X86_32 +#define NR_REGPARMS 3 +if (n <NR_REGPARMS ) { +switch (n) { +case 0 :return regs->ax; +case 1 :return regs->dx; +case 2 :return regs->cx; + } +return 0 ; +#else /* CONFIG_X86_64 */ +#define NR_REGPARMS 6 +if (n <NR_REGPARMS ) { +switch (n) { +case 0 :return regs->di; +case 1 :return regs->si; +case 2 :return regs->dx; +case 3 :return regs->cx; +case 4 :return regs->r8; +case 5 :return regs->r9; + } +return 0 ; +#endif + }else { +/* +* The typical case: arg n is on the stack. +* (Note: stack[0] = return address, so skip it) +*/ +return get_stack_nth (regs,1 + n -NR_REGPARMS ); + } +} +/* * These are defined as per linux/ptrace.h, which see. */ arch/x86/kernel/ptrace.c +32
-0@@ -46,6 +46,65 @@ enum x86_regset { REGSET_IOPERM32, }; +struct pt_regs_offset { +const char *name; +int offset; +}; + +#define REG_OFFSET (r) offsetof(struct pt_regs, r) +#define REG_OFFSET_NAME (r) {.name = #r, .offset = REG_OFFSET(r)} +#define REG_OFFSET_END {.name = NULL, .offset = 0} + +static struct pt_regs_offset regoffset_table[] = { +#ifdef CONFIG_X86_64 +REG_OFFSET_NAME (r15), +REG_OFFSET_NAME (r14), +REG_OFFSET_NAME (r13), +REG_OFFSET_NAME (r12), +REG_OFFSET_NAME (r11), +REG_OFFSET_NAME (r10), +REG_OFFSET_NAME (r9), +REG_OFFSET_NAME (r8), +#endif +REG_OFFSET_NAME (bx), +REG_OFFSET_NAME (cx), +REG_OFFSET_NAME (dx), +REG_OFFSET_NAME (si), +REG_OFFSET_NAME (di), +REG_OFFSET_NAME (bp), +REG_OFFSET_NAME (ax), +#ifdef CONFIG_X86_32 +REG_OFFSET_NAME (ds), +REG_OFFSET_NAME (es), +REG_OFFSET_NAME (fs), + REG_OFFSET_NAME(gs),
Quoted 8 lines
arch/x86/kernel/ptrace.c enum x86_regset { · line 84
Quoted 4 lines
arch/x86/kernel/ptrace.c +4
-0+#endif +REG_OFFSET_NAME (orig_ax), +REG_OFFSET_NAME (ip), + REG_OFFSET_NAME(cs),You seem to have also forgotten ss here.
Oh, I forgot it because ss usually ignored in the kernel... Anyway, it should be supported.
Quoted 7 lines
Quoted 7 lines
arch/x86/kernel/ptrace.c +7
-0+REG_OFFSET_NAME (flags), +REG_OFFSET_NAME (sp), + REG_OFFSET_END, +}; + +int query_register_offset (const char *name) +{
Quoted 8 lines
arch/x86/kernel/ptrace.c enum x86_regset { · line 95
Quoted 4 lines
arch/x86/kernel/ptrace.c +4
-0+struct pt_regs_offset *roff = regoffset_table; +for (roff = regoffset_table; roff->name !=NULL ; roff++) +if (!strcmp (roff->name, name)) +return (unsigned )roff->offset;Tiny thing here: could you set the full (unsigned int) cast?
or, I don't need to cast it...
Quoted 10 lines
Quoted 10 lines
arch/x86/kernel/ptrace.c +10
-0+return -EINVAL ; +} + +const char *query_register_name (unsigned offset) +{ +struct pt_regs_offset *roff = regoffset_table; +for (roff = regoffset_table; roff->name !=NULL ; roff++) +if (roff->offset == offset) +return roff->name; +return NULL ;
Quoted 8 lines
arch/x86/kernel/ptrace.c enum x86_regset { · line 110
Quoted 5 lines
arch/x86/kernel/ptrace.c +2
-0+} +/* * does not yet catch signals sent when the child dies. * in exit.c or in signal.c. All in one it looks good!
Thanks!
Signature · 7 lines
Masami Hiramatsu Software Engineer Hitachi Computer Products (America) Inc. Software Solutions Division e-mail: [email protected]
PATCH 2/6 x86: add arch-dep register and stack access API to ptrace
In reply to Frederic WeisbeckerAdd following APIs for accessing registers and stack entries from pt_regs.
- query_register_offset(const char *name)
Query the offset of "name" register.
- query_register_name(unsigned offset)
Query the name of register by its offset.
- get_register(struct pt_regs *regs, unsigned offset) Get the value of a register by its offset.
- valid_stack_address(struct pt_regs *regs, unsigned long addr) Check the address is in the stack.
- get_stack_nth(struct pt_regs *reg, unsigned nth) Get Nth entry of the stack. (N >= 0)
- get_argument_nth(struct pt_regs *reg, unsigned nth) Get Nth argument at function call. (N >= 0)
changes from v4:
- support querying "ss" register.
- remove unneeded cast.
---
arch/x86/include/asm/ptrace.h | 66 +++++++++++++++++++++++++++++++++++++++++ arch/x86/kernel/ptrace.c | 60 +++++++++++++++++++++++++++++++++++++ 2 files changed, 126 insertions(+), 0 deletions(-)
arch/x86/include/asm/ptrace.h +66 -0
@@ -7,6 +7,7 @@#ifdef __KERNEL__#include <asm/segment.h> +#include <asm/page_types.h> #endif #ifndef __ASSEMBLY__
@@ -215,6 +216,71 @@ static inline unsigned long user_stack_pointer(struct pt_regs *regs)return regs->sp; } +/* Query offset/name of register from its name/offset */ +extern int query_register_offset (const char *name); +extern const char *query_register_name (unsigned offset); +#define MAX_REG_OFFSET (offsetof(struct pt_regs, ss)) + +/* Get register value from its offset */ +static inline unsigned long get_register (struct pt_regs *regs,unsigned offset) +{ +if (unlikely (offset >MAX_REG_OFFSET )) +return 0 ; +return *(unsigned long *)((unsigned long )regs + offset); +} + +/* Check the address in the stack */ +static inline int valid_stack_address (struct pt_regs *regs,unsigned long addr) +{ +return ((addr & ~(THREAD_SIZE -1 )) == + (kernel_trap_sp (regs) & ~(THREAD_SIZE -1 ))); +} + +/* Get Nth entry of the stack */ +static inline unsigned long get_stack_nth (struct pt_regs *regs,unsigned n) +{ +unsigned long *addr = (unsigned long *)kernel_trap_sp (regs); + addr += n; +if (valid_stack_address (regs, (unsigned long )addr)) +return *addr; +else +return 0 ; +} + +/* Get Nth argument at function call */ +static inline unsigned long get_argument_nth (struct pt_regs *regs,unsigned n) +{ +#ifdef CONFIG_X86_32 +#define NR_REGPARMS 3 +if (n <NR_REGPARMS ) { +switch (n) { +case 0 :return regs->ax; +case 1 :return regs->dx; +case 2 :return regs->cx; + } +return 0 ; +#else /* CONFIG_X86_64 */ +#define NR_REGPARMS 6 +if (n <NR_REGPARMS ) { +switch (n) { +case 0 :return regs->di; +case 1 :return regs->si; +case 2 :return regs->dx; +case 3 :return regs->cx; +case 4 :return regs->r8; +case 5 :return regs->r9; + } +return 0 ; +#endif + }else { +/* +* The typical case: arg n is on the stack. +* (Note: stack[0] = return address, so skip it) +*/ +return get_stack_nth (regs,1 + n -NR_REGPARMS ); + } +} +/* * These are defined as per linux/ptrace.h, which see. */
arch/x86/kernel/ptrace.c +60 -0
66 lines not on this page · raw message
Signature · 7 lines
Masami Hiramatsu Software Engineer Hitachi Computer Products (America) Inc. Software Solutions Division e-mail: [email protected]
Quoted 1 line
+static struct
pt_regs_offsetregoffset_table[] = {
^ const
Quoted 3 lines · Roland McGrath
Quoted 1 line
+static struct
pt_regs_offsetregoffset_table[] = {^ const
Oops, exactly.
Perhaps, I need to update insn.c to make bitmap tables "static const" too.
Thank you,
Signature · 7 lines
Masami Hiramatsu Software Engineer Hitachi Computer Products (America) Inc. Software Solutions Division e-mail: [email protected]
PATCH 2/6 x86: add arch-dep register and stack access API to ptrace
Add following APIs for accessing registers and stack entries from pt_regs.
- query_register_offset(const char *name)
Query the offset of "name" register.
- query_register_name(unsigned offset)
Query the name of register by its offset.
- get_register(struct pt_regs *regs, unsigned offset) Get the value of a register by its offset.
- valid_stack_address(struct pt_regs *regs, unsigned long addr) Check the address is in the stack.
- get_stack_nth(struct pt_regs *reg, unsigned nth) Get Nth entry of the stack. (N >= 0)
- get_argument_nth(struct pt_regs *reg, unsigned nth) Get Nth argument at function call. (N >= 0)
changes from v4.1:
- make regoffset_table constant.
- remove needless local variable initialization in query_register_*.
---
arch/x86/include/asm/ptrace.h | 66 +++++++++++++++++++++++++++++++++++++++++ arch/x86/kernel/ptrace.c | 60 +++++++++++++++++++++++++++++++++++++ 2 files changed, 126 insertions(+), 0 deletions(-)
arch/x86/include/asm/ptrace.h +66 -0
@@ -7,6 +7,7 @@#ifdef __KERNEL__#include <asm/segment.h> +#include <asm/page_types.h> #endif #ifndef __ASSEMBLY__
@@ -215,6 +216,71 @@ static inline unsigned long user_stack_pointer(struct pt_regs *regs)return regs->sp; } +/* Query offset/name of register from its name/offset */ +extern int query_register_offset (const char *name); +extern const char *query_register_name (unsigned offset); +#define MAX_REG_OFFSET (offsetof(struct pt_regs, ss)) + +/* Get register value from its offset */ +static inline unsigned long get_register (struct pt_regs *regs,unsigned offset) +{ +if (unlikely (offset >MAX_REG_OFFSET )) +return 0 ; +return *(unsigned long *)((unsigned long )regs + offset); +} + +/* Check the address in the stack */ +static inline int valid_stack_address (struct pt_regs *regs,unsigned long addr) +{ +return ((addr & ~(THREAD_SIZE -1 )) == + (kernel_trap_sp (regs) & ~(THREAD_SIZE -1 ))); +} + +/* Get Nth entry of the stack */ +static inline unsigned long get_stack_nth (struct pt_regs *regs,unsigned n) +{ +unsigned long *addr = (unsigned long *)kernel_trap_sp (regs); + addr += n; +if (valid_stack_address (regs, (unsigned long )addr)) +return *addr; +else +return 0 ; +} + +/* Get Nth argument at function call */ +static inline unsigned long get_argument_nth (struct pt_regs *regs,unsigned n) +{ +#ifdef CONFIG_X86_32 +#define NR_REGPARMS 3 +if (n <NR_REGPARMS ) { +switch (n) { +case 0 :return regs->ax; +case 1 :return regs->dx; +case 2 :return regs->cx; + } +return 0 ; +#else /* CONFIG_X86_64 */ +#define NR_REGPARMS 6 +if (n <NR_REGPARMS ) { +switch (n) { +case 0 :return regs->di; +case 1 :return regs->si; +case 2 :return regs->dx; +case 3 :return regs->cx; +case 4 :return regs->r8; +case 5 :return regs->r9; + } +return 0 ; +#endif + }else { +/* +* The typical case: arg n is on the stack. +* (Note: stack[0] = return address, so skip it) +*/ +return get_stack_nth (regs,1 + n -NR_REGPARMS ); + } +} +/* * These are defined as per linux/ptrace.h, which see. */
arch/x86/kernel/ptrace.c +60 -0
66 lines not on this page · raw message
Signature · 7 lines
Masami Hiramatsu Software Engineer Hitachi Computer Products (America) Inc. Software Solutions Division e-mail: [email protected]
I have no comments about the patch, but the subject line is misleading because this has nothing do with ptrace. It's in asm/ptrace.h but it being struct pt_regs does not really have anything to do with ptrace.
Thanks,
Roland
Quoted 4 lines · Roland McGrath
I have no comments about the patch, but the subject line is misleading because this has nothing do with ptrace. It's in
asm/ptrace.hbut it being structpt_regsdoes not really have anything to do with ptrace.
Hmm, so, it should be "x86: add arch-dep register and stack access API".
Signature · 7 lines
Masami Hiramatsu Software Engineer Hitachi Computer Products (America) Inc. Software Solutions Division e-mail: [email protected]