Record stack growth, done inline to avoid another function call on
every user page fault. XXX Should make uvm_grow() an inline.
This commit is contained in:
parent
d54826f715
commit
50d060cc52
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: trap.c,v 1.72 2002/06/23 03:00:19 mrg Exp $ */
|
/* $NetBSD: trap.c,v 1.73 2002/09/29 16:49:45 thorpej Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1994 Ludd, University of Lule}, Sweden.
|
* Copyright (c) 1994 Ludd, University of Lule}, Sweden.
|
||||||
@ -150,9 +150,11 @@ trap(struct trapframe *frame)
|
|||||||
u_int rv, addr, umode;
|
u_int rv, addr, umode;
|
||||||
struct proc *p = curproc;
|
struct proc *p = curproc;
|
||||||
u_quad_t oticks = 0;
|
u_quad_t oticks = 0;
|
||||||
|
struct vmspace *vm;
|
||||||
struct vm_map *map;
|
struct vm_map *map;
|
||||||
vm_prot_t ftype;
|
vm_prot_t ftype;
|
||||||
|
vsize_t nss;
|
||||||
|
|
||||||
uvmexp.traps++;
|
uvmexp.traps++;
|
||||||
if ((umode = USERMODE(frame))) {
|
if ((umode = USERMODE(frame))) {
|
||||||
type |= T_USER;
|
type |= T_USER;
|
||||||
@ -228,10 +230,13 @@ if(faultdebug)printf("trap accflt type %lx, code %lx, pc %lx, psl %lx\n",
|
|||||||
* bother doing it here.
|
* bother doing it here.
|
||||||
*/
|
*/
|
||||||
addr = trunc_page(frame->code);
|
addr = trunc_page(frame->code);
|
||||||
if ((umode == 0) && (frame->code < 0))
|
if ((umode == 0) && (frame->code < 0)) {
|
||||||
|
vm = NULL;
|
||||||
map = kernel_map;
|
map = kernel_map;
|
||||||
else
|
} else {
|
||||||
map = &p->p_vmspace->vm_map;
|
vm = p->p_vmspace;
|
||||||
|
map = &vm->vm_map;
|
||||||
|
}
|
||||||
|
|
||||||
if (frame->trap & T_WRITE)
|
if (frame->trap & T_WRITE)
|
||||||
ftype = VM_PROT_WRITE;
|
ftype = VM_PROT_WRITE;
|
||||||
@ -242,6 +247,21 @@ if(faultdebug)printf("trap accflt type %lx, code %lx, pc %lx, psl %lx\n",
|
|||||||
KERNEL_PROC_LOCK(p);
|
KERNEL_PROC_LOCK(p);
|
||||||
else
|
else
|
||||||
KERNEL_LOCK(LK_CANRECURSE|LK_EXCLUSIVE);
|
KERNEL_LOCK(LK_CANRECURSE|LK_EXCLUSIVE);
|
||||||
|
|
||||||
|
nss = 0;
|
||||||
|
if (map != kernel_map &&
|
||||||
|
(caddr_t)addr >= vm->vm_maxsaddr &&
|
||||||
|
(caddr_t)addr < (caddr_t)USRSTACK) {
|
||||||
|
nss = btoc(USRSTACK - addr);
|
||||||
|
if (nss > btoc(p->p_rlimit[RLIMIT_STACK].rlim_cur)) {
|
||||||
|
/*
|
||||||
|
* Set nss to 0, since this case is not
|
||||||
|
* a "stack extension".
|
||||||
|
*/
|
||||||
|
nss = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
rv = uvm_fault(map, addr, 0, ftype);
|
rv = uvm_fault(map, addr, 0, ftype);
|
||||||
if (rv != 0) {
|
if (rv != 0) {
|
||||||
if (umode == 0) {
|
if (umode == 0) {
|
||||||
@ -260,8 +280,11 @@ if(faultdebug)printf("trap accflt type %lx, code %lx, pc %lx, psl %lx\n",
|
|||||||
} else {
|
} else {
|
||||||
sig = SIGSEGV;
|
sig = SIGSEGV;
|
||||||
}
|
}
|
||||||
} else
|
} else {
|
||||||
trapsig = 0;
|
trapsig = 0;
|
||||||
|
if (nss != 0 && nss > vm->vm_ssize)
|
||||||
|
vm->vm_ssize = nss;
|
||||||
|
}
|
||||||
if (umode)
|
if (umode)
|
||||||
KERNEL_PROC_UNLOCK(p);
|
KERNEL_PROC_UNLOCK(p);
|
||||||
else
|
else
|
||||||
|
Loading…
Reference in New Issue
Block a user