Skip to content
validate.c 3.33 KiB
Newer Older
wlott's avatar
wlott committed
/*
 * Memory Validation
 */

#include <stdio.h>
emarsden's avatar
 
emarsden committed
#include <unistd.h>
rtoy's avatar
rtoy committed
#include <string.h>
#include <stdlib.h>
rtoy's avatar
rtoy committed
#ifdef sparc
toy's avatar
toy committed
#include <alloca.h>
#endif
wlott's avatar
wlott committed
#include "lisp.h"
#include "os.h"
#include "globals.h"
#include "validate.h"
emarsden's avatar
 
emarsden committed
#include "internals.h"
wlott's avatar
wlott committed

rtoy's avatar
rtoy committed
#ifdef sparc
extern void make_holes(void);
#endif

ensure_space(lispobj * start, size_t size)
wlott's avatar
wlott committed
{
    if (os_validate((os_vm_address_t) start, size) == NULL) {
wlott's avatar
wlott committed
	fprintf(stderr,
		"ensure_space: Failed to validate %ld bytes at 0x%08lx\n",
		(unsigned long) size, (unsigned long) start);
wlott's avatar
wlott committed
	exit(1);
    }
}

/* builtin_image_flag is used as a flag indicating that the lisp image is
   built into the executable.  The other variables are set to actual values
   in elf.c when the core section is mapped. FMG
*/
extern int builtin_image_flag;
cwang's avatar
cwang committed
long image_dynamic_space_size = 0;
long image_read_only_space_size = 0;
long image_static_space_size = 0;
wlott's avatar
wlott committed
{
    /* Read-Only Space */
    read_only_space = (lispobj *) READ_ONLY_SPACE_START;
    /* Note that if the lisp core is not built into the image,
       the below expression will be equal to this:
       ensure_space(read_only_space, READ_ONLY_SPACE_SIZE);
       FMG
    */
    ensure_space((lispobj *)((int)read_only_space + image_read_only_space_size),
Raymond Toy's avatar
Raymond Toy committed
		 read_only_space_size - image_read_only_space_size);
wlott's avatar
wlott committed

    /* Static Space */
    static_space = (lispobj *) STATIC_SPACE_START;
    /* Note that if the lisp core is not built into the image,
       the below expression will be equal to this:
       ensure_space(static_space, STATIC_SPACE_SIZE);
       FMG
    */
    ensure_space((lispobj *)((int)static_space + image_static_space_size),
Raymond Toy's avatar
Raymond Toy committed
		 static_space_size - image_static_space_size);
wlott's avatar
wlott committed

    /* Dynamic-0 Space */
    dynamic_0_space = (lispobj *) DYNAMIC_0_SPACE_START;
    /* Note that if the lisp core is not built into the image,
       the below expression will be equal to this:
       ensure_space(dynamic_0_space, dynamic_space_size);
       FMG
    */
    ensure_space((lispobj *)((int)dynamic_0_space + image_dynamic_space_size),
		 dynamic_space_size - image_dynamic_space_size);
wlott's avatar
wlott committed

    current_dynamic_space = dynamic_0_space;
wlott's avatar
wlott committed

dtc's avatar
dtc committed
#ifndef GENCGC
    /* Dynamic-1 Space */
    dynamic_1_space = (lispobj *) DYNAMIC_1_SPACE_START;
    ensure_space(dynamic_1_space, dynamic_space_size);
    /* I'm not sure about the following, or if the lisp executable
       stuff will work with a garbage collector other than gencgc.
       FMG
    */
    /*
      if (builtin_image_flag != 0)
      dynamic_space_data = alloca((int) (&image_dynamic_space_size));
    */
dtc's avatar
dtc committed
#endif
wlott's avatar
wlott committed

    /* Control Stack */
    control_stack = (lispobj *) CONTROL_STACK_START;
cwang's avatar
cwang committed
#if (defined(i386) || defined(__x86_64))
Raymond Toy's avatar
Raymond Toy committed
    control_stack_end = (lispobj *) (CONTROL_STACK_START + control_stack_size);
ram's avatar
ram committed
#endif
Raymond Toy's avatar
Raymond Toy committed
    ensure_space(control_stack, control_stack_size);
wlott's avatar
wlott committed

#ifdef SIGNAL_STACK_START
    ensure_space((lispobj *) SIGNAL_STACK_START, SIGNAL_STACK_SIZE);
#endif

    /* Binding Stack */
    binding_stack = (lispobj *) BINDING_STACK_START;
Raymond Toy's avatar
Raymond Toy committed
    ensure_space(binding_stack, binding_stack_size);
moore's avatar
 
moore committed
#ifdef LINKAGE_TABLE
    ensure_space((lispobj *) FOREIGN_LINKAGE_SPACE_START,
		 FOREIGN_LINKAGE_SPACE_SIZE);
moore's avatar
 
moore committed
#endif
wlott's avatar
wlott committed
#ifdef PRINTNOISE
    printf(" done.\n");
#endif

#ifdef RED_ZONE_HIT
    os_guard_control_stack(0, 1);
wlott's avatar
wlott committed
#endif
}