- kmem = Open("/dev/kmem", 0);
- Lseek(kmem, (long)nl[X_DUMPDEV].n_value, 0);
- Read(kmem, (char *)&dumpdev, sizeof dumpdev);
- Lseek(kmem, (long)nl[X_DUMPLO].n_value, 0);
- Read(kmem, (char *)&dumplo, sizeof dumplo);
- Lseek(kmem, (long)nl[X_PHYSMEM].n_value, 0);
- Read(kmem, (char *)&physmem, sizeof physmem);
- dumplo *= 512L;
+ sprintf(name, "%.*s/r%s", sl - s, s, sl + 1);
+ return (name);
+}
+
+int cursyms[] =
+ { X_DUMPDEV, X_DUMPLO, X_VERSION, X_DUMPMAG, -1 };
+int dumpsyms[] =
+ { X_TIME, X_DUMPSIZE, X_VERSION, X_PANICSTR, X_DUMPMAG, -1 };
+read_kmem()
+{
+ register char *cp;
+ FILE *fp;
+ char *dump_sys;
+ int kmem, i;
+
+ dump_sys = system ? system : _PATH_UNIX;
+ nlist(_PATH_UNIX, current_nl);
+ nlist(dump_sys, dump_nl);
+ /*
+ * Some names we need for the currently running system,
+ * others for the system that was running when the dump was made.
+ * The values obtained from the current system are used
+ * to look for things in /dev/kmem that cannot be found
+ * in the dump_sys namelist, but are presumed to be the same
+ * (since the disk partitions are probably the same!)
+ */
+ for (i = 0; cursyms[i] != -1; i++)
+ if (current_nl[cursyms[i]].n_value == 0) {
+ log(LOG_ERR, "%s: %s not in namelist\n", _PATH_UNIX,
+ current_nl[cursyms[i]].n_name);
+ exit(1);
+ }
+ for (i = 0; dumpsyms[i] != -1; i++)
+ if (dump_nl[dumpsyms[i]].n_value == 0) {
+ log(LOG_ERR, "%s: %s not in namelist\n", dump_sys,
+ dump_nl[dumpsyms[i]].n_name);
+ exit(1);
+ }
+ kmem = Open(_PATH_KMEM, O_RDONLY);
+ Lseek(kmem, (long)current_nl[X_DUMPDEV].n_value, L_SET);
+ Read(kmem, (char *)&dumpdev, sizeof (dumpdev));
+ Lseek(kmem, (long)current_nl[X_DUMPLO].n_value, L_SET);
+ Read(kmem, (char *)&dumplo, sizeof (dumplo));
+ if (verbose)
+ printf("dumplo = %d (%d * %d)\n", dumplo, dumplo/DEV_BSIZE,
+ DEV_BSIZE);
+ Lseek(kmem, (long)current_nl[X_DUMPMAG].n_value, L_SET);
+ Read(kmem, (char *)&dumpmag, sizeof (dumpmag));
+ dumplo *= DEV_BSIZE;