Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/fs/procfs/procfs_dbregs.c
39564 views
1
/*-
2
* SPDX-License-Identifier: BSD-3-Clause
3
*
4
* Copyright (c) 1999 Brian Scott Dean, [email protected].
5
* All rights reserved.
6
*
7
* This code is derived from software contributed to Berkeley by
8
* Jan-Simon Pendry under the following copyrights and conditions:
9
*
10
* Copyright (c) 1993 Jan-Simon Pendry
11
* Copyright (c) 1993
12
* The Regents of the University of California. All rights reserved.
13
*
14
* This code is derived from software contributed to Berkeley by
15
* Jan-Simon Pendry.
16
*
17
* Redistribution and use in source and binary forms, with or without
18
* modification, are permitted provided that the following conditions
19
* are met:
20
* 1. Redistributions of source code must retain the above copyright
21
* notice, this list of conditions and the following disclaimer.
22
* 2. Redistributions in binary form must reproduce the above copyright
23
* notice, this list of conditions and the following disclaimer in the
24
* documentation and/or other materials provided with the distribution.
25
* 3. Neither the name of the University nor the names of its contributors
26
* may be used to endorse or promote products derived from this software
27
* without specific prior written permission.
28
*
29
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
30
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
31
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
32
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
33
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
34
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
35
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
37
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
38
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
39
* SUCH DAMAGE.
40
*
41
* From:
42
* $Id: procfs_regs.c,v 3.2 1993/12/15 09:40:17 jsp Exp $
43
*/
44
45
#include <sys/param.h>
46
#include <sys/systm.h>
47
#include <sys/lock.h>
48
#include <sys/mutex.h>
49
#include <sys/proc.h>
50
#include <sys/ptrace.h>
51
#include <sys/uio.h>
52
53
#include <fs/pseudofs/pseudofs.h>
54
#include <fs/procfs/procfs.h>
55
56
#ifdef COMPAT_FREEBSD32
57
#include <sys/sysent.h>
58
#include <sys/procfs.h>
59
#include <machine/fpu.h>
60
61
/*
62
* PROC(write, dbregs, td2, &r) becomes
63
* proc_write_dbregs(td2, &r) or
64
* proc_write_dbregs32(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
81
int
82
procfs_doprocdbregs(PFS_FILL_ARGS)
83
{
84
int error;
85
struct dbreg r;
86
struct thread *td2;
87
#ifdef COMPAT_FREEBSD32
88
struct dbreg32 r32;
89
int wrap32 = 0;
90
#endif
91
92
if (uio->uio_offset != 0)
93
return (0);
94
95
PROC_LOCK(p);
96
PROC_ASSERT_HELD(p);
97
if (p_candebug(td, p) != 0) {
98
PROC_UNLOCK(p);
99
return (EPERM);
100
}
101
102
td2 = FIRST_THREAD_IN_PROC(p);
103
#ifdef COMPAT_FREEBSD32
104
if (SV_CURPROC_FLAG(SV_ILP32)) {
105
if (SV_PROC_FLAG(td2->td_proc, SV_ILP32) == 0) {
106
PROC_UNLOCK(p);
107
return (EINVAL);
108
}
109
wrap32 = 1;
110
memset(&r32, 0, sizeof(r32));
111
} else
112
#endif
113
memset(&r, 0, sizeof(r));
114
error = PROC(read, dbregs, td2, &r);
115
if (error == 0) {
116
PROC_UNLOCK(p);
117
error = UIOMOVE_FROMBUF(r, uio);
118
PROC_LOCK(p);
119
}
120
if (error == 0 && uio->uio_rw == UIO_WRITE) {
121
if (!P_SHOULDSTOP(p)) /* XXXKSE should be P_TRACED? */
122
error = EBUSY;
123
else
124
/* XXXKSE: */
125
error = PROC(write, dbregs, td2, &r);
126
}
127
PROC_UNLOCK(p);
128
129
return (error);
130
}
131
132