aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/include/asm/ptrace.h17
1 files changed, 7 insertions, 10 deletions
diff --git a/arch/x86/include/asm/ptrace.h b/arch/x86/include/asm/ptrace.h
index 4a040f0078f2..70c439f9071b 100644
--- a/arch/x86/include/asm/ptrace.h
+++ b/arch/x86/include/asm/ptrace.h
@@ -96,11 +96,13 @@ static inline unsigned long regs_return_value(struct pt_regs *regs)
96} 96}
97 97
98/* 98/*
99 * user_mode_vm(regs) determines whether a register set came from user mode. 99 * user_mode(regs) determines whether a register set came from user
100 * This is true if V8086 mode was enabled OR if the register set was from 100 * mode. On x86_32, this is true if V8086 mode was enabled OR if the
101 * protected mode with RPL-3 CS value. This tricky test checks that with 101 * register set was from protected mode with RPL-3 CS value. This
102 * one comparison. Many places in the kernel can bypass this full check 102 * tricky test checks that with one comparison.
103 * if they have already ruled out V8086 mode, so user_mode(regs) can be used. 103 *
104 * On x86_64, vm86 mode is mercifully nonexistent, and we don't need
105 * the extra check.
104 */ 106 */
105static inline int user_mode(struct pt_regs *regs) 107static inline int user_mode(struct pt_regs *regs)
106{ 108{
@@ -113,12 +115,7 @@ static inline int user_mode(struct pt_regs *regs)
113 115
114static inline int user_mode_vm(struct pt_regs *regs) 116static inline int user_mode_vm(struct pt_regs *regs)
115{ 117{
116#ifdef CONFIG_X86_32
117 return ((regs->cs & SEGMENT_RPL_MASK) | (regs->flags & X86_VM_MASK)) >=
118 USER_RPL;
119#else
120 return user_mode(regs); 118 return user_mode(regs);
121#endif
122} 119}
123 120
124/* 121/*