2 * This software is part of the SBCL system. See the README file for
5 * This software is derived from the CMU CL system, which was
6 * written at Carnegie Mellon University and released into the
7 * public domain. The software is in the public domain and is
8 * provided with absolutely no warranty. See the COPYING and CREDITS
9 * files for more information.
35 write_bytes(FILE *file, char *addr, long bytes)
37 long count, here, data;
39 bytes = (bytes+CORE_PAGESIZE-1)&~(CORE_PAGESIZE-1);
44 data = (ftell(file)+CORE_PAGESIZE-1)&~(CORE_PAGESIZE-1);
48 count = fwrite(addr, 1, bytes, file);
54 perror("error writing to save file");
60 return data/CORE_PAGESIZE - 1;
64 output_space(FILE *file, int id, lispobj *addr, lispobj *end)
66 int words, bytes, data;
67 static char *names[] = {NULL, "dynamic", "static", "read-only"};
73 bytes = words * sizeof(lispobj);
75 printf("writing %d bytes from the %s space at 0x%08lx\n",
76 bytes, names[id], (unsigned long)addr);
78 data = write_bytes(file, (char *)addr, bytes);
81 putw((long)addr / CORE_PAGESIZE, file);
82 putw((bytes + CORE_PAGESIZE - 1) / CORE_PAGESIZE, file);
86 save(char *filename, lispobj init_function)
90 volatile lispobj*func_ptr = &init_function;
92 strcpy(sbuf,filename);
94 /* Get rid of remnant stuff. This is a MUST so that
95 * the memory manager can get started correctly when
96 * we restart after this save. Purify is going to
97 * maybe move the args so we need to consider them volatile,
98 * especially if the gcc optimizer is working!!
102 init_function = *func_ptr;
103 /* Set dynamic space pointer to base value so we don't write out
104 * MBs of just cleared heap.
106 if(SymbolValue(X86_CGC_ACTIVE_P) != NIL)
107 SetSymbolValue(ALLOCATION_POINTER, DYNAMIC_SPACE_START);
111 file = fopen(filename, "w");
116 printf("[undoing binding stack... ");
118 unbind_to_here((lispobj *)BINDING_STACK_START);
119 SetSymbolValue(CURRENT_CATCH_BLOCK, 0);
120 SetSymbolValue(CURRENT_UNWIND_PROTECT_BLOCK, 0);
121 SetSymbolValue(EVAL_STACK_TOP, 0);
123 #if defined WANT_CGC && defined X86_CGC_ACTIVE_P
124 SetSymbolValue(X86_CGC_ACTIVE_P, T);
126 printf("[saving current Lisp image into %s:\n", filename);
128 putw(CORE_MAGIC, file);
130 putw(CORE_VERSION, file);
132 putw(SBCL_CORE_VERSION_INTEGER, file);
134 putw(CORE_NDIRECTORY, file);
137 output_space(file, READ_ONLY_SPACE_ID, (lispobj *)READ_ONLY_SPACE_START,
138 (lispobj *)SymbolValue(READ_ONLY_SPACE_FREE_POINTER));
139 output_space(file, STATIC_SPACE_ID, (lispobj *)STATIC_SPACE_START,
140 (lispobj *)SymbolValue(STATIC_SPACE_FREE_POINTER));
142 output_space(file, DYNAMIC_SPACE_ID, (lispobj *)DYNAMIC_SPACE_START,
143 dynamic_space_free_pointer);
146 /* Flush the current_region updating the tables. */
147 gc_alloc_update_page_tables(0,&boxed_region);
148 gc_alloc_update_page_tables(1,&unboxed_region);
149 update_x86_dynamic_space_free_pointer();
151 output_space(file, DYNAMIC_SPACE_ID, DYNAMIC_SPACE_START,
152 (lispobj *)SymbolValue(ALLOCATION_POINTER));
155 putw(CORE_INITIAL_FUNCTION, file);
157 putw(init_function, file);
159 putw(CORE_END, file);