x86: get rid of TIF_IRET hackery
authorAl Viro <viro@zeniv.linux.org.uk>
Thu, 2 Aug 2012 18:12:06 +0000 (22:12 +0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Thu, 20 Sep 2012 13:50:17 +0000 (09:50 -0400)
TIF_NOTIFY_RESUME will work in precisely the same way; all that
is achieved by TIF_IRET is appearing that there's some work to be
done, so we end up on the iret exit path.  Just use NOTIFY_RESUME.
And for execve() do that in 32bit start_thread(), not sys_execve()
itself.

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/process_32.c
arch/x86/kernel/signal.c
arch/x86/kernel/vm86_32.c

index 89f794f..c509d07 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 ef6a845..7162e9c 100644 (file)
@@ -351,14 +351,6 @@ long sys_execve(const char __user *name,
        if (IS_ERR(filename))
                return error;
        error = do_execve(filename, argv, envp, regs);
-
-#ifdef CONFIG_X86_32
-       if (error == 0) {
-               /* Make sure we don't return using sysenter.. */
-                set_thread_flag(TIF_IRET);
-        }
-#endif
-
        putname(filename);
        return error;
 }
index 516fa18..75fcad1 100644 (file)
@@ -194,6 +194,11 @@ start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp)
         * Free the old FP and other extended state
         */
        free_thread_xstate(current);
+       /*
+        * force it to the iret return path by making it look as if there was
+        * some work pending.
+        */
+       set_thread_flag(TIF_NOTIFY_RESUME);
 }
 EXPORT_SYMBOL_GPL(start_thread);
 
index b280908..c648fc5 100644 (file)
@@ -800,10 +800,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 54abcc0..5c9687b 100644 (file)
@@ -561,9 +561,9 @@ int handle_vm86_trap(struct kernel_vm86_regs *regs, long error_code, int trapno)
                if ((trapno == 3) || (trapno == 1)) {
                        KVM86->regs32->ax = VM86_TRAP + (trapno << 8);
                        /* 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);
+                          the path where we call save_v86_state() and change
+                          the stack pointer to KVM86->regs32 */
+                       set_thread_flag(TIF_NOTIFY_RESUME);
                        return 0;
                }
                do_int(regs, trapno, (unsigned char __user *) (regs->pt.ss << 4), SP(regs));