1 /* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/coreparse.c,v 1.14 2009/01/20 03:58:11 agoncharov Rel $ */
14 #include "internals.h"
19 process_directory(int fd, long *ptr, int count)
22 lispobj *free_pointer;
24 struct ndir_entry *entry;
26 entry = (struct ndir_entry *) ptr;
29 id = entry->identifier;
30 offset = CORE_PAGESIZE * (1 + entry->data_page);
31 addr = (os_vm_address_t) (CORE_PAGESIZE * entry->address);
32 free_pointer = (lispobj *) addr + entry->nwords;
33 len = CORE_PAGESIZE * entry->page_count;
36 os_vm_address_t real_addr;
39 printf("Mapping %ld bytes at 0x%lx.\n", len, addr);
41 real_addr = os_map(fd, offset, addr, len);
42 if (real_addr != addr)
44 "process_directory: file mapped in wrong place! (0x%p != 0x%p)\n",
45 (void *) real_addr, (void *) addr);
48 printf("Space ID = %d, free pointer = 0x%08x.\n", id, free_pointer);
52 case DYNAMIC_SPACE_ID:
53 if (addr != (os_vm_address_t) dynamic_0_space
54 && addr != (os_vm_address_t) dynamic_1_space)
55 printf("Strange ... dynamic space lossage.\n");
56 current_dynamic_space = (lispobj *) addr;
57 #if defined(ibmrt) || defined(i386) || defined(__x86_64)
58 SetSymbolValue(ALLOCATION_POINTER, (lispobj) free_pointer);
60 current_dynamic_space_free_pointer = free_pointer;
64 static_space = (lispobj *) addr;
65 if (len >= static_space_size) {
66 fprintf(stderr, "Error: Static space size (%ld) exceeds allocated space (%ld)!\n",
67 len, static_space_size);
71 case READ_ONLY_SPACE_ID:
72 /* Don't care about read only space */
73 if (len >= read_only_space_size) {
74 fprintf(stderr, "Error: Read only space size (%ld) exceeds allocated space (%lu)!\n",
75 len, read_only_space_size);
80 printf("Strange space ID: %ld; ignored.\n", id);
88 load_core_file(const char *file, fpu_mode_t* fpu_type)
90 int fd = open(file, O_RDONLY), count;
92 #if !(defined(alpha) || defined(__x86_64))
93 long header[CORE_PAGESIZE / sizeof(long)], val, len, *ptr;
95 u32 header[CORE_PAGESIZE / sizeof(u32)], val, len, *ptr;
97 lispobj initial_function = NIL;
100 fprintf(stderr, "Could not open file \"%s\".\n", file);
105 count = read(fd, header, CORE_PAGESIZE);
110 if (count < CORE_PAGESIZE) {
111 fprintf(stderr, "Premature EOF.\n");
118 if (val != CORE_MAGIC) {
119 fprintf(stderr, "Invalid magic number: 0x%lx should have been 0x%x.\n",
124 while (val != CORE_END) {
133 if (*ptr != version) {
135 "WARNING: startup-code version (%d) different from core version (%ld).\nYou may lose big.\n",
139 *fpu_type = (fpu_mode_t) ptr[1];
146 fprintf(stderr, "Validation no longer supported; ignored.\n");
149 case CORE_NDIRECTORY:
150 process_directory(fd, ptr,
151 #if !(defined(alpha) || defined(__x86_64))
152 (len - 2) / (sizeof(struct ndir_entry) / sizeof(long)));
154 (len - 2) / (sizeof(struct ndir_entry) / sizeof(u32)));
158 case CORE_INITIAL_FUNCTION:
159 initial_function = (lispobj) * ptr;
162 case CORE_MACHINE_STATE:
163 fprintf(stderr, "Obsolete core file.\n");
168 printf("Unknown core file entry: %ld; skipping.\n", val);
175 return initial_function;