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: Andy 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.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
		
					parent
					
						
							
								ae60f0710a
							
						
					
				
			
			
				commit
				
					
						efa7045103
					
				
			
		
					 1 changed files with 7 additions and 10 deletions
				
			
		|  | @ -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) | ||||||
| 
 | 
 | ||||||
| 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 |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Andy Lutomirski
				Andy Lutomirski