Commit efa70451 authored by Andy Lutomirski's avatar Andy Lutomirski Committed by Ingo Molnar

x86/asm/entry: Make user_mode() work correctly if regs came from VM86 mode

user_mode() is now identical to user_mode_vm().  Subsequent patches
will change all callers of user_mode_vm() to user_mode() and then
delete user_mode_vm().
Signed-off-by: default avatarAndy Lutomirski <luto@kernel.org>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brad Spengler <spender@grsecurity.net>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/0dd03eacb5f0a2b5ba0240de25347a31b493c289.1426728647.git.luto@kernel.orgSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent ae60f071
...@@ -96,11 +96,13 @@ static inline unsigned long regs_return_value(struct pt_regs *regs) ...@@ -96,11 +96,13 @@ static inline unsigned long regs_return_value(struct pt_regs *regs)
} }
/* /*
* user_mode_vm(regs) determines whether a register set came from user mode. * user_mode(regs) determines whether a register set came from user
* This is true if V8086 mode was enabled OR if the register set was from * mode. On x86_32, this is true if V8086 mode was enabled OR if the
* protected mode with RPL-3 CS value. This tricky test checks that with * register set was from protected mode with RPL-3 CS value. This
* one comparison. Many places in the kernel can bypass this full check * tricky test checks that with one comparison.
* if they have already ruled out V8086 mode, so user_mode(regs) can be used. *
* On x86_64, vm86 mode is mercifully nonexistent, and we don't need
* the extra check.
*/ */
static inline int user_mode(struct pt_regs *regs) static inline int user_mode(struct pt_regs *regs)
{ {
...@@ -113,12 +115,7 @@ static inline int user_mode(struct pt_regs *regs) ...@@ -113,12 +115,7 @@ static inline int user_mode(struct pt_regs *regs)
static inline int user_mode_vm(struct pt_regs *regs) static inline int user_mode_vm(struct pt_regs *regs)
{ {
#ifdef CONFIG_X86_32
return ((regs->cs & SEGMENT_RPL_MASK) | (regs->flags & X86_VM_MASK)) >=
USER_RPL;
#else
return user_mode(regs); return user_mode(regs);
#endif
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment