Deleted Added
full compact
procfs_fpregs.c (136004) procfs_fpregs.c (147692)
1/*-
2 * Copyright (c) 1993 Jan-Simon Pendry
3 * Copyright (c) 1993
4 * The Regents of the University of California. All rights reserved.
5 *
6 * This code is derived from software contributed to Berkeley by
7 * Jan-Simon Pendry.
8 *

--- 20 unchanged lines hidden (view full) ---

29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
33 * @(#)procfs_fpregs.c 8.2 (Berkeley) 6/15/94
34 *
35 * From:
36 * $Id: procfs_regs.c,v 3.2 1993/12/15 09:40:17 jsp Exp $
1/*-
2 * Copyright (c) 1993 Jan-Simon Pendry
3 * Copyright (c) 1993
4 * The Regents of the University of California. All rights reserved.
5 *
6 * This code is derived from software contributed to Berkeley by
7 * Jan-Simon Pendry.
8 *

--- 20 unchanged lines hidden (view full) ---

29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
33 * @(#)procfs_fpregs.c 8.2 (Berkeley) 6/15/94
34 *
35 * From:
36 * $Id: procfs_regs.c,v 3.2 1993/12/15 09:40:17 jsp Exp $
37 * $FreeBSD: head/sys/fs/procfs/procfs_fpregs.c 136004 2004-10-01 05:01:17Z das $
37 * $FreeBSD: head/sys/fs/procfs/procfs_fpregs.c 147692 2005-06-30 07:49:22Z peter $
38 */
39
38 */
39
40#include "opt_compat.h"
41
40#include <sys/param.h>
41#include <sys/systm.h>
42#include <sys/lock.h>
43#include <sys/mutex.h>
44#include <sys/proc.h>
45#include <sys/ptrace.h>
46#include <sys/uio.h>
47
48#include <machine/reg.h>
49
50#include <fs/pseudofs/pseudofs.h>
51#include <fs/procfs/procfs.h>
52
42#include <sys/param.h>
43#include <sys/systm.h>
44#include <sys/lock.h>
45#include <sys/mutex.h>
46#include <sys/proc.h>
47#include <sys/ptrace.h>
48#include <sys/uio.h>
49
50#include <machine/reg.h>
51
52#include <fs/pseudofs/pseudofs.h>
53#include <fs/procfs/procfs.h>
54
55#ifdef COMPAT_IA32
56#include <sys/procfs.h>
57#include <machine/fpu.h>
58#include <compat/ia32/ia32_reg.h>
59
60extern struct sysentvec ia32_freebsd_sysvec;
61/*
62 * PROC(write, fpregs, td2, &r) becomes
63 * proc_write_fpregs(td2, &r) or
64 * proc_write_fpregs32(td2, &r32)
65 *
66 * UIOMOVE_FROMBUF(r, uio) becomes
67 * uiomove_frombuf(&r, sizeof(r), uio) or
68 * uiomove_frombuf(&r32, sizeof(r32), uio)
69 */
70#define PROC(d, w, t, r) wrap32 ? \
71 proc_ ## d ## _ ## w ## 32(t, r ## 32) : \
72 proc_ ## d ## _ ## w(t, r)
73#define UIOMOVE_FROMBUF(k, u) wrap32 ? \
74 uiomove_frombuf(& k ## 32, sizeof(k ## 32), u) : \
75 uiomove_frombuf(& k, sizeof(k), u)
76#else
77#define PROC(d, w, t, r) proc_ ## d ## _ ## w(t, r)
78#define UIOMOVE_FROMBUF(k, u) uiomove_frombuf(& k, sizeof(k), u)
79#endif
80
53int
54procfs_doprocfpregs(PFS_FILL_ARGS)
55{
56 int error;
57 struct fpreg r;
81int
82procfs_doprocfpregs(PFS_FILL_ARGS)
83{
84 int error;
85 struct fpreg r;
86 struct thread *td2;
87#ifdef COMPAT_IA32
88 struct fpreg32 r32;
89 int wrap32 = 0;
90#endif
58
59 PROC_LOCK(p);
60 KASSERT(p->p_lock > 0, ("proc not held"));
61 if (p_candebug(td, p)) {
62 PROC_UNLOCK(p);
63 return (EPERM);
64 }
65
66 /* XXXKSE: */
91
92 PROC_LOCK(p);
93 KASSERT(p->p_lock > 0, ("proc not held"));
94 if (p_candebug(td, p)) {
95 PROC_UNLOCK(p);
96 return (EPERM);
97 }
98
99 /* XXXKSE: */
67 error = proc_read_fpregs(FIRST_THREAD_IN_PROC(p), &r);
100 td2 = FIRST_THREAD_IN_PROC(p);
101#ifdef COMPAT_IA32
102 if (td->td_proc->p_sysent == &ia32_freebsd_sysvec) {
103 if (td2->td_proc->p_sysent != &ia32_freebsd_sysvec) {
104 PROC_UNLOCK(p);
105 return (EINVAL);
106 }
107 wrap32 = 1;
108 }
109#endif
110 error = PROC(read, fpregs, td2, &r);
68 if (error == 0) {
69 PROC_UNLOCK(p);
111 if (error == 0) {
112 PROC_UNLOCK(p);
70 error = uiomove_frombuf(&r, sizeof(r), uio);
113 error = UIOMOVE_FROMBUF(r, uio);
71 PROC_LOCK(p);
72 }
73 if (error == 0 && uio->uio_rw == UIO_WRITE) {
74 if (!P_SHOULDSTOP(p))
75 error = EBUSY;
76 else
77 /* XXXKSE: */
114 PROC_LOCK(p);
115 }
116 if (error == 0 && uio->uio_rw == UIO_WRITE) {
117 if (!P_SHOULDSTOP(p))
118 error = EBUSY;
119 else
120 /* XXXKSE: */
78 error = proc_write_fpregs(FIRST_THREAD_IN_PROC(p), &r);
121 error = PROC(write, fpregs, td2, &r);
79 }
80 PROC_UNLOCK(p);
81
82 uio->uio_offset = 0;
83 return (error);
84}
122 }
123 PROC_UNLOCK(p);
124
125 uio->uio_offset = 0;
126 return (error);
127}