X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fcoreparse.c;h=e7dbdfd153a46f7e757045b5e9ecaa252a1c7f5d;hb=8bb8f286dbacf1792a26de693c795d268516672c;hp=00598c570dfe5befa5b9d83f3d25c5d35f68cb02;hpb=1de12891f900d156ed035a097561ecd7755a256a;p=sbcl.git diff --git a/src/runtime/coreparse.c b/src/runtime/coreparse.c index 00598c5..e7dbdfd 100644 --- a/src/runtime/coreparse.c +++ b/src/runtime/coreparse.c @@ -107,7 +107,7 @@ lose: } static void -process_directory(int fd, u32 *ptr, int count, os_vm_offset_t file_offset) +process_directory(int fd, lispobj *ptr, int count, os_vm_offset_t file_offset) { struct ndir_entry *entry; @@ -140,13 +140,13 @@ process_directory(int fd, u32 *ptr, int count, os_vm_offset_t file_offset) switch (id) { case DYNAMIC_CORE_SPACE_ID: - if (len > dynamic_space_size) { + if (len > dynamic_space_size) { fprintf(stderr, "dynamic space too small for core: %ldKiB required, %ldKiB available.\n", len >> 10, (long)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", @@ -161,8 +161,8 @@ process_directory(int fd, u32 *ptr, int count, os_vm_offset_t file_offset) (long)DYNAMIC_0_SPACE_START, (long)DYNAMIC_1_SPACE_START); lose("warning: core/runtime address mismatch: DYNAMIC_SPACE_START\n"); - } -#endif + } +#endif #if defined(ALLOCATION_POINTER) SetSymbolValue(ALLOCATION_POINTER, (lispobj)free_pointer,0); #else @@ -349,7 +349,16 @@ load_core_file(char *file, os_vm_offset_t file_offset) 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].first_object_offset = data[i]; + } + i++; + offset++; } }