X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fcoreparse.c;h=12003deab350ce30d80d8f3ba6a9e038c329ac2c;hb=8a97cca4411b211a5d4be617bb179e3f53a61f31;hp=dd74c749959bbcc8c0965d4fe758dec2d03cd849;hpb=79cc569a97e444389350ea3f5b1017374fe16bec;p=sbcl.git diff --git a/src/runtime/coreparse.c b/src/runtime/coreparse.c index dd74c74..12003de 100644 --- a/src/runtime/coreparse.c +++ b/src/runtime/coreparse.c @@ -36,6 +36,9 @@ #include "interr.h" #include "thread.h" +#include "validate.h" +#include "gc-internal.h" + unsigned char build_id[] = #include "../../output/build-id.tmp" ; @@ -59,7 +62,7 @@ process_directory(int fd, u32 *ptr, int 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, addr)); + (long)len, (long)len, (unsigned long)addr)); real_addr = os_map(fd, offset, addr, len); if (real_addr != addr) { lose("file mapped in wrong place! " @@ -69,8 +72,8 @@ process_directory(int fd, u32 *ptr, int count) } } - FSHOW((stderr, "/space id = %d, free pointer = 0x%08x\n", - id, (long)free_pointer)); + FSHOW((stderr, "/space id = %ld, free pointer = 0x%lx\n", + id, (unsigned long)free_pointer)); switch (id) { case DYNAMIC_CORE_SPACE_ID: @@ -182,7 +185,7 @@ load_core_file(char *file) FSHOW((stderr, "build_id[]=\"%s\"\n", build_id)); FSHOW((stderr, "remaining_len = %d\n", remaining_len)); - if (remaining_len != strlen(build_id)) + if (remaining_len != strlen((const char *)build_id)) goto losing_build_id; for (i = 0; i < remaining_len; ++i) { FSHOW((stderr, "ptr[%d] = char = %d, expected=%d\n", @@ -224,12 +227,36 @@ load_core_file(char *file) initial_function = (lispobj)*ptr; break; +#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; + long data[4096]; + lseek(fd, fdoffset, 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); + page_table[offset++].first_object_offset = data[i++]; + } + } + + gencgc_partial_pickup = 1; + break; + } +#endif default: lose("unknown core file entry: %ld", (long)val); } ptr += remaining_len; - FSHOW((stderr, "/new ptr=%x\n", ptr)); + FSHOW((stderr, "/new ptr=%lx\n", (unsigned long)ptr)); } SHOW("about to free(header)"); free(header);