]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
x86: switch uses of TIF_IRET to TIF_NOTIFY_RESUME, kill TIF_IRET
authorAl Viro <viro@zeniv.linux.org.uk>
Mon, 7 May 2012 21:30:22 +0000 (17:30 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Thu, 21 Jun 2012 04:02:42 +0000 (08:02 +0400)
TIF_IRET(i386) is used to force return to userland via iret, even if
we'd entered the kernel via sysenter.  This, to put it mildly, is a
fucking ugly hack.  Essentially, it acts as a silent duplicate of
NOTIFY_RESUME.  do_notify_resume() clears it (as it clears NOTIFY_RESUME
itself).  And i386 has glue treat it as something indistinguishable from
NOTIFY_RESUME, never mentioning either explicitly.  _Any_ path going
through do_notify_resume() there will leave via iret - sysret is for
fast path only.  So setting TIF_IRET (or, for that matter, TIF_NOTIFY_RESUME)
has an effect of forcing exit via iret.

That had been obfuscated just enough to have it copied to hexagon, m32r,
microblaze and xtensa.  Neither of those ever sets it.  Or has an analog
of the x86 issues that make forcing exit via iret needed there.  Pure and
simple cargo-cult programming...

Just kill the undocumented bugger...

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
arch/x86/include/asm/thread_info.h
arch/x86/kernel/process.c
arch/x86/kernel/signal.c
arch/x86/kernel/vm86_32.c

index 89f794f007ec1e4aa5bbd029bcb32182fffe1f48..c509d07bdbd72b15d425f1a445eaf42dd4f6ae83 100644 (file)
@@ -79,7 +79,6 @@ struct thread_info {
 #define TIF_SIGPENDING         2       /* signal pending */
 #define TIF_NEED_RESCHED       3       /* rescheduling necessary */
 #define TIF_SINGLESTEP         4       /* reenable singlestep on user return*/
-#define TIF_IRET               5       /* force IRET */
 #define TIF_SYSCALL_EMU                6       /* syscall emulation active */
 #define TIF_SYSCALL_AUDIT      7       /* syscall auditing active */
 #define TIF_SECCOMP            8       /* secure computing */
@@ -104,7 +103,6 @@ struct thread_info {
 #define _TIF_SIGPENDING                (1 << TIF_SIGPENDING)
 #define _TIF_SINGLESTEP                (1 << TIF_SINGLESTEP)
 #define _TIF_NEED_RESCHED      (1 << TIF_NEED_RESCHED)
-#define _TIF_IRET              (1 << TIF_IRET)
 #define _TIF_SYSCALL_EMU       (1 << TIF_SYSCALL_EMU)
 #define _TIF_SYSCALL_AUDIT     (1 << TIF_SYSCALL_AUDIT)
 #define _TIF_SECCOMP           (1 << TIF_SECCOMP)
index 735279e54e59a56d3f3ce97288f2d81fc98491d6..ca232c8ee4acfd423fb314259baaa6d41e394ae0 100644 (file)
@@ -355,7 +355,7 @@ long sys_execve(const char __user *name,
 #ifdef CONFIG_X86_32
        if (error == 0) {
                /* Make sure we don't return using sysenter.. */
-                set_thread_flag(TIF_IRET);
+                set_thread_flag(TIF_NOTIFY_RESUME);
         }
 #endif
 
index 21af737053aad05fb726a0e1023dfad428064518..16f61c4eb7ea2d38fd420bf8afa8a2311dfa872f 100644 (file)
@@ -797,10 +797,6 @@ do_notify_resume(struct pt_regs *regs, void *unused, __u32 thread_info_flags)
        }
        if (thread_info_flags & _TIF_USER_RETURN_NOTIFY)
                fire_user_return_notifiers();
-
-#ifdef CONFIG_X86_32
-       clear_thread_flag(TIF_IRET);
-#endif /* CONFIG_X86_32 */
 }
 
 void signal_fault(struct pt_regs *regs, void __user *frame, char *where)
index 255f58ae71e8991838080eac595786a60f372a62..245d8ccfcc9eeb8db9ded9d8b96346c359d9c5ac 100644 (file)
@@ -561,7 +561,7 @@ int handle_vm86_trap(struct kernel_vm86_regs *regs, long error_code, int trapno)
                        /* setting this flag forces the code in entry_32.S to
                           call save_v86_state() and change the stack pointer
                           to KVM86->regs32 */
-                       set_thread_flag(TIF_IRET);
+                       set_thread_flag(TIF_NOTIFY_RESUME);
                        return 0;
                }
                do_int(regs, trapno, (unsigned char __user *) (regs->pt.ss << 4), SP(regs));