Mostly remove the VM_STACK OPTION.
This changes the definitions of a few items so that structures are the same whether or not the option itself is enabled. This allows people to enable and disable the option without recompilng the world. As the author says: |I ran into a problem pulling out the VM_STACK option. I was aware of this |when I first did the work, but then forgot about it. The VM_STACK stuff |has some code changes in the i386 branch. There need to be corresponding |changes in the alpha branch before it can come out completely. what is done: | |1) Pull the VM_STACK option out of the header files it appears in. This |really shouldn't affect anything that executes with or without the rest |of the VM_STACK patches. The vm_map_entry will then always have one |extra element (avail_ssize). It just won't be used if the VM_STACK |option is not turned on. | |I've also pulled the option out of vm_map.c. This shouldn't harm anything, |since the routines that are enabled as a result are not called unless |the VM_STACK option is enabled elsewhere. | |2) Add what appears to be appropriate code the the alpha branch, still |protected behind the VM_STACK switch. I don't have an alpha machine, |so we would need to get some testers with alpha machines to try it out. | |Once there is some testing, we can consider making the change permanent |for both i386 and alpha. | [..] | |Once the alpha code is adequately tested, we can pull VM_STACK out |everywhere. | Submitted by: "Richard Seaman, Jr." <dick@tar.com>
This commit is contained in:
parent
88c5ea4574
commit
2907af2a96
@ -130,6 +130,25 @@ system calls.
|
||||
Modifications are private.
|
||||
.It Dv MAP_SHARED
|
||||
Modifications are shared.
|
||||
.It Dv MAP_STACK
|
||||
This option is only available if your system has been compiled with
|
||||
VM_STACK defined when compiling the kernel. This is the default for
|
||||
i386 only. Consider adding -DVM_STACK to COPTFLAGS in your /etc/make.conf
|
||||
to enable this option for other architechures. MAP_STACK implies
|
||||
MAP_ANON, and
|
||||
.Fa offset
|
||||
of 0.
|
||||
.Fa fd
|
||||
must be -1 and
|
||||
.Fa prot
|
||||
must include at least PROT_READ and PROT_WRITE. This option creates
|
||||
a memory region that grows to at most
|
||||
.Fa len
|
||||
bytes in size, starting from the stack top and growing down. The
|
||||
stack top is the starting address returned by the call, plus
|
||||
.Fa len
|
||||
bytes. The bottom of the stack at maximum growth is the starting
|
||||
address returned by the call.
|
||||
.El
|
||||
.Pp
|
||||
The
|
||||
|
@ -23,7 +23,7 @@
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id: machdep.c,v 1.29 1998/12/30 10:38:58 dfr Exp $
|
||||
* $Id: machdep.c,v 1.30 1999/01/15 18:00:19 msmith Exp $
|
||||
*/
|
||||
/*-
|
||||
* Copyright (c) 1998 The NetBSD Foundation, Inc.
|
||||
@ -1268,12 +1268,22 @@ sendsig(sig_t catcher, int sig, int mask, u_long code)
|
||||
psp->ps_sigstk.ss_flags |= SS_ONSTACK;
|
||||
} else
|
||||
scp = (struct sigcontext *)(alpha_pal_rdusp() - rndfsize);
|
||||
#ifndef VM_STACK
|
||||
if ((u_long)scp <= USRSTACK - ctob(p->p_vmspace->vm_ssize))
|
||||
#if defined(UVM)
|
||||
(void)uvm_grow(p, (u_long)scp);
|
||||
#else
|
||||
(void)grow(p, (u_long)scp);
|
||||
#endif
|
||||
#else
|
||||
/* Note: uvm_grow doesn't seem to be defined anywhere, so we don't
|
||||
* know how to implement it for the VM_STACK case. Also, we would
|
||||
* think that it would be wise to test for success of grow_stack,
|
||||
* but we don't since there is no test for success for grow in the
|
||||
* non VM_STACK case.
|
||||
*/
|
||||
(void)grow_stack(p, (u_long)scp);
|
||||
#endif
|
||||
#ifdef DEBUG
|
||||
if ((sigdebug & SDB_KSTACK) && p->p_pid == sigpid)
|
||||
printf("sendsig(%d): sig %d ssp %p usp %p\n", p->p_pid,
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $Id: trap.c,v 1.9 1998/12/16 15:21:50 bde Exp $ */
|
||||
/* $Id: trap.c,v 1.10 1998/12/30 10:38:58 dfr Exp $ */
|
||||
/* $NetBSD: trap.c,v 1.31 1998/03/26 02:21:46 thorpej Exp $ */
|
||||
|
||||
/*
|
||||
@ -418,6 +418,7 @@ trap(a0, a1, a2, entry, framep)
|
||||
/*
|
||||
* Grow the stack if necessary
|
||||
*/
|
||||
#ifndef VM_STACK
|
||||
if ((caddr_t)va > vm->vm_maxsaddr
|
||||
&& va < USRSTACK) {
|
||||
if (!grow(p, va)) {
|
||||
@ -426,6 +427,20 @@ trap(a0, a1, a2, entry, framep)
|
||||
goto nogo;
|
||||
}
|
||||
}
|
||||
#else
|
||||
/* grow_stack returns false only if va falls into
|
||||
* a growable stack region and the stack growth
|
||||
* fails. It returns true if va was not within
|
||||
* a growable stack region, or if the stack
|
||||
* growth succeeded.
|
||||
*/
|
||||
if (!grow_stack (p, va)) {
|
||||
rv = KERN_FAILURE;
|
||||
--p->p_lock;
|
||||
goto nogo;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/* Fault in the user page: */
|
||||
rv = vm_fault(map, va, ftype,
|
||||
|
@ -38,7 +38,7 @@
|
||||
*
|
||||
* from: @(#)vm_machdep.c 7.3 (Berkeley) 5/13/91
|
||||
* Utah $Hdr: vm_machdep.c 1.16.1.1 89/06/23$
|
||||
* $Id: vm_machdep.c,v 1.6 1998/12/16 15:21:50 bde Exp $
|
||||
* $Id: vm_machdep.c,v 1.7 1998/12/30 10:38:58 dfr Exp $
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University.
|
||||
@ -365,6 +365,7 @@ cpu_reset()
|
||||
prom_halt(0);
|
||||
}
|
||||
|
||||
#ifndef VM_STACK
|
||||
/*
|
||||
* Grow the user stack to allow for 'sp'. This version grows the stack in
|
||||
* chunks of SGROWSIZ.
|
||||
@ -417,6 +418,22 @@ grow(p, sp)
|
||||
|
||||
return (1);
|
||||
}
|
||||
#else
|
||||
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);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
static int cnt_prezero;
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
# Makefile.i386 -- with config changes.
|
||||
# Copyright 1990 W. Jolitz
|
||||
# from: @(#)Makefile.i386 7.1 5/10/91
|
||||
# $Id: Makefile.i386,v 1.136 1999/01/19 17:08:28 peter Exp $
|
||||
# $Id: Makefile.i386,v 1.137 1999/01/25 04:08:28 peter Exp $
|
||||
#
|
||||
# Makefile for FreeBSD
|
||||
#
|
||||
@ -38,7 +38,7 @@ INCLUDES+= -I$S/../include
|
||||
.else
|
||||
INCLUDES+= -I/usr/include
|
||||
.endif
|
||||
COPTS= ${INCLUDES} ${IDENT} -DKERNEL -include opt_global.h
|
||||
COPTS= ${INCLUDES} ${IDENT} -DKERNEL -DVM_STACK -include opt_global.h
|
||||
CFLAGS= ${COPTFLAGS} ${CWARNFLAGS} ${DEBUG} ${COPTS}
|
||||
|
||||
# XXX LOCORE means "don't declare C stuff" not "for locore.s".
|
||||
|
@ -1,7 +1,7 @@
|
||||
# Makefile.i386 -- with config changes.
|
||||
# Copyright 1990 W. Jolitz
|
||||
# from: @(#)Makefile.i386 7.1 5/10/91
|
||||
# $Id: Makefile.i386,v 1.136 1999/01/19 17:08:28 peter Exp $
|
||||
# $Id: Makefile.i386,v 1.137 1999/01/25 04:08:28 peter Exp $
|
||||
#
|
||||
# Makefile for FreeBSD
|
||||
#
|
||||
@ -38,7 +38,7 @@ INCLUDES+= -I$S/../include
|
||||
.else
|
||||
INCLUDES+= -I/usr/include
|
||||
.endif
|
||||
COPTS= ${INCLUDES} ${IDENT} -DKERNEL -include opt_global.h
|
||||
COPTS= ${INCLUDES} ${IDENT} -DKERNEL -DVM_STACK -include opt_global.h
|
||||
CFLAGS= ${COPTFLAGS} ${CWARNFLAGS} ${DEBUG} ${COPTS}
|
||||
|
||||
# XXX LOCORE means "don't declare C stuff" not "for locore.s".
|
||||
|
@ -1,7 +1,7 @@
|
||||
# Makefile.i386 -- with config changes.
|
||||
# Copyright 1990 W. Jolitz
|
||||
# from: @(#)Makefile.i386 7.1 5/10/91
|
||||
# $Id: Makefile.i386,v 1.136 1999/01/19 17:08:28 peter Exp $
|
||||
# $Id: Makefile.i386,v 1.137 1999/01/25 04:08:28 peter Exp $
|
||||
#
|
||||
# Makefile for FreeBSD
|
||||
#
|
||||
@ -38,7 +38,7 @@ INCLUDES+= -I$S/../include
|
||||
.else
|
||||
INCLUDES+= -I/usr/include
|
||||
.endif
|
||||
COPTS= ${INCLUDES} ${IDENT} -DKERNEL -include opt_global.h
|
||||
COPTS= ${INCLUDES} ${IDENT} -DKERNEL -DVM_STACK -include opt_global.h
|
||||
CFLAGS= ${COPTFLAGS} ${CWARNFLAGS} ${DEBUG} ${COPTS}
|
||||
|
||||
# XXX LOCORE means "don't declare C stuff" not "for locore.s".
|
||||
|
@ -38,7 +38,7 @@
|
||||
*
|
||||
* from: @(#)vm_machdep.c 7.3 (Berkeley) 5/13/91
|
||||
* Utah $Hdr: vm_machdep.c 1.16.1.1 89/06/23$
|
||||
* $Id: vm_machdep.c,v 1.6 1998/12/16 15:21:50 bde Exp $
|
||||
* $Id: vm_machdep.c,v 1.7 1998/12/30 10:38:58 dfr Exp $
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University.
|
||||
@ -365,6 +365,7 @@ cpu_reset()
|
||||
prom_halt(0);
|
||||
}
|
||||
|
||||
#ifndef VM_STACK
|
||||
/*
|
||||
* Grow the user stack to allow for 'sp'. This version grows the stack in
|
||||
* chunks of SGROWSIZ.
|
||||
@ -417,6 +418,22 @@ grow(p, sp)
|
||||
|
||||
return (1);
|
||||
}
|
||||
#else
|
||||
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);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
static int cnt_prezero;
|
||||
|
||||
|
@ -38,7 +38,7 @@
|
||||
*
|
||||
* from: @(#)vm_machdep.c 7.3 (Berkeley) 5/13/91
|
||||
* Utah $Hdr: vm_machdep.c 1.16.1.1 89/06/23$
|
||||
* $Id: vm_machdep.c,v 1.6 1998/12/16 15:21:50 bde Exp $
|
||||
* $Id: vm_machdep.c,v 1.7 1998/12/30 10:38:58 dfr Exp $
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University.
|
||||
@ -365,6 +365,7 @@ cpu_reset()
|
||||
prom_halt(0);
|
||||
}
|
||||
|
||||
#ifndef VM_STACK
|
||||
/*
|
||||
* Grow the user stack to allow for 'sp'. This version grows the stack in
|
||||
* chunks of SGROWSIZ.
|
||||
@ -417,6 +418,22 @@ grow(p, sp)
|
||||
|
||||
return (1);
|
||||
}
|
||||
#else
|
||||
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);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
static int cnt_prezero;
|
||||
|
||||
|
@ -31,7 +31,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)mman.h 8.2 (Berkeley) 1/9/95
|
||||
* $Id: mman.h,v 1.23 1998/03/28 11:50:38 dufault Exp $
|
||||
* $Id: mman.h,v 1.24 1999/01/06 23:05:40 julian Exp $
|
||||
*/
|
||||
|
||||
#ifndef _SYS_MMAN_H_
|
||||
@ -64,9 +64,7 @@
|
||||
#define MAP_INHERIT 0x0080 /* region is retained after exec */
|
||||
#define MAP_NOEXTEND 0x0100 /* for MAP_FILE, don't change file size */
|
||||
#define MAP_HASSEMAPHORE 0x0200 /* region may contain semaphores */
|
||||
#ifdef VM_STACK
|
||||
#define MAP_STACK 0x0400 /* region grows down, like a stack */
|
||||
#endif
|
||||
|
||||
#ifdef _P1003_1B_VISIBLE
|
||||
/*
|
||||
|
@ -31,7 +31,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)vm_extern.h 8.2 (Berkeley) 1/12/94
|
||||
* $Id: vm_extern.h,v 1.38 1998/06/07 17:13:09 dfr Exp $
|
||||
* $Id: vm_extern.h,v 1.39 1999/01/06 23:05:41 julian Exp $
|
||||
*/
|
||||
|
||||
#ifndef _VM_EXTERN_H_
|
||||
@ -61,11 +61,8 @@ int swapon __P((struct proc *, void *, int *));
|
||||
#endif
|
||||
|
||||
void faultin __P((struct proc *p));
|
||||
#ifndef VM_STACK
|
||||
int grow __P((struct proc *, size_t));
|
||||
#else
|
||||
int grow_stack __P((struct proc *, size_t));
|
||||
#endif
|
||||
int kernacc __P((caddr_t, int, int));
|
||||
vm_offset_t kmem_alloc __P((vm_map_t, vm_size_t));
|
||||
vm_offset_t kmem_alloc_pageable __P((vm_map_t, vm_size_t));
|
||||
|
@ -61,7 +61,7 @@
|
||||
* any improvements or extensions that they make and grant Carnegie the
|
||||
* rights to redistribute these changes.
|
||||
*
|
||||
* $Id: vm_map.c,v 1.141 1999/01/21 09:40:48 dillon Exp $
|
||||
* $Id: vm_map.c,v 1.142 1999/01/24 06:04:52 dillon Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -75,9 +75,7 @@
|
||||
#include <sys/vmmeter.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/vnode.h>
|
||||
#ifdef VM_STACK
|
||||
#include <sys/resourcevar.h>
|
||||
#endif
|
||||
|
||||
#include <vm/vm.h>
|
||||
#include <vm/vm_param.h>
|
||||
@ -548,9 +546,7 @@ vm_map_insert(vm_map_t map, vm_object_t object, vm_ooffset_t offset,
|
||||
new_entry->eflags = protoeflags;
|
||||
new_entry->object.vm_object = object;
|
||||
new_entry->offset = offset;
|
||||
#ifdef VM_STACK
|
||||
new_entry->avail_ssize = 0;
|
||||
#endif
|
||||
|
||||
if (object) {
|
||||
if ((object->ref_count > 1) || (object->shadow_count != 0)) {
|
||||
@ -589,7 +585,6 @@ vm_map_insert(vm_map_t map, vm_object_t object, vm_ooffset_t offset,
|
||||
return (KERN_SUCCESS);
|
||||
}
|
||||
|
||||
#ifdef VM_STACK
|
||||
int
|
||||
vm_map_stack (vm_map_t map, vm_offset_t addrbos, vm_size_t max_ssize,
|
||||
vm_prot_t prot, vm_prot_t max, int cow)
|
||||
@ -785,7 +780,6 @@ vm_map_growstack (struct proc *p, vm_offset_t addr)
|
||||
return (rv);
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Find sufficient space for `length' bytes in the given map, starting at
|
||||
|
@ -61,7 +61,7 @@
|
||||
* any improvements or extensions that they make and grant Carnegie the
|
||||
* rights to redistribute these changes.
|
||||
*
|
||||
* $Id: vm_map.h,v 1.32 1998/01/22 17:30:38 dyson Exp $
|
||||
* $Id: vm_map.h,v 1.33 1999/01/06 23:05:42 julian Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -102,9 +102,7 @@ struct vm_map_entry {
|
||||
struct vm_map_entry *next; /* next entry */
|
||||
vm_offset_t start; /* start address */
|
||||
vm_offset_t end; /* end address */
|
||||
#ifdef VM_STACK
|
||||
vm_offset_t avail_ssize; /* amt can grow if this is a stack */
|
||||
#endif
|
||||
union vm_map_object object; /* object I point to */
|
||||
vm_ooffset_t offset; /* offset into object */
|
||||
u_char eflags; /* map entry flags */
|
||||
@ -338,10 +336,8 @@ void vm_map_simplify_entry __P((vm_map_t, vm_map_entry_t));
|
||||
void vm_init2 __P((void));
|
||||
int vm_uiomove __P((vm_map_t, vm_object_t, off_t, int, vm_offset_t, int *));
|
||||
void vm_freeze_copyopts __P((vm_object_t, vm_pindex_t, vm_pindex_t));
|
||||
#ifdef VM_STACK
|
||||
int vm_map_stack __P((vm_map_t, vm_offset_t, vm_size_t, vm_prot_t, vm_prot_t, int));
|
||||
int vm_map_growstack __P((struct proc *p, vm_offset_t addr));
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#endif /* _VM_MAP_ */
|
||||
|
@ -38,7 +38,7 @@
|
||||
* from: Utah $Hdr: vm_mmap.c 1.6 91/10/21$
|
||||
*
|
||||
* @(#)vm_mmap.c 8.4 (Berkeley) 1/12/94
|
||||
* $Id: vm_mmap.c,v 1.86 1999/01/06 23:05:42 julian Exp $
|
||||
* $Id: vm_mmap.c,v 1.87 1999/01/21 08:29:11 dillon Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -178,15 +178,18 @@ mmap(p, uap)
|
||||
((flags & MAP_ANON) && uap->fd != -1))
|
||||
return (EINVAL);
|
||||
|
||||
#ifdef VM_STACK
|
||||
if (flags & MAP_STACK) {
|
||||
#ifdef VM_STACK
|
||||
if ((uap->fd != -1) ||
|
||||
((prot & (PROT_READ | PROT_WRITE)) != (PROT_READ | PROT_WRITE)))
|
||||
return (EINVAL);
|
||||
flags |= MAP_ANON;
|
||||
pos = 0;
|
||||
}
|
||||
#else
|
||||
return (EINVAL);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* Align the file position to a page boundary,
|
||||
* and save its page offset component.
|
||||
|
Loading…
x
Reference in New Issue
Block a user