Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/coreparse.c,v 1.1 1992/07/28 20:14:21 wlott Exp $ */
#include <stdio.h>
#include <sys/types.h>
#include <sys/file.h>
#include "os.h"
#include "lisp.h"
#include "globals.h"
#include "core.h"
#include "save.h"
extern int version;
static void process_directory(int fd, long *ptr, int count)
{
long id, offset, len;
lispobj *free_pointer;
os_vm_address_t addr;
struct ndir_entry *entry;
entry = (struct ndir_entry *) ptr;
while (count-- > 0) {
id = entry->identifier;
offset = CORE_PAGESIZE * (1 + entry->data_page);
addr = (os_vm_address_t) (CORE_PAGESIZE * entry->address);
free_pointer = (lispobj *) addr + entry->nwords;
len = CORE_PAGESIZE * entry->page_count;
if (len != 0) {
os_vm_address_t real_addr;
#ifdef PRINTNOISE
printf("Mapping %d bytes at 0x%x.\n", len, addr);
#endif
real_addr=os_map(fd, offset, addr, len);
if(real_addr!=addr)
fprintf(stderr,
"process_directory: file mapped in wrong place! (0x%08x != 0x%08x)\n",
real_addr,
addr);
}
#if 0
printf("Space ID = %d, free pointer = 0x%08x.\n", id, free_pointer);
#endif
switch (id) {
case DYNAMIC_SPACE_ID:
if (addr != (os_vm_address_t)dynamic_0_space && addr != (os_vm_address_t)dynamic_1_space)
printf("Strange ... dynamic space lossage.\n");
current_dynamic_space = (lispobj *)addr;
#ifdef ibmrt
SetSymbolValue(ALLOCATION_POINTER, (lispobj)free_pointer);
#else
current_dynamic_space_free_pointer = free_pointer;
#endif
break;
case STATIC_SPACE_ID:
static_space = (lispobj *) addr;
break;
case READ_ONLY_SPACE_ID:
/* Don't care about read only space */
break;
default:
printf("Strange space ID: %d; ignored.\n", id);
break;
}
entry++;
}
}
boolean load_core_file(char *file)
{
int fd = open(file, O_RDONLY), count;
long header[CORE_PAGESIZE / sizeof(long)], val, len, *ptr;
boolean restore_state = FALSE;
if (fd < 0) {
fprintf(stderr, "Could not open file \"%s\".\n", file);
perror("open");
exit(1);
}
count = read(fd, header, CORE_PAGESIZE);
if (count < 0) {
perror("read");
exit(1);
}
if (count < CORE_PAGESIZE) {
fprintf(stderr, "Premature EOF.\n");
exit(1);
}
ptr = header;
val = *ptr++;
if (val != CORE_MAGIC) {
fprintf(stderr, "Invalid magic number: 0x%x should have been 0x%x.\n",
val, CORE_MAGIC);
exit(1);
}
while (val != CORE_END) {
val = *ptr++;
len = *ptr++;
switch (val) {
case CORE_END:
break;
case CORE_VERSION:
if (*ptr != version) {
fprintf(stderr, "WARNING: ldb version (%d) different from core version (%d).\nYou may lose big.\n", version, *ptr);
}
break;
case CORE_VALIDATE:
fprintf(stderr, "Validation no longer supported; ignored.\n");
break;
case CORE_NDIRECTORY:
process_directory(fd, ptr,
(len-2) / (sizeof(struct ndir_entry) / sizeof(long)));
break;
case CORE_MACHINE_STATE:
restore_state = TRUE;
load(fd, (struct machine_state *)ptr);
break;
default:
printf("Unknown core file entry: %d; skipping.\n", val);
break;
}
ptr += len - 2;
}
return restore_state;
}