Lines Matching +full:halt +full:- +full:regs

1 /*-
2 * SPDX-License-Identifier: BSD-3-Clause
7 * Copyright (c) 1998-1999 Andrew Gallatin
8 * Copyright (c) 1994-1996 Søren Schmidt
36 #error "Unable to compile Linux-emulator due to missing COMPAT_FREEBSD32 option!"
80 #define LINUX32_MAXUSER ((1ul << 32) - PAGE_SIZE)
82 #define LINUX32_VDSOPAGE (LINUX32_MAXUSER - LINUX32_VDSOPAGE_SIZE)
83 #define LINUX32_SHAREDPAGE (LINUX32_VDSOPAGE - PAGE_SIZE)
85 * PAGE_SIZE - the size
123 #define LINUX32_PS_STRINGS (LINUX32_USRSTACK - \
149 struct proc *p = td->td_proc; in linux_rt_sendsig()
151 struct trapframe *regs; in linux_rt_sendsig() local
157 sig = linux_translate_traps(ksi->ksi_signo, ksi->ksi_trapno); in linux_rt_sendsig()
158 code = ksi->ksi_code; in linux_rt_sendsig()
160 psp = p->p_sigacts; in linux_rt_sendsig()
161 mtx_assert(&psp->ps_mtx, MA_OWNED); in linux_rt_sendsig()
162 regs = td->td_frame; in linux_rt_sendsig()
163 oonstack = sigonstack(regs->tf_rsp); in linux_rt_sendsig()
166 if ((td->td_pflags & TDP_ALTSTACK) && !oonstack && in linux_rt_sendsig()
167 SIGISMEMBER(psp->ps_sigonstack, sig)) { in linux_rt_sendsig()
168 fp = (struct l_rt_sigframe *)((uintptr_t)td->td_sigstk.ss_sp + in linux_rt_sendsig()
169 td->td_sigstk.ss_size - sizeof(struct l_rt_sigframe)); in linux_rt_sendsig()
171 fp = (struct l_rt_sigframe *)regs->tf_rsp - 1; in linux_rt_sendsig()
172 mtx_unlock(&psp->ps_mtx); in linux_rt_sendsig()
180 frame.sf_siginfo = PTROUT(&fp->sf_si); in linux_rt_sendsig()
181 frame.sf_ucontext = PTROUT(&fp->sf_uc); in linux_rt_sendsig()
184 siginfo_to_lsiginfo(&ksi->ksi_info, &frame.sf_si, sig); in linux_rt_sendsig()
189 frame.sf_uc.uc_stack.ss_sp = PTROUT(td->td_sigstk.ss_sp); in linux_rt_sendsig()
190 frame.sf_uc.uc_stack.ss_size = td->td_sigstk.ss_size; in linux_rt_sendsig()
191 frame.sf_uc.uc_stack.ss_flags = (td->td_pflags & TDP_ALTSTACK) in linux_rt_sendsig()
198 frame.sf_uc.uc_mcontext.sc_edi = regs->tf_rdi; in linux_rt_sendsig()
199 frame.sf_uc.uc_mcontext.sc_esi = regs->tf_rsi; in linux_rt_sendsig()
200 frame.sf_uc.uc_mcontext.sc_ebp = regs->tf_rbp; in linux_rt_sendsig()
201 frame.sf_uc.uc_mcontext.sc_ebx = regs->tf_rbx; in linux_rt_sendsig()
202 frame.sf_uc.uc_mcontext.sc_esp = regs->tf_rsp; in linux_rt_sendsig()
203 frame.sf_uc.uc_mcontext.sc_edx = regs->tf_rdx; in linux_rt_sendsig()
204 frame.sf_uc.uc_mcontext.sc_ecx = regs->tf_rcx; in linux_rt_sendsig()
205 frame.sf_uc.uc_mcontext.sc_eax = regs->tf_rax; in linux_rt_sendsig()
206 frame.sf_uc.uc_mcontext.sc_eip = regs->tf_rip; in linux_rt_sendsig()
207 frame.sf_uc.uc_mcontext.sc_cs = regs->tf_cs; in linux_rt_sendsig()
208 frame.sf_uc.uc_mcontext.sc_gs = regs->tf_gs; in linux_rt_sendsig()
209 frame.sf_uc.uc_mcontext.sc_fs = regs->tf_fs; in linux_rt_sendsig()
210 frame.sf_uc.uc_mcontext.sc_es = regs->tf_es; in linux_rt_sendsig()
211 frame.sf_uc.uc_mcontext.sc_ds = regs->tf_ds; in linux_rt_sendsig()
212 frame.sf_uc.uc_mcontext.sc_eflags = regs->tf_rflags; in linux_rt_sendsig()
213 frame.sf_uc.uc_mcontext.sc_esp_at_signal = regs->tf_rsp; in linux_rt_sendsig()
214 frame.sf_uc.uc_mcontext.sc_ss = regs->tf_ss; in linux_rt_sendsig()
215 frame.sf_uc.uc_mcontext.sc_err = regs->tf_err; in linux_rt_sendsig()
216 frame.sf_uc.uc_mcontext.sc_cr2 = (u_int32_t)(uintptr_t)ksi->ksi_addr; in linux_rt_sendsig()
222 * instruction to halt it in its tracks. in linux_rt_sendsig()
229 regs->tf_rsp = PTROUT(fp); in linux_rt_sendsig()
230 regs->tf_rip = linux32_vdso_rt_sigcode; in linux_rt_sendsig()
231 regs->tf_rdi = PTROUT(catcher); in linux_rt_sendsig()
232 regs->tf_rflags &= ~(PSL_T | PSL_D); in linux_rt_sendsig()
233 regs->tf_cs = _ucode32sel; in linux_rt_sendsig()
234 regs->tf_ss = _udatasel; in linux_rt_sendsig()
235 regs->tf_ds = _udatasel; in linux_rt_sendsig()
236 regs->tf_es = _udatasel; in linux_rt_sendsig()
237 regs->tf_fs = _ufssel; in linux_rt_sendsig()
238 regs->tf_gs = _ugssel; in linux_rt_sendsig()
239 regs->tf_flags = TF_HASSEGS; in linux_rt_sendsig()
240 set_pcb_flags(td->td_pcb, PCB_FULL_IRET); in linux_rt_sendsig()
242 mtx_lock(&psp->ps_mtx); in linux_rt_sendsig()
259 struct proc *p = td->td_proc; in linux_sendsig()
261 struct trapframe *regs; in linux_sendsig() local
267 sig = linux_translate_traps(ksi->ksi_signo, ksi->ksi_trapno); in linux_sendsig()
268 code = ksi->ksi_code; in linux_sendsig()
270 psp = p->p_sigacts; in linux_sendsig()
271 mtx_assert(&psp->ps_mtx, MA_OWNED); in linux_sendsig()
272 if (SIGISMEMBER(psp->ps_siginfo, sig)) { in linux_sendsig()
278 regs = td->td_frame; in linux_sendsig()
279 oonstack = sigonstack(regs->tf_rsp); in linux_sendsig()
282 if ((td->td_pflags & TDP_ALTSTACK) && !oonstack && in linux_sendsig()
283 SIGISMEMBER(psp->ps_sigonstack, sig)) { in linux_sendsig()
284 fp = (struct l_sigframe *)((uintptr_t)td->td_sigstk.ss_sp + in linux_sendsig()
285 td->td_sigstk.ss_size - sizeof(struct l_sigframe)); in linux_sendsig()
287 fp = (struct l_sigframe *)regs->tf_rsp - 1; in linux_sendsig()
288 mtx_unlock(&psp->ps_mtx); in linux_sendsig()
302 frame.sf_sc.sc_gs = regs->tf_gs; in linux_sendsig()
303 frame.sf_sc.sc_fs = regs->tf_fs; in linux_sendsig()
304 frame.sf_sc.sc_es = regs->tf_es; in linux_sendsig()
305 frame.sf_sc.sc_ds = regs->tf_ds; in linux_sendsig()
306 frame.sf_sc.sc_edi = regs->tf_rdi; in linux_sendsig()
307 frame.sf_sc.sc_esi = regs->tf_rsi; in linux_sendsig()
308 frame.sf_sc.sc_ebp = regs->tf_rbp; in linux_sendsig()
309 frame.sf_sc.sc_ebx = regs->tf_rbx; in linux_sendsig()
310 frame.sf_sc.sc_esp = regs->tf_rsp; in linux_sendsig()
311 frame.sf_sc.sc_edx = regs->tf_rdx; in linux_sendsig()
312 frame.sf_sc.sc_ecx = regs->tf_rcx; in linux_sendsig()
313 frame.sf_sc.sc_eax = regs->tf_rax; in linux_sendsig()
314 frame.sf_sc.sc_eip = regs->tf_rip; in linux_sendsig()
315 frame.sf_sc.sc_cs = regs->tf_cs; in linux_sendsig()
316 frame.sf_sc.sc_eflags = regs->tf_rflags; in linux_sendsig()
317 frame.sf_sc.sc_esp_at_signal = regs->tf_rsp; in linux_sendsig()
318 frame.sf_sc.sc_ss = regs->tf_ss; in linux_sendsig()
319 frame.sf_sc.sc_err = regs->tf_err; in linux_sendsig()
320 frame.sf_sc.sc_cr2 = (u_int32_t)(uintptr_t)ksi->ksi_addr; in linux_sendsig()
326 * instruction to halt it in its tracks. in linux_sendsig()
333 regs->tf_rsp = PTROUT(fp); in linux_sendsig()
334 regs->tf_rip = linux32_vdso_sigcode; in linux_sendsig()
335 regs->tf_rdi = PTROUT(catcher); in linux_sendsig()
336 regs->tf_rflags &= ~(PSL_T | PSL_D); in linux_sendsig()
337 regs->tf_cs = _ucode32sel; in linux_sendsig()
338 regs->tf_ss = _udatasel; in linux_sendsig()
339 regs->tf_ds = _udatasel; in linux_sendsig()
340 regs->tf_es = _udatasel; in linux_sendsig()
341 regs->tf_fs = _ufssel; in linux_sendsig()
342 regs->tf_gs = _ugssel; in linux_sendsig()
343 regs->tf_flags = TF_HASSEGS; in linux_sendsig()
344 set_pcb_flags(td->td_pcb, PCB_FULL_IRET); in linux_sendsig()
346 mtx_lock(&psp->ps_mtx); in linux_sendsig()
363 struct trapframe *regs; in linux_sigreturn() local
367 regs = td->td_frame; in linux_sigreturn()
374 if (copyin(args->sfp, &frame, sizeof(frame)) != 0) in linux_sigreturn()
379 if (!EFL_SECURE(eflags, regs->tf_rflags)) in linux_sigreturn()
392 ksi.ksi_addr = (void *)regs->tf_rip; in linux_sigreturn()
400 regs->tf_rdi = frame.sf_sc.sc_edi; in linux_sigreturn()
401 regs->tf_rsi = frame.sf_sc.sc_esi; in linux_sigreturn()
402 regs->tf_rbp = frame.sf_sc.sc_ebp; in linux_sigreturn()
403 regs->tf_rbx = frame.sf_sc.sc_ebx; in linux_sigreturn()
404 regs->tf_rdx = frame.sf_sc.sc_edx; in linux_sigreturn()
405 regs->tf_rcx = frame.sf_sc.sc_ecx; in linux_sigreturn()
406 regs->tf_rax = frame.sf_sc.sc_eax; in linux_sigreturn()
407 regs->tf_rip = frame.sf_sc.sc_eip; in linux_sigreturn()
408 regs->tf_cs = frame.sf_sc.sc_cs; in linux_sigreturn()
409 regs->tf_ds = frame.sf_sc.sc_ds; in linux_sigreturn()
410 regs->tf_es = frame.sf_sc.sc_es; in linux_sigreturn()
411 regs->tf_fs = frame.sf_sc.sc_fs; in linux_sigreturn()
412 regs->tf_gs = frame.sf_sc.sc_gs; in linux_sigreturn()
413 regs->tf_rflags = eflags; in linux_sigreturn()
414 regs->tf_rsp = frame.sf_sc.sc_esp_at_signal; in linux_sigreturn()
415 regs->tf_ss = frame.sf_sc.sc_ss; in linux_sigreturn()
416 set_pcb_flags(td->td_pcb, PCB_FULL_IRET); in linux_sigreturn()
439 struct trapframe *regs; in linux_rt_sigreturn() local
443 regs = td->td_frame; in linux_rt_sigreturn()
450 if (copyin(args->ucp, &uc, sizeof(uc)) != 0) in linux_rt_sigreturn()
456 eflags = context->sc_eflags; in linux_rt_sigreturn()
457 if (!EFL_SECURE(eflags, regs->tf_rflags)) in linux_rt_sigreturn()
465 if (!CS_SECURE(context->sc_cs)) { in linux_rt_sigreturn()
470 ksi.ksi_addr = (void *)regs->tf_rip; in linux_rt_sigreturn()
481 regs->tf_gs = context->sc_gs; in linux_rt_sigreturn()
482 regs->tf_fs = context->sc_fs; in linux_rt_sigreturn()
483 regs->tf_es = context->sc_es; in linux_rt_sigreturn()
484 regs->tf_ds = context->sc_ds; in linux_rt_sigreturn()
485 regs->tf_rdi = context->sc_edi; in linux_rt_sigreturn()
486 regs->tf_rsi = context->sc_esi; in linux_rt_sigreturn()
487 regs->tf_rbp = context->sc_ebp; in linux_rt_sigreturn()
488 regs->tf_rbx = context->sc_ebx; in linux_rt_sigreturn()
489 regs->tf_rdx = context->sc_edx; in linux_rt_sigreturn()
490 regs->tf_rcx = context->sc_ecx; in linux_rt_sigreturn()
491 regs->tf_rax = context->sc_eax; in linux_rt_sigreturn()
492 regs->tf_rip = context->sc_eip; in linux_rt_sigreturn()
493 regs->tf_cs = context->sc_cs; in linux_rt_sigreturn()
494 regs->tf_rflags = eflags; in linux_rt_sigreturn()
495 regs->tf_rsp = context->sc_esp_at_signal; in linux_rt_sigreturn()
496 regs->tf_ss = context->sc_ss; in linux_rt_sigreturn()
497 set_pcb_flags(td->td_pcb, PCB_FULL_IRET); in linux_rt_sigreturn()
503 ss.ss_sp = PTRIN(lss->ss_sp); in linux_rt_sigreturn()
504 ss.ss_size = lss->ss_size; in linux_rt_sigreturn()
505 ss.ss_flags = linux_to_bsd_sigaltstack(lss->ss_flags); in linux_rt_sigreturn()
519 p = td->td_proc; in linux32_fetch_syscall_args()
520 frame = td->td_frame; in linux32_fetch_syscall_args()
521 sa = &td->td_sa; in linux32_fetch_syscall_args()
523 sa->args[0] = frame->tf_rbx; in linux32_fetch_syscall_args()
524 sa->args[1] = frame->tf_rcx; in linux32_fetch_syscall_args()
525 sa->args[2] = frame->tf_rdx; in linux32_fetch_syscall_args()
526 sa->args[3] = frame->tf_rsi; in linux32_fetch_syscall_args()
527 sa->args[4] = frame->tf_rdi; in linux32_fetch_syscall_args()
528 sa->args[5] = frame->tf_rbp; in linux32_fetch_syscall_args()
529 sa->code = frame->tf_rax; in linux32_fetch_syscall_args()
530 sa->original_code = sa->code; in linux32_fetch_syscall_args()
532 if (sa->code >= p->p_sysent->sv_size) in linux32_fetch_syscall_args()
534 sa->callp = &nosys_sysent; in linux32_fetch_syscall_args()
536 sa->callp = &p->p_sysent->sv_table[sa->code]; in linux32_fetch_syscall_args()
538 td->td_retval[0] = 0; in linux32_fetch_syscall_args()
539 td->td_retval[1] = frame->tf_rdx; in linux32_fetch_syscall_args()
547 struct trapframe *frame = td->td_frame; in linux32_set_syscall_retval()
553 frame->tf_rax = bsd_to_linux_errno(error); in linux32_set_syscall_retval()
560 struct trapframe *frame = td->td_frame; in linux32_set_fork_retval()
562 frame->tf_rax = 0; in linux32_set_fork_retval()
573 struct trapframe *regs = td->td_frame; in linux_exec_setregs() local
574 struct pcb *pcb = td->td_pcb; in linux_exec_setregs()
577 regs = td->td_frame; in linux_exec_setregs()
578 pcb = td->td_pcb; in linux_exec_setregs()
580 if (td->td_proc->p_md.md_ldt != NULL) in linux_exec_setregs()
586 pcb->pcb_fsbase = 0; in linux_exec_setregs()
587 pcb->pcb_gsbase = 0; in linux_exec_setregs()
589 pcb->pcb_initial_fpucw = __LINUX_NPXCW__; in linux_exec_setregs()
591 saved_rflags = regs->tf_rflags & PSL_T; in linux_exec_setregs()
592 bzero((char *)regs, sizeof(struct trapframe)); in linux_exec_setregs()
593 regs->tf_rip = imgp->entry_addr; in linux_exec_setregs()
594 regs->tf_rsp = stack; in linux_exec_setregs()
595 regs->tf_rflags = PSL_USER | saved_rflags; in linux_exec_setregs()
596 regs->tf_gs = _ugssel; in linux_exec_setregs()
597 regs->tf_fs = _ufssel; in linux_exec_setregs()
598 regs->tf_es = _udatasel; in linux_exec_setregs()
599 regs->tf_ds = _udatasel; in linux_exec_setregs()
600 regs->tf_ss = _udatasel; in linux_exec_setregs()
601 regs->tf_flags = TF_HASSEGS; in linux_exec_setregs()
602 regs->tf_cs = _ucode32sel; in linux_exec_setregs()
603 regs->tf_rbx = (register_t)imgp->ps_strings; in linux_exec_setregs()
627 arginfo = (struct linux32_ps_strings *)PROC_PS_STRINGS(imgp->proc); in linux_copyout_strings()
630 if (imgp->execpath != NULL && imgp->auxargs != NULL) { in linux_copyout_strings()
631 execpath_len = strlen(imgp->execpath) + 1; in linux_copyout_strings()
632 destp -= execpath_len; in linux_copyout_strings()
634 imgp->execpathp = (void *)destp; in linux_copyout_strings()
635 error = copyout(imgp->execpath, imgp->execpathp, execpath_len); in linux_copyout_strings()
642 destp -= roundup(sizeof(canary), sizeof(uint32_t)); in linux_copyout_strings()
643 imgp->canary = (void *)destp; in linux_copyout_strings()
644 error = copyout(canary, imgp->canary, sizeof(canary)); in linux_copyout_strings()
649 destp -= ARG_MAX - imgp->args->stringspace; in linux_copyout_strings()
653 if (imgp->auxargs) { in linux_copyout_strings()
658 destp -= LINUX_AT_COUNT * sizeof(Elf32_Auxinfo); in linux_copyout_strings()
668 vectp -= imgp->args->argc + 1 + imgp->args->envc + 1; in linux_copyout_strings()
673 stringp = imgp->args->begin_argv; in linux_copyout_strings()
674 argc = imgp->args->argc; in linux_copyout_strings()
675 envc = imgp->args->envc; in linux_copyout_strings()
677 /* Copy out strings - arguments and environment. */ in linux_copyout_strings()
679 ARG_MAX - imgp->args->stringspace); in linux_copyout_strings()
684 if (suword32(&arginfo->ps_argvstr, (uint32_t)(intptr_t)vectp) != 0 || in linux_copyout_strings()
685 suword32(&arginfo->ps_nargvstr, argc) != 0) in linux_copyout_strings()
689 for (; argc > 0; --argc) { in linux_copyout_strings()
701 if (suword32(&arginfo->ps_envstr, (uint32_t)(intptr_t)vectp) != 0 || in linux_copyout_strings()
702 suword32(&arginfo->ps_nenvstr, envc) != 0) in linux_copyout_strings()
706 for (; envc > 0; --envc) { in linux_copyout_strings()
718 if (imgp->auxargs) { in linux_copyout_strings()
720 error = imgp->sysent->sv_copyout_auxargs(imgp, in linux_copyout_strings()
730 "32-bit Linux emulation");
752 if (rl->rlim_cur > linux32_maxdsiz) in linux32_fixlimit()
753 rl->rlim_cur = linux32_maxdsiz; in linux32_fixlimit()
754 if (rl->rlim_max > linux32_maxdsiz) in linux32_fixlimit()
755 rl->rlim_max = linux32_maxdsiz; in linux32_fixlimit()
760 if (rl->rlim_cur > linux32_maxssiz) in linux32_fixlimit()
761 rl->rlim_cur = linux32_maxssiz; in linux32_fixlimit()
762 if (rl->rlim_max > linux32_maxssiz) in linux32_fixlimit()
763 rl->rlim_max = linux32_maxssiz; in linux32_fixlimit()
768 if (rl->rlim_cur > linux32_maxvmem) in linux32_fixlimit()
769 rl->rlim_cur = linux32_maxvmem; in linux32_fixlimit()
770 if (rl->rlim_max > linux32_maxvmem) in linux32_fixlimit()
771 rl->rlim_max = linux32_maxvmem; in linux32_fixlimit()
847 tkoff = kern_timekeep_base - linux_vdso_base; in linux_exec_sysvec_init()
849 *ktimekeep_base = sv->sv_shared_page_base + sv->sv_timekeep_offset; in linux_exec_sysvec_init()
851 tkoff = kern_tsc_selector - linux_vdso_base; in linux_exec_sysvec_init()
857 tkoff = kern_cpu_selector - linux_vdso_base; in linux_exec_sysvec_init()
872 linux_szsigcode = vdso_end - vdso_start; in linux_vdso_install()
913 shdr = (const Elf_Shdr *)(mapping + ehdr->e_shoff); in linux_vdso_reloc()
914 for (i = 0; i < ehdr->e_shnum; i++) in linux_vdso_reloc()
928 where = (Elf32_Addr *)(mapping + rel->r_offset); in linux_vdso_reloc()
930 rtype = ELF_R_TYPE(rel->r_info); in linux_vdso_reloc()
931 symidx = ELF_R_SYM(rel->r_info); in linux_vdso_reloc()
967 .interp_path = "/lib/ld-linux.so.1",
978 .interp_path = "/lib/ld-linux.so.2",
989 .interp_path = "/lib/ld-musl-i386.so.1",