[PATCH 106] turn context->sysemu into PTRACE_O_SYSEMU

Oleg Nesterov oleg at redhat.com
Tue Oct 20 16:15:24 UTC 2009


Turn context->sysemu into PTRACE_O_SYSEMU. This flag is not visible
to user space, and it has no effect after the tracee was stopped.

IOW, PTRACE_SETOPTIONS always clear PTRACE_O_SYSEMU but this doesn't
matter, all we need it should be correct after ptrace_resume() wakes
up the tracee.

---

 kernel/ptrace.c |   13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

--- PU/kernel/ptrace.c~106_KILL_CONTEXT_SYSEMU	2009-10-20 15:58:19.000000000 +0200
+++ PU/kernel/ptrace.c	2009-10-20 17:22:27.000000000 +0200
@@ -27,8 +27,6 @@
 struct ptrace_context {
 	int		options;
 
-	bool		sysemu;	// XXX: will die soon
-
 	int		signr;
 	siginfo_t	*siginfo;
 
@@ -38,6 +36,8 @@ struct ptrace_context {
 	enum utrace_resume_action resume;
 };
 
+#define PTRACE_O_SYSEMU			0x100
+
 #define PTRACE_EVENT_SYSCALL_ENTRY	(1 << 16)
 #define PTRACE_EVENT_SYSCALL_EXIT	(2 << 16)
 #define PTRACE_EVENT_SIGTRAP		(3 << 16)
@@ -252,7 +252,7 @@ static u32 ptrace_report_syscall_entry(u
 
 	set_syscall_code(context, PTRACE_EVENT_SYSCALL_ENTRY);
 
-	if (unlikely(context->sysemu)) {
+	if (unlikely(context->options & PTRACE_O_SYSEMU)) {
 		if (test_thread_flag(TIF_SINGLESTEP))
 			user_disable_single_step(task);
 		return UTRACE_SYSCALL_ABORT | UTRACE_REPORT;
@@ -851,8 +851,9 @@ int ptrace_writedata(struct task_struct 
 static int ptrace_set_options(struct utrace_engine *engine,
 				struct task_struct *child, long data)
 {
-	__ptrace_set_options(child, engine, data & PTRACE_O_MASK);
+	BUILD_BUG_ON(PTRACE_O_MASK & PTRACE_O_SYSEMU);
 
+	__ptrace_set_options(child, engine, data & PTRACE_O_MASK);
 	return (data & ~PTRACE_O_MASK) ? -EINVAL : 0;
 }
 
@@ -1026,7 +1027,7 @@ static int ptrace_resume(struct utrace_e
 	if (!valid_signal(data))
 		return -EIO;
 
-	context->sysemu = false;
+	context->options &= ~PTRACE_O_SYSEMU;
 	events = engine->flags & ~UTRACE_EVENT_SYSCALL;
 	action = UTRACE_RESUME;
 
@@ -1053,7 +1054,7 @@ static int ptrace_resume(struct utrace_e
 			return -EIO;
 		action = UTRACE_SINGLESTEP;
 	case PTRACE_SYSEMU:
-		context->sysemu = true;
+		context->options |= PTRACE_O_SYSEMU;
 		events |= UTRACE_EVENT(SYSCALL_ENTRY);
 		break;
 #endif




More information about the utrace-devel mailing list