Exemple #1
0
int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
{
	struct boot_params *base_ptr;
	void *bzImage_addr = NULL;
	ulong load_address;
	char *s;
	ulong bzImage_size = 0;
	ulong initrd_addr = 0;
	ulong initrd_size = 0;

	disable_interrupts();

	/* Setup board for maximum PC/AT Compatibility */
	setup_pcat_compatibility();

	if (argc >= 2) {
		/* argv[1] holds the address of the bzImage */
		s = argv[1];
	} else {
		s = getenv("fileaddr");
	}

	if (s)
		bzImage_addr = (void *)simple_strtoul(s, NULL, 16);

	if (argc >= 3) {
		/* argv[2] holds the size of the bzImage */
		bzImage_size = simple_strtoul(argv[2], NULL, 16);
	}

	if (argc >= 4)
		initrd_addr = simple_strtoul(argv[3], NULL, 16);
	if (argc >= 5)
		initrd_size = simple_strtoul(argv[4], NULL, 16);

	/* Lets look for */
	base_ptr = load_zimage(bzImage_addr, bzImage_size, &load_address);

	if (!base_ptr) {
		puts("## Kernel loading failed ...\n");
		return -1;
	}
	if (setup_zimage(base_ptr, (char *)base_ptr + COMMAND_LINE_OFFSET,
			0, initrd_addr, initrd_size)) {
		puts("Setting up boot parameters failed ...\n");
		return -1;
	}

	/* we assume that the kernel is in place */
	return boot_linux_kernel((ulong)base_ptr, load_address, false);
}
Exemple #2
0
void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
                    bootm_headers_t *images)
{
    void		*base_ptr;
    ulong		os_data, os_len;
    ulong		initrd_start, initrd_end;
    ulong		ep;
    image_header_t	*hdr;
    int		ret;
#if defined(CONFIG_FIT)
    const void	*data;
    size_t		len;
#endif

    ret = boot_get_ramdisk (argc, argv, images, IH_ARCH_I386,
                            &initrd_start, &initrd_end);
    if (ret)
        goto error;

    if (images->legacy_hdr_valid) {
        hdr = images->legacy_hdr_os;
        if (image_check_type (hdr, IH_TYPE_MULTI)) {
            /* if multi-part image, we need to get first subimage */
            image_multi_getimg (hdr, 0, &os_data, &os_len);
        } else {
            /* otherwise get image data */
            os_data = image_get_data (hdr);
            os_len = image_get_data_size (hdr);
        }
#if defined(CONFIG_FIT)
    } else if (images->fit_uname_os) {
        ret = fit_image_get_data (images->fit_hdr_os,
                                  images->fit_noffset_os, &data, &len);
        if (ret) {
            puts ("Can't get image data/size!\n");
            goto error;
        }
        os_data = (ulong)data;
        os_len = (ulong)len;
#endif
    } else {
        puts ("Could not find kernel image!\n");
        goto error;
    }

    base_ptr = load_zimage ((void*)os_data, os_len,
                            initrd_start, initrd_end - initrd_start, 0);

    if (NULL == base_ptr) {
        printf ("## Kernel loading failed ...\n");
        goto error;

    }

    if (!images->autostart)
        return ;

#ifdef DEBUG
    printf ("## Transferring control to Linux (at address %08x) ...\n",
            (u32)base_ptr);
#endif

    /* we assume that the kernel is in place */
    printf("\nStarting kernel ...\n\n");

    boot_zimage(base_ptr);
    /* does not return */
    return;

error:
    if (images->autostart)
        do_reset (cmdtp, flag, argc, argv);
    return;
}