示例#1
0
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);
}
示例#2
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);
}