Changeset View
Changeset View
Standalone View
Standalone View
sys/amd64/linux/linux_sysvec.c
Show First 20 Lines • Show All 624 Lines • ▼ Show 20 Lines | linux_rt_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask) | ||||
code = ksi->ksi_code; | code = ksi->ksi_code; | ||||
mtx_assert(&psp->ps_mtx, MA_OWNED); | mtx_assert(&psp->ps_mtx, MA_OWNED); | ||||
regs = td->td_frame; | regs = td->td_frame; | ||||
oonstack = sigonstack(regs->tf_rsp); | oonstack = sigonstack(regs->tf_rsp); | ||||
LINUX_CTR4(rt_sendsig, "%p, %d, %p, %u", | LINUX_CTR4(rt_sendsig, "%p, %d, %p, %u", | ||||
catcher, sig, mask, code); | catcher, sig, mask, code); | ||||
/* Translate the signal. */ | |||||
sig = bsd_to_linux_signal(sig); | |||||
/* Save user context. */ | /* Save user context. */ | ||||
bzero(&sf, sizeof(sf)); | bzero(&sf, sizeof(sf)); | ||||
bsd_to_linux_sigset(mask, &sf.sf_sc.uc_sigmask); | bsd_to_linux_sigset(mask, &sf.sf_sc.uc_sigmask); | ||||
bsd_to_linux_sigset(mask, &sf.sf_sc.uc_mcontext.sc_mask); | bsd_to_linux_sigset(mask, &sf.sf_sc.uc_mcontext.sc_mask); | ||||
sf.sf_sc.uc_stack.ss_sp = PTROUT(td->td_sigstk.ss_sp); | sf.sf_sc.uc_stack.ss_sp = PTROUT(td->td_sigstk.ss_sp); | ||||
sf.sf_sc.uc_stack.ss_size = td->td_sigstk.ss_size; | sf.sf_sc.uc_stack.ss_size = td->td_sigstk.ss_size; | ||||
sf.sf_sc.uc_stack.ss_flags = (td->td_pflags & TDP_ALTSTACK) | sf.sf_sc.uc_stack.ss_flags = (td->td_pflags & TDP_ALTSTACK) | ||||
Show All 26 Lines | linux_rt_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask) | ||||
if ((td->td_pflags & TDP_ALTSTACK) != 0 && !oonstack && | if ((td->td_pflags & TDP_ALTSTACK) != 0 && !oonstack && | ||||
SIGISMEMBER(psp->ps_sigonstack, sig)) { | SIGISMEMBER(psp->ps_sigonstack, sig)) { | ||||
sp = (caddr_t)td->td_sigstk.ss_sp + td->td_sigstk.ss_size - | sp = (caddr_t)td->td_sigstk.ss_sp + td->td_sigstk.ss_size - | ||||
sizeof(struct l_rt_sigframe); | sizeof(struct l_rt_sigframe); | ||||
} else | } else | ||||
sp = (caddr_t)regs->tf_rsp - sizeof(struct l_rt_sigframe) - 128; | sp = (caddr_t)regs->tf_rsp - sizeof(struct l_rt_sigframe) - 128; | ||||
/* Align to 16 bytes. */ | /* Align to 16 bytes. */ | ||||
sfp = (struct l_rt_sigframe *)((unsigned long)sp & ~0xFul); | sfp = (struct l_rt_sigframe *)((unsigned long)sp & ~0xFul); | ||||
/* Translate the signal. */ | |||||
sig = bsd_to_linux_signal(sig); | |||||
/* Build the argument list for the signal handler. */ | /* Build the argument list for the signal handler. */ | ||||
regs->tf_rdi = sig; /* arg 1 in %rdi */ | regs->tf_rdi = sig; /* arg 1 in %rdi */ | ||||
regs->tf_rax = 0; | regs->tf_rax = 0; | ||||
regs->tf_rsi = (register_t)&sfp->sf_si; /* arg 2 in %rsi */ | regs->tf_rsi = (register_t)&sfp->sf_si; /* arg 2 in %rsi */ | ||||
regs->tf_rdx = (register_t)&sfp->sf_sc; /* arg 3 in %rdx */ | regs->tf_rdx = (register_t)&sfp->sf_sc; /* arg 3 in %rdx */ | ||||
/* Fill in POSIX parts. */ | /* Fill in POSIX parts. */ | ||||
▲ Show 20 Lines • Show All 377 Lines • Show Last 20 Lines |