Skip to content

Commit

Permalink
x86: unify pt_regs accessors ptrace.h
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Harvey Harrison authored and Ingo Molnar committed Jan 30, 2008
1 parent 0649547 commit 90d43d7
Showing 1 changed file with 54 additions and 30 deletions.
84 changes: 54 additions & 30 deletions include/asm-x86/ptrace.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand All @@ -188,6 +158,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.
*/
Expand Down

0 comments on commit 90d43d7

Please sign in to comment.