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>
This commit is contained in:
parent
0649547612
commit
90d43d728d
|
@ -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);
|
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)
|
#define regs_return_value(regs) ((regs)->ax)
|
||||||
|
|
||||||
extern unsigned long profile_pc(struct pt_regs *regs);
|
extern unsigned long profile_pc(struct pt_regs *regs);
|
||||||
|
@ -167,12 +143,6 @@ struct pt_regs {
|
||||||
/* top of stack page */
|
/* 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)
|
#define regs_return_value(regs) ((regs)->ax)
|
||||||
|
|
||||||
extern unsigned long profile_pc(struct pt_regs *regs);
|
extern unsigned long profile_pc(struct pt_regs *regs);
|
||||||
|
@ -188,6 +158,60 @@ convert_ip_to_linear(struct task_struct *child, struct pt_regs *regs);
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
#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.
|
* These are defined as per linux/ptrace.h, which see.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue