Introduce the PROC_SIGCODE() macro
Use a getter macro instead of fetching the sigcode address directly from a sysent of a given process. It assumes that the sigcode is stored in the shared page, which is true in all cases, except for a.out binaries. This will be later useful when the shared page address randomization is introduced. No functional change intended. Approved by: mw(mentor) Sponsored by: Stormshield Obtained from: Semihalf Reviewed by: kib Differential Revision: https://reviews.freebsd.org/D35392
This commit is contained in:
parent
ddd9004e7a
commit
f6ac79fb12
@ -203,7 +203,7 @@ sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask)
|
||||
|
||||
fpstate_drop(td);
|
||||
regs->tf_rsp = (long)sfp;
|
||||
regs->tf_rip = p->p_sysent->sv_sigcode_base;
|
||||
regs->tf_rip = PROC_SIGCODE(p);
|
||||
regs->tf_rflags &= ~(PSL_T | PSL_D);
|
||||
regs->tf_cs = _ucodesel;
|
||||
regs->tf_ds = _udatasel;
|
||||
|
@ -535,7 +535,7 @@ freebsd4_ia32_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask)
|
||||
}
|
||||
|
||||
regs->tf_rsp = (uintptr_t)sfp;
|
||||
regs->tf_rip = p->p_sysent->sv_sigcode_base +
|
||||
regs->tf_rip = PROC_SIGCODE(p) +
|
||||
VDSO_FREEBSD4_IA32_SIGCODE_OFFSET - VDSO_IA32_SIGCODE_OFFSET;
|
||||
regs->tf_rflags &= ~(PSL_T | PSL_D);
|
||||
regs->tf_cs = _ucode32sel;
|
||||
@ -670,7 +670,7 @@ ia32_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask)
|
||||
|
||||
fpstate_drop(td);
|
||||
regs->tf_rsp = (uintptr_t)sfp;
|
||||
regs->tf_rip = p->p_sysent->sv_sigcode_base;
|
||||
regs->tf_rip = PROC_SIGCODE(p);
|
||||
regs->tf_rflags &= ~(PSL_T | PSL_D);
|
||||
regs->tf_cs = _ucode32sel;
|
||||
regs->tf_ss = _udatasel;
|
||||
|
@ -347,7 +347,7 @@ sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask)
|
||||
tf->tf_usr_sp = (register_t)fp;
|
||||
sysent = p->p_sysent;
|
||||
if (sysent->sv_sigcode_base != 0)
|
||||
tf->tf_usr_lr = (register_t)sysent->sv_sigcode_base;
|
||||
tf->tf_usr_lr = (register_t)PROC_SIGCODE(p);
|
||||
else
|
||||
tf->tf_usr_lr = (register_t)(PROC_PS_STRINGS(p) -
|
||||
*(sysent->sv_szsigcode));
|
||||
|
@ -626,7 +626,7 @@ sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask)
|
||||
tf->tf_x[2] = (register_t)&fp->sf_uc;
|
||||
tf->tf_x[8] = (register_t)catcher;
|
||||
tf->tf_sp = (register_t)fp;
|
||||
tf->tf_elr = (register_t)p->p_sysent->sv_sigcode_base;
|
||||
tf->tf_elr = (register_t)PROC_SIGCODE(p);
|
||||
|
||||
/* Clear the single step flag while in the signal handler */
|
||||
if ((td->td_pcb->pcb_flags & PCB_SINGLE_STEP) != 0) {
|
||||
|
@ -419,7 +419,7 @@ freebsd32_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask)
|
||||
tf->tf_x[13] = (register_t)fp;
|
||||
sysent = p->p_sysent;
|
||||
if (sysent->sv_sigcode_base != 0)
|
||||
tf->tf_x[14] = (register_t)sysent->sv_sigcode_base;
|
||||
tf->tf_x[14] = (register_t)PROC_SIGCODE(p);
|
||||
else
|
||||
tf->tf_x[14] = (register_t)(PROC_PS_STRINGS(p) -
|
||||
*(sysent->sv_szsigcode));
|
||||
|
@ -238,7 +238,7 @@ osendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask)
|
||||
|
||||
regs->tf_esp = (int)fp;
|
||||
if (p->p_sysent->sv_sigcode_base != 0) {
|
||||
regs->tf_eip = p->p_sysent->sv_sigcode_base + szsigcode -
|
||||
regs->tf_eip = PROC_SIGCODE(p) + szsigcode -
|
||||
szosigcode;
|
||||
} else {
|
||||
/* a.out sysentvec does not use shared page */
|
||||
@ -363,7 +363,7 @@ freebsd4_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask)
|
||||
}
|
||||
|
||||
regs->tf_esp = (int)sfp;
|
||||
regs->tf_eip = p->p_sysent->sv_sigcode_base + szsigcode -
|
||||
regs->tf_eip = PROC_SIGCODE(p) + szsigcode -
|
||||
szfreebsd4_sigcode;
|
||||
regs->tf_eflags &= ~(PSL_T | PSL_D);
|
||||
regs->tf_cs = _ucodesel;
|
||||
@ -525,7 +525,7 @@ sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask)
|
||||
}
|
||||
|
||||
regs->tf_esp = (int)sfp;
|
||||
regs->tf_eip = p->p_sysent->sv_sigcode_base;
|
||||
regs->tf_eip = PROC_SIGCODE(p);
|
||||
if (regs->tf_eip == 0)
|
||||
regs->tf_eip = PROC_PS_STRINGS(p) - szsigcode;
|
||||
regs->tf_eflags &= ~(PSL_T | PSL_D);
|
||||
|
@ -3097,8 +3097,8 @@ sysctl_kern_proc_sigtramp(SYSCTL_HANDLER_ARGS)
|
||||
bzero(&kst32, sizeof(kst32));
|
||||
if (SV_PROC_FLAG(p, SV_ILP32)) {
|
||||
if (sv->sv_sigcode_base != 0) {
|
||||
kst32.ksigtramp_start = sv->sv_sigcode_base;
|
||||
kst32.ksigtramp_end = sv->sv_sigcode_base +
|
||||
kst32.ksigtramp_start = PROC_SIGCODE(p);
|
||||
kst32.ksigtramp_end = kst32.ksigtramp_start +
|
||||
((sv->sv_flags & SV_DSO_SIG) == 0 ?
|
||||
*sv->sv_szsigcode :
|
||||
(uintptr_t)sv->sv_szsigcode);
|
||||
@ -3115,8 +3115,8 @@ sysctl_kern_proc_sigtramp(SYSCTL_HANDLER_ARGS)
|
||||
#endif
|
||||
bzero(&kst, sizeof(kst));
|
||||
if (sv->sv_sigcode_base != 0) {
|
||||
kst.ksigtramp_start = (char *)sv->sv_sigcode_base;
|
||||
kst.ksigtramp_end = (char *)sv->sv_sigcode_base +
|
||||
kst.ksigtramp_start = (char *)PROC_SIGCODE(p);
|
||||
kst.ksigtramp_end = (char *)kst.ksigtramp_start +
|
||||
((sv->sv_flags & SV_DSO_SIG) == 0 ? *sv->sv_szsigcode :
|
||||
(uintptr_t)sv->sv_szsigcode);
|
||||
} else {
|
||||
|
@ -310,7 +310,7 @@ sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask)
|
||||
mtx_unlock(&psp->ps_mtx);
|
||||
PROC_UNLOCK(p);
|
||||
|
||||
tf->srr0 = (register_t)p->p_sysent->sv_sigcode_base;
|
||||
tf->srr0 = (register_t)PROC_SIGCODE(p);
|
||||
|
||||
/*
|
||||
* copy the frame out to userland.
|
||||
|
@ -416,7 +416,7 @@ sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask)
|
||||
|
||||
sysent = p->p_sysent;
|
||||
if (sysent->sv_sigcode_base != 0)
|
||||
tf->tf_ra = (register_t)sysent->sv_sigcode_base;
|
||||
tf->tf_ra = (register_t)PROC_SIGCODE(p);
|
||||
else
|
||||
tf->tf_ra = (register_t)(PROC_PS_STRINGS(p) -
|
||||
*(sysent->sv_szsigcode));
|
||||
|
@ -90,6 +90,14 @@ struct execsw {
|
||||
#define PROC_PS_STRINGS(p) \
|
||||
((p)->p_vmspace->vm_stacktop - (p)->p_sysent->sv_psstringssz)
|
||||
|
||||
/*
|
||||
* Address of signal trampoline (in user space).
|
||||
* This assumes that the sigcode resides in the shared page, which is true
|
||||
* in all cases, except for a.out binaries.
|
||||
*/
|
||||
#define PROC_SIGCODE(p) \
|
||||
((p)->p_sysent->sv_sigcode_base)
|
||||
|
||||
int exec_map_first_page(struct image_params *);
|
||||
void exec_unmap_first_page(struct image_params *);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user