procfs_fpregs.c revision 84637
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 84637 2001-10-07 20:08:42Z des $ 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> 4884637Sdes#include <sys/ptrace.h> 491541Srgrimes#include <sys/vnode.h> 5076166Smarkm 511541Srgrimes#include <machine/reg.h> 5276166Smarkm 5377031Sru#include <fs/procfs/procfs.h> 5476166Smarkm 5513608Speter#include <vm/vm.h> 561541Srgrimes 571541Srgrimesint 581541Srgrimesprocfs_dofpregs(curp, p, pfs, uio) 591541Srgrimes struct proc *curp; 601541Srgrimes struct proc *p; 611541Srgrimes struct pfsnode *pfs; 621541Srgrimes struct uio *uio; 631541Srgrimes{ 641541Srgrimes int error; 651541Srgrimes struct fpreg r; 661541Srgrimes char *kv; 671541Srgrimes int kl; 681541Srgrimes 6979335Srwatson if (p_candebug(curp, p)) 7028089Ssef return EPERM; 711541Srgrimes kl = sizeof(r); 721541Srgrimes kv = (char *) &r; 731541Srgrimes 741541Srgrimes kv += uio->uio_offset; 751541Srgrimes kl -= uio->uio_offset; 761541Srgrimes if (kl > uio->uio_resid) 771541Srgrimes kl = uio->uio_resid; 781541Srgrimes 7913608Speter PHOLD(p); 8013608Speter 811541Srgrimes if (kl < 0) 821541Srgrimes error = EINVAL; 831541Srgrimes else 8483366Sjulian error = procfs_read_fpregs(&p->p_thread, &r); 851541Srgrimes if (error == 0) 861541Srgrimes error = uiomove(kv, kl, uio); 871541Srgrimes if (error == 0 && uio->uio_rw == UIO_WRITE) { 881541Srgrimes if (p->p_stat != SSTOP) 891541Srgrimes error = EBUSY; 901541Srgrimes else 9183366Sjulian error = procfs_write_fpregs(&p->p_thread, &r); 921541Srgrimes } 9313608Speter PRELE(p); 941541Srgrimes 951541Srgrimes uio->uio_offset = 0; 961541Srgrimes return (error); 971541Srgrimes} 9813608Speter 9913608Speterint 10083366Sjulianprocfs_validfpregs(struct thread *td) 10113608Speter{ 10273906Sjhb 10383366Sjulian return (( td->td_proc->p_flag & P_SYSTEM) == 0); 10413608Speter} 105