0.9.6.56:
[sbcl.git] / src / runtime / coreparse.c
index dd74c74..12003de 100644 (file)
@@ -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);