mirror of https://gitee.com/openkylin/linux.git
x86: get rid of TIF_IRET hackery
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>
This commit is contained in:
parent
c46de2263f
commit
e76623d694
|
@ -79,7 +79,6 @@ struct thread_info {
|
||||||
#define TIF_SIGPENDING 2 /* signal pending */
|
#define TIF_SIGPENDING 2 /* signal pending */
|
||||||
#define TIF_NEED_RESCHED 3 /* rescheduling necessary */
|
#define TIF_NEED_RESCHED 3 /* rescheduling necessary */
|
||||||
#define TIF_SINGLESTEP 4 /* reenable singlestep on user return*/
|
#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_EMU 6 /* syscall emulation active */
|
||||||
#define TIF_SYSCALL_AUDIT 7 /* syscall auditing active */
|
#define TIF_SYSCALL_AUDIT 7 /* syscall auditing active */
|
||||||
#define TIF_SECCOMP 8 /* secure computing */
|
#define TIF_SECCOMP 8 /* secure computing */
|
||||||
|
@ -104,7 +103,6 @@ struct thread_info {
|
||||||
#define _TIF_SIGPENDING (1 << TIF_SIGPENDING)
|
#define _TIF_SIGPENDING (1 << TIF_SIGPENDING)
|
||||||
#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP)
|
#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP)
|
||||||
#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED)
|
#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_EMU (1 << TIF_SYSCALL_EMU)
|
||||||
#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT)
|
#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT)
|
||||||
#define _TIF_SECCOMP (1 << TIF_SECCOMP)
|
#define _TIF_SECCOMP (1 << TIF_SECCOMP)
|
||||||
|
|
|
@ -351,14 +351,6 @@ long sys_execve(const char __user *name,
|
||||||
if (IS_ERR(filename))
|
if (IS_ERR(filename))
|
||||||
return error;
|
return error;
|
||||||
error = do_execve(filename, argv, envp, regs);
|
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);
|
putname(filename);
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 the old FP and other extended state
|
||||||
*/
|
*/
|
||||||
free_thread_xstate(current);
|
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);
|
EXPORT_SYMBOL_GPL(start_thread);
|
||||||
|
|
||||||
|
|
|
@ -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)
|
if (thread_info_flags & _TIF_USER_RETURN_NOTIFY)
|
||||||
fire_user_return_notifiers();
|
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)
|
void signal_fault(struct pt_regs *regs, void __user *frame, char *where)
|
||||||
|
|
|
@ -561,9 +561,9 @@ int handle_vm86_trap(struct kernel_vm86_regs *regs, long error_code, int trapno)
|
||||||
if ((trapno == 3) || (trapno == 1)) {
|
if ((trapno == 3) || (trapno == 1)) {
|
||||||
KVM86->regs32->ax = VM86_TRAP + (trapno << 8);
|
KVM86->regs32->ax = VM86_TRAP + (trapno << 8);
|
||||||
/* setting this flag forces the code in entry_32.S to
|
/* setting this flag forces the code in entry_32.S to
|
||||||
call save_v86_state() and change the stack pointer
|
the path where we call save_v86_state() and change
|
||||||
to KVM86->regs32 */
|
the stack pointer to KVM86->regs32 */
|
||||||
set_thread_flag(TIF_IRET);
|
set_thread_flag(TIF_NOTIFY_RESUME);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
do_int(regs, trapno, (unsigned char __user *) (regs->pt.ss << 4), SP(regs));
|
do_int(regs, trapno, (unsigned char __user *) (regs->pt.ss << 4), SP(regs));
|
||||||
|
|
Loading…
Reference in New Issue