Module Name: src Committed By: jmcneill Date: Tue Sep 6 09:55:04 UTC 2011
Modified Files: src/sys/arch/usermode/dev: cpu.c src/sys/arch/usermode/usermode: trap.c urkelvisor.c Log Message: cpu_lwp_inkernel approach won't work, back to the drawing board To generate a diff of this commit: cvs rdiff -u -r1.33 -r1.34 src/sys/arch/usermode/dev/cpu.c cvs rdiff -u -r1.29 -r1.30 src/sys/arch/usermode/usermode/trap.c cvs rdiff -u -r1.7 -r1.8 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/dev/cpu.c diff -u src/sys/arch/usermode/dev/cpu.c:1.33 src/sys/arch/usermode/dev/cpu.c:1.34 --- src/sys/arch/usermode/dev/cpu.c:1.33 Mon Sep 5 20:54:47 2011 +++ src/sys/arch/usermode/dev/cpu.c Tue Sep 6 09:55:04 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: cpu.c,v 1.33 2011/09/05 20:54:47 jmcneill Exp $ */ +/* $NetBSD: cpu.c,v 1.34 2011/09/06 09:55:04 jmcneill Exp $ */ /*- * Copyright (c) 2007 Jared D. McNeill <jmcne...@invisible.ca> @@ -29,7 +29,7 @@ #include "opt_cpu.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.33 2011/09/05 20:54:47 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.34 2011/09/06 09:55:04 jmcneill Exp $"); #include <sys/param.h> #include <sys/conf.h> @@ -58,8 +58,6 @@ #define cpu_unreachable() do { thunk_abort(); } while (0) #endif -int cpu_lwp_inkernel = 1; - static int cpu_match(device_t, cfdata_t, void *); static void cpu_attach(device_t, device_t, void *); @@ -188,7 +186,6 @@ ci->ci_stash = oldlwp; curlwp = newlwp; - cpu_lwp_inkernel = curproc->p_vmspace->vm_map.pmap == pmap_kernel(); if (oldpcb) { oldpcb->pcb_errno = thunk_geterrno(); Index: src/sys/arch/usermode/usermode/trap.c diff -u src/sys/arch/usermode/usermode/trap.c:1.29 src/sys/arch/usermode/usermode/trap.c:1.30 --- src/sys/arch/usermode/usermode/trap.c:1.29 Tue Sep 6 09:38:27 2011 +++ src/sys/arch/usermode/usermode/trap.c Tue Sep 6 09:55:04 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: trap.c,v 1.29 2011/09/06 09:38:27 reinoud Exp $ */ +/* $NetBSD: trap.c,v 1.30 2011/09/06 09:55:04 jmcneill Exp $ */ /*- * Copyright (c) 2011 Reinoud Zandijk <rein...@netbsd.org> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.29 2011/09/06 09:38:27 reinoud Exp $"); +__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.30 2011/09/06 09:55:04 jmcneill Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -48,8 +48,6 @@ //#include <machine/instr.h> //#include <machine/userret.h> -extern int cpu_lwp_inkernel; - /* forwards and externals */ void setup_signal_handlers(void); static void mem_access_handler(int sig, siginfo_t *info, void *ctx); @@ -118,8 +116,6 @@ void *onfault; int kmem, lwp_errno, rv; - cpu_lwp_inkernel++; - recurse++; if (recurse > 1) printf("enter trap recursion level %d\n", recurse); @@ -232,7 +228,6 @@ if (recurse > 1) printf("leaving trap recursion level %d\n", recurse); recurse--; - cpu_lwp_inkernel--; } static void @@ -244,7 +239,6 @@ struct pcb *pcb; vaddr_t va; - cpu_lwp_inkernel++; recurse++; if (recurse > 1) printf("enter trap recursion level %d\n", recurse); @@ -292,5 +286,4 @@ panic("illegal instruction encountered\n"); } - cpu_lwp_inkernel--; } Index: src/sys/arch/usermode/usermode/urkelvisor.c diff -u src/sys/arch/usermode/usermode/urkelvisor.c:1.7 src/sys/arch/usermode/usermode/urkelvisor.c:1.8 --- src/sys/arch/usermode/usermode/urkelvisor.c:1.7 Mon Sep 5 20:54:48 2011 +++ src/sys/arch/usermode/usermode/urkelvisor.c Tue Sep 6 09:55:04 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: urkelvisor.c,v 1.7 2011/09/05 20:54:48 jmcneill Exp $ */ +/* $NetBSD: urkelvisor.c,v 1.8 2011/09/06 09:55:04 jmcneill Exp $ */ /*- * Copyright (c) 2011 Jared D. McNeill <jmcne...@invisible.ca> @@ -32,7 +32,7 @@ #include <sys/cdefs.h> #ifdef __NetBSD__ -__RCSID("$NetBSD: urkelvisor.c,v 1.7 2011/09/05 20:54:48 jmcneill Exp $"); +__RCSID("$NetBSD: urkelvisor.c,v 1.8 2011/09/06 09:55:04 jmcneill Exp $"); #endif #include <sys/types.h> @@ -114,15 +114,12 @@ static int handle_syscall(struct reg_struct *puregs, pid_t urkel_pid) { - extern int cpu_lwp_inkernel; + vaddr_t pc; int sig = 0; int inkernel; - errno = 0; - inkernel = ptrace(PT_READ_D, urkel_pid, &cpu_lwp_inkernel, 0); - if (errno) - err(EXIT_FAILURE, "ptrace(PT_READ_D, %d, %p, 0) failed", - urkel_pid, &cpu_lwp_inkernel); + pc = (vaddr_t)R_PC(puregs); + inkernel = !(pc >= kmem_user_start && pc < kmem_user_end); //fprintf(stderr, "%s: pid=%d pc=%p inkernel=%d\n", // __func__, urkel_pid, (void *)R_PC(puregs), inkernel);