procfs_fpregs.c revision 94622
190716Sbde/*- 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: 4090716Sbde * $Id: procfs_regs.c,v 3.2 1993/12/15 09:40:17 jsp Exp $ 4150477Speter * $FreeBSD: head/sys/fs/procfs/procfs_fpregs.c 94622 2002-04-13 23:14:08Z jhb $ 421541Srgrimes */ 431541Srgrimes 441541Srgrimes#include <sys/param.h> 4576166Smarkm#include <sys/systm.h> 4676166Smarkm#include <sys/lock.h> 4776166Smarkm#include <sys/mutex.h> 481541Srgrimes#include <sys/proc.h> 4984637Sdes#include <sys/ptrace.h> 5087321Sdes#include <sys/uio.h> 5176166Smarkm 521541Srgrimes#include <machine/reg.h> 5376166Smarkm 5487321Sdes#include <fs/pseudofs/pseudofs.h> 5577031Sru#include <fs/procfs/procfs.h> 5676166Smarkm 571541Srgrimesint 5887321Sdesprocfs_doprocfpregs(PFS_FILL_ARGS) 591541Srgrimes{ 601541Srgrimes int error; 611541Srgrimes struct fpreg r; 621541Srgrimes char *kv; 631541Srgrimes int kl; 641541Srgrimes 6594622Sjhb PROC_LOCK(p); 6694622Sjhb if (p_candebug(td->td_proc, p)) { 6794622Sjhb PROC_UNLOCK(p); 6890716Sbde return (EPERM); 6994622Sjhb } 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 7894622Sjhb _PHOLD(p); 791541Srgrimes if (kl < 0) 801541Srgrimes error = EINVAL; 811541Srgrimes else 8290716Sbde /* XXXKSE: */ 8390361Sjulian error = proc_read_fpregs(FIRST_THREAD_IN_PROC(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 9090716Sbde /* XXXKSE: */ 9190361Sjulian error = proc_write_fpregs(FIRST_THREAD_IN_PROC(p), &r); 921541Srgrimes } 9394622Sjhb _PRELE(p); 9494622Sjhb PROC_UNLOCK(p); 951541Srgrimes 961541Srgrimes uio->uio_offset = 0; 971541Srgrimes return (error); 981541Srgrimes} 99