diff --git a/lisp/FreeBSD-os.c b/lisp/FreeBSD-os.c
index 13b409f3ec11e508954d4218ad8e1931b557b0c7..ed459b23138709e8fb436dc9f71a9f3ba73f007e 100644
--- a/lisp/FreeBSD-os.c
+++ b/lisp/FreeBSD-os.c
@@ -12,7 +12,7 @@
  * Much hacked by Paul Werkowski
  * GENCGC support by Douglas Crosher, 1996, 1997.
  *
- * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/FreeBSD-os.c,v 1.5 1999/11/29 17:04:07 dtc Exp $
+ * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/FreeBSD-os.c,v 1.6 2000/10/24 13:32:30 dtc Exp $
  *
  */
 
@@ -149,8 +149,8 @@ boolean valid_addr(os_vm_address_t addr)
 
   if (   in_range_p(addr, READ_ONLY_SPACE_START, READ_ONLY_SPACE_SIZE)
       || in_range_p(addr, STATIC_SPACE_START   , STATIC_SPACE_SIZE   )
-      || in_range_p(addr, DYNAMIC_0_SPACE_START, DYNAMIC_SPACE_SIZE  )
-      || in_range_p(addr, DYNAMIC_1_SPACE_START, DYNAMIC_SPACE_SIZE  )
+      || in_range_p(addr, DYNAMIC_0_SPACE_START, dynamic_space_size  )
+      || in_range_p(addr, DYNAMIC_1_SPACE_START, dynamic_space_size  )
       || in_range_p(addr, CONTROL_STACK_START  , CONTROL_STACK_SIZE  )
       || in_range_p(addr, BINDING_STACK_START  , BINDING_STACK_SIZE  ))
     return TRUE;
diff --git a/lisp/Linux-os.c b/lisp/Linux-os.c
index e905a25546d98ba29eef6555f8688cc870ef05c9..15ea86991556fe17b4fbe6cd2a90081d62319489 100644
--- a/lisp/Linux-os.c
+++ b/lisp/Linux-os.c
@@ -15,7 +15,7 @@
  * GENCGC support by Douglas Crosher, 1996, 1997.
  * Alpha support by Julian Dolby, 1999.
  *
- * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/Linux-os.c,v 1.11 2000/08/27 14:45:41 dtc Exp $
+ * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/Linux-os.c,v 1.12 2000/10/24 13:32:30 dtc Exp $
  *
  */
 
@@ -192,8 +192,8 @@ boolean valid_addr(os_vm_address_t addr)
 
   if (   in_range_p(addr, READ_ONLY_SPACE_START, READ_ONLY_SPACE_SIZE)
       || in_range_p(addr, STATIC_SPACE_START   , STATIC_SPACE_SIZE   )
-      || in_range_p(addr, DYNAMIC_0_SPACE_START, DYNAMIC_SPACE_SIZE  )
-      || in_range_p(addr, DYNAMIC_1_SPACE_START, DYNAMIC_SPACE_SIZE  )
+      || in_range_p(addr, DYNAMIC_0_SPACE_START, dynamic_space_size  )
+      || in_range_p(addr, DYNAMIC_1_SPACE_START, dynamic_space_size  )
       || in_range_p(addr, CONTROL_STACK_START  , CONTROL_STACK_SIZE  )
       || in_range_p(addr, BINDING_STACK_START  , BINDING_STACK_SIZE  ))
     return TRUE;
