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

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 1994-1996 Søren Schmidt
78 #define LINUX_VDSOPAGE (VM_MAXUSER_ADDRESS - LINUX_VDSOPAGE_SIZE)
79 #define LINUX_SHAREDPAGE (LINUX_VDSOPAGE - PAGE_SIZE)
81 * PAGE_SIZE - the size
85 #define LINUX_PS_STRINGS (LINUX_USRSTACK - sizeof(struct ps_strings))
127 envp = base + (imgp->args->argc + 1); in linux_fixup()
128 base--; in linux_fixup()
131 base--; in linux_fixup()
134 base--; in linux_fixup()
135 if (suword(base, imgp->args->argc) != 0) in linux_fixup()
156 struct proc *p = td->td_proc; in linux_rt_sendsig()
158 struct trapframe *regs; in linux_rt_sendsig() local
163 sig = linux_translate_traps(ksi->ksi_signo, ksi->ksi_trapno); in linux_rt_sendsig()
164 code = ksi->ksi_code; in linux_rt_sendsig()
166 psp = p->p_sigacts; in linux_rt_sendsig()
167 mtx_assert(&psp->ps_mtx, MA_OWNED); in linux_rt_sendsig()
168 regs = td->td_frame; in linux_rt_sendsig()
169 oonstack = sigonstack(regs->tf_esp); in linux_rt_sendsig()
172 if ((td->td_pflags & TDP_ALTSTACK) && !oonstack && in linux_rt_sendsig()
173 SIGISMEMBER(psp->ps_sigonstack, sig)) { in linux_rt_sendsig()
174 fp = (struct l_rt_sigframe *)((uintptr_t)td->td_sigstk.ss_sp + in linux_rt_sendsig()
175 td->td_sigstk.ss_size - sizeof(struct l_rt_sigframe)); in linux_rt_sendsig()
177 fp = (struct l_rt_sigframe *)regs->tf_esp - 1; in linux_rt_sendsig()
178 mtx_unlock(&psp->ps_mtx); in linux_rt_sendsig()
186 frame.sf_siginfo = PTROUT(&fp->sf_si); in linux_rt_sendsig()
187 frame.sf_ucontext = PTROUT(&fp->sf_uc); in linux_rt_sendsig()
190 siginfo_to_lsiginfo(&ksi->ksi_info, &frame.sf_si, sig); in linux_rt_sendsig()
193 frame.sf_uc.uc_stack.ss_sp = PTROUT(td->td_sigstk.ss_sp); in linux_rt_sendsig()
194 frame.sf_uc.uc_stack.ss_size = td->td_sigstk.ss_size; in linux_rt_sendsig()
195 frame.sf_uc.uc_stack.ss_flags = (td->td_pflags & TDP_ALTSTACK) in linux_rt_sendsig()
203 frame.sf_uc.uc_mcontext.sc_fs = regs->tf_fs; in linux_rt_sendsig()
204 frame.sf_uc.uc_mcontext.sc_es = regs->tf_es; in linux_rt_sendsig()
205 frame.sf_uc.uc_mcontext.sc_ds = regs->tf_ds; in linux_rt_sendsig()
206 frame.sf_uc.uc_mcontext.sc_edi = regs->tf_edi; in linux_rt_sendsig()
207 frame.sf_uc.uc_mcontext.sc_esi = regs->tf_esi; in linux_rt_sendsig()
208 frame.sf_uc.uc_mcontext.sc_ebp = regs->tf_ebp; in linux_rt_sendsig()
209 frame.sf_uc.uc_mcontext.sc_ebx = regs->tf_ebx; in linux_rt_sendsig()
210 frame.sf_uc.uc_mcontext.sc_esp = regs->tf_esp; in linux_rt_sendsig()
211 frame.sf_uc.uc_mcontext.sc_edx = regs->tf_edx; in linux_rt_sendsig()
212 frame.sf_uc.uc_mcontext.sc_ecx = regs->tf_ecx; in linux_rt_sendsig()
213 frame.sf_uc.uc_mcontext.sc_eax = regs->tf_eax; in linux_rt_sendsig()
214 frame.sf_uc.uc_mcontext.sc_eip = regs->tf_eip; in linux_rt_sendsig()
215 frame.sf_uc.uc_mcontext.sc_cs = regs->tf_cs; in linux_rt_sendsig()
216 frame.sf_uc.uc_mcontext.sc_eflags = regs->tf_eflags; in linux_rt_sendsig()
217 frame.sf_uc.uc_mcontext.sc_esp_at_signal = regs->tf_esp; in linux_rt_sendsig()
218 frame.sf_uc.uc_mcontext.sc_ss = regs->tf_ss; in linux_rt_sendsig()
219 frame.sf_uc.uc_mcontext.sc_err = regs->tf_err; in linux_rt_sendsig()
220 frame.sf_uc.uc_mcontext.sc_cr2 = (register_t)ksi->ksi_addr; in linux_rt_sendsig()
226 * instruction to halt it in its tracks. in linux_rt_sendsig()
233 regs->tf_esp = PTROUT(fp); in linux_rt_sendsig()
234 regs->tf_eip = linux_vdso_rt_sigcode; in linux_rt_sendsig()
235 regs->tf_edi = PTROUT(catcher); in linux_rt_sendsig()
236 regs->tf_eflags &= ~(PSL_T | PSL_VM | PSL_D); in linux_rt_sendsig()
237 regs->tf_cs = _ucodesel; in linux_rt_sendsig()
238 regs->tf_ds = _udatasel; in linux_rt_sendsig()
239 regs->tf_es = _udatasel; in linux_rt_sendsig()
240 regs->tf_fs = _udatasel; in linux_rt_sendsig()
241 regs->tf_ss = _udatasel; in linux_rt_sendsig()
243 mtx_lock(&psp->ps_mtx); in linux_rt_sendsig()
260 struct proc *p = td->td_proc; in linux_sendsig()
262 struct trapframe *regs; in linux_sendsig() local
269 psp = p->p_sigacts; in linux_sendsig()
270 sig = linux_translate_traps(ksi->ksi_signo, ksi->ksi_trapno); in linux_sendsig()
271 mtx_assert(&psp->ps_mtx, MA_OWNED); in linux_sendsig()
272 if (SIGISMEMBER(psp->ps_siginfo, sig)) { in linux_sendsig()
277 regs = td->td_frame; in linux_sendsig()
278 oonstack = sigonstack(regs->tf_esp); in linux_sendsig()
281 if ((td->td_pflags & TDP_ALTSTACK) && !oonstack && in linux_sendsig()
282 SIGISMEMBER(psp->ps_sigonstack, sig)) { in linux_sendsig()
283 fp = (struct l_sigframe *)((uintptr_t)td->td_sigstk.ss_sp + in linux_sendsig()
284 td->td_sigstk.ss_size - sizeof(struct l_sigframe)); in linux_sendsig()
286 fp = (struct l_sigframe *)regs->tf_esp - 1; in linux_sendsig()
287 mtx_unlock(&psp->ps_mtx); in linux_sendsig()
302 frame.sf_sc.sc_fs = regs->tf_fs; in linux_sendsig()
303 frame.sf_sc.sc_es = regs->tf_es; in linux_sendsig()
304 frame.sf_sc.sc_ds = regs->tf_ds; in linux_sendsig()
305 frame.sf_sc.sc_edi = regs->tf_edi; in linux_sendsig()
306 frame.sf_sc.sc_esi = regs->tf_esi; in linux_sendsig()
307 frame.sf_sc.sc_ebp = regs->tf_ebp; in linux_sendsig()
308 frame.sf_sc.sc_ebx = regs->tf_ebx; in linux_sendsig()
309 frame.sf_sc.sc_esp = regs->tf_esp; in linux_sendsig()
310 frame.sf_sc.sc_edx = regs->tf_edx; in linux_sendsig()
311 frame.sf_sc.sc_ecx = regs->tf_ecx; in linux_sendsig()
312 frame.sf_sc.sc_eax = regs->tf_eax; in linux_sendsig()
313 frame.sf_sc.sc_eip = regs->tf_eip; in linux_sendsig()
314 frame.sf_sc.sc_cs = regs->tf_cs; in linux_sendsig()
315 frame.sf_sc.sc_eflags = regs->tf_eflags; in linux_sendsig()
316 frame.sf_sc.sc_esp_at_signal = regs->tf_esp; in linux_sendsig()
317 frame.sf_sc.sc_ss = regs->tf_ss; in linux_sendsig()
318 frame.sf_sc.sc_err = regs->tf_err; in linux_sendsig()
319 frame.sf_sc.sc_cr2 = (register_t)ksi->ksi_addr; in linux_sendsig()
320 frame.sf_sc.sc_trapno = bsd_to_linux_trapcode(ksi->ksi_trapno); in linux_sendsig()
325 * instruction to halt it in its tracks. in linux_sendsig()
332 regs->tf_esp = PTROUT(fp); in linux_sendsig()
333 regs->tf_eip = linux_vdso_sigcode; in linux_sendsig()
334 regs->tf_edi = PTROUT(catcher); in linux_sendsig()
335 regs->tf_eflags &= ~(PSL_T | PSL_VM | PSL_D); in linux_sendsig()
336 regs->tf_cs = _ucodesel; in linux_sendsig()
337 regs->tf_ds = _udatasel; in linux_sendsig()
338 regs->tf_es = _udatasel; in linux_sendsig()
339 regs->tf_fs = _udatasel; in linux_sendsig()
340 regs->tf_ss = _udatasel; in linux_sendsig()
342 mtx_lock(&psp->ps_mtx); in linux_sendsig()
359 struct trapframe *regs; in linux_sigreturn() local
363 regs = td->td_frame; in linux_sigreturn()
370 if (copyin(args->sfp, &frame, sizeof(frame)) != 0) in linux_sigreturn()
376 if (!EFLAGS_SECURE(eflags, regs->tf_eflags)) in linux_sigreturn()
390 ksi.ksi_addr = (void *)regs->tf_eip; in linux_sigreturn()
399 regs->tf_fs = frame.sf_sc.sc_fs; in linux_sigreturn()
400 regs->tf_es = frame.sf_sc.sc_es; in linux_sigreturn()
401 regs->tf_ds = frame.sf_sc.sc_ds; in linux_sigreturn()
402 regs->tf_edi = frame.sf_sc.sc_edi; in linux_sigreturn()
403 regs->tf_esi = frame.sf_sc.sc_esi; in linux_sigreturn()
404 regs->tf_ebp = frame.sf_sc.sc_ebp; in linux_sigreturn()
405 regs->tf_ebx = frame.sf_sc.sc_ebx; in linux_sigreturn()
406 regs->tf_edx = frame.sf_sc.sc_edx; in linux_sigreturn()
407 regs->tf_ecx = frame.sf_sc.sc_ecx; in linux_sigreturn()
408 regs->tf_eax = frame.sf_sc.sc_eax; in linux_sigreturn()
409 regs->tf_eip = frame.sf_sc.sc_eip; in linux_sigreturn()
410 regs->tf_cs = frame.sf_sc.sc_cs; in linux_sigreturn()
411 regs->tf_eflags = eflags; in linux_sigreturn()
412 regs->tf_esp = frame.sf_sc.sc_esp_at_signal; in linux_sigreturn()
413 regs->tf_ss = frame.sf_sc.sc_ss; in linux_sigreturn()
436 struct trapframe *regs; in linux_rt_sigreturn() local
440 regs = td->td_frame; in linux_rt_sigreturn()
447 if (copyin(args->ucp, &uc, sizeof(uc)) != 0) in linux_rt_sigreturn()
454 eflags = context->sc_eflags; in linux_rt_sigreturn()
455 if (!EFLAGS_SECURE(eflags, regs->tf_eflags)) in linux_rt_sigreturn()
464 if (!CS_SECURE(context->sc_cs)) { in linux_rt_sigreturn()
469 ksi.ksi_addr = (void *)regs->tf_eip; in linux_rt_sigreturn()
479 regs->tf_fs = context->sc_fs; in linux_rt_sigreturn()
480 regs->tf_es = context->sc_es; in linux_rt_sigreturn()
481 regs->tf_ds = context->sc_ds; in linux_rt_sigreturn()
482 regs->tf_edi = context->sc_edi; in linux_rt_sigreturn()
483 regs->tf_esi = context->sc_esi; in linux_rt_sigreturn()
484 regs->tf_ebp = context->sc_ebp; in linux_rt_sigreturn()
485 regs->tf_ebx = context->sc_ebx; in linux_rt_sigreturn()
486 regs->tf_edx = context->sc_edx; in linux_rt_sigreturn()
487 regs->tf_ecx = context->sc_ecx; in linux_rt_sigreturn()
488 regs->tf_eax = context->sc_eax; in linux_rt_sigreturn()
489 regs->tf_eip = context->sc_eip; in linux_rt_sigreturn()
490 regs->tf_cs = context->sc_cs; in linux_rt_sigreturn()
491 regs->tf_eflags = eflags; in linux_rt_sigreturn()
492 regs->tf_esp = context->sc_esp_at_signal; in linux_rt_sigreturn()
493 regs->tf_ss = context->sc_ss; in linux_rt_sigreturn()
497 ss.ss_sp = PTRIN(lss->ss_sp); in linux_rt_sigreturn()
498 ss.ss_size = lss->ss_size; in linux_rt_sigreturn()
499 ss.ss_flags = linux_to_bsd_sigaltstack(lss->ss_flags); in linux_rt_sigreturn()
513 p = td->td_proc; in linux_fetch_syscall_args()
514 frame = td->td_frame; in linux_fetch_syscall_args()
515 sa = &td->td_sa; in linux_fetch_syscall_args()
517 sa->code = frame->tf_eax; in linux_fetch_syscall_args()
518 sa->original_code = sa->code; in linux_fetch_syscall_args()
519 sa->args[0] = frame->tf_ebx; in linux_fetch_syscall_args()
520 sa->args[1] = frame->tf_ecx; in linux_fetch_syscall_args()
521 sa->args[2] = frame->tf_edx; in linux_fetch_syscall_args()
522 sa->args[3] = frame->tf_esi; in linux_fetch_syscall_args()
523 sa->args[4] = frame->tf_edi; in linux_fetch_syscall_args()
524 sa->args[5] = frame->tf_ebp; in linux_fetch_syscall_args()
526 if (sa->code >= p->p_sysent->sv_size) in linux_fetch_syscall_args()
528 sa->callp = &nosys_sysent; in linux_fetch_syscall_args()
530 sa->callp = &p->p_sysent->sv_table[sa->code]; in linux_fetch_syscall_args()
532 td->td_retval[0] = 0; in linux_fetch_syscall_args()
533 td->td_retval[1] = frame->tf_edx; in linux_fetch_syscall_args()
541 struct trapframe *frame = td->td_frame; in linux_set_syscall_retval()
547 frame->tf_eax = bsd_to_linux_errno(error); in linux_set_syscall_retval()
554 struct trapframe *frame = td->td_frame; in linux_set_fork_retval()
556 frame->tf_eax = 0; in linux_set_fork_retval()
568 struct pcb *pcb = td->td_pcb; in linux_exec_setregs()
573 pcb->pcb_gs = 0; in linux_exec_setregs()
576 pcb->pcb_initial_npxcw = __LINUX_NPXCW__; in linux_exec_setregs()
688 tkoff = kern_timekeep_base - linux_vdso_base; in linux_exec_sysvec_init()
690 *ktimekeep_base = sv->sv_shared_page_base + sv->sv_timekeep_offset; in linux_exec_sysvec_init()
692 tkoff = kern_tsc_selector - linux_vdso_base; in linux_exec_sysvec_init()
698 tkoff = kern_cpu_selector - linux_vdso_base; in linux_exec_sysvec_init()
713 linux_szsigcode = vdso_end - vdso_start; in linux_vdso_install()
754 shdr = (const Elf_Shdr *)(mapping + ehdr->e_shoff); in linux_vdso_reloc()
755 for (i = 0; i < ehdr->e_shnum; i++) in linux_vdso_reloc()
769 where = (Elf_Addr *)(mapping + rel->r_offset); in linux_vdso_reloc()
771 rtype = ELF_R_TYPE(rel->r_info); in linux_vdso_reloc()
772 symidx = ELF_R_SYM(rel->r_info); in linux_vdso_reloc()
808 .interp_path = "/lib/ld-linux.so.1",
819 .interp_path = "/lib/ld-linux.so.2",
830 .interp_path = "/lib/ld-musl-i386.so.1",