Module Name:    src
Committed By:   jmcneill
Date:           Mon Sep  5 13:28:17 UTC 2011

Modified Files:
        src/sys/arch/usermode/usermode: urkelvisor.c

Log Message:
rearrange ptrace_getregs and have the child raise(SIGSTOP) instead of wait()


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/usermode/usermode/urkelvisor.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/usermode/usermode/urkelvisor.c
diff -u src/sys/arch/usermode/usermode/urkelvisor.c:1.4 src/sys/arch/usermode/usermode/urkelvisor.c:1.5
--- src/sys/arch/usermode/usermode/urkelvisor.c:1.4	Mon Sep  5 12:49:33 2011
+++ src/sys/arch/usermode/usermode/urkelvisor.c	Mon Sep  5 13:28:17 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: urkelvisor.c,v 1.4 2011/09/05 12:49:33 jmcneill Exp $ */
+/* $NetBSD: urkelvisor.c,v 1.5 2011/09/05 13:28:17 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2011 Jared D. McNeill <jmcne...@invisible.ca>
@@ -32,13 +32,14 @@
 
 #include <sys/cdefs.h>
 #ifdef __NetBSD__
-__RCSID("$NetBSD: urkelvisor.c,v 1.4 2011/09/05 12:49:33 jmcneill Exp $");
+__RCSID("$NetBSD: urkelvisor.c,v 1.5 2011/09/05 13:28:17 jmcneill Exp $");
 #endif
 
 #include <sys/types.h>
 #include <sys/param.h>
 #include <sys/ptrace.h>
 #include <sys/wait.h>
+#include <sys/syscall.h>
 
 #ifdef __linux__
 #include <sys/user.h>
@@ -50,6 +51,7 @@
 #include <errno.h>
 #include <stdlib.h>
 #include <stdio.h>
+#include <signal.h>
 #include <unistd.h>
 
 #include "../include/urkelvisor.h"
@@ -98,27 +100,24 @@
 static void
 ptrace_getregs(pid_t urkel_pid, struct reg_struct *puregs)
 {
+	errno = 0;
 #ifdef __linux__
 	ptrace(PT_GETREGS, urkel_pid, NULL, puregs);
 #else
 	ptrace(PT_GETREGS, urkel_pid, puregs, 0);
 #endif
+	if (errno)
+		err(EXIT_FAILURE, "ptrace(PT_GETREGS, %d, &uregs, 0) failed",
+		    urkel_pid);
 }
 
 static int
-handle_syscall(pid_t urkel_pid)
+handle_syscall(struct reg_struct *puregs, pid_t urkel_pid)
 {
-	struct reg_struct uregs;
 	int sig = 0;
 
-	errno = 0;
-	ptrace_getregs(urkel_pid, &uregs);
-	if (errno)
-		err(EXIT_FAILURE, "ptrace(PT_GETREGS, %d, &uregs, 0) failed",
-		    urkel_pid);
-
-	if (R_PC(&uregs) >= kmem_user_start && R_PC(&uregs) < kmem_user_end) {
-		fprintf(stderr, "caught syscall %d\n", (int)R_SYSCALL(&uregs));
+	if (R_PC(puregs) >= kmem_user_start && R_PC(puregs) < kmem_user_end) {
+		fprintf(stderr, "caught syscall %d\n", (int)R_SYSCALL(puregs));
 		errno = 0;
 		ptrace(PT_SYSCALLEMU, urkel_pid, NULL, 0);
 		if (errno)
@@ -134,6 +133,7 @@
 static int
 urkelvisor(pid_t urkel_pid)
 {
+	struct reg_struct uregs;
 	int status, insyscall, sig;
 
 	insyscall = 0;
@@ -156,7 +156,8 @@
 		if (WSTOPSIG(status) == SIGTRAP) {
 			insyscall = !insyscall;
 			if (insyscall) {
-				sig = handle_syscall(urkel_pid);
+				ptrace_getregs(urkel_pid, &uregs);
+				sig = handle_syscall(&uregs, urkel_pid);
 				if (sig)
 					insyscall = !insyscall;
 			}
@@ -191,7 +192,7 @@
 		if (errno)
 			err(EXIT_FAILURE,
 			    "ptrace(PT_TRACE_ME, 0, NULL, 0) failed");
-		wait(&status);
+		raise(SIGSTOP);
 		break;
 	default:
 		status = urkelvisor(child_pid);

Reply via email to