Fixup the last broken bits of the signal handling code.

This commit is contained in:
eeh 1998-11-16 06:51:35 +00:00
parent 0cd1643609
commit a178ed6add
4 changed files with 25 additions and 11 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: compat_13_machdep.c,v 1.2 1998/10/08 02:31:40 eeh Exp $ */
/* $NetBSD: compat_13_machdep.c,v 1.3 1998/11/16 06:51:35 eeh Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
@ -91,7 +91,14 @@ compat_13_sys_sigreturn(p, v, retval)
* verified. pc and npc must be multiples of 4. This is all
* that is required; if it holds, just do it.
*/
if (((scp->sc_pc | scp->sc_npc) & 3) != 0)
if (((scp->sc_pc | scp->sc_npc) & 3) != 0 || scp->sc_pc == 0 || scp->sc_npc == 0)
#ifdef DEBUG
{
printf("sigreturn13: pc %p or npc %p invalid\n", scp->sc_pc, scp->sc_npc);
Debugger();
return (EINVAL);
}
#endif
return (EINVAL);
/* take only psr ICC field */
#ifdef _LP64

View File

@ -3936,10 +3936,10 @@ zshard:
*/
return_from_trap:
#ifdef DEBUG
!! Make sure we don't have pc == npc or we suck.
!! Make sure we don't have pc == npc == 0 or we suck.
ldx [%sp + CC64FSZ + STKB + TF_PC], %g2
ldx [%sp + CC64FSZ + STKB + TF_NPC], %g3
cmp %g2, %g3
orcc %g2, %g3, %g0
tz %icc, 1
#endif
#ifdef NOTDEF_DEBUG

View File

@ -1,4 +1,4 @@
/* $NetBSD: machdep.c,v 1.21 1998/10/19 22:09:20 tron Exp $ */
/* $NetBSD: machdep.c,v 1.22 1998/11/16 06:51:36 eeh Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
@ -645,7 +645,7 @@ sendsig(catcher, sig, mask, code)
/*
* Build the signal context to be used by sigreturn.
*/
sf.sf_sc.sc_onstack = onstack;
sf.sf_sc.sc_onstack = psp->ps_sigstk.ss_flags & SS_ONSTACK;
sf.sf_sc.sc_mask = *mask;
#ifdef COMPAT_13
/*
@ -674,7 +674,7 @@ sendsig(catcher, sig, mask, code)
* joins seamlessly with the frame it was in when the signal occurred,
* so that the debugger and _longjmp code can back up through it.
*/
newsp = (struct rwindow *)((vaddr_t)fp - CC64FSZ);
newsp = (struct rwindow *)((vaddr_t)fp - sizeof(struct rwindow));
write_user_windows();
#ifdef DEBUG
if ((sigdebug & SDB_KSTACK))
@ -794,10 +794,10 @@ sys___sigreturn14(p, v, retval)
* verified. pc and npc must be multiples of 4. This is all
* that is required; if it holds, just do it.
*/
if (((sc.sc_pc | sc.sc_npc) & 3) != 0)
if (((sc.sc_pc | sc.sc_npc) & 3) != 0 || (sc.sc_pc == 0) || (sc.sc_npc == 0))
#ifdef DEBUG
{
printf("sigreturn: pc %p or npc %p invalid\n", sc.sc_pc, sc.sc_npc);
printf("sigreturn14: pc %p or npc %p invalid\n", sc.sc_pc, sc.sc_npc);
Debugger();
return (EINVAL);
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: sunos_machdep.c,v 1.4 1998/10/08 02:31:41 eeh Exp $ */
/* $NetBSD: sunos_machdep.c,v 1.5 1998/11/16 06:51:36 eeh Exp $ */
/*
* Copyright (c) 1995 Matthew R. Green
@ -237,7 +237,14 @@ sunos_sys_sigreturn(p, v, retval)
* verified. pc and npc must be multiples of 4. This is all
* that is required; if it holds, just do it.
*/
if (((scp->sc_pc | scp->sc_npc) & 3) != 0)
if (((scp->sc_pc | scp->sc_npc) & 3) != 0 || scp->sc_pc == 0 || scp->sc_npc == 0)
#ifdef DEBUG
{
printf("sigreturn13: pc %p or npc %p invalid\n", scp->sc_pc, scp->sc_npc);
Debugger();
return (EINVAL);
}
#endif
return (EINVAL);
/* take only psr ICC field */
tf->tf_tstate = (int64_t)(tf->tf_tstate & ~TSTATE_CCR) | PSRCC_TO_TSTATE(scp->sc_psr);