procfs_fpregs.c revision 22521
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: 4021673Sjkh * $FreeBSD: head/sys/fs/procfs/procfs_fpregs.c 22521 1997-02-10 02:22:35Z dyson $ 411541Srgrimes */ 421541Srgrimes 431541Srgrimes#include <sys/param.h> 441541Srgrimes#include <sys/systm.h> 451541Srgrimes#include <sys/time.h> 461541Srgrimes#include <sys/kernel.h> 471541Srgrimes#include <sys/proc.h> 481541Srgrimes#include <sys/vnode.h> 491541Srgrimes#include <machine/reg.h> 501541Srgrimes#include <miscfs/procfs/procfs.h> 5113608Speter#include <vm/vm.h> 5213608Speter#include <vm/vm_extern.h> 531541Srgrimes 541541Srgrimesint 551541Srgrimesprocfs_dofpregs(curp, p, pfs, uio) 561541Srgrimes struct proc *curp; 571541Srgrimes struct proc *p; 581541Srgrimes struct pfsnode *pfs; 591541Srgrimes struct uio *uio; 601541Srgrimes{ 611541Srgrimes int error; 621541Srgrimes struct fpreg r; 631541Srgrimes char *kv; 641541Srgrimes int kl; 651541Srgrimes 661541Srgrimes kl = sizeof(r); 671541Srgrimes kv = (char *) &r; 681541Srgrimes 691541Srgrimes kv += uio->uio_offset; 701541Srgrimes kl -= uio->uio_offset; 711541Srgrimes if (kl > uio->uio_resid) 721541Srgrimes kl = uio->uio_resid; 731541Srgrimes 7413608Speter PHOLD(p); 7513608Speter 761541Srgrimes if (kl < 0) 771541Srgrimes error = EINVAL; 781541Srgrimes else 791541Srgrimes error = procfs_read_fpregs(p, &r); 801541Srgrimes if (error == 0) 811541Srgrimes error = uiomove(kv, kl, uio); 821541Srgrimes if (error == 0 && uio->uio_rw == UIO_WRITE) { 831541Srgrimes if (p->p_stat != SSTOP) 841541Srgrimes error = EBUSY; 851541Srgrimes else 861541Srgrimes error = procfs_write_fpregs(p, &r); 871541Srgrimes } 8813608Speter PRELE(p); 891541Srgrimes 901541Srgrimes uio->uio_offset = 0; 911541Srgrimes return (error); 921541Srgrimes} 9313608Speter 9413608Speterint 9513608Speterprocfs_validfpregs(p) 9613608Speter struct proc *p; 9713608Speter{ 9813608Speter return ((p->p_flag & P_SYSTEM) == 0); 9913608Speter} 100