1*0e6594a8SSascha Wildner /* 2*0e6594a8SSascha Wildner * Copyright (c) 1993 3*0e6594a8SSascha Wildner * The Regents of the University of California. All rights reserved. 4*0e6594a8SSascha Wildner * Copyright (c) 1993 Jan-Simon Pendry 5*0e6594a8SSascha Wildner * 6*0e6594a8SSascha Wildner * This code is derived from software contributed to Berkeley by 7*0e6594a8SSascha Wildner * Jan-Simon Pendry. 8*0e6594a8SSascha Wildner * 9*0e6594a8SSascha Wildner * Redistribution and use in source and binary forms, with or without 10*0e6594a8SSascha Wildner * modification, are permitted provided that the following conditions 11*0e6594a8SSascha Wildner * are met: 12*0e6594a8SSascha Wildner * 1. Redistributions of source code must retain the above copyright 13*0e6594a8SSascha Wildner * notice, this list of conditions and the following disclaimer. 14*0e6594a8SSascha Wildner * 2. Redistributions in binary form must reproduce the above copyright 15*0e6594a8SSascha Wildner * notice, this list of conditions and the following disclaimer in the 16*0e6594a8SSascha Wildner * documentation and/or other materials provided with the distribution. 17*0e6594a8SSascha Wildner * 3. All advertising materials mentioning features or use of this software 18*0e6594a8SSascha Wildner * must display the following acknowledgement: 19*0e6594a8SSascha Wildner * This product includes software developed by the University of 20*0e6594a8SSascha Wildner * California, Berkeley and its contributors. 21*0e6594a8SSascha Wildner * 4. Neither the name of the University nor the names of its contributors 22*0e6594a8SSascha Wildner * may be used to endorse or promote products derived from this software 23*0e6594a8SSascha Wildner * without specific prior written permission. 24*0e6594a8SSascha Wildner * 25*0e6594a8SSascha Wildner * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 26*0e6594a8SSascha Wildner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 27*0e6594a8SSascha Wildner * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 28*0e6594a8SSascha Wildner * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 29*0e6594a8SSascha Wildner * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 30*0e6594a8SSascha Wildner * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 31*0e6594a8SSascha Wildner * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 32*0e6594a8SSascha Wildner * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 33*0e6594a8SSascha Wildner * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 34*0e6594a8SSascha Wildner * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 35*0e6594a8SSascha Wildner * SUCH DAMAGE. 36*0e6594a8SSascha Wildner * 37*0e6594a8SSascha Wildner * @(#)procfs_machdep.c 8.3 (Berkeley) 1/27/94 38*0e6594a8SSascha Wildner * 39*0e6594a8SSascha Wildner * From: 40*0e6594a8SSascha Wildner * $FreeBSD: src/sys/i386/i386/procfs_machdep.c,v 1.14 1999/10/11 14:50:03 peter Exp $ 41*0e6594a8SSascha Wildner * $DragonFly: src/sys/platform/pc64/amd64/procfs_machdep.c,v 1.2 2007/09/24 03:24:45 yanyh Exp $ 42*0e6594a8SSascha Wildner */ 43*0e6594a8SSascha Wildner 44*0e6594a8SSascha Wildner /* 45*0e6594a8SSascha Wildner * Functions to be implemented here are: 46*0e6594a8SSascha Wildner * 47*0e6594a8SSascha Wildner * procfs_read_regs(lwp, regs) 48*0e6594a8SSascha Wildner * Get the current user-visible register set from the process 49*0e6594a8SSascha Wildner * and copy it into the regs structure (<machine/reg.h>). 50*0e6594a8SSascha Wildner * The process is stopped at the time read_regs is called. 51*0e6594a8SSascha Wildner * 52*0e6594a8SSascha Wildner * procfs_write_regs(lwp, regs) 53*0e6594a8SSascha Wildner * Update the current register set from the passed in regs 54*0e6594a8SSascha Wildner * structure. Take care to avoid clobbering special CPU 55*0e6594a8SSascha Wildner * registers or privileged bits in the PSL. 56*0e6594a8SSascha Wildner * Depending on the architecture this may have fix-up work to do, 57*0e6594a8SSascha Wildner * especially if the IAR or PCW are modified. 58*0e6594a8SSascha Wildner * The process is stopped at the time write_regs is called. 59*0e6594a8SSascha Wildner * 60*0e6594a8SSascha Wildner * procfs_read_fpregs, procfs_write_fpregs 61*0e6594a8SSascha Wildner * deal with the floating point register set, otherwise as above. 62*0e6594a8SSascha Wildner * 63*0e6594a8SSascha Wildner * procfs_read_dbregs, procfs_write_dbregs 64*0e6594a8SSascha Wildner * deal with the processor debug register set, otherwise as above. 65*0e6594a8SSascha Wildner * 66*0e6594a8SSascha Wildner * procfs_sstep(lwp) 67*0e6594a8SSascha Wildner * Arrange for the process to trap after executing a single instruction. 68*0e6594a8SSascha Wildner * 69*0e6594a8SSascha Wildner */ 70*0e6594a8SSascha Wildner 71*0e6594a8SSascha Wildner #include <sys/param.h> 72*0e6594a8SSascha Wildner #include <sys/proc.h> 73*0e6594a8SSascha Wildner #include <sys/ptrace.h> 74*0e6594a8SSascha Wildner #include <sys/vnode.h> 75*0e6594a8SSascha Wildner #include <sys/reg.h> 76*0e6594a8SSascha Wildner #include <machine/md_var.h> 77*0e6594a8SSascha Wildner #include <vfs/procfs/procfs.h> 78*0e6594a8SSascha Wildner 79*0e6594a8SSascha Wildner #include <vm/vm.h> 80*0e6594a8SSascha Wildner #include <sys/lock.h> 81*0e6594a8SSascha Wildner #include <vm/pmap.h> 82*0e6594a8SSascha Wildner #include <vm/vm_map.h> 83*0e6594a8SSascha Wildner 84*0e6594a8SSascha Wildner int 85*0e6594a8SSascha Wildner procfs_read_regs(struct lwp *lp, struct reg *regs) 86*0e6594a8SSascha Wildner { 87*0e6594a8SSascha Wildner return (fill_regs(lp, regs)); 88*0e6594a8SSascha Wildner } 89*0e6594a8SSascha Wildner 90*0e6594a8SSascha Wildner int 91*0e6594a8SSascha Wildner procfs_write_regs(struct lwp *lp, struct reg *regs) 92*0e6594a8SSascha Wildner { 93*0e6594a8SSascha Wildner return (set_regs(lp, regs)); 94*0e6594a8SSascha Wildner } 95*0e6594a8SSascha Wildner 96*0e6594a8SSascha Wildner int 97*0e6594a8SSascha Wildner procfs_read_dbregs(struct lwp *lp, struct dbreg *dbregs) 98*0e6594a8SSascha Wildner { 99*0e6594a8SSascha Wildner return (fill_dbregs(lp, dbregs)); 100*0e6594a8SSascha Wildner } 101*0e6594a8SSascha Wildner 102*0e6594a8SSascha Wildner int 103*0e6594a8SSascha Wildner procfs_write_dbregs(struct lwp *lp, struct dbreg *dbregs) 104*0e6594a8SSascha Wildner { 105*0e6594a8SSascha Wildner return (set_dbregs(lp, dbregs)); 106*0e6594a8SSascha Wildner } 107*0e6594a8SSascha Wildner 108*0e6594a8SSascha Wildner /* 109*0e6594a8SSascha Wildner * Ptrace doesn't support fpregs at all, and there are no security holes 110*0e6594a8SSascha Wildner * or translations for fpregs, so we can just copy them. 111*0e6594a8SSascha Wildner */ 112*0e6594a8SSascha Wildner 113*0e6594a8SSascha Wildner int 114*0e6594a8SSascha Wildner procfs_read_fpregs(struct lwp *lp, struct fpreg *fpregs) 115*0e6594a8SSascha Wildner { 116*0e6594a8SSascha Wildner return (fill_fpregs(lp, fpregs)); 117*0e6594a8SSascha Wildner } 118*0e6594a8SSascha Wildner 119*0e6594a8SSascha Wildner int 120*0e6594a8SSascha Wildner procfs_write_fpregs(struct lwp *lp, struct fpreg *fpregs) 121*0e6594a8SSascha Wildner { 122*0e6594a8SSascha Wildner return (set_fpregs(lp, fpregs)); 123*0e6594a8SSascha Wildner } 124*0e6594a8SSascha Wildner 125*0e6594a8SSascha Wildner int 126*0e6594a8SSascha Wildner procfs_sstep(struct lwp *lp) 127*0e6594a8SSascha Wildner { 128*0e6594a8SSascha Wildner return (ptrace_single_step(lp)); 129*0e6594a8SSascha Wildner } 130