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);