Module Name: src Committed By: dsl Date: Sun Jan 19 13:35:58 UTC 2014
Modified Files: src/sys/arch/i386/i386: freebsd_machdep.c src/sys/arch/i386/include: freebsd_machdep.h src/sys/compat/freebsd: freebsd_ptrace.c Log Message: Rip out the code that might once have supported the freebsd ptrace system calls. Removes some very dodgy conversions of FP register layouts. Most of it has been disabled since 2007 when I removed the stackgap. To generate a diff of this commit: cvs rdiff -u -r1.56 -r1.57 src/sys/arch/i386/i386/freebsd_machdep.c cvs rdiff -u -r1.11 -r1.12 src/sys/arch/i386/include/freebsd_machdep.h cvs rdiff -u -r1.19 -r1.20 src/sys/compat/freebsd/freebsd_ptrace.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/i386/i386/freebsd_machdep.c diff -u src/sys/arch/i386/i386/freebsd_machdep.c:1.56 src/sys/arch/i386/i386/freebsd_machdep.c:1.57 --- src/sys/arch/i386/i386/freebsd_machdep.c:1.56 Sun Dec 8 20:45:30 2013 +++ src/sys/arch/i386/i386/freebsd_machdep.c Sun Jan 19 13:35:58 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: freebsd_machdep.c,v 1.56 2013/12/08 20:45:30 dsl Exp $ */ +/* $NetBSD: freebsd_machdep.c,v 1.57 2014/01/19 13:35:58 dsl Exp $ */ /*- * Copyright (c) 1998, 2000 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: freebsd_machdep.c,v 1.56 2013/12/08 20:45:30 dsl Exp $"); +__KERNEL_RCSID(0, "$NetBSD: freebsd_machdep.c,v 1.57 2014/01/19 13:35:58 dsl Exp $"); #if defined(_KERNEL_OPT) #include "opt_vm86.h" @@ -56,7 +56,6 @@ __KERNEL_RCSID(0, "$NetBSD: freebsd_mach #include <compat/freebsd/freebsd_syscallargs.h> #include <compat/freebsd/freebsd_exec.h> #include <compat/freebsd/freebsd_signal.h> -#include <compat/freebsd/freebsd_ptrace.h> void freebsd_setregs(struct lwp *l, struct exec_package *epp, vaddr_t stack) @@ -255,152 +254,3 @@ freebsd_sys_sigreturn(struct lwp *l, con return (EJUSTRETURN); } - -/* - * freebsd_ptrace(2) support - */ - -void -netbsd_to_freebsd_ptrace_regs(struct reg *nregs, struct fpreg *nfpregs, struct freebsd_ptrace_reg *fregs) -{ - struct save87 *nframe = (struct save87 *)nfpregs; - - fregs->freebsd_ptrace_regs.tf_es = nregs->r_es; - fregs->freebsd_ptrace_regs.tf_ds = nregs->r_ds; - fregs->freebsd_ptrace_regs.tf_edi = nregs->r_edi; - fregs->freebsd_ptrace_regs.tf_esi = nregs->r_esi; - fregs->freebsd_ptrace_regs.tf_ebp = nregs->r_ebp; - fregs->freebsd_ptrace_regs.tf_isp = 0; - fregs->freebsd_ptrace_regs.tf_ebx = nregs->r_ebx; - fregs->freebsd_ptrace_regs.tf_edx = nregs->r_edx; - fregs->freebsd_ptrace_regs.tf_ecx = nregs->r_ecx; - fregs->freebsd_ptrace_regs.tf_eax = nregs->r_eax; - fregs->freebsd_ptrace_regs.tf_trapno = 0; - - fregs->freebsd_ptrace_regs.tf_err = 0; - fregs->freebsd_ptrace_regs.tf_eip = nregs->r_eip; - fregs->freebsd_ptrace_regs.tf_cs = nregs->r_cs; - fregs->freebsd_ptrace_regs.tf_eflags = nregs->r_eflags; - - fregs->freebsd_ptrace_regs.tf_esp = nregs->r_esp; - fregs->freebsd_ptrace_regs.tf_ss = nregs->r_ss; - - fregs->freebsd_ptrace_fpregs.sv_env = nframe->sv_env; - memcpy(fregs->freebsd_ptrace_fpregs.sv_ac, nframe->sv_ac, - sizeof(fregs->freebsd_ptrace_fpregs.sv_ac)); - fregs->freebsd_ptrace_fpregs.sv_ex_sw = - nframe->sv_ex_sw; - /* - * fortunately, sizeof(freebsd_save87) >= sizeof(save87) - */ -#ifdef DIAGNOSTIC - if (sizeof(fregs->freebsd_ptrace_fpregs.sv_pad) < - sizeof(nframe->sv_ex_tw) + sizeof(nframe->sv_pad)) { - panic("netbsd_to_freebsd_ptrace_regs: %s", - "sizeof(freebsd_save87) >= sizeof(save87)"); - } -#endif - memcpy(fregs->freebsd_ptrace_fpregs.sv_pad, &nframe->sv_ex_tw, - sizeof(nframe->sv_ex_tw)); - memcpy((char *)fregs->freebsd_ptrace_fpregs.sv_pad + - sizeof(nframe->sv_ex_tw), - nframe->sv_pad, - sizeof(nframe->sv_pad)); - memset((char *)fregs->freebsd_ptrace_fpregs.sv_pad + - sizeof(nframe->sv_ex_tw) + sizeof(nframe->sv_pad), - 0, - sizeof(fregs->freebsd_ptrace_fpregs.sv_pad) - - sizeof(nframe->sv_ex_tw) - sizeof(nframe->sv_pad)); -} - -void -freebsd_to_netbsd_ptrace_regs(struct freebsd_ptrace_reg *fregs, struct reg *nregs, struct fpreg *nfpregs) -{ - struct save87 *nframe = (struct save87 *)nfpregs; - - nregs->r_es = fregs->freebsd_ptrace_regs.tf_es; - nregs->r_ds = fregs->freebsd_ptrace_regs.tf_ds; - nregs->r_edi = fregs->freebsd_ptrace_regs.tf_edi; - nregs->r_esi = fregs->freebsd_ptrace_regs.tf_esi; - nregs->r_ebp = fregs->freebsd_ptrace_regs.tf_ebp; - nregs->r_ebx = fregs->freebsd_ptrace_regs.tf_ebx; - nregs->r_edx = fregs->freebsd_ptrace_regs.tf_edx; - nregs->r_ecx = fregs->freebsd_ptrace_regs.tf_ecx; - nregs->r_eax = fregs->freebsd_ptrace_regs.tf_eax; - - nregs->r_eip = fregs->freebsd_ptrace_regs.tf_eip; - nregs->r_cs = fregs->freebsd_ptrace_regs.tf_cs; - nregs->r_eflags = fregs->freebsd_ptrace_regs.tf_eflags; - - nregs->r_esp = fregs->freebsd_ptrace_regs.tf_esp; - nregs->r_ss = fregs->freebsd_ptrace_regs.tf_ss; - - nframe->sv_env = fregs->freebsd_ptrace_fpregs.sv_env; - memcpy(nframe->sv_ac, fregs->freebsd_ptrace_fpregs.sv_ac, - sizeof(nframe->sv_ac)); - nframe->sv_ex_sw = - fregs->freebsd_ptrace_fpregs.sv_ex_sw; - /* - * fortunately, sizeof(freebsd_save87) >= sizeof(save87) - */ - memcpy(&nframe->sv_ex_tw, fregs->freebsd_ptrace_fpregs.sv_pad, - sizeof(nframe->sv_ex_tw)); - memcpy(nframe->sv_pad, - (char *)fregs->freebsd_ptrace_fpregs.sv_pad + - sizeof(nframe->sv_ex_tw), - sizeof(nframe->sv_pad)); -} - -/* random value, except FREEBSD_U_AR0_OFFSET..., FREEBSD_U_SAVEFP_OFFSET... */ -#define FREEBSD_REGS_OFFSET 0x2000 - -int -freebsd_ptrace_getregs(struct freebsd_ptrace_reg *fregs, void *addr, register_t *datap) -{ - vaddr_t offset = (vaddr_t)addr; - - if (offset == FREEBSD_U_AR0_OFFSET) { - *datap = FREEBSD_REGS_OFFSET + FREEBSD_USRSTACK; - return 0; - } else if (offset >= FREEBSD_REGS_OFFSET && - offset <= FREEBSD_REGS_OFFSET + - sizeof(fregs->freebsd_ptrace_regs)-sizeof(register_t)) { - *datap = *(register_t *)&((char *)&fregs->freebsd_ptrace_regs) - [(vaddr_t) addr - FREEBSD_REGS_OFFSET]; - return 0; - } else if (offset >= FREEBSD_U_SAVEFP_OFFSET && - offset <= FREEBSD_U_SAVEFP_OFFSET + - sizeof(fregs->freebsd_ptrace_fpregs)-sizeof(register_t)){ - *datap= *(register_t *)&((char *)&fregs->freebsd_ptrace_fpregs) - [offset - FREEBSD_U_SAVEFP_OFFSET]; - return 0; - } -#ifdef DIAGNOSTIC - printf("freebsd_ptrace_getregs: *(0x%08lx)\n", offset); -#endif - return EFAULT; -} - -int -freebsd_ptrace_setregs(struct freebsd_ptrace_reg *fregs, void *addr, int data) -{ - vaddr_t offset = (vaddr_t)addr; - - if (offset >= FREEBSD_REGS_OFFSET && - offset <= FREEBSD_REGS_OFFSET + - sizeof(fregs->freebsd_ptrace_regs) - sizeof(int)) { - *(int *)&((char *)&fregs->freebsd_ptrace_regs) - [offset - FREEBSD_REGS_OFFSET] = data; - return 0; - } else if (offset >= FREEBSD_U_SAVEFP_OFFSET && - offset <= FREEBSD_U_SAVEFP_OFFSET + - sizeof(fregs->freebsd_ptrace_fpregs) - sizeof(int)) { - *(int *)&((char *)&fregs->freebsd_ptrace_fpregs) - [offset - FREEBSD_U_SAVEFP_OFFSET] = data; - return 0; - } -#ifdef DIAGNOSTIC - printf("freebsd_ptrace_setregs: *(0x%08lx) = 0x%08x\n", offset, data); -#endif - return EFAULT; -} Index: src/sys/arch/i386/include/freebsd_machdep.h diff -u src/sys/arch/i386/include/freebsd_machdep.h:1.11 src/sys/arch/i386/include/freebsd_machdep.h:1.12 --- src/sys/arch/i386/include/freebsd_machdep.h:1.11 Mon Dec 9 17:39:53 2013 +++ src/sys/arch/i386/include/freebsd_machdep.h Sun Jan 19 13:35:58 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: freebsd_machdep.h,v 1.11 2013/12/09 17:39:53 dsl Exp $ */ +/* $NetBSD: freebsd_machdep.h,v 1.12 2014/01/19 13:35:58 dsl Exp $ */ /* * Copyright (c) 1986, 1989, 1991, 1993 @@ -111,74 +111,6 @@ struct freebsd_sigframe { struct freebsd_sigcontext sf_sc; }; -/* - * freebsd_ptrace(2) support - */ - -#define FREEBSD_USRSTACK 0xefbfe000 /* USRSTACK */ -#define FREEBSD_U_AR0_OFFSET 0x0000045c /* offsetof(struct user, u_ar0) */ -#define FREEBSD_U_SAVEFP_OFFSET 0x00000070 - /* offsetof(struct user, u_pcb) + offsetof(struct pcb, pcb_savefpu) */ - -/* Exception/Trap Stack Frame */ -struct freebsd_trapframe { - int tf_es; - int tf_ds; - int tf_edi; - int tf_esi; - int tf_ebp; - int tf_isp; - int tf_ebx; - int tf_edx; - int tf_ecx; - int tf_eax; - int tf_trapno; - /* below portion defined in 386 hardware */ - int tf_err; - int tf_eip; - int tf_cs; - int tf_eflags; - /* below only when transitting rings (e.g. user to kernel) */ - int tf_esp; - int tf_ss; -}; - -/* Environment information of floating point unit */ -#define freebsd_env87 env87 - -/* Contents of each floating point accumulator */ -struct freebsd_fpacc87 { -#ifdef dontdef /* too unportable */ - u_long fp_mantlo; /* mantissa low (31:0) */ - u_long fp_manthi; /* mantissa high (63:32) */ - int fp_exp:15; /* exponent */ - int fp_sgn:1; /* mantissa sign */ -#else - u_char fp_bytes[10]; -#endif -}; - -/* Floating point context */ -struct freebsd_save87 { - struct freebsd_env87 sv_env; /* floating point control/status */ - struct freebsd_fpacc87 sv_ac[8]; /* accumulator contents, 0-7 */ - u_long sv_ex_sw; /* status word for last exception */ - /* - * Bogus padding for emulators. Emulators should use their own - * struct and arrange to store into this struct (ending here) - * before it is inspected for ptracing or for core dumps. Some - * emulators overwrite the whole struct. We have no good way of - * knowing how much padding to leave. Leave just enough for the - * GPL emulator's i387_union (176 bytes total). - */ - u_char sv_pad[64]; /* padding; used by emulators */ -}; - -struct freebsd_ptrace_reg { - struct freebsd_trapframe freebsd_ptrace_regs; - struct freebsd_save87 freebsd_ptrace_fpregs; -}; - /* sys/i386/include/exec.h */ #define FREEBSD___LDPGSZ 4096 Index: src/sys/compat/freebsd/freebsd_ptrace.c diff -u src/sys/compat/freebsd/freebsd_ptrace.c:1.19 src/sys/compat/freebsd/freebsd_ptrace.c:1.20 --- src/sys/compat/freebsd/freebsd_ptrace.c:1.19 Mon Nov 23 00:46:06 2009 +++ src/sys/compat/freebsd/freebsd_ptrace.c Sun Jan 19 13:35:58 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: freebsd_ptrace.c,v 1.19 2009/11/23 00:46:06 rmind Exp $ */ +/* $NetBSD: freebsd_ptrace.c,v 1.20 2014/01/19 13:35:58 dsl Exp $ */ /*- * Copyright (c) 1982, 1986, 1989, 1993 @@ -71,7 +71,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: freebsd_ptrace.c,v 1.19 2009/11/23 00:46:06 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: freebsd_ptrace.c,v 1.20 2014/01/19 13:35:58 dsl Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -91,7 +91,6 @@ __KERNEL_RCSID(0, "$NetBSD: freebsd_ptra #include <compat/common/compat_util.h> #include <compat/freebsd/freebsd_syscallargs.h> -#include <compat/freebsd/freebsd_ptrace.h> /* * Process debugging system call. @@ -99,108 +98,5 @@ __KERNEL_RCSID(0, "$NetBSD: freebsd_ptra int freebsd_sys_ptrace(struct lwp *l, const struct freebsd_sys_ptrace_args *uap, register_t *retval) { - /* { - syscallarg(int) req; - syscallarg(pid_t) pid; - syscallarg(void *) addr; - syscallarg(int) data; - } */ - struct sys_ptrace_args npa; - sy_call_t *fn = sysent[SYS_ptrace].sy_call; - - switch (SCARG(uap, req)) { -#ifdef PT_STEP - case FREEBSD_PT_STEP: - SCARG(&npa, req) = PT_STEP; - SCARG(&npa, pid) = SCARG(uap, pid); - SCARG(&npa, addr) = SCARG(uap, addr); - SCARG(&npa, data) = SCARG(uap, data); - return (*fn)(l, &npa, retval); -#endif - case FREEBSD_PT_TRACE_ME: - case FREEBSD_PT_READ_I: - case FREEBSD_PT_READ_D: - case FREEBSD_PT_WRITE_I: - case FREEBSD_PT_WRITE_D: - case FREEBSD_PT_CONTINUE: - case FREEBSD_PT_KILL: - /* These requests are compatible with NetBSD */ - return (*fn)(l, (const void *)uap, retval); - -#if 0 -/* - * XXX: I've commented out this code, it is broken on too many fronts to fix. - * 1) It is doing an unlocked read-modify-write cycle on process that - * I assume might be running! - * and in code that might sleep (due to a pagefault), never mind - * what happens on an SMP system - * 2) It accesses data in userspace without using copyin/out. - * 3) It all looks like a nasty hack that isn't likely to work. - * 4) It uses the stackgap. - * dsl June 2007 - */ - case FREEBSD_PT_READ_U: - case FREEBSD_PT_WRITE_U: - { - int error; - struct { - struct reg regs; - struct fpreg fpregs; - } *nrp; - struct freebsd_ptrace_reg fr; - sg = stackgap_init(p, 0); - nrp = stackgap_alloc(p, &sg, sizeof(*nrp)); -#ifdef PT_GETREGS - SCARG(&npa, req) = PT_GETREGS; - SCARG(&npa, pid) = SCARG(uap, pid); - SCARG(&npa, addr) = (void *)&nrp->regs; - if ((error = (*fn)(l, &npa, retval)) != 0) - return error; -#endif -#ifdef PT_GETFPREGS - SCARG(&npa, req) = PT_GETFPREGS; - SCARG(&npa, pid) = SCARG(uap, pid); - SCARG(&npa, addr) = (void *)&nrp->fpregs; - if ((error = (*fn)(l, &npa, retval)) != 0) - return error; -#endif - netbsd_to_freebsd_ptrace_regs(&nrp->regs, &nrp->fpregs, &fr); - switch (SCARG(uap, req)) { - case FREEBSD_PT_READ_U: - return freebsd_ptrace_getregs(&fr, SCARG(uap, addr), - retval); - - case FREEBSD_PT_WRITE_U: - error = freebsd_ptrace_setregs(&fr, - SCARG(uap, addr), SCARG(uap, data)); - if (error) - return error; - freebsd_to_netbsd_ptrace_regs(&fr, - &nrp->regs, &nrp->fpregs); -#ifdef PT_SETREGS - SCARG(&npa, req) = PT_SETREGS; - SCARG(&npa, pid) = SCARG(uap, pid); - SCARG(&npa, addr) = (void *)&nrp->regs; - if ((error = (*fn)(l, &npa, retval)) != 0) - return error; -#endif -#ifdef PT_SETFPREGS - SCARG(&npa, req) = PT_SETFPREGS; - SCARG(&npa, pid) = SCARG(uap, pid); - SCARG(&npa, addr) = (void *)&nrp->fpregs; - if ((error = (*fn)(l, &npa, retval)) != 0) - return error; -#endif - return 0; - } - } -#endif - - default: /* It was not a legal request. */ - return (EINVAL); - } - -#ifdef DIAGNOSTIC - panic("freebsd_ptrace: impossible"); -#endif + return (EINVAL); }