x86: unify pt_regs accessors ptrace.h
PATCH 1/2 x86: unify pt_regs accessors ptrace.h
Unify the definiton of:v8086_modeuser_modeuser_mode_vmstack_pointerinstruction_pointerframe_pointer
in ptrace.h to make it clear where the differences are between 32 and 64 bit. Changes macros to static inlines as well.
--- include/asm-x86/ptrace.h | 84 +++++++++++++++++++++++++++++---------------- 1 files changed, 54 insertions(+), 30 deletions(-)
include/asm-x86/ptrace.h +54 -30
@@ -76,30 +76,6 @@ convert_ip_to_linear(struct task_struct *child, struct pt_regs *regs);extern void send_sigtrap (struct task_struct *tsk,struct pt_regs *regs,int error_code); -/* -* user_mode_vm(regs) determines whether a register set came from user mode. -* This is true if V8086 mode was enabled OR if the register set was from -* protected mode with RPL-3 CS value. This tricky test checks that with -* one comparison. Many places in the kernel can bypass this full check -* if they have already ruled out V8086 mode, so user_mode(regs) can be used. -*/ -static inline int user_mode (struct pt_regs *regs) -{ -return (regs->cs &SEGMENT_RPL_MASK ) ==USER_RPL ; -} -static inline int user_mode_vm (struct pt_regs *regs) -{ -return ((regs->cs &SEGMENT_RPL_MASK ) | - (regs->flags &VM_MASK )) >=USER_RPL ; -} -static inline int v8086_mode (struct pt_regs *regs) -{ -return (regs->flags &VM_MASK ); -} - -#define instruction_pointer (regs) ((regs)->ip) -#define frame_pointer (regs) ((regs)->bp) -#define stack_pointer (regs) ((unsigned long)(regs))#define regs_return_value (regs) ((regs)->ax)extern unsigned long profile_pc (struct pt_regs *regs);
@@ -167,12 +143,6 @@ struct pt_regs {/* top of stack page */ }; -#define user_mode (regs) (!!((regs)->cs & 3)) -#define user_mode_vm (regs) user_mode(regs) -#define v8086_mode (regs) 0/* No V86 mode support in long mode */ -#define instruction_pointer (regs) ((regs)->ip) -#define frame_pointer (regs) ((regs)->bp) -#define stack_pointer (regs) ((regs)->sp)#define regs_return_value (regs) ((regs)->ax)extern unsigned long profile_pc (struct pt_regs *regs);
@@ -189,6 +159,60 @@ convert_ip_to_linear(struct task_struct *child, struct pt_regs *regs);#ifdef __KERNEL__/* +* user_mode_vm(regs) determines whether a register set came from user mode. +* This is true if V8086 mode was enabled OR if the register set was from +* protected mode with RPL-3 CS value. This tricky test checks that with +* one comparison. Many places in the kernel can bypass this full check +* if they have already ruled out V8086 mode, so user_mode(regs) can be used. +*/ +static inline int user_mode (struct pt_regs *regs) +{ +#ifdef CONFIG_X86_32 +return (regs->cs &SEGMENT_RPL_MASK ) ==USER_RPL ; +#else +return !!(regs->cs &3 ); +#endif +} + +static inline int user_mode_vm (struct pt_regs *regs) +{ +#ifdef CONFIG_X86_32 +return ((regs->cs &SEGMENT_RPL_MASK ) | + (regs->flags &VM_MASK )) >=USER_RPL ; +#else +return user_mode (regs); +#endif +} + +static inline int v8086_mode (struct pt_regs *regs) +{ +#ifdef CONFIG_X86_32 +return (regs->flags &VM_MASK ); +#else +return 0 ;/* No V86 mode support in long mode */ +#endif +} + +static inline unsigned long stack_pointer (struct pt_regs *regs) +{ +#ifdef CONFIG_X86_32 +return (unsigned long )regs; +#else +return regs->sp; +#endif +} + +static inline unsigned long instruction_pointer (struct pt_regs *regs) +{ +return regs->ip; +} + +static inline unsigned long frame_pointer (struct pt_regs *regs) +{ +return regs->bp; +} + +/* * These are defined as per linux/ptrace.h, which see. */ #define arch_has_single_step () (1)
Signature · 1 line
1.5.4.rc2.1164.g6451
Quoted 11 lines · Harvey Harrison
Unify the definiton of:
v8086_modeuser_modeuser_mode_vmstack_pointerinstruction_pointerframe_pointerin
ptrace.hto make it clear where the differences are between 32 and 64 bit. Changes macros to static inlines as well.
Can you put a comment on stack_pointer() that it applies to a kernel-mode pt_regs only?
-hpa
Quoted 9 lines · H. Peter Anvin
Quoted 8 lines · Harvey Harrison
Unify the definiton of:
v8086_modeuser_modeuser_mode_vmstack_pointerinstruction_pointerframe_pointer
Quoted 6 lines
Quoted 3 lines
in
ptrace.hto make it clear where the differences are between 32 and 64 bit. Changes macros to static inlines as well.Can you put a comment on
stack_pointer()that it applies to a kernel-modept_regsonly?
How about a follow-on patch that picks a better name and adds the comment? I'd like to leave this as a movement-only patch. Once we decide on a name I'll do the rename/comment. It seems like there are very few users currently (oprofile/backtrace.c only?).
Then I'll also change the kprobes code to use this instead of their stack_addr helper.
Harvey
Quoted 15 lines · Harvey Harrison
Quoted 9 lines · H. Peter Anvin
Quoted 8 lines · Harvey Harrison
Unify the definiton of:
v8086_modeuser_modeuser_mode_vmstack_pointerinstruction_pointerframe_pointerQuoted 4 lines
Quoted 3 lines
in
ptrace.hto make it clear where the differences are between 32 and 64 bit. Changes macros to static inlines as well.Can you put a comment on
stack_pointer()that it applies to a kernel-modept_regsonly?
Quoted 8 lines
How about a follow-on patch that picks a better name and adds the comment? I'd like to leave this as a movement-only patch. Once we decide on a name I'll do the rename/comment. It seems like there are very few users currently (
oprofile/backtrace.conly?).Then I'll also change the kprobes code to use this instead of their
stack_addrhelper.
IMO, go ahead and add a comment, but yes, renaming should be a separate patch.
-hpa