o Kill the MD grow_stack(). Call the MI vm_map_growstack()
in its place. o Eliminate the use of useracc() and grow_stack() from sendsig(). Reviewed by: peter
This commit is contained in:
parent
56f2a75b76
commit
09d30f2c8d
@ -864,30 +864,11 @@ sendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
|
|||||||
sfp = (struct sigframe *)(frame->tf_r[FRAME_SP] - rndfsize);
|
sfp = (struct sigframe *)(frame->tf_r[FRAME_SP] - rndfsize);
|
||||||
PROC_UNLOCK(p);
|
PROC_UNLOCK(p);
|
||||||
|
|
||||||
(void)grow_stack(p, (u_long)sfp);
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
if ((sigdebug & SDB_KSTACK) && p->p_pid == sigpid)
|
if ((sigdebug & SDB_KSTACK) && p->p_pid == sigpid)
|
||||||
printf("sendsig(%d): sig %d ssp %p usp %p\n", p->p_pid,
|
printf("sendsig(%d): sig %d ssp %p usp %p\n", p->p_pid,
|
||||||
sig, &sf, sfp);
|
sig, &sf, sfp);
|
||||||
#endif
|
#endif
|
||||||
if (!useracc((caddr_t)sfp, sizeof(sf), VM_PROT_WRITE)) {
|
|
||||||
#ifdef DEBUG
|
|
||||||
if ((sigdebug & SDB_KSTACK) && p->p_pid == sigpid)
|
|
||||||
printf("sendsig(%d): useracc failed on sig %d\n",
|
|
||||||
p->p_pid, sig);
|
|
||||||
#endif
|
|
||||||
/*
|
|
||||||
* Process has trashed its stack; give it an illegal
|
|
||||||
* instruction to halt it in its tracks.
|
|
||||||
*/
|
|
||||||
PROC_LOCK(p);
|
|
||||||
SIGACTION(p, SIGILL) = SIG_DFL;
|
|
||||||
SIGDELSET(p->p_sigignore, SIGILL);
|
|
||||||
SIGDELSET(p->p_sigcatch, SIGILL);
|
|
||||||
SIGDELSET(p->p_sigmask, SIGILL);
|
|
||||||
psignal(p, SIGILL);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/* save the floating-point state, if necessary, then copy it. */
|
/* save the floating-point state, if necessary, then copy it. */
|
||||||
@ -902,7 +883,24 @@ sendsig(sig_t catcher, int sig, sigset_t *mask, u_long code)
|
|||||||
/*
|
/*
|
||||||
* copy the frame out to userland.
|
* copy the frame out to userland.
|
||||||
*/
|
*/
|
||||||
(void) copyout((caddr_t)&sf, (caddr_t)sfp, sizeof(sf));
|
if (copyout((caddr_t)&sf, (caddr_t)sfp, sizeof(sf)) != 0) {
|
||||||
|
#ifdef DEBUG
|
||||||
|
if ((sigdebug & SDB_KSTACK) && p->p_pid == sigpid)
|
||||||
|
printf("sendsig(%d): copyout failed on sig %d\n",
|
||||||
|
p->p_pid, sig);
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Process has trashed its stack; give it an illegal
|
||||||
|
* instruction to halt it in its tracks.
|
||||||
|
*/
|
||||||
|
PROC_LOCK(p);
|
||||||
|
SIGACTION(p, SIGILL) = SIG_DFL;
|
||||||
|
SIGDELSET(p->p_sigignore, SIGILL);
|
||||||
|
SIGDELSET(p->p_sigcatch, SIGILL);
|
||||||
|
SIGDELSET(p->p_sigmask, SIGILL);
|
||||||
|
psignal(p, SIGILL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
if (sigdebug & SDB_FOLLOW)
|
if (sigdebug & SDB_FOLLOW)
|
||||||
printf("sendsig(%d): sig %d sfp %p code %lx\n", p->p_pid, sig,
|
printf("sendsig(%d): sig %d sfp %p code %lx\n", p->p_pid, sig,
|
||||||
|
@ -587,13 +587,13 @@ trap(int vector, int imm, struct trapframe *framep)
|
|||||||
/*
|
/*
|
||||||
* Grow the stack if necessary
|
* Grow the stack if necessary
|
||||||
*/
|
*/
|
||||||
/* grow_stack returns false only if va falls into
|
/* vm_map_growstack fails only if va falls into
|
||||||
* a growable stack region and the stack growth
|
* a growable stack region and the stack growth
|
||||||
* fails. It returns true if va was not within
|
* fails. It succeeds if va was not within
|
||||||
* a growable stack region, or if the stack
|
* a growable stack region, or if the stack
|
||||||
* growth succeeded.
|
* growth succeeded.
|
||||||
*/
|
*/
|
||||||
if (!grow_stack (p, va))
|
if (vm_map_growstack(p, va) != KERN_SUCCESS)
|
||||||
rv = KERN_FAILURE;
|
rv = KERN_FAILURE;
|
||||||
else
|
else
|
||||||
/* Fault in the user page: */
|
/* Fault in the user page: */
|
||||||
|
@ -418,20 +418,6 @@ cpu_reset()
|
|||||||
cpu_boot(0);
|
cpu_boot(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
grow_stack(p, sp)
|
|
||||||
struct proc *p;
|
|
||||||
size_t sp;
|
|
||||||
{
|
|
||||||
int rv;
|
|
||||||
|
|
||||||
rv = vm_map_growstack (p, sp);
|
|
||||||
if (rv != KERN_SUCCESS)
|
|
||||||
return (0);
|
|
||||||
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Software interrupt handler for queued VM system processing.
|
* Software interrupt handler for queued VM system processing.
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user