diff --git a/lisp/solaris-os.c b/lisp/solaris-os.c
index de6c9366c7efc04e6e7b7d7416856fdb13e7c4d0..0c2e78e9dcfb7bf8b107ca97ce0164fb7a6cb9ab 100644
--- a/lisp/solaris-os.c
+++ b/lisp/solaris-os.c
@@ -1,5 +1,5 @@
 /*
- * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/solaris-os.c,v 1.3 2000/11/03 18:13:45 dtc Exp $
+ * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/solaris-os.c,v 1.4 2000/12/05 03:03:48 dtc Exp $
  *
  * OS-dependent routines.  This file (along with os.h) exports an
  * OS-independent interface to the operating system VM facilities.
@@ -58,12 +58,12 @@ extern char *getenv();
 long os_vm_page_size=(-1);
 static long os_real_page_size=(-1);
 
-static int zero_fd=(-1), empty_fd=(-1);
+static int zero_fd=(-1);
 
 static os_vm_size_t real_page_size_difference=0;
 
-static void os_init_bailout(arg)
-char *arg;
+static void
+os_init_bailout(char* arg)
 {
     char buf[500];
     sprintf(buf,"os_init: %s",arg);
@@ -71,18 +71,9 @@ char *arg;
     exit(1);
 }
 
-void os_init()
+void
+os_init(void)
 {
-    char *empty_file=getenv("CMUCL_EMPTYFILE");
-
-    if(empty_file==NULL)
-	empty_file=EMPTYFILE;
-
-    empty_fd=open(empty_file,O_RDONLY|O_CREAT);
-    if(empty_fd<0)
-	os_init_bailout(empty_file);
-    unlink(empty_file);
-
     zero_fd=open(ZEROFILE,O_RDONLY);
     if(zero_fd<0)
 	os_init_bailout(ZEROFILE);
@@ -115,7 +106,8 @@ os_validate(os_vm_address_t addr, os_vm_size_t len)
 
   if(addr) flags|=MAP_FIXED;
 
-  if((addr=mmap(addr,len,OS_VM_PROT_ALL,flags,zero_fd,0)) == (os_vm_address_t) -1)
+  if((addr = (os_vm_address_t) mmap((void*)addr, len, OS_VM_PROT_ALL, flags, zero_fd, 0))
+     == (os_vm_address_t) -1)
     perror("mmap");
 
   return addr;
@@ -124,23 +116,22 @@ os_validate(os_vm_address_t addr, os_vm_size_t len)
 void
 os_invalidate(os_vm_address_t addr, os_vm_size_t len)
 {
-  if(munmap(addr,len) == -1)
+  if(munmap((void*) addr, len) == -1)
     perror("munmap");
 }
 
 os_vm_address_t
 os_map(int fd, int offset, os_vm_address_t addr, os_vm_size_t len)
 {
-  if((addr=mmap(addr,len,OS_VM_PROT_ALL,MAP_PRIVATE|MAP_FIXED,fd,
+  if((addr = (os_vm_address_t) mmap((void*) addr, len, OS_VM_PROT_ALL, MAP_PRIVATE|MAP_FIXED, fd,
 		(off_t) offset)) == (os_vm_address_t) -1)
     perror("mmap");
   
   return addr;
 }
 
-void os_flush_icache(address, length)
-os_vm_address_t address;
-os_vm_size_t length;
+void
+os_flush_icache(os_vm_address_t address, os_vm_size_t length)
 {
   static int flushit = -1;
   /*
@@ -165,15 +156,34 @@ os_vm_size_t length;
 void
 os_protect(os_vm_address_t address, os_vm_size_t length, os_vm_prot_t prot)
 {
-  if(mprotect(address, length, prot) == -1)
+  if(mprotect((void*)address, length, prot) == -1)
     perror("mprotect");
 }
 
-boolean valid_addr(test)
-os_vm_address_t test;
+static boolean
+in_range_p(os_vm_address_t a, lispobj sbeg, size_t slen)
 {
-  /* XXX needs implementing */
-  return 1;
+  char* beg = (char*) sbeg;
+  char* end = (char*) sbeg + slen;
+  char* adr = (char*) a;
+  return (adr >= beg && adr < end);
+}
+
+boolean
+valid_addr(os_vm_address_t addr)
+{
+  /* Stolen from Linux-os.c */
+  os_vm_address_t newaddr;
+  newaddr = os_trunc_to_page(addr);
+
+  /* Just assume address is valid if it lies within one of the known
+     spaces.  (Unlike sunos-os which keeps track of every valid page.) */
+  return (   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, CONTROL_STACK_START  , CONTROL_STACK_SIZE  )
+          || in_range_p(addr, BINDING_STACK_START  , BINDING_STACK_SIZE  ));
 }
 
 /* ---------------------------------------------------------------- */
@@ -181,7 +191,8 @@ os_vm_address_t test;
 /*
  * Running into the gc trigger page will end up here...
  */
-void segv_handler(HANDLER_ARGS)
+void
+segv_handler(HANDLER_ARGS)
 {
   caddr_t addr = code->si_addr;
 
@@ -195,15 +206,17 @@ void segv_handler(HANDLER_ARGS)
   }
 }
 
-void os_install_interrupt_handlers()
+void
+os_install_interrupt_handlers()
 {
     interrupt_install_low_level_handler(SIGSEGV,segv_handler);
 }
 
 
-/* function defintions for register lvalues */
+/* function definitions for register lvalues */
 
-int * solaris_register_address(struct ucontext *context, int reg)
+int *
+solaris_register_address(struct ucontext *context, int reg)
 {
     if (reg == 0) {
 	static int zero;