Lines Matching +full:halt +full:- +full:regs
1 /*-
2 * SPDX-License-Identifier: BSD-4-Clause
134 struct trapframe *regs; in osendsig() local
139 p = td->td_proc; in osendsig()
141 sig = ksi->ksi_signo; in osendsig()
142 psp = p->p_sigacts; in osendsig()
143 mtx_assert(&psp->ps_mtx, MA_OWNED); in osendsig()
144 regs = td->td_frame; in osendsig()
145 oonstack = sigonstack(regs->tf_esp); in osendsig()
148 if ((td->td_pflags & TDP_ALTSTACK) && !oonstack && in osendsig()
149 SIGISMEMBER(psp->ps_sigonstack, sig)) { in osendsig()
150 fp = (struct osigframe *)((uintptr_t)td->td_sigstk.ss_sp + in osendsig()
151 td->td_sigstk.ss_size - sizeof(struct osigframe)); in osendsig()
153 td->td_sigstk.ss_flags |= SS_ONSTACK; in osendsig()
156 fp = (struct osigframe *)regs->tf_esp - 1; in osendsig()
160 sf.sf_scp = (register_t)&fp->sf_siginfo.si_sc; in osendsig()
162 if (SIGISMEMBER(psp->ps_siginfo, sig)) { in osendsig()
164 sf.sf_arg2 = (register_t)&fp->sf_siginfo; in osendsig()
166 sf.sf_siginfo.si_code = ksi->ksi_code; in osendsig()
170 /* Old FreeBSD-style arguments. */ in osendsig()
171 sf.sf_arg2 = ksi->ksi_code; in osendsig()
172 sf.sf_addr = (register_t)ksi->ksi_addr; in osendsig()
175 mtx_unlock(&psp->ps_mtx); in osendsig()
179 sf.sf_siginfo.si_sc.sc_eax = regs->tf_eax; in osendsig()
180 sf.sf_siginfo.si_sc.sc_ebx = regs->tf_ebx; in osendsig()
181 sf.sf_siginfo.si_sc.sc_ecx = regs->tf_ecx; in osendsig()
182 sf.sf_siginfo.si_sc.sc_edx = regs->tf_edx; in osendsig()
183 sf.sf_siginfo.si_sc.sc_esi = regs->tf_esi; in osendsig()
184 sf.sf_siginfo.si_sc.sc_edi = regs->tf_edi; in osendsig()
185 sf.sf_siginfo.si_sc.sc_cs = regs->tf_cs; in osendsig()
186 sf.sf_siginfo.si_sc.sc_ds = regs->tf_ds; in osendsig()
187 sf.sf_siginfo.si_sc.sc_ss = regs->tf_ss; in osendsig()
188 sf.sf_siginfo.si_sc.sc_es = regs->tf_es; in osendsig()
189 sf.sf_siginfo.si_sc.sc_fs = regs->tf_fs; in osendsig()
191 sf.sf_siginfo.si_sc.sc_isp = regs->tf_isp; in osendsig()
196 sf.sf_siginfo.si_sc.sc_sp = regs->tf_esp; in osendsig()
197 sf.sf_siginfo.si_sc.sc_fp = regs->tf_ebp; in osendsig()
198 sf.sf_siginfo.si_sc.sc_pc = regs->tf_eip; in osendsig()
199 sf.sf_siginfo.si_sc.sc_ps = regs->tf_eflags; in osendsig()
200 sf.sf_siginfo.si_sc.sc_trapno = regs->tf_trapno; in osendsig()
201 sf.sf_siginfo.si_sc.sc_err = regs->tf_err; in osendsig()
208 if (regs->tf_eflags & PSL_VM) { in osendsig()
209 /* XXX confusing names: `tf' isn't a trapframe; `regs' is. */ in osendsig()
210 struct trapframe_vm86 *tf = (struct trapframe_vm86 *)regs; in osendsig()
211 struct vm86_kernel *vm86 = &td->td_pcb->pcb_ext->ext_vm86; in osendsig()
213 sf.sf_siginfo.si_sc.sc_gs = tf->tf_vm86_gs; in osendsig()
214 sf.sf_siginfo.si_sc.sc_fs = tf->tf_vm86_fs; in osendsig()
215 sf.sf_siginfo.si_sc.sc_es = tf->tf_vm86_es; in osendsig()
216 sf.sf_siginfo.si_sc.sc_ds = tf->tf_vm86_ds; in osendsig()
218 if (vm86->vm86_has_vme == 0) in osendsig()
220 (tf->tf_eflags & ~(PSL_VIF | PSL_VIP)) | in osendsig()
221 (vm86->vm86_eflags & (PSL_VIF | PSL_VIP)); in osendsig()
224 tf->tf_eflags &= ~(PSL_VM | PSL_NT | PSL_VIF | PSL_VIP); in osendsig()
235 regs->tf_esp = (int)fp; in osendsig()
237 regs->tf_eip = PROC_SIGCODE(p) + szsigcode - in osendsig()
241 regs->tf_eip = PROC_PS_STRINGS(p) - szosigcode; in osendsig()
243 regs->tf_eflags &= ~(PSL_T | PSL_D); in osendsig()
244 regs->tf_cs = _ucodesel; in osendsig()
245 regs->tf_ds = _udatasel; in osendsig()
246 regs->tf_es = _udatasel; in osendsig()
247 regs->tf_fs = _udatasel; in osendsig()
249 regs->tf_ss = _udatasel; in osendsig()
251 mtx_lock(&psp->ps_mtx); in osendsig()
263 struct trapframe *regs; in freebsd4_sendsig() local
268 p = td->td_proc; in freebsd4_sendsig()
270 sig = ksi->ksi_signo; in freebsd4_sendsig()
271 psp = p->p_sigacts; in freebsd4_sendsig()
272 mtx_assert(&psp->ps_mtx, MA_OWNED); in freebsd4_sendsig()
273 regs = td->td_frame; in freebsd4_sendsig()
274 oonstack = sigonstack(regs->tf_esp); in freebsd4_sendsig()
279 sf.sf_uc.uc_stack = td->td_sigstk; in freebsd4_sendsig()
280 sf.sf_uc.uc_stack.ss_flags = (td->td_pflags & TDP_ALTSTACK) in freebsd4_sendsig()
284 bcopy(regs, &sf.sf_uc.uc_mcontext.mc_fs, sizeof(*regs)); in freebsd4_sendsig()
292 if ((td->td_pflags & TDP_ALTSTACK) != 0 && !oonstack && in freebsd4_sendsig()
293 SIGISMEMBER(psp->ps_sigonstack, sig)) { in freebsd4_sendsig()
294 sfp = (struct freebsd4_sigframe *)((uintptr_t)td->td_sigstk.ss_sp + in freebsd4_sendsig()
295 td->td_sigstk.ss_size - sizeof(struct freebsd4_sigframe)); in freebsd4_sendsig()
297 td->td_sigstk.ss_flags |= SS_ONSTACK; in freebsd4_sendsig()
300 sfp = (struct freebsd4_sigframe *)regs->tf_esp - 1; in freebsd4_sendsig()
304 sf.sf_ucontext = (register_t)&sfp->sf_uc; in freebsd4_sendsig()
306 if (SIGISMEMBER(psp->ps_siginfo, sig)) { in freebsd4_sendsig()
308 sf.sf_siginfo = (register_t)&sfp->sf_si; in freebsd4_sendsig()
313 sf.sf_si.si_code = ksi->ksi_code; in freebsd4_sendsig()
314 sf.sf_si.si_addr = ksi->ksi_addr; in freebsd4_sendsig()
316 /* Old FreeBSD-style arguments. */ in freebsd4_sendsig()
317 sf.sf_siginfo = ksi->ksi_code; in freebsd4_sendsig()
318 sf.sf_addr = (register_t)ksi->ksi_addr; in freebsd4_sendsig()
321 mtx_unlock(&psp->ps_mtx); in freebsd4_sendsig()
329 if (regs->tf_eflags & PSL_VM) { in freebsd4_sendsig()
330 struct trapframe_vm86 *tf = (struct trapframe_vm86 *)regs; in freebsd4_sendsig()
331 struct vm86_kernel *vm86 = &td->td_pcb->pcb_ext->ext_vm86; in freebsd4_sendsig()
333 sf.sf_uc.uc_mcontext.mc_gs = tf->tf_vm86_gs; in freebsd4_sendsig()
334 sf.sf_uc.uc_mcontext.mc_fs = tf->tf_vm86_fs; in freebsd4_sendsig()
335 sf.sf_uc.uc_mcontext.mc_es = tf->tf_vm86_es; in freebsd4_sendsig()
336 sf.sf_uc.uc_mcontext.mc_ds = tf->tf_vm86_ds; in freebsd4_sendsig()
338 if (vm86->vm86_has_vme == 0) in freebsd4_sendsig()
340 (tf->tf_eflags & ~(PSL_VIF | PSL_VIP)) | in freebsd4_sendsig()
341 (vm86->vm86_eflags & (PSL_VIF | PSL_VIP)); in freebsd4_sendsig()
350 tf->tf_eflags &= ~(PSL_VM | PSL_NT | PSL_VIF | PSL_VIP); in freebsd4_sendsig()
361 regs->tf_esp = (int)sfp; in freebsd4_sendsig()
362 regs->tf_eip = PROC_SIGCODE(p) + szsigcode - in freebsd4_sendsig()
364 regs->tf_eflags &= ~(PSL_T | PSL_D); in freebsd4_sendsig()
365 regs->tf_cs = _ucodesel; in freebsd4_sendsig()
366 regs->tf_ds = _udatasel; in freebsd4_sendsig()
367 regs->tf_es = _udatasel; in freebsd4_sendsig()
368 regs->tf_fs = _udatasel; in freebsd4_sendsig()
369 regs->tf_ss = _udatasel; in freebsd4_sendsig()
371 mtx_lock(&psp->ps_mtx); in freebsd4_sendsig()
383 struct trapframe *regs; in sendsig() local
391 p = td->td_proc; in sendsig()
393 sig = ksi->ksi_signo; in sendsig()
394 psp = p->p_sigacts; in sendsig()
395 mtx_assert(&psp->ps_mtx, MA_OWNED); in sendsig()
397 if (SIGISMEMBER(psp->ps_freebsd4, sig)) { in sendsig()
403 if (SIGISMEMBER(psp->ps_osigset, sig)) { in sendsig()
408 regs = td->td_frame; in sendsig()
409 oonstack = sigonstack(regs->tf_esp); in sendsig()
412 xfpusave_len = cpu_max_ext_state_size - sizeof(union savefpu); in sendsig()
422 sf.sf_uc.uc_stack = td->td_sigstk; in sendsig()
423 sf.sf_uc.uc_stack.ss_flags = (td->td_pflags & TDP_ALTSTACK) in sendsig()
427 bcopy(regs, &sf.sf_uc.uc_mcontext.mc_fs, sizeof(*regs)); in sendsig()
434 sdp = &td->td_pcb->pcb_fsd; in sendsig()
435 sf.sf_uc.uc_mcontext.mc_fsbase = sdp->sd_hibase << 24 | in sendsig()
436 sdp->sd_lobase; in sendsig()
437 sdp = &td->td_pcb->pcb_gsd; in sendsig()
438 sf.sf_uc.uc_mcontext.mc_gsbase = sdp->sd_hibase << 24 | in sendsig()
439 sdp->sd_lobase; in sendsig()
444 if ((td->td_pflags & TDP_ALTSTACK) != 0 && !oonstack && in sendsig()
445 SIGISMEMBER(psp->ps_sigonstack, sig)) { in sendsig()
446 sp = (char *)td->td_sigstk.ss_sp + td->td_sigstk.ss_size; in sendsig()
448 td->td_sigstk.ss_flags |= SS_ONSTACK; in sendsig()
451 sp = (char *)regs->tf_esp - 128; in sendsig()
453 sp -= xfpusave_len; in sendsig()
457 sp -= sizeof(struct sigframe); in sendsig()
464 sf.sf_ucontext = (register_t)&sfp->sf_uc; in sendsig()
466 if (SIGISMEMBER(psp->ps_siginfo, sig)) { in sendsig()
468 sf.sf_siginfo = (register_t)&sfp->sf_si; in sendsig()
472 sf.sf_si = ksi->ksi_info; in sendsig()
475 /* Old FreeBSD-style arguments. */ in sendsig()
476 sf.sf_siginfo = ksi->ksi_code; in sendsig()
477 sf.sf_addr = (register_t)ksi->ksi_addr; in sendsig()
480 mtx_unlock(&psp->ps_mtx); in sendsig()
488 if (regs->tf_eflags & PSL_VM) { in sendsig()
489 struct trapframe_vm86 *tf = (struct trapframe_vm86 *)regs; in sendsig()
490 struct vm86_kernel *vm86 = &td->td_pcb->pcb_ext->ext_vm86; in sendsig()
492 sf.sf_uc.uc_mcontext.mc_gs = tf->tf_vm86_gs; in sendsig()
493 sf.sf_uc.uc_mcontext.mc_fs = tf->tf_vm86_fs; in sendsig()
494 sf.sf_uc.uc_mcontext.mc_es = tf->tf_vm86_es; in sendsig()
495 sf.sf_uc.uc_mcontext.mc_ds = tf->tf_vm86_ds; in sendsig()
497 if (vm86->vm86_has_vme == 0) in sendsig()
499 (tf->tf_eflags & ~(PSL_VIF | PSL_VIP)) | in sendsig()
500 (vm86->vm86_eflags & (PSL_VIF | PSL_VIP)); in sendsig()
509 tf->tf_eflags &= ~(PSL_VM | PSL_NT | PSL_VIF | PSL_VIP); in sendsig()
523 regs->tf_esp = (int)sfp; in sendsig()
524 regs->tf_eip = PROC_SIGCODE(p); in sendsig()
525 if (regs->tf_eip == 0) in sendsig()
526 regs->tf_eip = PROC_PS_STRINGS(p) - szsigcode; in sendsig()
527 regs->tf_eflags &= ~(PSL_T | PSL_D); in sendsig()
528 regs->tf_cs = _ucodesel; in sendsig()
529 regs->tf_ds = _udatasel; in sendsig()
530 regs->tf_es = _udatasel; in sendsig()
531 regs->tf_fs = _udatasel; in sendsig()
532 regs->tf_ss = _udatasel; in sendsig()
534 mtx_lock(&psp->ps_mtx); in sendsig()
549 struct trapframe *regs; in osigreturn() local
554 regs = td->td_frame; in osigreturn()
555 error = copyin(uap->sigcntxp, &sc, sizeof(sc)); in osigreturn()
559 eflags = scp->sc_ps; in osigreturn()
561 struct trapframe_vm86 *tf = (struct trapframe_vm86 *)regs; in osigreturn()
568 if (td->td_pcb->pcb_ext == 0) in osigreturn()
570 vm86 = &td->td_pcb->pcb_ext->ext_vm86; in osigreturn()
571 if (vm86->vm86_inited == 0) in osigreturn()
579 ksi.ksi_addr = (void *)regs->tf_eip; in osigreturn()
583 if (vm86->vm86_has_vme) { in osigreturn()
584 eflags = (tf->tf_eflags & ~VME_USERCHANGE) | in osigreturn()
587 vm86->vm86_eflags = eflags; /* save VIF, VIP */ in osigreturn()
588 eflags = (tf->tf_eflags & ~VM_USERCHANGE) | in osigreturn()
591 tf->tf_vm86_ds = scp->sc_ds; in osigreturn()
592 tf->tf_vm86_es = scp->sc_es; in osigreturn()
593 tf->tf_vm86_fs = scp->sc_fs; in osigreturn()
594 tf->tf_vm86_gs = scp->sc_gs; in osigreturn()
595 tf->tf_ds = _udatasel; in osigreturn()
596 tf->tf_es = _udatasel; in osigreturn()
597 tf->tf_fs = _udatasel; in osigreturn()
602 if (!EFL_SECURE(eflags, regs->tf_eflags)) { in osigreturn()
611 if (!CS_SECURE(scp->sc_cs)) { in osigreturn()
616 ksi.ksi_addr = (void *)regs->tf_eip; in osigreturn()
620 regs->tf_ds = scp->sc_ds; in osigreturn()
621 regs->tf_es = scp->sc_es; in osigreturn()
622 regs->tf_fs = scp->sc_fs; in osigreturn()
626 regs->tf_eax = scp->sc_eax; in osigreturn()
627 regs->tf_ebx = scp->sc_ebx; in osigreturn()
628 regs->tf_ecx = scp->sc_ecx; in osigreturn()
629 regs->tf_edx = scp->sc_edx; in osigreturn()
630 regs->tf_esi = scp->sc_esi; in osigreturn()
631 regs->tf_edi = scp->sc_edi; in osigreturn()
632 regs->tf_cs = scp->sc_cs; in osigreturn()
633 regs->tf_ss = scp->sc_ss; in osigreturn()
634 regs->tf_isp = scp->sc_isp; in osigreturn()
635 regs->tf_ebp = scp->sc_fp; in osigreturn()
636 regs->tf_esp = scp->sc_sp; in osigreturn()
637 regs->tf_eip = scp->sc_pc; in osigreturn()
638 regs->tf_eflags = eflags; in osigreturn()
639 regs->tf_trapno = T_RESERVED; in osigreturn()
642 if (scp->sc_onstack & 1) in osigreturn()
643 td->td_sigstk.ss_flags |= SS_ONSTACK; in osigreturn()
645 td->td_sigstk.ss_flags &= ~SS_ONSTACK; in osigreturn()
647 kern_sigprocmask(td, SIG_SETMASK, (sigset_t *)&scp->sc_mask, NULL, in osigreturn()
658 struct trapframe *regs; in freebsd4_sigreturn() local
663 error = copyin(uap->sigcntxp, &uc, sizeof(uc)); in freebsd4_sigreturn()
667 regs = td->td_frame; in freebsd4_sigreturn()
668 eflags = ucp->uc_mcontext.mc_eflags; in freebsd4_sigreturn()
670 struct trapframe_vm86 *tf = (struct trapframe_vm86 *)regs; in freebsd4_sigreturn()
677 if (td->td_pcb->pcb_ext == 0) in freebsd4_sigreturn()
679 vm86 = &td->td_pcb->pcb_ext->ext_vm86; in freebsd4_sigreturn()
680 if (vm86->vm86_inited == 0) in freebsd4_sigreturn()
688 ksi.ksi_addr = (void *)regs->tf_eip; in freebsd4_sigreturn()
691 if (vm86->vm86_has_vme) { in freebsd4_sigreturn()
692 eflags = (tf->tf_eflags & ~VME_USERCHANGE) | in freebsd4_sigreturn()
695 vm86->vm86_eflags = eflags; /* save VIF, VIP */ in freebsd4_sigreturn()
696 eflags = (tf->tf_eflags & ~VM_USERCHANGE) | in freebsd4_sigreturn()
699 bcopy(&ucp->uc_mcontext.mc_fs, tf, sizeof(struct trapframe)); in freebsd4_sigreturn()
700 tf->tf_eflags = eflags; in freebsd4_sigreturn()
701 tf->tf_vm86_ds = tf->tf_ds; in freebsd4_sigreturn()
702 tf->tf_vm86_es = tf->tf_es; in freebsd4_sigreturn()
703 tf->tf_vm86_fs = tf->tf_fs; in freebsd4_sigreturn()
704 tf->tf_vm86_gs = ucp->uc_mcontext.mc_gs; in freebsd4_sigreturn()
705 tf->tf_ds = _udatasel; in freebsd4_sigreturn()
706 tf->tf_es = _udatasel; in freebsd4_sigreturn()
707 tf->tf_fs = _udatasel; in freebsd4_sigreturn()
712 if (!EFL_SECURE(eflags, regs->tf_eflags)) { in freebsd4_sigreturn()
715 td->td_proc->p_pid, td->td_name, eflags); in freebsd4_sigreturn()
724 cs = ucp->uc_mcontext.mc_cs; in freebsd4_sigreturn()
727 td->td_proc->p_pid, td->td_name, cs); in freebsd4_sigreturn()
732 ksi.ksi_addr = (void *)regs->tf_eip; in freebsd4_sigreturn()
737 bcopy(&ucp->uc_mcontext.mc_fs, regs, sizeof(*regs)); in freebsd4_sigreturn()
739 regs->tf_trapno = T_RESERVED; in freebsd4_sigreturn()
742 if (ucp->uc_mcontext.mc_onstack & 1) in freebsd4_sigreturn()
743 td->td_sigstk.ss_flags |= SS_ONSTACK; in freebsd4_sigreturn()
745 td->td_sigstk.ss_flags &= ~SS_ONSTACK; in freebsd4_sigreturn()
747 kern_sigprocmask(td, SIG_SETMASK, &ucp->uc_sigmask, NULL, 0); in freebsd4_sigreturn()
757 struct trapframe *regs; in sys_sigreturn() local
764 p = td->td_proc; in sys_sigreturn()
766 error = copyin(uap->sigcntxp, &uc, sizeof(uc)); in sys_sigreturn()
770 if ((ucp->uc_mcontext.mc_flags & ~_MC_FLAG_MASK) != 0) { in sys_sigreturn()
771 uprintf("pid %d (%s): sigreturn mc_flags %x\n", p->p_pid, in sys_sigreturn()
772 td->td_name, ucp->uc_mcontext.mc_flags); in sys_sigreturn()
775 regs = td->td_frame; in sys_sigreturn()
776 eflags = ucp->uc_mcontext.mc_eflags; in sys_sigreturn()
778 struct trapframe_vm86 *tf = (struct trapframe_vm86 *)regs; in sys_sigreturn()
785 if (td->td_pcb->pcb_ext == 0) in sys_sigreturn()
787 vm86 = &td->td_pcb->pcb_ext->ext_vm86; in sys_sigreturn()
788 if (vm86->vm86_inited == 0) in sys_sigreturn()
796 ksi.ksi_addr = (void *)regs->tf_eip; in sys_sigreturn()
800 if (vm86->vm86_has_vme) { in sys_sigreturn()
801 eflags = (tf->tf_eflags & ~VME_USERCHANGE) | in sys_sigreturn()
804 vm86->vm86_eflags = eflags; /* save VIF, VIP */ in sys_sigreturn()
805 eflags = (tf->tf_eflags & ~VM_USERCHANGE) | in sys_sigreturn()
808 bcopy(&ucp->uc_mcontext.mc_fs, tf, sizeof(struct trapframe)); in sys_sigreturn()
809 tf->tf_eflags = eflags; in sys_sigreturn()
810 tf->tf_vm86_ds = tf->tf_ds; in sys_sigreturn()
811 tf->tf_vm86_es = tf->tf_es; in sys_sigreturn()
812 tf->tf_vm86_fs = tf->tf_fs; in sys_sigreturn()
813 tf->tf_vm86_gs = ucp->uc_mcontext.mc_gs; in sys_sigreturn()
814 tf->tf_ds = _udatasel; in sys_sigreturn()
815 tf->tf_es = _udatasel; in sys_sigreturn()
816 tf->tf_fs = _udatasel; in sys_sigreturn()
821 if (!EFL_SECURE(eflags, regs->tf_eflags)) { in sys_sigreturn()
823 td->td_proc->p_pid, td->td_name, eflags); in sys_sigreturn()
832 cs = ucp->uc_mcontext.mc_cs; in sys_sigreturn()
835 td->td_proc->p_pid, td->td_name, cs); in sys_sigreturn()
840 ksi.ksi_addr = (void *)regs->tf_eip; in sys_sigreturn()
847 if (xfpustate_len > cpu_max_ext_state_size - in sys_sigreturn()
851 p->p_pid, td->td_name, xfpustate_len); in sys_sigreturn()
861 p->p_pid, td->td_name); in sys_sigreturn()
868 ret = set_fpcontext(td, &ucp->uc_mcontext, xfpustate, in sys_sigreturn()
872 bcopy(&ucp->uc_mcontext.mc_fs, regs, sizeof(*regs)); in sys_sigreturn()
874 regs->tf_trapno = T_RESERVED; in sys_sigreturn()
877 if (ucp->uc_mcontext.mc_onstack & 1) in sys_sigreturn()
878 td->td_sigstk.ss_flags |= SS_ONSTACK; in sys_sigreturn()
880 td->td_sigstk.ss_flags &= ~SS_ONSTACK; in sys_sigreturn()
883 kern_sigprocmask(td, SIG_SETMASK, &ucp->uc_sigmask, NULL, 0); in sys_sigreturn()
894 if ((pcb->pcb_flags & PCB_DBREGS) == 0) in x86_clear_dbregs()
897 pcb->pcb_dr0 = 0; in x86_clear_dbregs()
898 pcb->pcb_dr1 = 0; in x86_clear_dbregs()
899 pcb->pcb_dr2 = 0; in x86_clear_dbregs()
900 pcb->pcb_dr3 = 0; in x86_clear_dbregs()
901 pcb->pcb_dr6 = 0; in x86_clear_dbregs()
902 pcb->pcb_dr7 = 0; in x86_clear_dbregs()
912 pcb->pcb_flags &= ~PCB_DBREGS; in x86_clear_dbregs()
926 lcall_addr = p->p_sysent->sv_psstrings - sz_lcall_tramp; in setup_priv_lcall_gate()
947 struct trapframe *regs; in exec_setregs() local
951 regs = td->td_frame; in exec_setregs()
952 pcb = td->td_pcb; in exec_setregs()
954 /* Reset pc->pcb_gs and %gs before possibly invalidating it. */ in exec_setregs()
955 pcb->pcb_gs = _udatasel; in exec_setregs()
959 if (td->td_proc->p_md.md_ldt != NULL) in exec_setregs()
965 if (td->td_proc->p_sysent->sv_psstrings != in exec_setregs()
967 setup_priv_lcall_gate(td->td_proc); in exec_setregs()
980 saved_eflags = regs->tf_eflags & PSL_T; in exec_setregs()
981 bzero((char *)regs, sizeof(struct trapframe)); in exec_setregs()
982 regs->tf_eip = imgp->entry_addr; in exec_setregs()
983 regs->tf_esp = stack; in exec_setregs()
984 regs->tf_eflags = PSL_USER | saved_eflags; in exec_setregs()
985 regs->tf_ss = _udatasel; in exec_setregs()
986 regs->tf_ds = _udatasel; in exec_setregs()
987 regs->tf_es = _udatasel; in exec_setregs()
988 regs->tf_fs = _udatasel; in exec_setregs()
989 regs->tf_cs = _ucodesel; in exec_setregs()
991 /* PS_STRINGS value for BSD/OS binaries. It is 0 for non-BSD/OS. */ in exec_setregs()
992 regs->tf_ebx = (register_t)imgp->ps_strings; in exec_setregs()
996 pcb->pcb_initial_npxcw = __INITIAL_NPXCW__; in exec_setregs()
1006 fill_regs(struct thread *td, struct reg *regs) in fill_regs() argument
1011 tp = td->td_frame; in fill_regs()
1012 pcb = td->td_pcb; in fill_regs()
1013 regs->r_gs = pcb->pcb_gs; in fill_regs()
1014 return (fill_frame_regs(tp, regs)); in fill_regs()
1018 fill_frame_regs(struct trapframe *tp, struct reg *regs) in fill_frame_regs() argument
1021 regs->r_fs = tp->tf_fs; in fill_frame_regs()
1022 regs->r_es = tp->tf_es; in fill_frame_regs()
1023 regs->r_ds = tp->tf_ds; in fill_frame_regs()
1024 regs->r_edi = tp->tf_edi; in fill_frame_regs()
1025 regs->r_esi = tp->tf_esi; in fill_frame_regs()
1026 regs->r_ebp = tp->tf_ebp; in fill_frame_regs()
1027 regs->r_ebx = tp->tf_ebx; in fill_frame_regs()
1028 regs->r_edx = tp->tf_edx; in fill_frame_regs()
1029 regs->r_ecx = tp->tf_ecx; in fill_frame_regs()
1030 regs->r_eax = tp->tf_eax; in fill_frame_regs()
1031 regs->r_eip = tp->tf_eip; in fill_frame_regs()
1032 regs->r_cs = tp->tf_cs; in fill_frame_regs()
1033 regs->r_eflags = tp->tf_eflags; in fill_frame_regs()
1034 regs->r_esp = tp->tf_esp; in fill_frame_regs()
1035 regs->r_ss = tp->tf_ss; in fill_frame_regs()
1036 regs->r_err = 0; in fill_frame_regs()
1037 regs->r_trapno = 0; in fill_frame_regs()
1042 set_regs(struct thread *td, struct reg *regs) in set_regs() argument
1047 tp = td->td_frame; in set_regs()
1048 if (!EFL_SECURE(regs->r_eflags, tp->tf_eflags) || in set_regs()
1049 !CS_SECURE(regs->r_cs)) in set_regs()
1051 pcb = td->td_pcb; in set_regs()
1052 tp->tf_fs = regs->r_fs; in set_regs()
1053 tp->tf_es = regs->r_es; in set_regs()
1054 tp->tf_ds = regs->r_ds; in set_regs()
1055 tp->tf_edi = regs->r_edi; in set_regs()
1056 tp->tf_esi = regs->r_esi; in set_regs()
1057 tp->tf_ebp = regs->r_ebp; in set_regs()
1058 tp->tf_ebx = regs->r_ebx; in set_regs()
1059 tp->tf_edx = regs->r_edx; in set_regs()
1060 tp->tf_ecx = regs->r_ecx; in set_regs()
1061 tp->tf_eax = regs->r_eax; in set_regs()
1062 tp->tf_eip = regs->r_eip; in set_regs()
1063 tp->tf_cs = regs->r_cs; in set_regs()
1064 tp->tf_eflags = regs->r_eflags; in set_regs()
1065 tp->tf_esp = regs->r_esp; in set_regs()
1066 tp->tf_ss = regs->r_ss; in set_regs()
1067 pcb->pcb_gs = regs->r_gs; in set_regs()
1076 P_SHOULDSTOP(td->td_proc), in fill_fpregs()
1080 npx_fill_fpregs_xmm(&get_pcb_user_save_td(td)->sv_xmm, in fill_fpregs()
1083 bcopy(&get_pcb_user_save_td(td)->sv_87, fpregs, in fill_fpregs()
1095 &get_pcb_user_save_td(td)->sv_xmm); in set_fpregs()
1097 bcopy(fpregs, &get_pcb_user_save_td(td)->sv_87, in set_fpregs()
1113 tp = td->td_frame; in get_mcontext()
1115 PROC_LOCK(curthread->td_proc); in get_mcontext()
1116 mcp->mc_onstack = sigonstack(tp->tf_esp); in get_mcontext()
1117 PROC_UNLOCK(curthread->td_proc); in get_mcontext()
1118 mcp->mc_gs = td->td_pcb->pcb_gs; in get_mcontext()
1119 mcp->mc_fs = tp->tf_fs; in get_mcontext()
1120 mcp->mc_es = tp->tf_es; in get_mcontext()
1121 mcp->mc_ds = tp->tf_ds; in get_mcontext()
1122 mcp->mc_edi = tp->tf_edi; in get_mcontext()
1123 mcp->mc_esi = tp->tf_esi; in get_mcontext()
1124 mcp->mc_ebp = tp->tf_ebp; in get_mcontext()
1125 mcp->mc_isp = tp->tf_isp; in get_mcontext()
1126 mcp->mc_eflags = tp->tf_eflags; in get_mcontext()
1128 mcp->mc_eax = 0; in get_mcontext()
1129 mcp->mc_edx = 0; in get_mcontext()
1130 mcp->mc_eflags &= ~PSL_C; in get_mcontext()
1132 mcp->mc_eax = tp->tf_eax; in get_mcontext()
1133 mcp->mc_edx = tp->tf_edx; in get_mcontext()
1135 mcp->mc_ebx = tp->tf_ebx; in get_mcontext()
1136 mcp->mc_ecx = tp->tf_ecx; in get_mcontext()
1137 mcp->mc_eip = tp->tf_eip; in get_mcontext()
1138 mcp->mc_cs = tp->tf_cs; in get_mcontext()
1139 mcp->mc_esp = tp->tf_esp; in get_mcontext()
1140 mcp->mc_ss = tp->tf_ss; in get_mcontext()
1141 mcp->mc_len = sizeof(*mcp); in get_mcontext()
1143 sdp = &td->td_pcb->pcb_fsd; in get_mcontext()
1144 mcp->mc_fsbase = sdp->sd_hibase << 24 | sdp->sd_lobase; in get_mcontext()
1145 sdp = &td->td_pcb->pcb_gsd; in get_mcontext()
1146 mcp->mc_gsbase = sdp->sd_hibase << 24 | sdp->sd_lobase; in get_mcontext()
1147 mcp->mc_flags = 0; in get_mcontext()
1148 mcp->mc_xfpustate = 0; in get_mcontext()
1149 mcp->mc_xfpustate_len = 0; in get_mcontext()
1150 bzero(mcp->mc_spare2, sizeof(mcp->mc_spare2)); in get_mcontext()
1167 tp = td->td_frame; in set_mcontext()
1168 if (mcp->mc_len != sizeof(*mcp) || in set_mcontext()
1169 (mcp->mc_flags & ~_MC_FLAG_MASK) != 0) in set_mcontext()
1171 eflags = (mcp->mc_eflags & PSL_USERCHANGE) | in set_mcontext()
1172 (tp->tf_eflags & ~PSL_USERCHANGE); in set_mcontext()
1173 if (mcp->mc_flags & _MC_HASFPXSTATE) { in set_mcontext()
1174 if (mcp->mc_xfpustate_len > cpu_max_ext_state_size - in set_mcontext()
1177 xfpustate = __builtin_alloca(mcp->mc_xfpustate_len); in set_mcontext()
1178 ret = copyin((void *)mcp->mc_xfpustate, xfpustate, in set_mcontext()
1179 mcp->mc_xfpustate_len); in set_mcontext()
1184 ret = set_fpcontext(td, mcp, xfpustate, mcp->mc_xfpustate_len); in set_mcontext()
1187 tp->tf_fs = mcp->mc_fs; in set_mcontext()
1188 tp->tf_es = mcp->mc_es; in set_mcontext()
1189 tp->tf_ds = mcp->mc_ds; in set_mcontext()
1190 tp->tf_edi = mcp->mc_edi; in set_mcontext()
1191 tp->tf_esi = mcp->mc_esi; in set_mcontext()
1192 tp->tf_ebp = mcp->mc_ebp; in set_mcontext()
1193 tp->tf_ebx = mcp->mc_ebx; in set_mcontext()
1194 tp->tf_edx = mcp->mc_edx; in set_mcontext()
1195 tp->tf_ecx = mcp->mc_ecx; in set_mcontext()
1196 tp->tf_eax = mcp->mc_eax; in set_mcontext()
1197 tp->tf_eip = mcp->mc_eip; in set_mcontext()
1198 tp->tf_eflags = eflags; in set_mcontext()
1199 tp->tf_esp = mcp->mc_esp; in set_mcontext()
1200 tp->tf_ss = mcp->mc_ss; in set_mcontext()
1201 td->td_pcb->pcb_gs = mcp->mc_gs; in set_mcontext()
1211 mcp->mc_ownedfp = npxgetregs(td); in get_fpcontext()
1212 bcopy(get_pcb_user_save_td(td), &mcp->mc_fpstate[0], in get_fpcontext()
1213 sizeof(mcp->mc_fpstate)); in get_fpcontext()
1214 mcp->mc_fpformat = npxformat(); in get_fpcontext()
1217 max_len = cpu_max_ext_state_size - sizeof(union savefpu); in get_fpcontext()
1221 bzero(xfpusave + max_len, len - max_len); in get_fpcontext()
1223 mcp->mc_flags |= _MC_HASFPXSTATE; in get_fpcontext()
1224 mcp->mc_xfpustate_len = len; in get_fpcontext()
1234 if (mcp->mc_fpformat == _MC_FPFMT_NODEV) in set_fpcontext()
1236 else if (mcp->mc_fpformat != _MC_FPFMT_387 && in set_fpcontext()
1237 mcp->mc_fpformat != _MC_FPFMT_XMM) in set_fpcontext()
1239 else if (mcp->mc_ownedfp == _MC_FPOWNED_NONE) { in set_fpcontext()
1243 } else if (mcp->mc_ownedfp == _MC_FPOWNED_FPU || in set_fpcontext()
1244 mcp->mc_ownedfp == _MC_FPOWNED_PCB) { in set_fpcontext()
1245 error = npxsetregs(td, (union savefpu *)&mcp->mc_fpstate, in set_fpcontext()
1256 KASSERT(PCB_USER_FPU(td->td_pcb), ("fpstate_drop: kernel-owned fpu")); in fpstate_drop()
1270 curthread->td_pcb->pcb_flags &= ~(PCB_NPXINITDONE | in fpstate_drop()
1281 dbregs->dr[0] = rdr0(); in fill_dbregs()
1282 dbregs->dr[1] = rdr1(); in fill_dbregs()
1283 dbregs->dr[2] = rdr2(); in fill_dbregs()
1284 dbregs->dr[3] = rdr3(); in fill_dbregs()
1285 dbregs->dr[6] = rdr6(); in fill_dbregs()
1286 dbregs->dr[7] = rdr7(); in fill_dbregs()
1288 pcb = td->td_pcb; in fill_dbregs()
1289 dbregs->dr[0] = pcb->pcb_dr0; in fill_dbregs()
1290 dbregs->dr[1] = pcb->pcb_dr1; in fill_dbregs()
1291 dbregs->dr[2] = pcb->pcb_dr2; in fill_dbregs()
1292 dbregs->dr[3] = pcb->pcb_dr3; in fill_dbregs()
1293 dbregs->dr[6] = pcb->pcb_dr6; in fill_dbregs()
1294 dbregs->dr[7] = pcb->pcb_dr7; in fill_dbregs()
1296 dbregs->dr[4] = 0; in fill_dbregs()
1297 dbregs->dr[5] = 0; in fill_dbregs()
1308 load_dr0(dbregs->dr[0]); in set_dbregs()
1309 load_dr1(dbregs->dr[1]); in set_dbregs()
1310 load_dr2(dbregs->dr[2]); in set_dbregs()
1311 load_dr3(dbregs->dr[3]); in set_dbregs()
1312 load_dr6(dbregs->dr[6]); in set_dbregs()
1313 load_dr7(dbregs->dr[7]); in set_dbregs()
1322 if (DBREG_DR7_ACCESS(dbregs->dr[7], i) == 0x02) in set_dbregs()
1324 if (DBREG_DR7_LEN(dbregs->dr[7], i) == 0x02) in set_dbregs()
1328 pcb = td->td_pcb; in set_dbregs()
1333 * could halt the system by setting a breakpoint in the kernel in set_dbregs()
1338 * XXX - what about when the watched area of the user's in set_dbregs()
1344 if (DBREG_DR7_ENABLED(dbregs->dr[7], 0)) { in set_dbregs()
1346 if (dbregs->dr[0] >= VM_MAXUSER_ADDRESS) in set_dbregs()
1350 if (DBREG_DR7_ENABLED(dbregs->dr[7], 1)) { in set_dbregs()
1352 if (dbregs->dr[1] >= VM_MAXUSER_ADDRESS) in set_dbregs()
1356 if (DBREG_DR7_ENABLED(dbregs->dr[7], 2)) { in set_dbregs()
1358 if (dbregs->dr[2] >= VM_MAXUSER_ADDRESS) in set_dbregs()
1362 if (DBREG_DR7_ENABLED(dbregs->dr[7], 3)) { in set_dbregs()
1364 if (dbregs->dr[3] >= VM_MAXUSER_ADDRESS) in set_dbregs()
1368 pcb->pcb_dr0 = dbregs->dr[0]; in set_dbregs()
1369 pcb->pcb_dr1 = dbregs->dr[1]; in set_dbregs()
1370 pcb->pcb_dr2 = dbregs->dr[2]; in set_dbregs()
1371 pcb->pcb_dr3 = dbregs->dr[3]; in set_dbregs()
1372 pcb->pcb_dr6 = dbregs->dr[6]; in set_dbregs()
1373 pcb->pcb_dr7 = dbregs->dr[7]; in set_dbregs()
1375 pcb->pcb_flags |= PCB_DBREGS; in set_dbregs()