2 * SPDX-License-Identifier: BSD-4-Clause
4 * Copyright (c) 2018 The FreeBSD Foundation
5 * Copyright (c) 1992 Terrence R. Lambert.
6 * Copyright (c) 1982, 1987, 1990 The Regents of the University of California.
9 * This code is derived from software contributed to Berkeley by
12 * Portions of this software were developed by A. Joseph Koshy under
13 * sponsorship from the FreeBSD Foundation and Google, Inc.
15 * Redistribution and use in source and binary forms, with or without
16 * modification, are permitted provided that the following conditions
18 * 1. Redistributions of source code must retain the above copyright
19 * notice, this list of conditions and the following disclaimer.
20 * 2. Redistributions in binary form must reproduce the above copyright
21 * notice, this list of conditions and the following disclaimer in the
22 * documentation and/or other materials provided with the distribution.
23 * 3. All advertising materials mentioning features or use of this software
24 * must display the following acknowledgement:
25 * This product includes software developed by the University of
26 * California, Berkeley and its contributors.
27 * 4. Neither the name of the University nor the names of its contributors
28 * may be used to endorse or promote products derived from this software
29 * without specific prior written permission.
31 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
32 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
33 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
34 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
35 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
39 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
40 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
43 * from: @(#)machdep.c 7.4 (Berkeley) 6/3/91
46 #include <sys/cdefs.h>
47 __FBSDID("$FreeBSD$");
51 #include "opt_kstack_pages.h"
53 #include <sys/param.h>
55 #include <sys/systm.h>
57 #include <sys/imgact.h>
59 #include <sys/kernel.h>
61 #include <sys/linker.h>
63 #include <sys/malloc.h>
64 #include <sys/mutex.h>
66 #include <sys/ptrace.h>
68 #include <sys/rwlock.h>
69 #include <sys/signalvar.h>
70 #include <sys/syscallsubr.h>
71 #include <sys/sysctl.h>
72 #include <sys/sysent.h>
73 #include <sys/sysproto.h>
74 #include <sys/ucontext.h>
75 #include <sys/vmmeter.h>
78 #include <vm/vm_param.h>
79 #include <vm/vm_extern.h>
80 #include <vm/vm_kern.h>
81 #include <vm/vm_page.h>
82 #include <vm/vm_map.h>
83 #include <vm/vm_object.h>
87 #error KDB must be enabled in order for DDB to work!
90 #include <ddb/db_sym.h>
93 #include <machine/cpu.h>
94 #include <machine/cputypes.h>
95 #include <machine/md_var.h>
96 #include <machine/pcb.h>
97 #include <machine/pcb_ext.h>
98 #include <machine/proc.h>
99 #include <machine/sigframe.h>
100 #include <machine/specialreg.h>
101 #include <machine/sysarch.h>
102 #include <machine/trap.h>
104 static void fpstate_drop(struct thread *td);
105 static void get_fpcontext(struct thread *td, mcontext_t *mcp,
106 char *xfpusave, size_t xfpusave_len);
107 static int set_fpcontext(struct thread *td, mcontext_t *mcp,
108 char *xfpustate, size_t xfpustate_len);
110 static void osendsig(sig_t catcher, ksiginfo_t *, sigset_t *mask);
112 #ifdef COMPAT_FREEBSD4
113 static void freebsd4_sendsig(sig_t catcher, ksiginfo_t *, sigset_t *mask);
116 extern struct sysentvec elf32_freebsd_sysvec;
118 _Static_assert(sizeof(mcontext_t) == 640, "mcontext_t size incorrect");
119 _Static_assert(sizeof(ucontext_t) == 704, "ucontext_t size incorrect");
120 _Static_assert(sizeof(siginfo_t) == 64, "siginfo_t size incorrect");
123 * Send an interrupt to process.
125 * Stack is set up to allow sigcode stored at top to call routine,
126 * followed by call to sigreturn routine below. After sigreturn
127 * resets the signal mask, the stack, and the frame pointer, it
128 * returns to the user specified pc, psl.
132 osendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask)
134 struct osigframe sf, *fp;
138 struct trapframe *regs;
144 PROC_LOCK_ASSERT(p, MA_OWNED);
145 sig = ksi->ksi_signo;
147 mtx_assert(&psp->ps_mtx, MA_OWNED);
149 oonstack = sigonstack(regs->tf_esp);
151 /* Allocate space for the signal handler context. */
152 if ((td->td_pflags & TDP_ALTSTACK) && !oonstack &&
153 SIGISMEMBER(psp->ps_sigonstack, sig)) {
154 fp = (struct osigframe *)((uintptr_t)td->td_sigstk.ss_sp +
155 td->td_sigstk.ss_size - sizeof(struct osigframe));
156 #if defined(COMPAT_43)
157 td->td_sigstk.ss_flags |= SS_ONSTACK;
160 fp = (struct osigframe *)regs->tf_esp - 1;
162 /* Build the argument list for the signal handler. */
164 sf.sf_scp = (register_t)&fp->sf_siginfo.si_sc;
165 bzero(&sf.sf_siginfo, sizeof(sf.sf_siginfo));
166 if (SIGISMEMBER(psp->ps_siginfo, sig)) {
167 /* Signal handler installed with SA_SIGINFO. */
168 sf.sf_arg2 = (register_t)&fp->sf_siginfo;
169 sf.sf_siginfo.si_signo = sig;
170 sf.sf_siginfo.si_code = ksi->ksi_code;
171 sf.sf_ahu.sf_action = (__osiginfohandler_t *)catcher;
174 /* Old FreeBSD-style arguments. */
175 sf.sf_arg2 = ksi->ksi_code;
176 sf.sf_addr = (register_t)ksi->ksi_addr;
177 sf.sf_ahu.sf_handler = catcher;
179 mtx_unlock(&psp->ps_mtx);
182 /* Save most if not all of trap frame. */
183 sf.sf_siginfo.si_sc.sc_eax = regs->tf_eax;
184 sf.sf_siginfo.si_sc.sc_ebx = regs->tf_ebx;
185 sf.sf_siginfo.si_sc.sc_ecx = regs->tf_ecx;
186 sf.sf_siginfo.si_sc.sc_edx = regs->tf_edx;
187 sf.sf_siginfo.si_sc.sc_esi = regs->tf_esi;
188 sf.sf_siginfo.si_sc.sc_edi = regs->tf_edi;
189 sf.sf_siginfo.si_sc.sc_cs = regs->tf_cs;
190 sf.sf_siginfo.si_sc.sc_ds = regs->tf_ds;
191 sf.sf_siginfo.si_sc.sc_ss = regs->tf_ss;
192 sf.sf_siginfo.si_sc.sc_es = regs->tf_es;
193 sf.sf_siginfo.si_sc.sc_fs = regs->tf_fs;
194 sf.sf_siginfo.si_sc.sc_gs = rgs();
195 sf.sf_siginfo.si_sc.sc_isp = regs->tf_isp;
197 /* Build the signal context to be used by osigreturn(). */
198 sf.sf_siginfo.si_sc.sc_onstack = (oonstack) ? 1 : 0;
199 SIG2OSIG(*mask, sf.sf_siginfo.si_sc.sc_mask);
200 sf.sf_siginfo.si_sc.sc_sp = regs->tf_esp;
201 sf.sf_siginfo.si_sc.sc_fp = regs->tf_ebp;
202 sf.sf_siginfo.si_sc.sc_pc = regs->tf_eip;
203 sf.sf_siginfo.si_sc.sc_ps = regs->tf_eflags;
204 sf.sf_siginfo.si_sc.sc_trapno = regs->tf_trapno;
205 sf.sf_siginfo.si_sc.sc_err = regs->tf_err;
208 * If we're a vm86 process, we want to save the segment registers.
209 * We also change eflags to be our emulated eflags, not the actual
212 if (regs->tf_eflags & PSL_VM) {
213 /* XXX confusing names: `tf' isn't a trapframe; `regs' is. */
214 struct trapframe_vm86 *tf = (struct trapframe_vm86 *)regs;
215 struct vm86_kernel *vm86 = &td->td_pcb->pcb_ext->ext_vm86;
217 sf.sf_siginfo.si_sc.sc_gs = tf->tf_vm86_gs;
218 sf.sf_siginfo.si_sc.sc_fs = tf->tf_vm86_fs;
219 sf.sf_siginfo.si_sc.sc_es = tf->tf_vm86_es;
220 sf.sf_siginfo.si_sc.sc_ds = tf->tf_vm86_ds;
222 if (vm86->vm86_has_vme == 0)
223 sf.sf_siginfo.si_sc.sc_ps =
224 (tf->tf_eflags & ~(PSL_VIF | PSL_VIP)) |
225 (vm86->vm86_eflags & (PSL_VIF | PSL_VIP));
227 /* See sendsig() for comments. */
228 tf->tf_eflags &= ~(PSL_VM | PSL_NT | PSL_VIF | PSL_VIP);
232 * Copy the sigframe out to the user's stack.
234 if (copyout(&sf, fp, sizeof(*fp)) != 0) {
239 regs->tf_esp = (int)fp;
240 if (PROC_HAS_SHP(p)) {
241 regs->tf_eip = PROC_SIGCODE(p) + szsigcode -
244 /* a.out sysentvec does not use shared page */
245 regs->tf_eip = PROC_PS_STRINGS(p) - szosigcode;
247 regs->tf_eflags &= ~(PSL_T | PSL_D);
248 regs->tf_cs = _ucodesel;
249 regs->tf_ds = _udatasel;
250 regs->tf_es = _udatasel;
251 regs->tf_fs = _udatasel;
253 regs->tf_ss = _udatasel;
255 mtx_lock(&psp->ps_mtx);
257 #endif /* COMPAT_43 */
259 #ifdef COMPAT_FREEBSD4
261 freebsd4_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask)
263 struct freebsd4_sigframe sf, *sfp;
267 struct trapframe *regs;
273 PROC_LOCK_ASSERT(p, MA_OWNED);
274 sig = ksi->ksi_signo;
276 mtx_assert(&psp->ps_mtx, MA_OWNED);
278 oonstack = sigonstack(regs->tf_esp);
280 /* Save user context. */
281 bzero(&sf, sizeof(sf));
282 sf.sf_uc.uc_sigmask = *mask;
283 sf.sf_uc.uc_stack = td->td_sigstk;
284 sf.sf_uc.uc_stack.ss_flags = (td->td_pflags & TDP_ALTSTACK)
285 ? ((oonstack) ? SS_ONSTACK : 0) : SS_DISABLE;
286 sf.sf_uc.uc_mcontext.mc_onstack = (oonstack) ? 1 : 0;
287 sf.sf_uc.uc_mcontext.mc_gs = rgs();
288 bcopy(regs, &sf.sf_uc.uc_mcontext.mc_fs, sizeof(*regs));
289 bzero(sf.sf_uc.uc_mcontext.mc_fpregs,
290 sizeof(sf.sf_uc.uc_mcontext.mc_fpregs));
291 bzero(sf.sf_uc.uc_mcontext.__spare__,
292 sizeof(sf.sf_uc.uc_mcontext.__spare__));
293 bzero(sf.sf_uc.__spare__, sizeof(sf.sf_uc.__spare__));
295 /* Allocate space for the signal handler context. */
296 if ((td->td_pflags & TDP_ALTSTACK) != 0 && !oonstack &&
297 SIGISMEMBER(psp->ps_sigonstack, sig)) {
298 sfp = (struct freebsd4_sigframe *)((uintptr_t)td->td_sigstk.ss_sp +
299 td->td_sigstk.ss_size - sizeof(struct freebsd4_sigframe));
300 #if defined(COMPAT_43)
301 td->td_sigstk.ss_flags |= SS_ONSTACK;
304 sfp = (struct freebsd4_sigframe *)regs->tf_esp - 1;
306 /* Build the argument list for the signal handler. */
308 sf.sf_ucontext = (register_t)&sfp->sf_uc;
309 bzero(&sf.sf_si, sizeof(sf.sf_si));
310 if (SIGISMEMBER(psp->ps_siginfo, sig)) {
311 /* Signal handler installed with SA_SIGINFO. */
312 sf.sf_siginfo = (register_t)&sfp->sf_si;
313 sf.sf_ahu.sf_action = (__siginfohandler_t *)catcher;
315 /* Fill in POSIX parts */
316 sf.sf_si.si_signo = sig;
317 sf.sf_si.si_code = ksi->ksi_code;
318 sf.sf_si.si_addr = ksi->ksi_addr;
320 /* Old FreeBSD-style arguments. */
321 sf.sf_siginfo = ksi->ksi_code;
322 sf.sf_addr = (register_t)ksi->ksi_addr;
323 sf.sf_ahu.sf_handler = catcher;
325 mtx_unlock(&psp->ps_mtx);
329 * If we're a vm86 process, we want to save the segment registers.
330 * We also change eflags to be our emulated eflags, not the actual
333 if (regs->tf_eflags & PSL_VM) {
334 struct trapframe_vm86 *tf = (struct trapframe_vm86 *)regs;
335 struct vm86_kernel *vm86 = &td->td_pcb->pcb_ext->ext_vm86;
337 sf.sf_uc.uc_mcontext.mc_gs = tf->tf_vm86_gs;
338 sf.sf_uc.uc_mcontext.mc_fs = tf->tf_vm86_fs;
339 sf.sf_uc.uc_mcontext.mc_es = tf->tf_vm86_es;
340 sf.sf_uc.uc_mcontext.mc_ds = tf->tf_vm86_ds;
342 if (vm86->vm86_has_vme == 0)
343 sf.sf_uc.uc_mcontext.mc_eflags =
344 (tf->tf_eflags & ~(PSL_VIF | PSL_VIP)) |
345 (vm86->vm86_eflags & (PSL_VIF | PSL_VIP));
348 * Clear PSL_NT to inhibit T_TSSFLT faults on return from
349 * syscalls made by the signal handler. This just avoids
350 * wasting time for our lazy fixup of such faults. PSL_NT
351 * does nothing in vm86 mode, but vm86 programs can set it
352 * almost legitimately in probes for old cpu types.
354 tf->tf_eflags &= ~(PSL_VM | PSL_NT | PSL_VIF | PSL_VIP);
358 * Copy the sigframe out to the user's stack.
360 if (copyout(&sf, sfp, sizeof(*sfp)) != 0) {
365 regs->tf_esp = (int)sfp;
366 regs->tf_eip = PROC_SIGCODE(p) + szsigcode -
368 regs->tf_eflags &= ~(PSL_T | PSL_D);
369 regs->tf_cs = _ucodesel;
370 regs->tf_ds = _udatasel;
371 regs->tf_es = _udatasel;
372 regs->tf_fs = _udatasel;
373 regs->tf_ss = _udatasel;
375 mtx_lock(&psp->ps_mtx);
377 #endif /* COMPAT_FREEBSD4 */
380 sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask)
382 struct sigframe sf, *sfp;
387 struct trapframe *regs;
388 struct segment_descriptor *sdp;
396 PROC_LOCK_ASSERT(p, MA_OWNED);
397 sig = ksi->ksi_signo;
399 mtx_assert(&psp->ps_mtx, MA_OWNED);
400 #ifdef COMPAT_FREEBSD4
401 if (SIGISMEMBER(psp->ps_freebsd4, sig)) {
402 freebsd4_sendsig(catcher, ksi, mask);
407 if (SIGISMEMBER(psp->ps_osigset, sig)) {
408 osendsig(catcher, ksi, mask);
413 oonstack = sigonstack(regs->tf_esp);
415 if (cpu_max_ext_state_size > sizeof(union savefpu) && use_xsave) {
416 xfpusave_len = cpu_max_ext_state_size - sizeof(union savefpu);
417 xfpusave = __builtin_alloca(xfpusave_len);
423 /* Save user context. */
424 bzero(&sf, sizeof(sf));
425 sf.sf_uc.uc_sigmask = *mask;
426 sf.sf_uc.uc_stack = td->td_sigstk;
427 sf.sf_uc.uc_stack.ss_flags = (td->td_pflags & TDP_ALTSTACK)
428 ? ((oonstack) ? SS_ONSTACK : 0) : SS_DISABLE;
429 sf.sf_uc.uc_mcontext.mc_onstack = (oonstack) ? 1 : 0;
430 sf.sf_uc.uc_mcontext.mc_gs = rgs();
431 bcopy(regs, &sf.sf_uc.uc_mcontext.mc_fs, sizeof(*regs));
432 sf.sf_uc.uc_mcontext.mc_len = sizeof(sf.sf_uc.uc_mcontext); /* magic */
433 get_fpcontext(td, &sf.sf_uc.uc_mcontext, xfpusave, xfpusave_len);
436 * Unconditionally fill the fsbase and gsbase into the mcontext.
438 sdp = &td->td_pcb->pcb_fsd;
439 sf.sf_uc.uc_mcontext.mc_fsbase = sdp->sd_hibase << 24 |
441 sdp = &td->td_pcb->pcb_gsd;
442 sf.sf_uc.uc_mcontext.mc_gsbase = sdp->sd_hibase << 24 |
444 bzero(sf.sf_uc.uc_mcontext.mc_spare2,
445 sizeof(sf.sf_uc.uc_mcontext.mc_spare2));
447 /* Allocate space for the signal handler context. */
448 if ((td->td_pflags & TDP_ALTSTACK) != 0 && !oonstack &&
449 SIGISMEMBER(psp->ps_sigonstack, sig)) {
450 sp = (char *)td->td_sigstk.ss_sp + td->td_sigstk.ss_size;
451 #if defined(COMPAT_43)
452 td->td_sigstk.ss_flags |= SS_ONSTACK;
455 sp = (char *)regs->tf_esp - 128;
456 if (xfpusave != NULL) {
458 sp = (char *)((unsigned int)sp & ~0x3F);
459 sf.sf_uc.uc_mcontext.mc_xfpustate = (register_t)sp;
461 sp -= sizeof(struct sigframe);
463 /* Align to 16 bytes. */
464 sfp = (struct sigframe *)((unsigned int)sp & ~0xF);
466 /* Build the argument list for the signal handler. */
468 sf.sf_ucontext = (register_t)&sfp->sf_uc;
469 bzero(&sf.sf_si, sizeof(sf.sf_si));
470 if (SIGISMEMBER(psp->ps_siginfo, sig)) {
471 /* Signal handler installed with SA_SIGINFO. */
472 sf.sf_siginfo = (register_t)&sfp->sf_si;
473 sf.sf_ahu.sf_action = (__siginfohandler_t *)catcher;
475 /* Fill in POSIX parts */
476 sf.sf_si = ksi->ksi_info;
477 sf.sf_si.si_signo = sig; /* maybe a translated signal */
479 /* Old FreeBSD-style arguments. */
480 sf.sf_siginfo = ksi->ksi_code;
481 sf.sf_addr = (register_t)ksi->ksi_addr;
482 sf.sf_ahu.sf_handler = catcher;
484 mtx_unlock(&psp->ps_mtx);
488 * If we're a vm86 process, we want to save the segment registers.
489 * We also change eflags to be our emulated eflags, not the actual
492 if (regs->tf_eflags & PSL_VM) {
493 struct trapframe_vm86 *tf = (struct trapframe_vm86 *)regs;
494 struct vm86_kernel *vm86 = &td->td_pcb->pcb_ext->ext_vm86;
496 sf.sf_uc.uc_mcontext.mc_gs = tf->tf_vm86_gs;
497 sf.sf_uc.uc_mcontext.mc_fs = tf->tf_vm86_fs;
498 sf.sf_uc.uc_mcontext.mc_es = tf->tf_vm86_es;
499 sf.sf_uc.uc_mcontext.mc_ds = tf->tf_vm86_ds;
501 if (vm86->vm86_has_vme == 0)
502 sf.sf_uc.uc_mcontext.mc_eflags =
503 (tf->tf_eflags & ~(PSL_VIF | PSL_VIP)) |
504 (vm86->vm86_eflags & (PSL_VIF | PSL_VIP));
507 * Clear PSL_NT to inhibit T_TSSFLT faults on return from
508 * syscalls made by the signal handler. This just avoids
509 * wasting time for our lazy fixup of such faults. PSL_NT
510 * does nothing in vm86 mode, but vm86 programs can set it
511 * almost legitimately in probes for old cpu types.
513 tf->tf_eflags &= ~(PSL_VM | PSL_NT | PSL_VIF | PSL_VIP);
517 * Copy the sigframe out to the user's stack.
519 if (copyout(&sf, sfp, sizeof(*sfp)) != 0 ||
520 (xfpusave != NULL && copyout(xfpusave,
521 (void *)sf.sf_uc.uc_mcontext.mc_xfpustate, xfpusave_len)
527 regs->tf_esp = (int)sfp;
528 regs->tf_eip = PROC_SIGCODE(p);
529 if (regs->tf_eip == 0)
530 regs->tf_eip = PROC_PS_STRINGS(p) - szsigcode;
531 regs->tf_eflags &= ~(PSL_T | PSL_D);
532 regs->tf_cs = _ucodesel;
533 regs->tf_ds = _udatasel;
534 regs->tf_es = _udatasel;
535 regs->tf_fs = _udatasel;
536 regs->tf_ss = _udatasel;
538 mtx_lock(&psp->ps_mtx);
542 * System call to cleanup state after a signal has been taken. Reset
543 * signal mask and stack state from context left by sendsig (above).
544 * Return to previous pc and psl as specified by context left by
545 * sendsig. Check carefully to make sure that the user has not
546 * modified the state to gain improper privileges.
550 osigreturn(struct thread *td, struct osigreturn_args *uap)
552 struct osigcontext sc;
553 struct trapframe *regs;
554 struct osigcontext *scp;
559 error = copyin(uap->sigcntxp, &sc, sizeof(sc));
564 if (eflags & PSL_VM) {
565 struct trapframe_vm86 *tf = (struct trapframe_vm86 *)regs;
566 struct vm86_kernel *vm86;
569 * if pcb_ext == 0 or vm86_inited == 0, the user hasn't
570 * set up the vm86 area, and we can't enter vm86 mode.
572 if (td->td_pcb->pcb_ext == 0)
574 vm86 = &td->td_pcb->pcb_ext->ext_vm86;
575 if (vm86->vm86_inited == 0)
578 /* Go back to user mode if both flags are set. */
579 if ((eflags & PSL_VIP) && (eflags & PSL_VIF)) {
580 ksiginfo_init_trap(&ksi);
581 ksi.ksi_signo = SIGBUS;
582 ksi.ksi_code = BUS_OBJERR;
583 ksi.ksi_addr = (void *)regs->tf_eip;
584 trapsignal(td, &ksi);
587 if (vm86->vm86_has_vme) {
588 eflags = (tf->tf_eflags & ~VME_USERCHANGE) |
589 (eflags & VME_USERCHANGE) | PSL_VM;
591 vm86->vm86_eflags = eflags; /* save VIF, VIP */
592 eflags = (tf->tf_eflags & ~VM_USERCHANGE) |
593 (eflags & VM_USERCHANGE) | PSL_VM;
595 tf->tf_vm86_ds = scp->sc_ds;
596 tf->tf_vm86_es = scp->sc_es;
597 tf->tf_vm86_fs = scp->sc_fs;
598 tf->tf_vm86_gs = scp->sc_gs;
599 tf->tf_ds = _udatasel;
600 tf->tf_es = _udatasel;
601 tf->tf_fs = _udatasel;
604 * Don't allow users to change privileged or reserved flags.
606 if (!EFL_SECURE(eflags, regs->tf_eflags)) {
611 * Don't allow users to load a valid privileged %cs. Let the
612 * hardware check for invalid selectors, excess privilege in
613 * other selectors, invalid %eip's and invalid %esp's.
615 if (!CS_SECURE(scp->sc_cs)) {
616 ksiginfo_init_trap(&ksi);
617 ksi.ksi_signo = SIGBUS;
618 ksi.ksi_code = BUS_OBJERR;
619 ksi.ksi_trapno = T_PROTFLT;
620 ksi.ksi_addr = (void *)regs->tf_eip;
621 trapsignal(td, &ksi);
624 regs->tf_ds = scp->sc_ds;
625 regs->tf_es = scp->sc_es;
626 regs->tf_fs = scp->sc_fs;
629 /* Restore remaining registers. */
630 regs->tf_eax = scp->sc_eax;
631 regs->tf_ebx = scp->sc_ebx;
632 regs->tf_ecx = scp->sc_ecx;
633 regs->tf_edx = scp->sc_edx;
634 regs->tf_esi = scp->sc_esi;
635 regs->tf_edi = scp->sc_edi;
636 regs->tf_cs = scp->sc_cs;
637 regs->tf_ss = scp->sc_ss;
638 regs->tf_isp = scp->sc_isp;
639 regs->tf_ebp = scp->sc_fp;
640 regs->tf_esp = scp->sc_sp;
641 regs->tf_eip = scp->sc_pc;
642 regs->tf_eflags = eflags;
643 regs->tf_trapno = T_RESERVED;
645 #if defined(COMPAT_43)
646 if (scp->sc_onstack & 1)
647 td->td_sigstk.ss_flags |= SS_ONSTACK;
649 td->td_sigstk.ss_flags &= ~SS_ONSTACK;
651 kern_sigprocmask(td, SIG_SETMASK, (sigset_t *)&scp->sc_mask, NULL,
653 return (EJUSTRETURN);
655 #endif /* COMPAT_43 */
657 #ifdef COMPAT_FREEBSD4
659 freebsd4_sigreturn(struct thread *td, struct freebsd4_sigreturn_args *uap)
661 struct freebsd4_ucontext uc;
662 struct trapframe *regs;
663 struct freebsd4_ucontext *ucp;
664 int cs, eflags, error;
667 error = copyin(uap->sigcntxp, &uc, sizeof(uc));
672 eflags = ucp->uc_mcontext.mc_eflags;
673 if (eflags & PSL_VM) {
674 struct trapframe_vm86 *tf = (struct trapframe_vm86 *)regs;
675 struct vm86_kernel *vm86;
678 * if pcb_ext == 0 or vm86_inited == 0, the user hasn't
679 * set up the vm86 area, and we can't enter vm86 mode.
681 if (td->td_pcb->pcb_ext == 0)
683 vm86 = &td->td_pcb->pcb_ext->ext_vm86;
684 if (vm86->vm86_inited == 0)
687 /* Go back to user mode if both flags are set. */
688 if ((eflags & PSL_VIP) && (eflags & PSL_VIF)) {
689 ksiginfo_init_trap(&ksi);
690 ksi.ksi_signo = SIGBUS;
691 ksi.ksi_code = BUS_OBJERR;
692 ksi.ksi_addr = (void *)regs->tf_eip;
693 trapsignal(td, &ksi);
695 if (vm86->vm86_has_vme) {
696 eflags = (tf->tf_eflags & ~VME_USERCHANGE) |
697 (eflags & VME_USERCHANGE) | PSL_VM;
699 vm86->vm86_eflags = eflags; /* save VIF, VIP */
700 eflags = (tf->tf_eflags & ~VM_USERCHANGE) |
701 (eflags & VM_USERCHANGE) | PSL_VM;
703 bcopy(&ucp->uc_mcontext.mc_fs, tf, sizeof(struct trapframe));
704 tf->tf_eflags = eflags;
705 tf->tf_vm86_ds = tf->tf_ds;
706 tf->tf_vm86_es = tf->tf_es;
707 tf->tf_vm86_fs = tf->tf_fs;
708 tf->tf_vm86_gs = ucp->uc_mcontext.mc_gs;
709 tf->tf_ds = _udatasel;
710 tf->tf_es = _udatasel;
711 tf->tf_fs = _udatasel;
714 * Don't allow users to change privileged or reserved flags.
716 if (!EFL_SECURE(eflags, regs->tf_eflags)) {
718 "pid %d (%s): freebsd4_sigreturn eflags = 0x%x\n",
719 td->td_proc->p_pid, td->td_name, eflags);
724 * Don't allow users to load a valid privileged %cs. Let the
725 * hardware check for invalid selectors, excess privilege in
726 * other selectors, invalid %eip's and invalid %esp's.
728 cs = ucp->uc_mcontext.mc_cs;
729 if (!CS_SECURE(cs)) {
730 uprintf("pid %d (%s): freebsd4_sigreturn cs = 0x%x\n",
731 td->td_proc->p_pid, td->td_name, cs);
732 ksiginfo_init_trap(&ksi);
733 ksi.ksi_signo = SIGBUS;
734 ksi.ksi_code = BUS_OBJERR;
735 ksi.ksi_trapno = T_PROTFLT;
736 ksi.ksi_addr = (void *)regs->tf_eip;
737 trapsignal(td, &ksi);
741 bcopy(&ucp->uc_mcontext.mc_fs, regs, sizeof(*regs));
743 regs->tf_trapno = T_RESERVED;
745 #if defined(COMPAT_43)
746 if (ucp->uc_mcontext.mc_onstack & 1)
747 td->td_sigstk.ss_flags |= SS_ONSTACK;
749 td->td_sigstk.ss_flags &= ~SS_ONSTACK;
751 kern_sigprocmask(td, SIG_SETMASK, &ucp->uc_sigmask, NULL, 0);
752 return (EJUSTRETURN);
754 #endif /* COMPAT_FREEBSD4 */
757 sys_sigreturn(struct thread *td, struct sigreturn_args *uap)
761 struct trapframe *regs;
764 size_t xfpustate_len;
765 int cs, eflags, error, ret;
770 error = copyin(uap->sigcntxp, &uc, sizeof(uc));
774 if ((ucp->uc_mcontext.mc_flags & ~_MC_FLAG_MASK) != 0) {
775 uprintf("pid %d (%s): sigreturn mc_flags %x\n", p->p_pid,
776 td->td_name, ucp->uc_mcontext.mc_flags);
780 eflags = ucp->uc_mcontext.mc_eflags;
781 if (eflags & PSL_VM) {
782 struct trapframe_vm86 *tf = (struct trapframe_vm86 *)regs;
783 struct vm86_kernel *vm86;
786 * if pcb_ext == 0 or vm86_inited == 0, the user hasn't
787 * set up the vm86 area, and we can't enter vm86 mode.
789 if (td->td_pcb->pcb_ext == 0)
791 vm86 = &td->td_pcb->pcb_ext->ext_vm86;
792 if (vm86->vm86_inited == 0)
795 /* Go back to user mode if both flags are set. */
796 if ((eflags & PSL_VIP) && (eflags & PSL_VIF)) {
797 ksiginfo_init_trap(&ksi);
798 ksi.ksi_signo = SIGBUS;
799 ksi.ksi_code = BUS_OBJERR;
800 ksi.ksi_addr = (void *)regs->tf_eip;
801 trapsignal(td, &ksi);
804 if (vm86->vm86_has_vme) {
805 eflags = (tf->tf_eflags & ~VME_USERCHANGE) |
806 (eflags & VME_USERCHANGE) | PSL_VM;
808 vm86->vm86_eflags = eflags; /* save VIF, VIP */
809 eflags = (tf->tf_eflags & ~VM_USERCHANGE) |
810 (eflags & VM_USERCHANGE) | PSL_VM;
812 bcopy(&ucp->uc_mcontext.mc_fs, tf, sizeof(struct trapframe));
813 tf->tf_eflags = eflags;
814 tf->tf_vm86_ds = tf->tf_ds;
815 tf->tf_vm86_es = tf->tf_es;
816 tf->tf_vm86_fs = tf->tf_fs;
817 tf->tf_vm86_gs = ucp->uc_mcontext.mc_gs;
818 tf->tf_ds = _udatasel;
819 tf->tf_es = _udatasel;
820 tf->tf_fs = _udatasel;
823 * Don't allow users to change privileged or reserved flags.
825 if (!EFL_SECURE(eflags, regs->tf_eflags)) {
826 uprintf("pid %d (%s): sigreturn eflags = 0x%x\n",
827 td->td_proc->p_pid, td->td_name, eflags);
832 * Don't allow users to load a valid privileged %cs. Let the
833 * hardware check for invalid selectors, excess privilege in
834 * other selectors, invalid %eip's and invalid %esp's.
836 cs = ucp->uc_mcontext.mc_cs;
837 if (!CS_SECURE(cs)) {
838 uprintf("pid %d (%s): sigreturn cs = 0x%x\n",
839 td->td_proc->p_pid, td->td_name, cs);
840 ksiginfo_init_trap(&ksi);
841 ksi.ksi_signo = SIGBUS;
842 ksi.ksi_code = BUS_OBJERR;
843 ksi.ksi_trapno = T_PROTFLT;
844 ksi.ksi_addr = (void *)regs->tf_eip;
845 trapsignal(td, &ksi);
849 if ((uc.uc_mcontext.mc_flags & _MC_HASFPXSTATE) != 0) {
850 xfpustate_len = uc.uc_mcontext.mc_xfpustate_len;
851 if (xfpustate_len > cpu_max_ext_state_size -
852 sizeof(union savefpu)) {
854 "pid %d (%s): sigreturn xfpusave_len = 0x%zx\n",
855 p->p_pid, td->td_name, xfpustate_len);
858 xfpustate = __builtin_alloca(xfpustate_len);
860 (const void *)uc.uc_mcontext.mc_xfpustate,
861 xfpustate, xfpustate_len);
864 "pid %d (%s): sigreturn copying xfpustate failed\n",
865 p->p_pid, td->td_name);
872 ret = set_fpcontext(td, &ucp->uc_mcontext, xfpustate,
876 bcopy(&ucp->uc_mcontext.mc_fs, regs, sizeof(*regs));
878 regs->tf_trapno = T_RESERVED;
880 #if defined(COMPAT_43)
881 if (ucp->uc_mcontext.mc_onstack & 1)
882 td->td_sigstk.ss_flags |= SS_ONSTACK;
884 td->td_sigstk.ss_flags &= ~SS_ONSTACK;
887 kern_sigprocmask(td, SIG_SETMASK, &ucp->uc_sigmask, NULL, 0);
888 return (EJUSTRETURN);
892 * Reset the hardware debug registers if they were in use.
893 * They won't have any meaning for the newly exec'd process.
896 x86_clear_dbregs(struct pcb *pcb)
898 if ((pcb->pcb_flags & PCB_DBREGS) == 0)
910 * Clear the debug registers on the running CPU,
911 * otherwise they will end up affecting the next
912 * process we switch to.
916 pcb->pcb_flags &= ~PCB_DBREGS;
921 setup_priv_lcall_gate(struct proc *p)
923 struct i386_ldt_args uap;
924 union descriptor desc;
927 bzero(&uap, sizeof(uap));
930 lcall_addr = p->p_sysent->sv_psstrings - sz_lcall_tramp;
931 bzero(&desc, sizeof(desc));
932 desc.sd.sd_type = SDT_MEMERA;
933 desc.sd.sd_dpl = SEL_UPL;
935 desc.sd.sd_def32 = 1;
937 desc.sd.sd_lolimit = 0xffff;
938 desc.sd.sd_hilimit = 0xf;
939 desc.sd.sd_lobase = lcall_addr;
940 desc.sd.sd_hibase = lcall_addr >> 24;
941 i386_set_ldt(curthread, &uap, &desc);
946 * Reset registers to default values on exec.
949 exec_setregs(struct thread *td, struct image_params *imgp, uintptr_t stack)
951 struct trapframe *regs;
953 register_t saved_eflags;
958 /* Reset pc->pcb_gs and %gs before possibly invalidating it. */
959 pcb->pcb_gs = _udatasel;
962 mtx_lock_spin(&dt_lock);
963 if (td->td_proc->p_md.md_ldt != NULL)
966 mtx_unlock_spin(&dt_lock);
969 if (td->td_proc->p_sysent->sv_psstrings !=
970 elf32_freebsd_sysvec.sv_psstrings)
971 setup_priv_lcall_gate(td->td_proc);
975 * Reset the fs and gs bases. The values from the old address
976 * space do not make sense for the new program. In particular,
977 * gsbase might be the TLS base for the old program but the new
978 * program has no TLS now.
983 /* Make sure edx is 0x0 on entry. Linux binaries depend on it. */
984 saved_eflags = regs->tf_eflags & PSL_T;
985 bzero((char *)regs, sizeof(struct trapframe));
986 regs->tf_eip = imgp->entry_addr;
987 regs->tf_esp = stack;
988 regs->tf_eflags = PSL_USER | saved_eflags;
989 regs->tf_ss = _udatasel;
990 regs->tf_ds = _udatasel;
991 regs->tf_es = _udatasel;
992 regs->tf_fs = _udatasel;
993 regs->tf_cs = _ucodesel;
995 /* PS_STRINGS value for BSD/OS binaries. It is 0 for non-BSD/OS. */
996 regs->tf_ebx = (register_t)imgp->ps_strings;
998 x86_clear_dbregs(pcb);
1000 pcb->pcb_initial_npxcw = __INITIAL_NPXCW__;
1003 * Drop the FP state if we hold it, so that the process gets a
1004 * clean FP state if it uses the FPU again.
1010 fill_regs(struct thread *td, struct reg *regs)
1013 struct trapframe *tp;
1017 regs->r_gs = pcb->pcb_gs;
1018 return (fill_frame_regs(tp, regs));
1022 fill_frame_regs(struct trapframe *tp, struct reg *regs)
1025 regs->r_fs = tp->tf_fs;
1026 regs->r_es = tp->tf_es;
1027 regs->r_ds = tp->tf_ds;
1028 regs->r_edi = tp->tf_edi;
1029 regs->r_esi = tp->tf_esi;
1030 regs->r_ebp = tp->tf_ebp;
1031 regs->r_ebx = tp->tf_ebx;
1032 regs->r_edx = tp->tf_edx;
1033 regs->r_ecx = tp->tf_ecx;
1034 regs->r_eax = tp->tf_eax;
1035 regs->r_eip = tp->tf_eip;
1036 regs->r_cs = tp->tf_cs;
1037 regs->r_eflags = tp->tf_eflags;
1038 regs->r_esp = tp->tf_esp;
1039 regs->r_ss = tp->tf_ss;
1046 set_regs(struct thread *td, struct reg *regs)
1049 struct trapframe *tp;
1052 if (!EFL_SECURE(regs->r_eflags, tp->tf_eflags) ||
1053 !CS_SECURE(regs->r_cs))
1056 tp->tf_fs = regs->r_fs;
1057 tp->tf_es = regs->r_es;
1058 tp->tf_ds = regs->r_ds;
1059 tp->tf_edi = regs->r_edi;
1060 tp->tf_esi = regs->r_esi;
1061 tp->tf_ebp = regs->r_ebp;
1062 tp->tf_ebx = regs->r_ebx;
1063 tp->tf_edx = regs->r_edx;
1064 tp->tf_ecx = regs->r_ecx;
1065 tp->tf_eax = regs->r_eax;
1066 tp->tf_eip = regs->r_eip;
1067 tp->tf_cs = regs->r_cs;
1068 tp->tf_eflags = regs->r_eflags;
1069 tp->tf_esp = regs->r_esp;
1070 tp->tf_ss = regs->r_ss;
1071 pcb->pcb_gs = regs->r_gs;
1076 fill_fpregs(struct thread *td, struct fpreg *fpregs)
1079 KASSERT(td == curthread || TD_IS_SUSPENDED(td) ||
1080 P_SHOULDSTOP(td->td_proc),
1081 ("not suspended thread %p", td));
1084 npx_fill_fpregs_xmm(&get_pcb_user_save_td(td)->sv_xmm,
1085 (struct save87 *)fpregs);
1087 bcopy(&get_pcb_user_save_td(td)->sv_87, fpregs,
1093 set_fpregs(struct thread *td, struct fpreg *fpregs)
1098 npx_set_fpregs_xmm((struct save87 *)fpregs,
1099 &get_pcb_user_save_td(td)->sv_xmm);
1101 bcopy(fpregs, &get_pcb_user_save_td(td)->sv_87,
1109 * Get machine context.
1112 get_mcontext(struct thread *td, mcontext_t *mcp, int flags)
1114 struct trapframe *tp;
1115 struct segment_descriptor *sdp;
1119 PROC_LOCK(curthread->td_proc);
1120 mcp->mc_onstack = sigonstack(tp->tf_esp);
1121 PROC_UNLOCK(curthread->td_proc);
1122 mcp->mc_gs = td->td_pcb->pcb_gs;
1123 mcp->mc_fs = tp->tf_fs;
1124 mcp->mc_es = tp->tf_es;
1125 mcp->mc_ds = tp->tf_ds;
1126 mcp->mc_edi = tp->tf_edi;
1127 mcp->mc_esi = tp->tf_esi;
1128 mcp->mc_ebp = tp->tf_ebp;
1129 mcp->mc_isp = tp->tf_isp;
1130 mcp->mc_eflags = tp->tf_eflags;
1131 if (flags & GET_MC_CLEAR_RET) {
1134 mcp->mc_eflags &= ~PSL_C;
1136 mcp->mc_eax = tp->tf_eax;
1137 mcp->mc_edx = tp->tf_edx;
1139 mcp->mc_ebx = tp->tf_ebx;
1140 mcp->mc_ecx = tp->tf_ecx;
1141 mcp->mc_eip = tp->tf_eip;
1142 mcp->mc_cs = tp->tf_cs;
1143 mcp->mc_esp = tp->tf_esp;
1144 mcp->mc_ss = tp->tf_ss;
1145 mcp->mc_len = sizeof(*mcp);
1146 get_fpcontext(td, mcp, NULL, 0);
1147 sdp = &td->td_pcb->pcb_fsd;
1148 mcp->mc_fsbase = sdp->sd_hibase << 24 | sdp->sd_lobase;
1149 sdp = &td->td_pcb->pcb_gsd;
1150 mcp->mc_gsbase = sdp->sd_hibase << 24 | sdp->sd_lobase;
1152 mcp->mc_xfpustate = 0;
1153 mcp->mc_xfpustate_len = 0;
1154 bzero(mcp->mc_spare2, sizeof(mcp->mc_spare2));
1159 * Set machine context.
1161 * However, we don't set any but the user modifiable flags, and we won't
1162 * touch the cs selector.
1165 set_mcontext(struct thread *td, mcontext_t *mcp)
1167 struct trapframe *tp;
1172 if (mcp->mc_len != sizeof(*mcp) ||
1173 (mcp->mc_flags & ~_MC_FLAG_MASK) != 0)
1175 eflags = (mcp->mc_eflags & PSL_USERCHANGE) |
1176 (tp->tf_eflags & ~PSL_USERCHANGE);
1177 if (mcp->mc_flags & _MC_HASFPXSTATE) {
1178 if (mcp->mc_xfpustate_len > cpu_max_ext_state_size -
1179 sizeof(union savefpu))
1181 xfpustate = __builtin_alloca(mcp->mc_xfpustate_len);
1182 ret = copyin((void *)mcp->mc_xfpustate, xfpustate,
1183 mcp->mc_xfpustate_len);
1188 ret = set_fpcontext(td, mcp, xfpustate, mcp->mc_xfpustate_len);
1191 tp->tf_fs = mcp->mc_fs;
1192 tp->tf_es = mcp->mc_es;
1193 tp->tf_ds = mcp->mc_ds;
1194 tp->tf_edi = mcp->mc_edi;
1195 tp->tf_esi = mcp->mc_esi;
1196 tp->tf_ebp = mcp->mc_ebp;
1197 tp->tf_ebx = mcp->mc_ebx;
1198 tp->tf_edx = mcp->mc_edx;
1199 tp->tf_ecx = mcp->mc_ecx;
1200 tp->tf_eax = mcp->mc_eax;
1201 tp->tf_eip = mcp->mc_eip;
1202 tp->tf_eflags = eflags;
1203 tp->tf_esp = mcp->mc_esp;
1204 tp->tf_ss = mcp->mc_ss;
1205 td->td_pcb->pcb_gs = mcp->mc_gs;
1210 get_fpcontext(struct thread *td, mcontext_t *mcp, char *xfpusave,
1211 size_t xfpusave_len)
1213 size_t max_len, len;
1215 mcp->mc_ownedfp = npxgetregs(td);
1216 bcopy(get_pcb_user_save_td(td), &mcp->mc_fpstate[0],
1217 sizeof(mcp->mc_fpstate));
1218 mcp->mc_fpformat = npxformat();
1219 if (!use_xsave || xfpusave_len == 0)
1221 max_len = cpu_max_ext_state_size - sizeof(union savefpu);
1223 if (len > max_len) {
1225 bzero(xfpusave + max_len, len - max_len);
1227 mcp->mc_flags |= _MC_HASFPXSTATE;
1228 mcp->mc_xfpustate_len = len;
1229 bcopy(get_pcb_user_save_td(td) + 1, xfpusave, len);
1233 set_fpcontext(struct thread *td, mcontext_t *mcp, char *xfpustate,
1234 size_t xfpustate_len)
1238 if (mcp->mc_fpformat == _MC_FPFMT_NODEV)
1240 else if (mcp->mc_fpformat != _MC_FPFMT_387 &&
1241 mcp->mc_fpformat != _MC_FPFMT_XMM)
1243 else if (mcp->mc_ownedfp == _MC_FPOWNED_NONE) {
1244 /* We don't care what state is left in the FPU or PCB. */
1247 } else if (mcp->mc_ownedfp == _MC_FPOWNED_FPU ||
1248 mcp->mc_ownedfp == _MC_FPOWNED_PCB) {
1249 error = npxsetregs(td, (union savefpu *)&mcp->mc_fpstate,
1250 xfpustate, xfpustate_len);
1257 fpstate_drop(struct thread *td)
1260 KASSERT(PCB_USER_FPU(td->td_pcb), ("fpstate_drop: kernel-owned fpu"));
1262 if (PCPU_GET(fpcurthread) == td)
1265 * XXX force a full drop of the npx. The above only drops it if we
1266 * owned it. npxgetregs() has the same bug in the !cpu_fxsr case.
1268 * XXX I don't much like npxgetregs()'s semantics of doing a full
1269 * drop. Dropping only to the pcb matches fnsave's behaviour.
1270 * We only need to drop to !PCB_INITDONE in sendsig(). But
1271 * sendsig() is the only caller of npxgetregs()... perhaps we just
1272 * have too many layers.
1274 curthread->td_pcb->pcb_flags &= ~(PCB_NPXINITDONE |
1275 PCB_NPXUSERINITDONE);
1280 fill_dbregs(struct thread *td, struct dbreg *dbregs)
1285 dbregs->dr[0] = rdr0();
1286 dbregs->dr[1] = rdr1();
1287 dbregs->dr[2] = rdr2();
1288 dbregs->dr[3] = rdr3();
1289 dbregs->dr[6] = rdr6();
1290 dbregs->dr[7] = rdr7();
1293 dbregs->dr[0] = pcb->pcb_dr0;
1294 dbregs->dr[1] = pcb->pcb_dr1;
1295 dbregs->dr[2] = pcb->pcb_dr2;
1296 dbregs->dr[3] = pcb->pcb_dr3;
1297 dbregs->dr[6] = pcb->pcb_dr6;
1298 dbregs->dr[7] = pcb->pcb_dr7;
1306 set_dbregs(struct thread *td, struct dbreg *dbregs)
1312 load_dr0(dbregs->dr[0]);
1313 load_dr1(dbregs->dr[1]);
1314 load_dr2(dbregs->dr[2]);
1315 load_dr3(dbregs->dr[3]);
1316 load_dr6(dbregs->dr[6]);
1317 load_dr7(dbregs->dr[7]);
1320 * Don't let an illegal value for dr7 get set. Specifically,
1321 * check for undefined settings. Setting these bit patterns
1322 * result in undefined behaviour and can lead to an unexpected
1325 for (i = 0; i < 4; i++) {
1326 if (DBREG_DR7_ACCESS(dbregs->dr[7], i) == 0x02)
1328 if (DBREG_DR7_LEN(dbregs->dr[7], i) == 0x02)
1335 * Don't let a process set a breakpoint that is not within the
1336 * process's address space. If a process could do this, it
1337 * could halt the system by setting a breakpoint in the kernel
1338 * (if ddb was enabled). Thus, we need to check to make sure
1339 * that no breakpoints are being enabled for addresses outside
1340 * process's address space.
1342 * XXX - what about when the watched area of the user's
1343 * address space is written into from within the kernel
1344 * ... wouldn't that still cause a breakpoint to be generated
1345 * from within kernel mode?
1348 if (DBREG_DR7_ENABLED(dbregs->dr[7], 0)) {
1349 /* dr0 is enabled */
1350 if (dbregs->dr[0] >= VM_MAXUSER_ADDRESS)
1354 if (DBREG_DR7_ENABLED(dbregs->dr[7], 1)) {
1355 /* dr1 is enabled */
1356 if (dbregs->dr[1] >= VM_MAXUSER_ADDRESS)
1360 if (DBREG_DR7_ENABLED(dbregs->dr[7], 2)) {
1361 /* dr2 is enabled */
1362 if (dbregs->dr[2] >= VM_MAXUSER_ADDRESS)
1366 if (DBREG_DR7_ENABLED(dbregs->dr[7], 3)) {
1367 /* dr3 is enabled */
1368 if (dbregs->dr[3] >= VM_MAXUSER_ADDRESS)
1372 pcb->pcb_dr0 = dbregs->dr[0];
1373 pcb->pcb_dr1 = dbregs->dr[1];
1374 pcb->pcb_dr2 = dbregs->dr[2];
1375 pcb->pcb_dr3 = dbregs->dr[3];
1376 pcb->pcb_dr6 = dbregs->dr[6];
1377 pcb->pcb_dr7 = dbregs->dr[7];
1379 pcb->pcb_flags |= PCB_DBREGS;
1386 * Return > 0 if a hardware breakpoint has been hit, and the
1387 * breakpoint was in user space. Return 0, otherwise.
1390 user_dbreg_trap(register_t dr6)
1393 u_int32_t bp; /* breakpoint bits extracted from dr6 */
1394 int nbp; /* number of breakpoints that triggered */
1395 caddr_t addr[4]; /* breakpoint addresses */
1398 bp = dr6 & DBREG_DR6_BMASK;
1401 * None of the breakpoint bits are set meaning this
1402 * trap was not caused by any of the debug registers
1408 if ((dr7 & 0x000000ff) == 0) {
1410 * all GE and LE bits in the dr7 register are zero,
1411 * thus the trap couldn't have been caused by the
1412 * hardware debug registers
1420 * at least one of the breakpoints were hit, check to see
1421 * which ones and if any of them are user space addresses
1425 addr[nbp++] = (caddr_t)rdr0();
1428 addr[nbp++] = (caddr_t)rdr1();
1431 addr[nbp++] = (caddr_t)rdr2();
1434 addr[nbp++] = (caddr_t)rdr3();
1437 for (i = 0; i < nbp; i++) {
1438 if (addr[i] < (caddr_t)VM_MAXUSER_ADDRESS) {
1440 * addr[i] is in user space
1447 * None of the breakpoints are in user space.