int main(int argc, char *argv[]) { u_long marks[MARK_MAX]; u_long start, entry; int fd, sz, i; u_long *ap; u_long cksum, *lp; void *image; /* use the specified kernel if any */ if (argc > 1) netbsd = argv[1]; DPRINTF("loading %s...\n", netbsd); /* count kernel size */ marks[MARK_START] = 0; fd = loadfile(netbsd, marks, COUNT_ALL); if (fd == -1) err(0, "loadfile(1)"); close(fd); sz = marks[MARK_END] - marks[MARK_START]; start = marks[MARK_START]; entry = marks[MARK_ENTRY]; DPRINTF("size = 0x%x\n", sz); DPRINTF("start = 0x%lx\n", start); ap = malloc(sz + 2 * sizeof(long)); if (ap == NULL) err(0, "malloc"); image = &ap[2]; marks[MARK_START] = (u_long)image - start; fd = loadfile(netbsd, marks, LOAD_ALL); if (fd == -1) err(0, "loadfile(2)"); close(fd); /* ssym = marks[MARK_SYM]; */ /* esym = marks[MARK_END]; */ cksum = 0; lp = image; for (i = 0; i < sz / sizeof(cksum); i++) cksum += *lp++; ap[0] = sz; ap[1] = cksum; LoadAndReset(ap); printf("LoadAndReset returned...\n"); free(ap); exit(0); }
/* * machine dependent system variables. */ static int sysctl_machdep_loadandreset(SYSCTLFN_ARGS) { const char *osimage; int error; error = sysctl_lookup(SYSCTLFN_CALL(__UNCONST(rnode))); if (error || newp == NULL) return (error); osimage = (const char *)(*(const u_long *)newp); LoadAndReset(osimage); /* not reach here */ return (0); }