diff --git a/lisp/alpha-arch.c b/lisp/alpha-arch.c
index be8af2fdfbcfb39b4aaf4a9919e42d9b1dc0a07c..f730c0a54d9096ebe2d27f2b5ac7f51f00b2deac 100644
--- a/lisp/alpha-arch.c
+++ b/lisp/alpha-arch.c
@@ -1,6 +1,6 @@
 /*
 
- $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/alpha-arch.c,v 1.5 1999/02/20 15:54:43 pw Exp $
+ $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/alpha-arch.c,v 1.6 2000/10/24 13:32:30 dtc Exp $
 
  This code was written as part of the CMU Common Lisp project at
  Carnegie Mellon University, and has been placed in the public domain.
@@ -48,7 +48,7 @@ os_vm_address_t arch_get_bad_addr(int sig, int code, struct sigcontext *scp)
   if( (scp->sc_pc < READ_ONLY_SPACE_START ||
        scp->sc_pc >= READ_ONLY_SPACE_START+READ_ONLY_SPACE_SIZE) && 
       ((lispobj *)scp->sc_pc < current_dynamic_space ||
-       (lispobj *)scp->sc_pc >= current_dynamic_space + DYNAMIC_SPACE_SIZE))
+       (lispobj *)scp->sc_pc >= current_dynamic_space + dynamic_space_size))
     return NULL;
 
   badinst = *(unsigned int *)scp->sc_pc;
diff --git a/lisp/cgc.c b/lisp/cgc.c
index db6ce29db56d44dca47a203eb4b36d0e160d90e0..2b63412e0b8de478e836d159bf316ab72430249b 100644
--- a/lisp/cgc.c
+++ b/lisp/cgc.c
@@ -1,5 +1,5 @@
 /* cgc.c -*- Mode: C; comment-column: 40; -*-
- * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/cgc.c,v 1.8 1997/11/25 14:21:08 pw Exp $
+ * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/cgc.c,v 1.9 2000/10/24 13:32:30 dtc Exp $
  *
  * Conservative Garbage Collector for CMUCL x86.
  *
@@ -1880,7 +1880,7 @@ cgc_init_collector()
     heap_base = (void*)DYNAMIC_0_SPACE_START;
 
     /* I could actually use both spaces here but just 1 for now */
-    heap_end = (char*)heap_base + DYNAMIC_SPACE_SIZE;
+    heap_end = (char*)heap_base + dynamic_space_size;
 
     max_blocks = BLOCK_NUMBER(heap_end) - BLOCK_NUMBER(heap_base);
     if((block_table_base = malloc(sizeof(struct cluster *) * max_blocks))
diff --git a/lisp/gc.c b/lisp/gc.c
index 51873d8e1305f58e0f6da392eddbbbb84be9eba7..cc13413b2fc23e8933a6958893774b293c910694 100644
--- a/lisp/gc.c
+++ b/lisp/gc.c
@@ -1,7 +1,7 @@
 /*
  * Stop and Copy GC based on Cheney's algorithm.
  *
- * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/gc.c,v 1.16 1998/07/26 00:05:31 dtc Exp $
+ * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/gc.c,v 1.17 2000/10/24 13:32:30 dtc Exp $
  * 
  * Written by Christopher Hoover.
  */
@@ -299,7 +299,7 @@ void collect_garbage(void)
 #endif
 
 	os_zero((os_vm_address_t) current_dynamic_space,
-		(os_vm_size_t) DYNAMIC_SPACE_SIZE);
+		(os_vm_size_t) dynamic_space_size);
 
 	current_dynamic_space = new_space;
 #ifndef ibmrt
@@ -2230,7 +2230,7 @@ void set_auto_gc_trigger(os_vm_size_t dynamic_usage)
     os_vm_address_t addr=(os_vm_address_t)current_dynamic_space +
 	dynamic_usage;
     long length =
