diff options
author | Harvey Harrison <harvey.harrison@gmail.com> | 2008-01-30 13:33:16 +0100 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-01-30 13:33:16 +0100 |
commit | 90d43d728d22a5e20c63c8db1cfb497210768f19 (patch) | |
tree | 72f5ba536cc5791ff3ec2ed6473e5ab8a8bb59a5 /include/asm-x86/ptrace.h | |
parent | 064954761254ef17fae2b84fb5a034d48a769143 (diff) | |
download | kernel-crypto-90d43d728d22a5e20c63c8db1cfb497210768f19.tar.gz kernel-crypto-90d43d728d22a5e20c63c8db1cfb497210768f19.tar.xz kernel-crypto-90d43d728d22a5e20c63c8db1cfb497210768f19.zip |
x86: unify pt_regs accessors ptrace.h
Unify the definiton of:
v8086_mode
user_mode
user_mode_vm
stack_pointer
instruction_pointer
frame_pointer
in ptrace.h to make it clear where the differences are between
32 and 64 bit. Changes macros to static inlines as well.
Signed-off-by: Harvey Harrison <harvey.harrison@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'include/asm-x86/ptrace.h')
-rw-r--r-- | include/asm-x86/ptrace.h | 84 |
1 files changed, 54 insertions, 30 deletions
diff --git a/include/asm-x86/ptrace.h b/include/asm-x86/ptrace.h index ee4b595e1cc..0ad9a2b7f8c 100644 --- a/include/asm-x86/ptrace.h +++ b/include/asm-x86/ptrace.h @@ -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) |