* files for more information.
*/
+#include "sbcl.h"
+
+#ifndef LISP_FEATURE_WIN32
+#ifdef LISP_FEATURE_LINUX
+/* For madvise */
+#define _BSD_SOURCE
+#include <sys/mman.h>
+#undef _BSD_SOURCE
+#else
+#include <sys/mman.h>
+#endif
+#endif
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
-#include "sbcl.h"
-
-#ifndef LISP_FEATURE_WIN32
-#ifdef LISP_FEATURE_LINUX
-/* For madvise */
-# define _BSD_SOURCE
-#endif
-#include <sys/mman.h>
-#endif
-
#include "os.h"
#include "runtime.h"
#include "globals.h"
#include "validate.h"
#include "gc-internal.h"
-
-/* lutex stuff */
-#if defined(LISP_FEATURE_SB_THREAD) && defined(LISP_FEATURE_SB_LUTEX)
-#include "genesis/sap.h"
-#include "pthread-lutex.h"
-#endif
+#include "runtime-options.h"
#include <errno.h>
static struct runtime_options *
read_runtime_options(int fd)
{
- size_t optarray[RUNTIME_OPTIONS_WORDS];
+ os_vm_size_t optarray[RUNTIME_OPTIONS_WORDS];
struct runtime_options *options = NULL;
- if (read(fd, optarray, RUNTIME_OPTIONS_WORDS * sizeof(size_t)) !=
+ if (read(fd, optarray, RUNTIME_OPTIONS_WORDS * sizeof(os_vm_size_t)) !=
RUNTIME_OPTIONS_WORDS * sizeof(size_t)) {
return NULL;
}
FSHOW((stderr, "/process_directory(..), count=%d\n", count));
for (entry = (struct ndir_entry *) ptr; --count>= 0; ++entry) {
+
compressed = 0;
- long id = entry->identifier;
+ sword_t id = entry->identifier;
if (id <= (MAX_CORE_SPACE_ID | DEFLATED_CORE_SPACE_ID_FLAG)) {
if (id & DEFLATED_CORE_SPACE_ID_FLAG)
compressed = 1;
id &= ~(DEFLATED_CORE_SPACE_ID_FLAG);
}
- long offset = os_vm_page_size * (1 + entry->data_page);
+ sword_t offset = os_vm_page_size * (1 + entry->data_page);
os_vm_address_t addr =
(os_vm_address_t) (os_vm_page_size * entry->address);
lispobj *free_pointer = (lispobj *) addr + entry->nwords;
- unsigned long len = os_vm_page_size * entry->page_count;
+ uword_t len = os_vm_page_size * entry->page_count;
if (len != 0) {
os_vm_address_t real_addr;
FSHOW((stderr, "/mapping %ld(0x%lx) bytes at 0x%lx\n",
- (long)len, (long)len, (unsigned long)addr));
+ len, len, (uword_t)addr));
if (compressed) {
#ifdef LISP_FEATURE_SB_CORE_COMPRESSION
real_addr = inflate_core_bytes(fd, offset + file_offset, addr, len);
madvise(addr, len, MADV_MERGEABLE);
}
#endif
-
- FSHOW((stderr, "/space id = %ld, free pointer = 0x%lx\n",
- id, (unsigned long)free_pointer));
+ FSHOW((stderr, "/space id = %ld, free pointer = 0x%p\n",
+ id, (uword_t)free_pointer));
switch (id) {
case DYNAMIC_CORE_SPACE_ID:
fprintf(stderr,
"dynamic space too small for core: %ldKiB required, %ldKiB available.\n",
len >> 10,
- (long)dynamic_space_size >> 10);
+ (uword_t)dynamic_space_size >> 10);
exit(1);
}
#ifdef LISP_FEATURE_GENCGC
if (addr != (os_vm_address_t)DYNAMIC_SPACE_START) {
- fprintf(stderr, "in core: 0x%lx; in runtime: 0x%lx \n",
- (long)addr, (long)DYNAMIC_SPACE_START);
+ fprintf(stderr, "in core: 0x%p; in runtime: 0x%p \n",
+ (uword_t)addr, (uword_t)DYNAMIC_SPACE_START);
lose("core/runtime address mismatch: DYNAMIC_SPACE_START\n");
}
#else
if ((addr != (os_vm_address_t)DYNAMIC_0_SPACE_START) &&
(addr != (os_vm_address_t)DYNAMIC_1_SPACE_START)) {
- fprintf(stderr, "in core: 0x%lx; in runtime: 0x%lx or 0x%lx\n",
- (long)addr,
- (long)DYNAMIC_0_SPACE_START,
- (long)DYNAMIC_1_SPACE_START);
+ fprintf(stderr, "in core: 0x%p; in runtime: 0x%p or 0x%p\n",
+ (uword_t)addr,
+ (uword_t)DYNAMIC_0_SPACE_START,
+ (uword_t)DYNAMIC_1_SPACE_START);
lose("warning: core/runtime address mismatch: DYNAMIC_SPACE_START\n");
}
#endif
break;
case STATIC_CORE_SPACE_ID:
if (addr != (os_vm_address_t)STATIC_SPACE_START) {
- fprintf(stderr, "in core: 0x%lx - in runtime: 0x%lx\n",
- (long)addr, (long)STATIC_SPACE_START);
+ fprintf(stderr, "in core: 0x%p - in runtime: 0x%p\n",
+ (uword_t)addr, (uword_t)STATIC_SPACE_START);
lose("core/runtime address mismatch: STATIC_SPACE_START\n");
}
break;
case READ_ONLY_CORE_SPACE_ID:
if (addr != (os_vm_address_t)READ_ONLY_SPACE_START) {
- fprintf(stderr, "in core: 0x%lx - in runtime: 0x%lx\n",
- (long)addr, (long)READ_ONLY_SPACE_START);
+ fprintf(stderr, "in core: 0x%p - in runtime: 0x%p\n",
+ (uword_t)addr, (uword_t)READ_ONLY_SPACE_START);
lose("core/runtime address mismatch: READ_ONLY_SPACE_START\n");
}
break;
default:
- lose("unknown space ID %ld addr 0x%lx\n", id, (long)addr);
+ lose("unknown space ID %ld addr 0x%p\n", id, addr);
}
}
}
lispobj
load_core_file(char *file, os_vm_offset_t file_offset)
{
- lispobj *header, val, len, *ptr, remaining_len;
+ void *header;
+ word_t val, *ptr;
+ os_vm_size_t len, remaining_len;
int fd = open_binary(file, O_RDONLY);
- unsigned int count;
-
+ ssize_t count;
lispobj initial_function = NIL;
+
FSHOW((stderr, "/entering load_core_file(%s)\n", file));
if (fd < 0) {
fprintf(stderr, "could not open file \"%s\"\n", file);
}
lseek(fd, file_offset, SEEK_SET);
- header = calloc(os_vm_page_size / sizeof(u32), sizeof(u32));
+ header = calloc(os_vm_page_size, 1);
count = read(fd, header, os_vm_page_size);
if (count < os_vm_page_size) {
val = *ptr++;
len = *ptr++;
remaining_len = len - 2; /* (-2 to cancel the two ++ operations) */
- FSHOW((stderr, "/val=0x%ld, remaining_len=0x%ld\n",
- (long)val, (long)remaining_len));
+ FSHOW((stderr, "/val=0x%"WORD_FMTX", remaining_len=0x%"WORD_FMTX"\n",
+ val, remaining_len));
switch (val) {
case BUILD_ID_CORE_ENTRY_TYPE_CODE:
SHOW("BUILD_ID_CORE_ENTRY_TYPE_CODE case");
{
- unsigned int i;
+ os_vm_size_t i;
FSHOW((stderr, "build_id[]=\"%s\"\n", build_id));
FSHOW((stderr, "remaining_len = %d\n", remaining_len));
ptr,
#ifndef LISP_FEATURE_ALPHA
remaining_len / (sizeof(struct ndir_entry) /
- sizeof(long)),
+ sizeof(lispobj)),
#else
remaining_len / (sizeof(struct ndir_entry) /
sizeof(u32)),
initial_function = (lispobj)*ptr;
break;
-#if defined(LISP_FEATURE_SB_THREAD) && defined(LISP_FEATURE_SB_LUTEX)
- case LUTEX_TABLE_CORE_ENTRY_TYPE_CODE:
- SHOW("LUTEX_TABLE_CORE_ENTRY_TYPE_CODE case");
- {
- size_t n_lutexes = *ptr;
- size_t fdoffset = (*(ptr + 1) + 1) * (os_vm_page_size);
- size_t data_length = n_lutexes * sizeof(struct sap *);
- struct lutex **lutexes_to_resurrect = malloc(data_length);
- long bytes_read;
-
- lseek(fd, fdoffset + file_offset, SEEK_SET);
-
- FSHOW((stderr, "attempting to read %ld lutexes from core\n", n_lutexes));
- bytes_read = read(fd, lutexes_to_resurrect, data_length);
-
- /* XXX */
- if (bytes_read != data_length) {
- lose("Could not read the lutex table");
- }
- else {
- int i;
-
- for (i=0; i<n_lutexes; ++i) {
- struct lutex *lutex = lutexes_to_resurrect[i];
-
- FSHOW((stderr, "re-init'ing lutex @ %p\n", lutex));
- lutex_init((tagged_lutex_t) lutex);
- }
-
- free(lutexes_to_resurrect);
- }
- break;
- }
-#endif
-
#ifdef LISP_FEATURE_GENCGC
case PAGE_TABLE_CORE_ENTRY_TYPE_CODE:
{
- size_t size = *ptr;
- size_t fdoffset = (*(ptr+1) + 1) * (os_vm_page_size);
- size_t offset = 0;
- long bytes_read;
- unsigned long data[4096];
- unsigned long word;
+ os_vm_size_t size = *ptr;
+ os_vm_size_t fdoffset = (*(ptr+1) + 1) * (os_vm_page_size);
+ page_index_t offset = 0;
+ ssize_t bytes_read;
+ word_t data[4096];
+ word_t word;
lseek(fd, fdoffset + file_offset, SEEK_SET);
while ((bytes_read = read(fd, data, (size < 4096 ? size : 4096 )))
> 0)
int i = 0;
size -= bytes_read;
while (bytes_read) {
- bytes_read -= sizeof(long);
+ bytes_read -= sizeof(word_t);
/* Ignore all zeroes. The size of the page table
* core entry was rounded up to os_vm_page_size
* during the save, and might now have more
*
* The low bits of each word are allocation flags.
*/
- if (word=data[i]) {
- page_table[offset].region_start_offset = word & ~0x03;
+ if ((word=data[i])) {
+ page_table[offset].scan_start_offset = word & ~0x03;
page_table[offset].allocated = word & 0x03;
}
i++;
}
#endif
default:
- lose("unknown core file entry: %ld\n", (long)val);
+ lose("unknown core file entry: 0x%"WORD_FMTX"\n", val);
}
ptr += remaining_len;
- FSHOW((stderr, "/new ptr=%lx\n", (unsigned long)ptr));
+ FSHOW((stderr, "/new ptr=0x%"WORD_FMTX"\n", ptr));
}
SHOW("about to free(header)");
free(header);