summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/amd64/amd64/machdep.c160
-rw-r--r--sys/i386/i386/machdep.c160
2 files changed, 158 insertions, 162 deletions
diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c
index 6ee89b0..c84e765 100644
--- a/sys/amd64/amd64/machdep.c
+++ b/sys/amd64/amd64/machdep.c
@@ -126,6 +126,9 @@ extern void finishidentcpu(void);
extern void panicifcpuunsupported(void);
extern void initializecpu(void);
+#define CS_SECURE(cs) (ISPL(cs) == SEL_UPL)
+#define EFL_SECURE(ef, oef) ((((ef) ^ (oef)) & ~PSL_USERCHANGE) == 0)
+
static void cpu_startup __P((void *));
SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_startup, NULL)
@@ -152,6 +155,8 @@ SYSCTL_INT(_machdep, OID_AUTO, ispc98, CTLFLAG_RD, &ispc98, 0, "");
int physmem = 0;
int cold = 1;
+static void osendsig __P((sig_t catcher, int sig, sigset_t *mask, u_long code));
+
static int
sysctl_hw_physmem SYSCTL_HANDLER_ARGS
{
@@ -471,17 +476,23 @@ unregister_netisr(num)
* specified pc, psl.
*/
static void
-osendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
+osendsig(catcher, sig, mask, code)
+ sig_t catcher;
+ int sig;
+ sigset_t *mask;
+ u_long code;
{
- register struct proc *p = curproc;
- register struct trapframe *regs;
- register struct osigframe *fp;
struct osigframe sf;
- struct sigacts *psp = p->p_sigacts;
+ struct osigframe *fp;
+ struct proc *p;
+ struct sigacts *psp;
+ struct trapframe *regs;
int oonstack;
+ p = curproc;
+ psp = p->p_sigacts;
regs = p->p_md.md_regs;
- oonstack = (p->p_sigstk.ss_flags & SS_ONSTACK) ? 1 : 0;
+ oonstack = p->p_sigstk.ss_flags & SS_ONSTACK;
/* Allocate and validate space for the signal handler context. */
if ((p->p_flag & P_ALTSTACK) && !oonstack &&
@@ -489,17 +500,16 @@ osendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
fp = (struct osigframe *)(p->p_sigstk.ss_sp +
p->p_sigstk.ss_size - sizeof(struct osigframe));
p->p_sigstk.ss_flags |= SS_ONSTACK;
- }
- else
+ } else
fp = (struct osigframe *)regs->tf_esp - 1;
/*
- * grow() will return FALSE if the fp will not fit inside the stack
- * and the stack can not be grown. useracc will return FALSE
- * if access is denied.
+ * grow_stack() will return 0 if *fp does not fit inside the stack
+ * and the stack can not be grown.
+ * useracc() will return FALSE if access is denied.
*/
- if (grow_stack(p, (int)fp) == FALSE ||
- !useracc((caddr_t)fp, sizeof(struct osigframe), VM_PROT_WRITE)) {
+ if (grow_stack(p, (int)fp) == 0 ||
+ !useracc((caddr_t)fp, sizeof(*fp), VM_PROT_WRITE)) {
/*
* Process has trashed its stack; give it an illegal
* instruction to halt it in its tracks.
@@ -512,11 +522,9 @@ osendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
return;
}
- /* Translate the signal if appropriate */
- if (p->p_sysent->sv_sigtbl) {
- if (sig <= p->p_sysent->sv_sigsize)
- sig = p->p_sysent->sv_sigtbl[_SIG_IDX(sig)];
- }
+ /* Translate the signal if appropriate. */
+ if (p->p_sysent->sv_sigtbl && sig <= p->p_sysent->sv_sigsize)
+ sig = p->p_sysent->sv_sigtbl[_SIG_IDX(sig)];
/* Build the argument list for the signal handler. */
sf.sf_signum = sig;
@@ -527,15 +535,14 @@ osendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
sf.sf_siginfo.si_signo = sig;
sf.sf_siginfo.si_code = code;
sf.sf_ahu.sf_action = (__osiginfohandler_t *)catcher;
- }
- else {
+ } else {
/* Old FreeBSD-style arguments. */
sf.sf_arg2 = code;
sf.sf_addr = regs->tf_err;
sf.sf_ahu.sf_handler = catcher;
}
- /* save scratch registers */
+ /* Save most if not all of trap frame. */
sf.sf_siginfo.si_sc.sc_eax = regs->tf_eax;
sf.sf_siginfo.si_sc.sc_ebx = regs->tf_ebx;
sf.sf_siginfo.si_sc.sc_ecx = regs->tf_ecx;
@@ -550,7 +557,7 @@ osendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
sf.sf_siginfo.si_sc.sc_gs = rgs();
sf.sf_siginfo.si_sc.sc_isp = regs->tf_isp;
- /* Build the signal context to be used by sigreturn. */
+ /* Build the signal context to be used by osigreturn(). */
sf.sf_siginfo.si_sc.sc_onstack = oonstack;
SIG2OSIG(*mask, sf.sf_siginfo.si_sc.sc_mask);
sf.sf_siginfo.si_sc.sc_sp = regs->tf_esp;
@@ -566,6 +573,7 @@ osendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
* eflags.
*/
if (regs->tf_eflags & PSL_VM) {
+ /* XXX confusing names: `tf' isn't a trapframe; `regs' is. */
struct trapframe_vm86 *tf = (struct trapframe_vm86 *)regs;
struct vm86_kernel *vm86 = &p->p_addr->u_pcb.pcb_ext->ext_vm86;
@@ -576,14 +584,15 @@ osendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
if (vm86->vm86_has_vme == 0)
sf.sf_siginfo.si_sc.sc_ps =
- (tf->tf_eflags & ~(PSL_VIF | PSL_VIP))
- | (vm86->vm86_eflags & (PSL_VIF | PSL_VIP));
- /* see sendsig for comment */
- tf->tf_eflags &= ~(PSL_VM|PSL_NT|PSL_T|PSL_VIF|PSL_VIP);
+ (tf->tf_eflags & ~(PSL_VIF | PSL_VIP)) |
+ (vm86->vm86_eflags & (PSL_VIF | PSL_VIP));
+
+ /* See sendsig() for comments. */
+ tf->tf_eflags &= ~(PSL_VM | PSL_NT | PSL_T | PSL_VIF | PSL_VIP);
}
/* Copy the sigframe out to the user's stack. */
- if (copyout(&sf, fp, sizeof(struct osigframe)) != 0) {
+ if (copyout(&sf, fp, sizeof(*fp)) != 0) {
/*
* Something is wrong with the stack pointer.
* ...Kill the process.
@@ -608,45 +617,46 @@ sendsig(catcher, sig, mask, code)
sigset_t *mask;
u_long code;
{
- struct proc *p = curproc;
+ struct sigframe sf;
+ struct proc *p;
+ struct sigacts *psp;
struct trapframe *regs;
- struct sigacts *psp = p->p_sigacts;
- struct sigframe sf, *sfp;
+ struct sigframe *sfp;
int oonstack;
+ p = curproc;
+ psp = p->p_sigacts;
if (SIGISMEMBER(psp->ps_osigset, sig)) {
osendsig(catcher, sig, mask, code);
return;
}
-
regs = p->p_md.md_regs;
- oonstack = (p->p_sigstk.ss_flags & SS_ONSTACK) ? 1 : 0;
+ oonstack = p->p_sigstk.ss_flags & SS_ONSTACK;
- /* save user context */
- bzero(&sf, sizeof(struct sigframe));
+ /* Save user context. */
+ bzero(&sf, sizeof(sf));
sf.sf_uc.uc_sigmask = *mask;
sf.sf_uc.uc_stack = p->p_sigstk;
sf.sf_uc.uc_mcontext.mc_onstack = oonstack;
sf.sf_uc.uc_mcontext.mc_gs = rgs();
- bcopy(regs, &sf.sf_uc.uc_mcontext.mc_fs, sizeof(struct trapframe));
+ bcopy(regs, &sf.sf_uc.uc_mcontext.mc_fs, sizeof(*regs));
/* Allocate and validate space for the signal handler context. */
- if ((p->p_flag & P_ALTSTACK) != 0 && !oonstack &&
+ if ((p->p_flag & P_ALTSTACK) != 0 && !oonstack &&
SIGISMEMBER(psp->ps_sigonstack, sig)) {
sfp = (struct sigframe *)(p->p_sigstk.ss_sp +
p->p_sigstk.ss_size - sizeof(struct sigframe));
p->p_sigstk.ss_flags |= SS_ONSTACK;
- }
- else
+ } else
sfp = (struct sigframe *)regs->tf_esp - 1;
/*
- * grow() will return FALSE if the sfp will not fit inside the stack
- * and the stack can not be grown. useracc will return FALSE if
- * access is denied.
+ * grow_stack() will return 0 if *sfp does not fit inside the stack
+ * and the stack can not be grown.
+ * useracc() will return FALSE if access is denied.
*/
- if (grow_stack(p, (int)sfp) == FALSE ||
- !useracc((caddr_t)sfp, sizeof(struct sigframe), VM_PROT_WRITE)) {
+ if (grow_stack(p, (int)sfp) == 0 ||
+ !useracc((caddr_t)sfp, sizeof(*sfp), VM_PROT_WRITE)) {
/*
* Process has trashed its stack; give it an illegal
* instruction to halt it in its tracks.
@@ -662,11 +672,9 @@ sendsig(catcher, sig, mask, code)
return;
}
- /* Translate the signal is appropriate */
- if (p->p_sysent->sv_sigtbl) {
- if (sig <= p->p_sysent->sv_sigsize)
- sig = p->p_sysent->sv_sigtbl[_SIG_IDX(sig)];
- }
+ /* Translate the signal if appropriate. */
+ if (p->p_sysent->sv_sigtbl && sig <= p->p_sysent->sv_sigsize)
+ sig = p->p_sysent->sv_sigtbl[_SIG_IDX(sig)];
/* Build the argument list for the signal handler. */
sf.sf_signum = sig;
@@ -676,12 +684,11 @@ sendsig(catcher, sig, mask, code)
sf.sf_siginfo = (register_t)&sfp->sf_si;
sf.sf_ahu.sf_action = (__siginfohandler_t *)catcher;
- /* fill siginfo structure */
+ /* Fill siginfo structure. */
sf.sf_si.si_signo = sig;
sf.sf_si.si_code = code;
- sf.sf_si.si_addr = (void*)regs->tf_err;
- }
- else {
+ sf.sf_si.si_addr = (void *)regs->tf_err;
+ } else {
/* Old FreeBSD-style arguments. */
sf.sf_siginfo = code;
sf.sf_addr = regs->tf_err;
@@ -718,13 +725,11 @@ sendsig(catcher, sig, mask, code)
* does nothing in vm86 mode, but vm86 programs can set it
* almost legitimately in probes for old cpu types.
*/
- tf->tf_eflags &= ~(PSL_VM|PSL_NT|PSL_T|PSL_VIF|PSL_VIP);
+ tf->tf_eflags &= ~(PSL_VM | PSL_NT | PSL_T | PSL_VIF | PSL_VIP);
}
- /*
- * Copy the sigframe out to the user's stack.
- */
- if (copyout(&sf, sfp, sizeof(struct sigframe)) != 0) {
+ /* Copy the sigframe out to the user's stack. */
+ if (copyout(&sf, sfp, sizeof(*sfp)) != 0) {
/*
* Something is wrong with the stack pointer.
* ...Kill the process.
@@ -751,9 +756,6 @@ sendsig(catcher, sig, mask, code)
* make sure that the user has not modified the
* state to gain improper privileges.
*/
-#define EFL_SECURE(ef, oef) ((((ef) ^ (oef)) & ~PSL_USERCHANGE) == 0)
-#define CS_SECURE(cs) (ISPL(cs) == SEL_UPL)
-
int
osigreturn(p, uap)
struct proc *p;
@@ -761,15 +763,14 @@ osigreturn(p, uap)
struct osigcontext *sigcntxp;
} */ *uap;
{
- register struct osigcontext *scp;
- register struct trapframe *regs = p->p_md.md_regs;
+ struct trapframe *regs;
+ struct osigcontext *scp;
int eflags;
+ regs = p->p_md.md_regs;
scp = uap->sigcntxp;
-
- if (!useracc((caddr_t)scp, sizeof (struct osigcontext), VM_PROT_READ))
- return(EFAULT);
-
+ if (!useracc((caddr_t)scp, sizeof(*scp), VM_PROT_READ))
+ return (EFAULT);
eflags = scp->sc_ps;
if (eflags & PSL_VM) {
struct trapframe_vm86 *tf = (struct trapframe_vm86 *)regs;
@@ -785,7 +786,7 @@ osigreturn(p, uap)
if (vm86->vm86_inited == 0)
return (EINVAL);
- /* go back to user mode if both flags are set */
+ /* Go back to user mode if both flags are set. */
if ((eflags & PSL_VIP) && (eflags & PSL_VIF))
trapsignal(p, SIGBUS, 0);
@@ -818,7 +819,7 @@ osigreturn(p, uap)
* one less debugger trap, so allowing it is fairly harmless.
*/
if (!EFL_SECURE(eflags & ~PSL_RF, regs->tf_eflags & ~PSL_RF)) {
- return(EINVAL);
+ return (EINVAL);
}
/*
@@ -828,14 +829,14 @@ osigreturn(p, uap)
*/
if (!CS_SECURE(scp->sc_cs)) {
trapsignal(p, SIGBUS, T_PROTFLT);
- return(EINVAL);
+ return (EINVAL);
}
regs->tf_ds = scp->sc_ds;
regs->tf_es = scp->sc_es;
regs->tf_fs = scp->sc_fs;
}
- /* restore scratch registers */
+ /* Restore remaining registers. */
regs->tf_eax = scp->sc_eax;
regs->tf_ebx = scp->sc_ebx;
regs->tf_ecx = scp->sc_ecx;
@@ -850,14 +851,13 @@ osigreturn(p, uap)
p->p_sigstk.ss_flags |= SS_ONSTACK;
else
p->p_sigstk.ss_flags &= ~SS_ONSTACK;
-
SIGSETOLD(p->p_sigmask, scp->sc_mask);
SIG_CANTMASK(p->p_sigmask);
regs->tf_ebp = scp->sc_fp;
regs->tf_esp = scp->sc_sp;
regs->tf_eip = scp->sc_pc;
regs->tf_eflags = eflags;
- return(EJUSTRETURN);
+ return (EJUSTRETURN);
}
int
@@ -872,7 +872,6 @@ sigreturn(p, uap)
int cs, eflags;
ucp = uap->sigcntxp;
-
if (!useracc((caddr_t)ucp, sizeof(struct osigcontext), VM_PROT_READ))
return (EFAULT);
if (((struct osigcontext *)ucp)->sc_trapno == 0x01d516)
@@ -885,12 +884,11 @@ sigreturn(p, uap)
* being valid for the size of an osigcontext, now check for
* it being valid for a whole, new-style ucontext_t.
*/
- if (!useracc((caddr_t)ucp, sizeof(ucontext_t), VM_PROT_READ))
+ if (!useracc((caddr_t)ucp, sizeof(*ucp), VM_PROT_READ))
return (EFAULT);
regs = p->p_md.md_regs;
eflags = ucp->uc_mcontext.mc_eflags;
-
if (eflags & PSL_VM) {
struct trapframe_vm86 *tf = (struct trapframe_vm86 *)regs;
struct vm86_kernel *vm86;
@@ -905,7 +903,7 @@ sigreturn(p, uap)
if (vm86->vm86_inited == 0)
return (EINVAL);
- /* go back to user mode if both flags are set */
+ /* Go back to user mode if both flags are set. */
if ((eflags & PSL_VIP) && (eflags & PSL_VIF))
trapsignal(p, SIGBUS, 0);
@@ -941,7 +939,7 @@ sigreturn(p, uap)
*/
if (!EFL_SECURE(eflags & ~PSL_RF, regs->tf_eflags & ~PSL_RF)) {
printf("sigreturn: eflags = 0x%x\n", eflags);
- return(EINVAL);
+ return (EINVAL);
}
/*
@@ -953,11 +951,11 @@ sigreturn(p, uap)
if (!CS_SECURE(cs)) {
printf("sigreturn: cs = 0x%x\n", cs);
trapsignal(p, SIGBUS, T_PROTFLT);
- return(EINVAL);
+ return (EINVAL);
}
- bcopy(&ucp->uc_mcontext.mc_fs, regs, sizeof(struct trapframe));
- }
+ bcopy(&ucp->uc_mcontext.mc_fs, regs, sizeof(*regs));
+ }
if (ucp->uc_mcontext.mc_onstack & 1)
p->p_sigstk.ss_flags |= SS_ONSTACK;
else
@@ -965,7 +963,7 @@ sigreturn(p, uap)
p->p_sigmask = ucp->uc_sigmask;
SIG_CANTMASK(p->p_sigmask);
- return(EJUSTRETURN);
+ return (EJUSTRETURN);
}
/*
diff --git a/sys/i386/i386/machdep.c b/sys/i386/i386/machdep.c
index 6ee89b0..c84e765 100644
--- a/sys/i386/i386/machdep.c
+++ b/sys/i386/i386/machdep.c
@@ -126,6 +126,9 @@ extern void finishidentcpu(void);
extern void panicifcpuunsupported(void);
extern void initializecpu(void);
+#define CS_SECURE(cs) (ISPL(cs) == SEL_UPL)
+#define EFL_SECURE(ef, oef) ((((ef) ^ (oef)) & ~PSL_USERCHANGE) == 0)
+
static void cpu_startup __P((void *));
SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_startup, NULL)
@@ -152,6 +155,8 @@ SYSCTL_INT(_machdep, OID_AUTO, ispc98, CTLFLAG_RD, &ispc98, 0, "");
int physmem = 0;
int cold = 1;
+static void osendsig __P((sig_t catcher, int sig, sigset_t *mask, u_long code));
+
static int
sysctl_hw_physmem SYSCTL_HANDLER_ARGS
{
@@ -471,17 +476,23 @@ unregister_netisr(num)
* specified pc, psl.
*/
static void
-osendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
+osendsig(catcher, sig, mask, code)
+ sig_t catcher;
+ int sig;
+ sigset_t *mask;
+ u_long code;
{
- register struct proc *p = curproc;
- register struct trapframe *regs;
- register struct osigframe *fp;
struct osigframe sf;
- struct sigacts *psp = p->p_sigacts;
+ struct osigframe *fp;
+ struct proc *p;
+ struct sigacts *psp;
+ struct trapframe *regs;
int oonstack;
+ p = curproc;
+ psp = p->p_sigacts;
regs = p->p_md.md_regs;
- oonstack = (p->p_sigstk.ss_flags & SS_ONSTACK) ? 1 : 0;
+ oonstack = p->p_sigstk.ss_flags & SS_ONSTACK;
/* Allocate and validate space for the signal handler context. */
if ((p->p_flag & P_ALTSTACK) && !oonstack &&
@@ -489,17 +500,16 @@ osendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
fp = (struct osigframe *)(p->p_sigstk.ss_sp +
p->p_sigstk.ss_size - sizeof(struct osigframe));
p->p_sigstk.ss_flags |= SS_ONSTACK;
- }
- else
+ } else
fp = (struct osigframe *)regs->tf_esp - 1;
/*
- * grow() will return FALSE if the fp will not fit inside the stack
- * and the stack can not be grown. useracc will return FALSE
- * if access is denied.
+ * grow_stack() will return 0 if *fp does not fit inside the stack
+ * and the stack can not be grown.
+ * useracc() will return FALSE if access is denied.
*/
- if (grow_stack(p, (int)fp) == FALSE ||
- !useracc((caddr_t)fp, sizeof(struct osigframe), VM_PROT_WRITE)) {
+ if (grow_stack(p, (int)fp) == 0 ||
+ !useracc((caddr_t)fp, sizeof(*fp), VM_PROT_WRITE)) {
/*
* Process has trashed its stack; give it an illegal
* instruction to halt it in its tracks.
@@ -512,11 +522,9 @@ osendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
return;
}
- /* Translate the signal if appropriate */
- if (p->p_sysent->sv_sigtbl) {
- if (sig <= p->p_sysent->sv_sigsize)
- sig = p->p_sysent->sv_sigtbl[_SIG_IDX(sig)];
- }
+ /* Translate the signal if appropriate. */
+ if (p->p_sysent->sv_sigtbl && sig <= p->p_sysent->sv_sigsize)
+ sig = p->p_sysent->sv_sigtbl[_SIG_IDX(sig)];
/* Build the argument list for the signal handler. */
sf.sf_signum = sig;
@@ -527,15 +535,14 @@ osendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
sf.sf_siginfo.si_signo = sig;
sf.sf_siginfo.si_code = code;
sf.sf_ahu.sf_action = (__osiginfohandler_t *)catcher;
- }
- else {
+ } else {
/* Old FreeBSD-style arguments. */
sf.sf_arg2 = code;
sf.sf_addr = regs->tf_err;
sf.sf_ahu.sf_handler = catcher;
}
- /* save scratch registers */
+ /* Save most if not all of trap frame. */
sf.sf_siginfo.si_sc.sc_eax = regs->tf_eax;
sf.sf_siginfo.si_sc.sc_ebx = regs->tf_ebx;
sf.sf_siginfo.si_sc.sc_ecx = regs->tf_ecx;
@@ -550,7 +557,7 @@ osendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
sf.sf_siginfo.si_sc.sc_gs = rgs();
sf.sf_siginfo.si_sc.sc_isp = regs->tf_isp;
- /* Build the signal context to be used by sigreturn. */
+ /* Build the signal context to be used by osigreturn(). */
sf.sf_siginfo.si_sc.sc_onstack = oonstack;
SIG2OSIG(*mask, sf.sf_siginfo.si_sc.sc_mask);
sf.sf_siginfo.si_sc.sc_sp = regs->tf_esp;
@@ -566,6 +573,7 @@ osendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
* eflags.
*/
if (regs->tf_eflags & PSL_VM) {
+ /* XXX confusing names: `tf' isn't a trapframe; `regs' is. */
struct trapframe_vm86 *tf = (struct trapframe_vm86 *)regs;
struct vm86_kernel *vm86 = &p->p_addr->u_pcb.pcb_ext->ext_vm86;
@@ -576,14 +584,15 @@ osendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
if (vm86->vm86_has_vme == 0)
sf.sf_siginfo.si_sc.sc_ps =
- (tf->tf_eflags & ~(PSL_VIF | PSL_VIP))
- | (vm86->vm86_eflags & (PSL_VIF | PSL_VIP));
- /* see sendsig for comment */
- tf->tf_eflags &= ~(PSL_VM|PSL_NT|PSL_T|PSL_VIF|PSL_VIP);
+ (tf->tf_eflags & ~(PSL_VIF | PSL_VIP)) |
+ (vm86->vm86_eflags & (PSL_VIF | PSL_VIP));
+
+ /* See sendsig() for comments. */
+ tf->tf_eflags &= ~(PSL_VM | PSL_NT | PSL_T | PSL_VIF | PSL_VIP);
}
/* Copy the sigframe out to the user's stack. */
- if (copyout(&sf, fp, sizeof(struct osigframe)) != 0) {
+ if (copyout(&sf, fp, sizeof(*fp)) != 0) {
/*
* Something is wrong with the stack pointer.
* ...Kill the process.
@@ -608,45 +617,46 @@ sendsig(catcher, sig, mask, code)
sigset_t *mask;
u_long code;
{
- struct proc *p = curproc;
+ struct sigframe sf;
+ struct proc *p;
+ struct sigacts *psp;
struct trapframe *regs;
- struct sigacts *psp = p->p_sigacts;
- struct sigframe sf, *sfp;
+ struct sigframe *sfp;
int oonstack;
+ p = curproc;
+ psp = p->p_sigacts;
if (SIGISMEMBER(psp->ps_osigset, sig)) {
osendsig(catcher, sig, mask, code);
return;
}
-
regs = p->p_md.md_regs;
- oonstack = (p->p_sigstk.ss_flags & SS_ONSTACK) ? 1 : 0;
+ oonstack = p->p_sigstk.ss_flags & SS_ONSTACK;
- /* save user context */
- bzero(&sf, sizeof(struct sigframe));
+ /* Save user context. */
+ bzero(&sf, sizeof(sf));
sf.sf_uc.uc_sigmask = *mask;
sf.sf_uc.uc_stack = p->p_sigstk;
sf.sf_uc.uc_mcontext.mc_onstack = oonstack;
sf.sf_uc.uc_mcontext.mc_gs = rgs();
- bcopy(regs, &sf.sf_uc.uc_mcontext.mc_fs, sizeof(struct trapframe));
+ bcopy(regs, &sf.sf_uc.uc_mcontext.mc_fs, sizeof(*regs));
/* Allocate and validate space for the signal handler context. */
- if ((p->p_flag & P_ALTSTACK) != 0 && !oonstack &&
+ if ((p->p_flag & P_ALTSTACK) != 0 && !oonstack &&
SIGISMEMBER(psp->ps_sigonstack, sig)) {
sfp = (struct sigframe *)(p->p_sigstk.ss_sp +
p->p_sigstk.ss_size - sizeof(struct sigframe));
p->p_sigstk.ss_flags |= SS_ONSTACK;
- }
- else
+ } else
sfp = (struct sigframe *)regs->tf_esp - 1;
/*
- * grow() will return FALSE if the sfp will not fit inside the stack
- * and the stack can not be grown. useracc will return FALSE if
- * access is denied.
+ * grow_stack() will return 0 if *sfp does not fit inside the stack
+ * and the stack can not be grown.
+ * useracc() will return FALSE if access is denied.
*/
- if (grow_stack(p, (int)sfp) == FALSE ||
- !useracc((caddr_t)sfp, sizeof(struct sigframe), VM_PROT_WRITE)) {
+ if (grow_stack(p, (int)sfp) == 0 ||
+ !useracc((caddr_t)sfp, sizeof(*sfp), VM_PROT_WRITE)) {
/*
* Process has trashed its stack; give it an illegal
* instruction to halt it in its tracks.
@@ -662,11 +672,9 @@ sendsig(catcher, sig, mask, code)
return;
}
- /* Translate the signal is appropriate */
- if (p->p_sysent->sv_sigtbl) {
- if (sig <= p->p_sysent->sv_sigsize)
- sig = p->p_sysent->sv_sigtbl[_SIG_IDX(sig)];
- }
+ /* Translate the signal if appropriate. */
+ if (p->p_sysent->sv_sigtbl && sig <= p->p_sysent->sv_sigsize)
+ sig = p->p_sysent->sv_sigtbl[_SIG_IDX(sig)];
/* Build the argument list for the signal handler. */
sf.sf_signum = sig;
@@ -676,12 +684,11 @@ sendsig(catcher, sig, mask, code)
sf.sf_siginfo = (register_t)&sfp->sf_si;
sf.sf_ahu.sf_action = (__siginfohandler_t *)catcher;
- /* fill siginfo structure */
+ /* Fill siginfo structure. */
sf.sf_si.si_signo = sig;
sf.sf_si.si_code = code;
- sf.sf_si.si_addr = (void*)regs->tf_err;
- }
- else {
+ sf.sf_si.si_addr = (void *)regs->tf_err;
+ } else {
/* Old FreeBSD-style arguments. */
sf.sf_siginfo = code;
sf.sf_addr = regs->tf_err;
@@ -718,13 +725,11 @@ sendsig(catcher, sig, mask, code)
* does nothing in vm86 mode, but vm86 programs can set it
* almost legitimately in probes for old cpu types.
*/
- tf->tf_eflags &= ~(PSL_VM|PSL_NT|PSL_T|PSL_VIF|PSL_VIP);
+ tf->tf_eflags &= ~(PSL_VM | PSL_NT | PSL_T | PSL_VIF | PSL_VIP);
}
- /*
- * Copy the sigframe out to the user's stack.
- */
- if (copyout(&sf, sfp, sizeof(struct sigframe)) != 0) {
+ /* Copy the sigframe out to the user's stack. */
+ if (copyout(&sf, sfp, sizeof(*sfp)) != 0) {
/*
* Something is wrong with the stack pointer.
* ...Kill the process.
@@ -751,9 +756,6 @@ sendsig(catcher, sig, mask, code)
* make sure that the user has not modified the
* state to gain improper privileges.
*/
-#define EFL_SECURE(ef, oef) ((((ef) ^ (oef)) & ~PSL_USERCHANGE) == 0)
-#define CS_SECURE(cs) (ISPL(cs) == SEL_UPL)
-
int
osigreturn(p, uap)
struct proc *p;
@@ -761,15 +763,14 @@ osigreturn(p, uap)
struct osigcontext *sigcntxp;
} */ *uap;
{
- register struct osigcontext *scp;
- register struct trapframe *regs = p->p_md.md_regs;
+ struct trapframe *regs;
+ struct osigcontext *scp;
int eflags;
+ regs = p->p_md.md_regs;
scp = uap->sigcntxp;
-
- if (!useracc((caddr_t)scp, sizeof (struct osigcontext), VM_PROT_READ))
- return(EFAULT);
-
+ if (!useracc((caddr_t)scp, sizeof(*scp), VM_PROT_READ))
+ return (EFAULT);
eflags = scp->sc_ps;
if (eflags & PSL_VM) {
struct trapframe_vm86 *tf = (struct trapframe_vm86 *)regs;
@@ -785,7 +786,7 @@ osigreturn(p, uap)
if (vm86->vm86_inited == 0)
return (EINVAL);
- /* go back to user mode if both flags are set */
+ /* Go back to user mode if both flags are set. */
if ((eflags & PSL_VIP) && (eflags & PSL_VIF))
trapsignal(p, SIGBUS, 0);
@@ -818,7 +819,7 @@ osigreturn(p, uap)
* one less debugger trap, so allowing it is fairly harmless.
*/
if (!EFL_SECURE(eflags & ~PSL_RF, regs->tf_eflags & ~PSL_RF)) {
- return(EINVAL);
+ return (EINVAL);
}
/*
@@ -828,14 +829,14 @@ osigreturn(p, uap)
*/
if (!CS_SECURE(scp->sc_cs)) {
trapsignal(p, SIGBUS, T_PROTFLT);
- return(EINVAL);
+ return (EINVAL);
}
regs->tf_ds = scp->sc_ds;
regs->tf_es = scp->sc_es;
regs->tf_fs = scp->sc_fs;
}
- /* restore scratch registers */
+ /* Restore remaining registers. */
regs->tf_eax = scp->sc_eax;
regs->tf_ebx = scp->sc_ebx;
regs->tf_ecx = scp->sc_ecx;
@@ -850,14 +851,13 @@ osigreturn(p, uap)
p->p_sigstk.ss_flags |= SS_ONSTACK;
else
p->p_sigstk.ss_flags &= ~SS_ONSTACK;
-
SIGSETOLD(p->p_sigmask, scp->sc_mask);
SIG_CANTMASK(p->p_sigmask);
regs->tf_ebp = scp->sc_fp;
regs->tf_esp = scp->sc_sp;
regs->tf_eip = scp->sc_pc;
regs->tf_eflags = eflags;
- return(EJUSTRETURN);
+ return (EJUSTRETURN);
}
int
@@ -872,7 +872,6 @@ sigreturn(p, uap)
int cs, eflags;
ucp = uap->sigcntxp;
-
if (!useracc((caddr_t)ucp, sizeof(struct osigcontext), VM_PROT_READ))
return (EFAULT);
if (((struct osigcontext *)ucp)->sc_trapno == 0x01d516)
@@ -885,12 +884,11 @@ sigreturn(p, uap)
* being valid for the size of an osigcontext, now check for
* it being valid for a whole, new-style ucontext_t.
*/
- if (!useracc((caddr_t)ucp, sizeof(ucontext_t), VM_PROT_READ))
+ if (!useracc((caddr_t)ucp, sizeof(*ucp), VM_PROT_READ))
return (EFAULT);
regs = p->p_md.md_regs;
eflags = ucp->uc_mcontext.mc_eflags;
-
if (eflags & PSL_VM) {
struct trapframe_vm86 *tf = (struct trapframe_vm86 *)regs;
struct vm86_kernel *vm86;
@@ -905,7 +903,7 @@ sigreturn(p, uap)
if (vm86->vm86_inited == 0)
return (EINVAL);
- /* go back to user mode if both flags are set */
+ /* Go back to user mode if both flags are set. */
if ((eflags & PSL_VIP) && (eflags & PSL_VIF))
trapsignal(p, SIGBUS, 0);
@@ -941,7 +939,7 @@ sigreturn(p, uap)
*/
if (!EFL_SECURE(eflags & ~PSL_RF, regs->tf_eflags & ~PSL_RF)) {
printf("sigreturn: eflags = 0x%x\n", eflags);
- return(EINVAL);
+ return (EINVAL);
}
/*
@@ -953,11 +951,11 @@ sigreturn(p, uap)
if (!CS_SECURE(cs)) {
printf("sigreturn: cs = 0x%x\n", cs);
trapsignal(p, SIGBUS, T_PROTFLT);
- return(EINVAL);
+ return (EINVAL);
}
- bcopy(&ucp->uc_mcontext.mc_fs, regs, sizeof(struct trapframe));
- }
+ bcopy(&ucp->uc_mcontext.mc_fs, regs, sizeof(*regs));
+ }
if (ucp->uc_mcontext.mc_onstack & 1)
p->p_sigstk.ss_flags |= SS_ONSTACK;
else
@@ -965,7 +963,7 @@ sigreturn(p, uap)
p->p_sigmask = ucp->uc_sigmask;
SIG_CANTMASK(p->p_sigmask);
- return(EJUSTRETURN);
+ return (EJUSTRETURN);
}
/*
OpenPOWER on IntegriCloud