procfs_fpregs.c revision 76166
11541Srgrimes/* 21541Srgrimes * Copyright (c) 1993 Jan-Simon Pendry 31541Srgrimes * Copyright (c) 1993 41541Srgrimes * The Regents of the University of California. All rights reserved. 51541Srgrimes * 61541Srgrimes * This code is derived from software contributed to Berkeley by 71541Srgrimes * Jan-Simon Pendry. 81541Srgrimes * 91541Srgrimes * Redistribution and use in source and binary forms, with or without 101541Srgrimes * modification, are permitted provided that the following conditions 111541Srgrimes * are met: 121541Srgrimes * 1. Redistributions of source code must retain the above copyright 131541Srgrimes * notice, this list of conditions and the following disclaimer. 141541Srgrimes * 2. Redistributions in binary form must reproduce the above copyright 151541Srgrimes * notice, this list of conditions and the following disclaimer in the 161541Srgrimes * documentation and/or other materials provided with the distribution. 171541Srgrimes * 3. All advertising materials mentioning features or use of this software 181541Srgrimes * must display the following acknowledgement: 191541Srgrimes * This product includes software developed by the University of 201541Srgrimes * California, Berkeley and its contributors. 211541Srgrimes * 4. Neither the name of the University nor the names of its contributors 221541Srgrimes * may be used to endorse or promote products derived from this software 231541Srgrimes * without specific prior written permission. 241541Srgrimes * 251541Srgrimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 261541Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 271541Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 281541Srgrimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 291541Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 301541Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 311541Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 321541Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 331541Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 341541Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 351541Srgrimes * SUCH DAMAGE. 361541Srgrimes * 3722521Sdyson * @(#)procfs_fpregs.c 8.2 (Berkeley) 6/15/94 381541Srgrimes * 3922521Sdyson * From: 4050477Speter * $FreeBSD: head/sys/fs/procfs/procfs_fpregs.c 76166 2001-05-01 08:13:21Z markm $ 411541Srgrimes */ 421541Srgrimes 431541Srgrimes#include <sys/param.h> 4476166Smarkm#include <sys/systm.h> 4576166Smarkm#include <sys/lock.h> 4676166Smarkm#include <sys/mutex.h> 471541Srgrimes#include <sys/proc.h> 481541Srgrimes#include <sys/vnode.h> 4976166Smarkm 501541Srgrimes#include <machine/reg.h> 5176166Smarkm 521541Srgrimes#include <miscfs/procfs/procfs.h> 5376166Smarkm 5413608Speter#include <vm/vm.h> 551541Srgrimes 561541Srgrimesint 571541Srgrimesprocfs_dofpregs(curp, p, pfs, uio) 581541Srgrimes struct proc *curp; 591541Srgrimes struct proc *p; 601541Srgrimes struct pfsnode *pfs; 611541Srgrimes struct uio *uio; 621541Srgrimes{ 631541Srgrimes int error; 641541Srgrimes struct fpreg r; 651541Srgrimes char *kv; 661541Srgrimes int kl; 671541Srgrimes 6865237Srwatson if (p_can(curp, p, P_CAN_DEBUG, NULL)) 6928089Ssef return EPERM; 701541Srgrimes kl = sizeof(r); 711541Srgrimes kv = (char *) &r; 721541Srgrimes 731541Srgrimes kv += uio->uio_offset; 741541Srgrimes kl -= uio->uio_offset; 751541Srgrimes if (kl > uio->uio_resid) 761541Srgrimes kl = uio->uio_resid; 771541Srgrimes 7813608Speter PHOLD(p); 7913608Speter 801541Srgrimes if (kl < 0) 811541Srgrimes error = EINVAL; 821541Srgrimes else 831541Srgrimes error = procfs_read_fpregs(p, &r); 841541Srgrimes if (error == 0) 851541Srgrimes error = uiomove(kv, kl, uio); 861541Srgrimes if (error == 0 && uio->uio_rw == UIO_WRITE) { 871541Srgrimes if (p->p_stat != SSTOP) 881541Srgrimes error = EBUSY; 891541Srgrimes else 901541Srgrimes error = procfs_write_fpregs(p, &r); 911541Srgrimes } 9213608Speter PRELE(p); 931541Srgrimes 941541Srgrimes uio->uio_offset = 0; 951541Srgrimes return (error); 961541Srgrimes} 9713608Speter 9813608Speterint 9913608Speterprocfs_validfpregs(p) 10013608Speter struct proc *p; 10113608Speter{ 10273906Sjhb 10375893Sjhb return ((p->p_flag & P_SYSTEM) == 0); 10413608Speter} 105