-	DYNAMIC_SPACE_SIZE + (os_vm_address_t)current_dynamic_space - addr;
+	dynamic_space_size + (os_vm_address_t)current_dynamic_space - addr;
 
     if(addr < (os_vm_address_t)current_dynamic_space_free_pointer) {
 	fprintf(stderr,
@@ -2265,12 +2265,12 @@ void clear_auto_gc_trigger(void)
 #if defined(SUNOS) || defined(SOLARIS)/* don't want to force whole space into swapping mode... */
 	os_vm_address_t addr=(os_vm_address_t)current_auto_gc_trigger;
 	os_vm_size_t length=
-	    DYNAMIC_SPACE_SIZE + (os_vm_address_t)current_dynamic_space - addr;
+	    dynamic_space_size + (os_vm_address_t)current_dynamic_space - addr;
 
 	os_validate(addr,length);
 #else
 	os_protect((os_vm_address_t)current_dynamic_space,
-		   DYNAMIC_SPACE_SIZE,
+		   dynamic_space_size,
 		   OS_VM_PROT_ALL);
 #endif
 
diff --git a/lisp/gencgc.c b/lisp/gencgc.c
index 82baea377fd9236c8d663d96b1ac2a3fa250c6a1..18b2d37c96c538991b4198d2d82a608cd2076ecc 100644
--- a/lisp/gencgc.c
+++ b/lisp/gencgc.c
@@ -7,7 +7,7 @@
  *
  * Douglas Crosher, 1996, 1997, 1998, 1999.
  *
- * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/gencgc.c,v 1.22 2000/10/21 12:50:42 dtc Exp $
+ * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/gencgc.c,v 1.23 2000/10/24 13:32:31 dtc Exp $
  *
  */
 
@@ -139,12 +139,17 @@ static int new_space;
  * GC structures and variables.
  */
 
+/*
+ * Number of pages within the dynamic heap, setup from the size of the
+ * dynamic space.
+ */
+unsigned dynamic_space_pages;
+
 /*
  * An array of page structures is statically allocated.
  * This helps quickly map between an address its page structure.
- * NUM_PAGES is set from the size of the dynamic space.
  */
-struct page page_table[NUM_PAGES];
+struct page *page_table;
 
 /*
  * Heap base, needed for mapping addresses to page structures.
@@ -169,7 +174,7 @@ inline int find_page_index(void *addr)
 
   if (index >= 0) {
     index = (unsigned int) index / PAGE_SIZE;
-    if (index < NUM_PAGES)
+    if (index < dynamic_space_pages)
       return index;
   }
 
@@ -566,7 +571,7 @@ static void gc_alloc_new_region(int nbytes, int unboxed,
      * not write protected, or marked dont_move.
      */
 
-    while (first_page < NUM_PAGES) {
+    while (first_page < dynamic_space_pages) {
       int flags = page_table[first_page].flags;
       if (!(flags & PAGE_ALLOCATED_MASK)
 	  || ((flags & mmask) == mflags &&
@@ -576,7 +581,7 @@ static void gc_alloc_new_region(int nbytes, int unboxed,
     }
 
     /* Check for a failure */
-    if (first_page >= NUM_PAGES) {
+    if (first_page >= dynamic_space_pages) {
       fprintf(stderr, "*A2 gc_alloc_new_region failed, nbytes=%d.\n", nbytes);
       print_generation_stats(1);
       exit(1);
@@ -599,7 +604,7 @@ static void gc_alloc_new_region(int nbytes, int unboxed,
     bytes_found = PAGE_SIZE - page_table[first_page].bytes_used;
     num_pages = 1;
     while ((bytes_found < nbytes || num_pages < 2)
-	   && last_page < NUM_PAGES - 1
+	   && last_page < dynamic_space_pages - 1
 	   && !PAGE_ALLOCATED(last_page + 1)) {
       last_page++;
       num_pages++;
@@ -619,10 +624,10 @@ static void gc_alloc_new_region(int nbytes, int unboxed,
 
     restart_page = last_page + 1;
   }
-  while (restart_page < NUM_PAGES && bytes_found < nbytes);
+  while (restart_page < dynamic_space_pages && bytes_found < nbytes);
 
   /* Check for a failure */
-  if (restart_page >= NUM_PAGES && bytes_found < nbytes) {
+  if (restart_page >= dynamic_space_pages && bytes_found < nbytes) {
     fprintf(stderr, "*A1 gc_alloc_new_region failed, nbytes=%d.\n", nbytes);
     print_generation_stats(1);
     exit(1);
@@ -1007,10 +1012,10 @@ static void *gc_alloc_large(int  nbytes, int unboxed,
     first_page = restart_page;
 
     if (large)
-      while (first_page < NUM_PAGES && PAGE_ALLOCATED(first_page))
+      while (first_page < dynamic_space_pages && PAGE_ALLOCATED(first_page))
 	first_page++;
     else
-      while (first_page < NUM_PAGES) {
+      while (first_page < dynamic_space_pages) {
 	int flags = page_table[first_page].flags;
 	if (!(flags & PAGE_ALLOCATED_MASK)
 	    || ((flags & mmask) == mflags &&
@@ -1020,7 +1025,7 @@ static void *gc_alloc_large(int  nbytes, int unboxed,
       }
 
     /* Check for a failure */
-    if (first_page >= NUM_PAGES) {
+    if (first_page >= dynamic_space_pages) {
       fprintf(stderr, "*A2 gc_alloc_large failed, nbytes=%d.\n", nbytes);
       print_generation_stats(1);
       exit(1);
@@ -1037,7 +1042,7 @@ static void *gc_alloc_large(int  nbytes, int unboxed,
     bytes_found = PAGE_SIZE - page_table[first_page].bytes_used;
     num_pages = 1;
     while (bytes_found < nbytes
-	   && last_page < NUM_PAGES - 1
+	   && last_page < dynamic_space_pages - 1
 	   && !PAGE_ALLOCATED(last_page + 1)) {
       last_page++;
       num_pages++;
@@ -1057,10 +1062,10 @@ static void *gc_alloc_large(int  nbytes, int unboxed,
 
     restart_page = last_page + 1;
   }
-  while ((restart_page < NUM_PAGES) && (bytes_found < nbytes));
+  while ((restart_page < dynamic_space_pages) && (bytes_found < nbytes));
 
   /* Check for a failure */
-  if (restart_page >= NUM_PAGES && bytes_found < nbytes) {
+  if (restart_page >= dynamic_space_pages && bytes_found < nbytes) {
     fprintf(stderr, "*A1 gc_alloc_large failed, nbytes=%d.\n", nbytes);
     print_generation_stats(1);
     exit(1);
@@ -1434,7 +1439,7 @@ static inline boolean from_space_p(lispobj obj)
 {
   int page_index = (void*) obj - heap_base;
   return page_index >= 0
-    && (page_index = (unsigned int) page_index / PAGE_SIZE) < NUM_PAGES
+    && (page_index = (unsigned int) page_index / PAGE_SIZE) < dynamic_space_pages
     && PAGE_GENERATION(page_index) == from_space;
 }
 
@@ -1442,7 +1447,7 @@ static inline boolean new_space_p(lispobj obj)
 {
   int page_index = (void*) obj - heap_base;
   return page_index >= 0
-    && (page_index = (unsigned int) page_index / PAGE_SIZE) < NUM_PAGES
+    && (page_index = (unsigned int) page_index / PAGE_SIZE) < dynamic_space_pages
     && PAGE_GENERATION(page_index) == new_space;
 }
 
@@ -4855,7 +4860,7 @@ static void scavenge_generation(int generation)
 #define SC_GEN_CK 0
 #if SC_GEN_CK
   /* Clear the write_protected_cleared flags on all pages */
-  for (i = 0; i < NUM_PAGES; i++)
+  for (i = 0; i < dynamic_space_pages; i++)
     page_table[i].flags &= ~PAGE_WRITE_PROTECTED_CLEADED_MASK;
 #endif
 
@@ -4929,7 +4934,7 @@ static void scavenge_generation(int generation)
    * Check that none of the write_protected pages in this generation
    * have been written to.
    */
-  for (i = 0; i < NUM_PAGES; i++)
+  for (i = 0; i < dynamic_space_pages; i++)
     if (PAGE_ALLOCATED(i)
 	&& page_table[i].bytes_used != 0
 	&& PAGE_GENERATION(i) == generation
@@ -5100,7 +5105,7 @@ static void scavenge_newspace_generation(int generation)
 #define SC_NS_GEN_CK 0
 #if SC_NS_GEN_CK
   /* Clear the write_protected_cleared flags on all pages */
-  for (i = 0; i < NUM_PAGES; i++)
+  for (i = 0; i < dynamic_space_pages; i++)
     page_table[i].flags &= ~PAGE_WRITE_PROTECTED_CLEARED;
 #endif
 
@@ -5219,7 +5224,7 @@ static void scavenge_newspace_generation(int generation)
    * Check that none of the write_protected pages in this generation
    * have been written to.
    */
-  for (i = 0; i < NUM_PAGES; i++)
+  for (i = 0; i < dynamic_space_pages; i++)
     if (PAGE_ALLOCATED(i)
 	&& page_table[i].bytes_used != 0
 	&& PAGE_GENERATION(i) == generation
@@ -5924,7 +5929,7 @@ void	update_x86_dynamic_space_free_pointer(void)
   int last_page = -1;
   int i;
 
-  for (i = 0; i < NUM_PAGES; i++)
+  for (i = 0; i < dynamic_space_pages; i++)
     if (PAGE_ALLOCATED(i) && page_table[i].bytes_used != 0)
       last_page = i;
 
@@ -6099,7 +6104,7 @@ void	gc_free_heap(void)
   if (gencgc_verbose > 1)
     fprintf(stderr, "Free heap\n");
 
-  for (page = 0; page < NUM_PAGES; page++)
+  for (page = 0; page < dynamic_space_pages; page++)
     /* Skip Free pages which should already be zero filled. */
     if (PAGE_ALLOCATED(page)) {
       void *page_start, *addr;
@@ -6195,8 +6200,19 @@ void gc_init(void)
 
   heap_base = (void*) DYNAMIC_0_SPACE_START;
 
+  /* The number of pages needed for the dynamic space - rounding up. */
+  dynamic_space_pages = (dynamic_space_size + (PAGE_SIZE - 1)) / PAGE_SIZE;
+
+  page_table = (struct page *)malloc(dynamic_space_pages*sizeof(struct page));
+  if (page_table == NULL)
+    {
+      fprintf(stderr, "Unable to allocate page table.\n");
+      exit(1);
+    }
+
   /* Initialise each page structure. */
-  for (i = 0; i < NUM_PAGES; i++) {
+
+  for (i = 0; i < dynamic_space_pages; i++) {
     /* Initial all pages as free. */
     page_table[i].flags &= ~PAGE_ALLOCATED_MASK;
     page_table[i].bytes_used = 0;
diff --git a/lisp/gencgc.h b/lisp/gencgc.h
index dddbf1d16afae651497f546d8978d7865f5493b4..de8db5dce765d2d655caaa918a61cec3019aa8e8 100644
--- a/lisp/gencgc.h
+++ b/lisp/gencgc.h
@@ -7,7 +7,7 @@
  *
  * Douglas Crosher, 1996, 1997.
  *
- * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/gencgc.h,v 1.4 2000/08/27 14:45:42 dtc Exp $
+ * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/gencgc.h,v 1.5 2000/10/24 13:32:32 dtc Exp $
  *
  */
 
@@ -126,10 +126,8 @@ struct page {
 
 #define PAGE_SIZE 4096
 
-
-/* The number of pages needed for the dynamic space - rounding up. */
-#define NUM_PAGES ((DYNAMIC_SPACE_SIZE + (PAGE_SIZE - 1)) / PAGE_SIZE)
-extern struct page page_table[NUM_PAGES];
+extern unsigned dynamic_space_pages;
+extern struct page *page_table;
 
 
 /*
diff --git a/lisp/globals.c b/lisp/globals.c
index bc03c1880ce046bcdf1cfedf41dc97ccc875c744..590429f95f5877fc104518bf0da415ea8c38f673 100644
--- a/lisp/globals.c
+++ b/lisp/globals.c
@@ -1,4 +1,4 @@
-/* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/globals.c,v 1.2 1997/01/21 00:28:13 ram Exp $ */
+/* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/globals.c,v 1.3 2000/10/24 13:32:32 dtc Exp $ */
 
 /* Variables everybody needs to look at or frob on. */
 
@@ -20,6 +20,7 @@ lispobj *read_only_space;
 lispobj *static_space;
 lispobj *dynamic_0_space;
 lispobj *dynamic_1_space;
+unsigned dynamic_space_size;
 lispobj *control_stack;
 #ifdef i386
 lispobj *control_stack_end;
diff --git a/lisp/globals.h b/lisp/globals.h
index 207e368dcd97485ad6257c92980d03391cb9d6cc..5ecf696dee9e508dea361041b9b3285a86be83fc 100644
--- a/lisp/globals.h
+++ b/lisp/globals.h
@@ -1,4 +1,4 @@
-/* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/globals.h,v 1.4 1997/01/21 00:28:13 ram Exp $ */
+/* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/globals.h,v 1.5 2000/10/24 13:32:32 dtc Exp $ */
 
 #if !defined(_INCLUDE_GLOBALS_H_)
 #define _INCLUDED_GLOBALS_H_
@@ -19,6 +19,7 @@ extern lispobj *read_only_space;
 extern lispobj *static_space;
 extern lispobj *dynamic_0_space;
 extern lispobj *dynamic_1_space;
+extern unsigned dynamic_space_size;
 extern lispobj *control_stack;
 extern lispobj *binding_stack;
 #ifdef i386
diff --git a/lisp/interrupt.c b/lisp/interrupt.c
index 0bb24cbb1a2e94d4a5f7bfbdf7843971e761af8a..f3b959bd2ebed5d268e34b5e49578584b2a37703 100644
--- a/lisp/interrupt.c
+++ b/lisp/interrupt.c
@@ -1,4 +1,4 @@
-/* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/interrupt.c,v 1.24 2000/10/21 13:01:23 dtc Exp $ */
+/* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/interrupt.c,v 1.25 2000/10/24 13:32:32 dtc Exp $ */
 
 /* Interrupt handing magic. */
 
@@ -443,7 +443,7 @@ static boolean gc_trigger_hit(HANDLER_ARGS)
 	lispobj *badaddr=(lispobj *)arch_get_bad_addr(signal, code, context);
 
 	return (badaddr >= current_auto_gc_trigger &&
-		badaddr < current_dynamic_space + DYNAMIC_SPACE_SIZE);
+		badaddr < current_dynamic_space + dynamic_space_size);
     }
 }
 #endif
diff --git a/lisp/lisp.c b/lisp/lisp.c
index 455a826d6e4deb65bf18b87641c8603dad9f98d1..8dc05bcdff801b17138da62cb529731fa8b36cd4 100644
--- a/lisp/lisp.c
+++ b/lisp/lisp.c
@@ -1,7 +1,7 @@
 /*
  * main() entry point for a stand alone lisp image.
  *
- * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/lisp.c,v 1.19 2000/10/24 11:02:49 dtc Exp $
+ * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/lisp.c,v 1.20 2000/10/24 13:32:32 dtc Exp $
  *
  */
 
@@ -101,24 +101,50 @@ void main(int argc, char *argv[], char *envp[])
     set_lossage_handler(ldb_monitor);
 
     monitor = FALSE;
+#ifdef DEFAULT_DYNAMIC_SPACE_SIZE
+    dynamic_space_size = DEFAULT_DYNAMIC_SPACE_SIZE;
+#else
+    dynamic_space_size = DYNAMIC_SPACE_SIZE;
+#endif
 
     argptr = argv;
-    while ((arg = *++argptr) != NULL) {
-        if (strcmp(arg, "-core") == 0) {
-            if (core != NULL) {
+    while ((arg = *++argptr) != NULL)
+      {
+        if (strcmp(arg, "-core") == 0)
+	  {
+            if (core != NULL)
+	      {
                 fprintf(stderr, "can only specify one core file.\n");
                 exit(1);
-            }
+	      }
             core = *++argptr;
-            if (core == NULL) {
-                fprintf(stderr, "-core must be followed by the name of the core file to use.\n");
+            if (core == NULL)
+	      {
+		fprintf(stderr, "-core must be followed by the name of the core file to use.\n");
                 exit(1);
-            }
-        }
-	else if (strcmp(arg, "-monitor") == 0) {
+	      }
+	  }
+        else if (strcmp(arg, "-dynamic-space-size") == 0)
+	  {
+            char *str = *++argptr;
+            if (str == NULL)
+	      {
+                fprintf(stderr, "-dynamic-space-size must be followed by the size to use in MBytes.\n");
+                exit(1);
+	      }
+	    dynamic_space_size = atoi(str) * 1024 * 1024;
+	    if (dynamic_space_size > DYNAMIC_SPACE_SIZE)
+	      {
+                fprintf(stderr, "-dynamic-space-size must be no greater than %d MBytes.\n",
+			DYNAMIC_SPACE_SIZE / (1024 * 1024));
+                exit(1);
+	      }
+	  }
+	else if (strcmp(arg, "-monitor") == 0)
+	  {
 	    monitor = TRUE;
-	}
-    }
+	  }
+      }
 
     default_core = arch_init();
     if (default_core == NULL)
diff --git a/lisp/purify.c b/lisp/purify.c
index 7fb11853002fa3f8570bee7d9fd8fab10023e0ae..a518e05c6bfba79e592ba359b14421594c32f4f9 100644
--- a/lisp/purify.c
+++ b/lisp/purify.c
@@ -10,7 +10,7 @@
    and x86/GENCGC stack scavenging, by Douglas Crosher, 1996, 1997,
    1998.
 
-   $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/purify.c,v 1.18 2000/08/27 14:45:42 dtc Exp $ 
+   $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/purify.c,v 1.19 2000/10/24 13:32:32 dtc Exp $ 
 
    */
 #include <stdio.h>
@@ -1514,11 +1514,11 @@ int purify(lispobj static_roots, lispobj read_only_roots)
 #if defined(WANT_CGC) && defined(X86_CGC_ACTIVE_P)
     if(SymbolValue(X86_CGC_ACTIVE_P) != T)
       os_zero((os_vm_address_t) current_dynamic_space,
-	      (os_vm_size_t) DYNAMIC_SPACE_SIZE);
+	      (os_vm_size_t) dynamic_space_size);
 #else
 #if !defined(GENCGC)
     os_zero((os_vm_address_t) current_dynamic_space,
-            (os_vm_size_t) DYNAMIC_SPACE_SIZE);
+            (os_vm_size_t) dynamic_space_size);
 #endif
 #endif
 
diff --git a/lisp/sparc-arch.c b/lisp/sparc-arch.c
index 0100b6619a17db6fe68e8b640c5af60cc8c85d1e..a59d80c5c756186e96dfe39df6e569483a715503 100644
--- a/lisp/sparc-arch.c
+++ b/lisp/sparc-arch.c
@@ -1,6 +1,6 @@
 /*
 
- $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/sparc-arch.c,v 1.7 1997/04/20 21:03:14 dtc Exp $
+ $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/sparc-arch.c,v 1.8 2000/10/24 13:32:32 dtc Exp $
 
  This code was written as part of the CMU Common Lisp project at
  Carnegie Mellon University, and has been placed in the public domain.
@@ -43,7 +43,7 @@ os_vm_address_t arch_get_bad_addr(HANDLER_ARGS)
 	  SC_PC(context) >= READ_ONLY_SPACE_START+READ_ONLY_SPACE_SIZE) &&
 	 ((lispobj *)SC_PC(context) < current_dynamic_space &&
 	  (lispobj *)SC_PC(context) >=
-	      current_dynamic_space + DYNAMIC_SPACE_SIZE)))
+	      current_dynamic_space + dynamic_space_size)))
 	return 0;
 
     badinst = *(unsigned long *)SC_PC(context);
diff --git a/lisp/validate.c b/lisp/validate.c
index b9bf97c52dcc514ef883efb8033345a2900f298b..582c3cee8a0cc4b1c116334223bf522dfa72635e 100644
--- a/lisp/validate.c
+++ b/lisp/validate.c
@@ -1,5 +1,5 @@
 /*
- * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/validate.c,v 1.6 1997/11/08 15:33:49 dtc Exp $
+ * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/validate.c,v 1.7 2000/10/24 13:32:32 dtc Exp $
  *
  * Memory Validation
  */
@@ -59,14 +59,14 @@ void validate(void)
 
 	/* Dynamic-0 Space */
 	dynamic_0_space = (lispobj *) DYNAMIC_0_SPACE_START;
-	ensure_space(dynamic_0_space, DYNAMIC_SPACE_SIZE);
+	ensure_space(dynamic_0_space, dynamic_space_size);
 
 	current_dynamic_space = dynamic_0_space;
 
 	/* Dynamic-1 Space */
 	dynamic_1_space = (lispobj *) DYNAMIC_1_SPACE_START;
 #ifndef GENCGC
- 	ensure_space(dynamic_1_space, DYNAMIC_SPACE_SIZE);
+ 	ensure_space(dynamic_1_space, dynamic_space_size);
 #endif
 
 	/* Control Stack */
diff --git a/lisp/x86-validate.h b/lisp/x86-validate.h
index a20df02aa4fc7685a98e533d5fef9c6fc8c048f4..cf7e106e73ed292d3f00e80329dbdfcd2404270e 100644
--- a/lisp/x86-validate.h
+++ b/lisp/x86-validate.h
@@ -3,7 +3,7 @@
  * This code was written as part of the CMU Common Lisp project at
  * Carnegie Mellon University, and has been placed in the public domain.
  *
- *  $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/x86-validate.h,v 1.11 1999/09/16 15:40:11 dtc Exp $
+ *  $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/x86-validate.h,v 1.12 2000/10/24 13:32:32 dtc Exp $
  *
  */
 
@@ -52,6 +52,7 @@
 #else
 #define DYNAMIC_SPACE_SIZE	(0x04000000) /* 64MB */
 #endif
+#define DEFAULT_DYNAMIC_SPACE_SIZE	(0x20000000) /* 512MB */
 #endif
 
 
@@ -70,10 +71,11 @@
 
 #define DYNAMIC_0_SPACE_START	(0x48000000)
 #ifdef GENCGC
-#define DYNAMIC_SPACE_SIZE	(0x20000000) /* 512MB */
+#define DYNAMIC_SPACE_SIZE	(0x68000000) /* 1.625GB */
 #else
 #define DYNAMIC_SPACE_SIZE	(0x04000000) /* 64MB */
 #endif
+#define DEFAULT_DYNAMIC_SPACE_SIZE	(0x20000000) /* 512MB */
 #endif