Deleted Added
full compact
ptrace_machdep.c (278976) ptrace_machdep.c (284919)
1/*-
2 * Copyright (c) 2011 Konstantin Belousov <kib@FreeBSD.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

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

21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 */
27
28#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 2011 Konstantin Belousov <kib@FreeBSD.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

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

21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 */
27
28#include <sys/cdefs.h>
29__FBSDID("$FreeBSD: head/sys/amd64/amd64/ptrace_machdep.c 278976 2015-02-18 23:34:03Z jhb $");
29__FBSDID("$FreeBSD: head/sys/amd64/amd64/ptrace_machdep.c 284919 2015-06-29 07:07:24Z kib $");
30
31#include "opt_compat.h"
32
33#include <sys/param.h>
34#include <sys/systm.h>
35#include <sys/malloc.h>
36#include <sys/proc.h>
37#include <sys/ptrace.h>
38#include <sys/sysent.h>
30
31#include "opt_compat.h"
32
33#include <sys/param.h>
34#include <sys/systm.h>
35#include <sys/malloc.h>
36#include <sys/proc.h>
37#include <sys/ptrace.h>
38#include <sys/sysent.h>
39#include <vm/vm.h>
40#include <vm/pmap.h>
39#include <machine/md_var.h>
40#include <machine/pcb.h>
41#include <machine/md_var.h>
42#include <machine/pcb.h>
43#include <machine/frame.h>
44#include <machine/vmparam.h>
41
42static int
43cpu_ptrace_xstate(struct thread *td, int req, void *addr, int data)
44{
45 struct ptrace_xstate_info info;
46 char *savefpu;
47 int error;
48

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

105 default:
106 error = EINVAL;
107 break;
108 }
109
110 return (error);
111}
112
45
46static int
47cpu_ptrace_xstate(struct thread *td, int req, void *addr, int data)
48{
49 struct ptrace_xstate_info info;
50 char *savefpu;
51 int error;
52

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

109 default:
110 error = EINVAL;
111 break;
112 }
113
114 return (error);
115}
116
117static void
118cpu_ptrace_setbase(struct thread *td, int req, register_t r)
119{
120
121 if (req == PT_SETFSBASE) {
122 td->td_pcb->pcb_fsbase = r;
123 td->td_frame->tf_fs = _ufssel;
124 } else {
125 td->td_pcb->pcb_gsbase = r;
126 td->td_frame->tf_gs = _ugssel;
127 }
128 set_pcb_flags(td->td_pcb, PCB_FULL_IRET);
129}
130
113#ifdef COMPAT_FREEBSD32
114#define PT_I386_GETXMMREGS (PT_FIRSTMACH + 0)
115#define PT_I386_SETXMMREGS (PT_FIRSTMACH + 1)
116
117static int
118cpu32_ptrace(struct thread *td, int req, void *addr, int data)
119{
120 struct savefpu *fpstate;
131#ifdef COMPAT_FREEBSD32
132#define PT_I386_GETXMMREGS (PT_FIRSTMACH + 0)
133#define PT_I386_SETXMMREGS (PT_FIRSTMACH + 1)
134
135static int
136cpu32_ptrace(struct thread *td, int req, void *addr, int data)
137{
138 struct savefpu *fpstate;
139 uint32_t r;
121 int error;
122
123 switch (req) {
124 case PT_I386_GETXMMREGS:
125 fpugetregs(td);
126 error = copyout(get_pcb_user_save_td(td), addr,
127 sizeof(*fpstate));
128 break;

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

137 case PT_GETXSTATE_OLD:
138 case PT_SETXSTATE_OLD:
139 case PT_GETXSTATE_INFO:
140 case PT_GETXSTATE:
141 case PT_SETXSTATE:
142 error = cpu_ptrace_xstate(td, req, addr, data);
143 break;
144
140 int error;
141
142 switch (req) {
143 case PT_I386_GETXMMREGS:
144 fpugetregs(td);
145 error = copyout(get_pcb_user_save_td(td), addr,
146 sizeof(*fpstate));
147 break;

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

156 case PT_GETXSTATE_OLD:
157 case PT_SETXSTATE_OLD:
158 case PT_GETXSTATE_INFO:
159 case PT_GETXSTATE:
160 case PT_SETXSTATE:
161 error = cpu_ptrace_xstate(td, req, addr, data);
162 break;
163
164 case PT_GETFSBASE:
165 case PT_GETGSBASE:
166 if (!SV_PROC_FLAG(td->td_proc, SV_ILP32)) {
167 error = EINVAL;
168 break;
169 }
170 r = req == PT_GETFSBASE ? td->td_pcb->pcb_fsbase :
171 td->td_pcb->pcb_gsbase;
172 error = copyout(&r, addr, sizeof(r));
173 break;
174
175 case PT_SETFSBASE:
176 case PT_SETGSBASE:
177 if (!SV_PROC_FLAG(td->td_proc, SV_ILP32)) {
178 error = EINVAL;
179 break;
180 }
181 error = copyin(addr, &r, sizeof(r));
182 if (error != 0)
183 break;
184 cpu_ptrace_setbase(td, req, r);
185 break;
186
145 default:
146 error = EINVAL;
147 break;
148 }
149
150 return (error);
151}
152#endif
153
154int
155cpu_ptrace(struct thread *td, int req, void *addr, int data)
156{
187 default:
188 error = EINVAL;
189 break;
190 }
191
192 return (error);
193}
194#endif
195
196int
197cpu_ptrace(struct thread *td, int req, void *addr, int data)
198{
199 register_t *r, rv;
157 int error;
158
159#ifdef COMPAT_FREEBSD32
160 if (SV_CURPROC_FLAG(SV_ILP32))
161 return (cpu32_ptrace(td, req, addr, data));
162#endif
163
164 /* Support old values of PT_GETXSTATE_OLD and PT_SETXSTATE_OLD. */

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

171 case PT_GETXSTATE_OLD:
172 case PT_SETXSTATE_OLD:
173 case PT_GETXSTATE_INFO:
174 case PT_GETXSTATE:
175 case PT_SETXSTATE:
176 error = cpu_ptrace_xstate(td, req, addr, data);
177 break;
178
200 int error;
201
202#ifdef COMPAT_FREEBSD32
203 if (SV_CURPROC_FLAG(SV_ILP32))
204 return (cpu32_ptrace(td, req, addr, data));
205#endif
206
207 /* Support old values of PT_GETXSTATE_OLD and PT_SETXSTATE_OLD. */

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

214 case PT_GETXSTATE_OLD:
215 case PT_SETXSTATE_OLD:
216 case PT_GETXSTATE_INFO:
217 case PT_GETXSTATE:
218 case PT_SETXSTATE:
219 error = cpu_ptrace_xstate(td, req, addr, data);
220 break;
221
222 case PT_GETFSBASE:
223 case PT_GETGSBASE:
224 r = req == PT_GETFSBASE ? &td->td_pcb->pcb_fsbase :
225 &td->td_pcb->pcb_gsbase;
226 error = copyout(r, addr, sizeof(*r));
227 break;
228
229 case PT_SETFSBASE:
230 case PT_SETGSBASE:
231 error = copyin(addr, &rv, sizeof(rv));
232 if (error != 0)
233 break;
234 if (rv >= VM_MAXUSER_ADDRESS) {
235 error = EINVAL;
236 break;
237 }
238 cpu_ptrace_setbase(td, req, rv);
239 break;
240
179 default:
180 error = EINVAL;
181 break;
182 }
183
184 return (error);
185}
241 default:
242 error = EINVAL;
243 break;
244 }
245
246 return (error);
247}