/* lutex stuff */
#if defined(LISP_FEATURE_SB_THREAD) && defined(LISP_FEATURE_SB_LUTEX)
#include "genesis/sap.h"
+#include "pthread-lutex.h"
#endif
return open(filename, mode);
}
+
+static struct runtime_options *
+read_runtime_options(int fd)
+{
+ size_t optarray[RUNTIME_OPTIONS_WORDS];
+ struct runtime_options *options = NULL;
+
+ if (read(fd, optarray, RUNTIME_OPTIONS_WORDS * sizeof(size_t)) !=
+ RUNTIME_OPTIONS_WORDS * sizeof(size_t)) {
+ return NULL;
+ }
+
+ if ((RUNTIME_OPTIONS_MAGIC != optarray[0]) || (0 == optarray[1])) {
+ return NULL;
+ }
+
+ options = successful_malloc(sizeof(struct runtime_options));
+
+ options->dynamic_space_size = optarray[2];
+ options->thread_control_stack_size = optarray[3];
+
+ return options;
+}
+
+void
+maybe_initialize_runtime_options(int fd)
+{
+ off_t end_offset = sizeof(lispobj) +
+ sizeof(os_vm_offset_t) +
+ (RUNTIME_OPTIONS_WORDS * sizeof(size_t));
+
+ lseek(fd, -end_offset, SEEK_END);
+ runtime_options = read_runtime_options(fd);
+}
+
/* Search 'filename' for an embedded core. An SBCL core has, at the
- * end of the file, a trailer containing the size of the core (an
- * os_vm_offset_t) and a final signature word (the lispobj
- * CORE_MAGIC). If this trailer is found at the end of the file, the
- * start of the core can be determined from the core size.
+ * end of the file, a trailer containing optional saved runtime
+ * options, the start of the core (an os_vm_offset_t), and a final
+ * signature word (the lispobj CORE_MAGIC). If this trailer is found
+ * at the end of the file, the start of the core can be determined
+ * from the core size.
*
* If an embedded core is present, this returns the offset into the
* file to load the core from, or -1 if no core is present. */
lispobj header;
os_vm_offset_t lispobj_size = sizeof(lispobj);
os_vm_offset_t trailer_size = lispobj_size + sizeof(os_vm_offset_t);
- os_vm_offset_t core_size, pos;
+ os_vm_offset_t core_start, pos;
int fd = -1;
if ((fd = open_binary(filename, O_RDONLY)) < 0)
if (header == CORE_MAGIC) {
if (lseek(fd, -trailer_size, SEEK_END) < 0)
goto lose;
- if (read(fd, &core_size, sizeof(os_vm_offset_t)) < 0)
+ if (read(fd, &core_start, sizeof(os_vm_offset_t)) < 0)
goto lose;
- if (lseek(fd, -(core_size + trailer_size), SEEK_END) < 0)
+ if (lseek(fd, core_start, SEEK_SET) < 0)
goto lose;
pos = lseek(fd, 0, SEEK_CUR);
if (header != CORE_MAGIC)
goto lose;
+ maybe_initialize_runtime_options(fd);
+
close(fd);
return pos;
}
return -1;
}
+/* If more platforms doesn't support overlapping mmap rename this
+ * def to something like ifdef nommapoverlap */
+/* currently hpux only */
+#ifdef LISP_FEATURE_HPUX
+os_vm_address_t copy_core_bytes(int fd, os_vm_offset_t offset,
+ os_vm_address_t addr, int len)
+{
+ unsigned char buf[4096];
+ int c,x;
+ int old_fd = lseek(fd, 0, SEEK_CUR);
+
+ if(len & (4096-1)){
+ fprintf(stderr, "cant copy a slice of core because slice-length is not of page size(4096)\n");
+ exit(-1);
+ }
+ if(old_fd < 0){
+ fprintf(stderr, "cant perform lseek() on corefile\n");
+ }
+ lseek(fd, offset, SEEK_SET);
+ if(fd < 0){
+ fprintf(stderr, "cant perform lseek(%u,%lu,SEEK_SET) on corefile\n", fd, offset);
+ }
+ for(x = 0; x < len; x += 4096){
+ c = read(fd, buf, 4096);
+ if(c != 4096){
+ fprintf(stderr, "cant read memory area from corefile at position %lu, got %d\n", offset + x, c);
+ exit(-1);
+ }
+ memcpy(addr+x, buf, 4096);
+ }
+ os_flush_icache(addr, len);
+ return addr;
+}
+#endif
+
static void
process_directory(int fd, lispobj *ptr, int count, os_vm_offset_t file_offset)
{
os_vm_address_t addr =
(os_vm_address_t) (os_vm_page_size * entry->address);
lispobj *free_pointer = (lispobj *) addr + entry->nwords;
- long len = os_vm_page_size * entry->page_count;
-
+ unsigned long 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));
+#ifdef LISP_FEATURE_HPUX
+ real_addr = copy_core_bytes(fd, offset + file_offset, addr, len);
+#else
real_addr = os_map(fd, offset + file_offset, addr, len);
+#endif
if (real_addr != addr) {
lose("file mapped in wrong place! "
"(0x%08x != 0x%08lx)\n",
load_core_file(char *file, os_vm_offset_t file_offset)
{
lispobj *header, val, len, *ptr, remaining_len;
- int fd = open_binary(file, O_RDONLY), count;
+ int fd = open_binary(file, O_RDONLY);
+ unsigned int count;
lispobj initial_function = NIL;
FSHOW((stderr, "/entering load_core_file(%s)\n", file));
case BUILD_ID_CORE_ENTRY_TYPE_CODE:
SHOW("BUILD_ID_CORE_ENTRY_TYPE_CODE case");
{
- int i;
+ unsigned int i;
FSHOW((stderr, "build_id[]=\"%s\"\n", build_id));
FSHOW((stderr, "remaining_len = %d\n", remaining_len));
struct lutex *lutex = lutexes_to_resurrect[i];
FSHOW((stderr, "re-init'ing lutex @ %p\n", lutex));
- lutex_init(lutex);
+ lutex_init((tagged_lutex_t) lutex);
}
free(lutexes_to_resurrect);
size_t fdoffset = (*(ptr+1) + 1) * (os_vm_page_size);
size_t offset = 0;
long bytes_read;
- long data[4096];
+ unsigned long data[4096];
lseek(fd, fdoffset + file_offset, SEEK_SET);
while ((bytes_read = read(fd, data, (size < 4096 ? size : 4096 )))
> 0)
size -= bytes_read;
while (bytes_read) {
bytes_read -= sizeof(long);
- page_table[offset++].first_object_offset = data[i++];
+ /* 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
+ * elements than the page table.
+ */
+ if (data[i]) {
+ page_table[offset].region_start_offset = data[i];
+ }
+ i++;
+ offset++;
}
}