len = partial_decompress(vmlinuz_addr, vmlinuz_size,
elfheader, sizeof(elfheader), 0); /* assume uncompressed data if -1 is returned */ if (len == -1) {
uncompressed_image = 1;
memcpy(elfheader, vmlinuz_addr, sizeof(elfheader));
printf("No valid compressed data found, assume uncompressed data\n\r");
}
if (!parse_elf64(elfheader, &ei) && !parse_elf32(elfheader, &ei))
fatal("Error: not a valid PPC32 or PPC64 ELF file!\n\r");
if (platform_ops.image_hdr)
platform_ops.image_hdr(elfheader);
/* We need to alloc the memsize: gzip will expand the kernel * text/data, then possible rubbish we don't care about. But * the kernel bss must be claimed (it will be zero'd by the * kernel itself)
*/
printf("Allocating 0x%lx bytes for kernel...\n\r", ei.memsize);
if (platform_ops.vmlinux_alloc) {
addr = platform_ops.vmlinux_alloc(ei.memsize);
} else { /* * Check if the kernel image (without bss) would overwrite the * bootwrapper. The device tree has been moved in fdt_init() * to an area allocated with malloc() (somewhere past _end).
*/ if ((unsignedlong)_start < ei.loadsize)
fatal("Insufficient memory for kernel at address 0!" " (_start=%p, uncompressed size=%08lx)\n\r",
_start, ei.loadsize);
if ((unsignedlong)_end < ei.memsize)
fatal("The final kernel image would overwrite the " "device tree\n\r");
}
if (uncompressed_image) {
memcpy(addr, vmlinuz_addr + ei.elfoffset, ei.loadsize);
printf("0x%lx bytes of uncompressed data copied\n\r",
ei.loadsize); goto out;
}
staticstruct addr_range prep_initrd(struct addr_range vmlinux, void *chosen, unsignedlong initrd_addr, unsignedlong initrd_size)
{ /* If we have an image attached to us, it overrides anything
* supplied by the loader. */ if (&_initrd_end > &_initrd_start) {
printf("Attached initrd image at 0x%p-0x%p\n\r",
_initrd_start, _initrd_end);
initrd_addr = (unsignedlong)_initrd_start;
initrd_size = _initrd_end - _initrd_start;
} elseif (initrd_size > 0) {
printf("Using loader supplied ramdisk at 0x%lx-0x%lx\n\r",
initrd_addr, initrd_addr + initrd_size);
}
/* If there's no initrd at all, we're done */ if (! initrd_size) return (struct addr_range){0, 0};
/* * If the initrd is too low it will be clobbered when the * kernel relocates to its final location. In this case, * allocate a safer place and move it.
*/ if (initrd_addr < vmlinux.size) { void *old_addr = (void *)initrd_addr;
/* * If the ESM blob is too low it will be clobbered when the * kernel relocates to its final location. In this case, * allocate a safer place and move it.
*/ if (esm_blob_addr < vmlinux.size) { void *old_addr = (void *)esm_blob_addr;
/* A buffer that may be edited by tools operating on a zImage binary so as to * edit the command line passed to vmlinux (by setting /chosen/bootargs). * The buffer is put in its own section so that tools may locate it easier.
*/ staticchar cmdline[BOOT_COMMAND_LINE_SIZE]
__attribute__((__section__("__builtin_cmdline")));
staticvoid prep_cmdline(void *chosen)
{ unsignedint getline_timeout = 5000; int v; int n;
/* Wait-for-input time */
n = getprop(chosen, "linux,cmdline-timeout", &v, sizeof(v)); if (n == sizeof(v))
getline_timeout = v;
if (cmdline[0] == '\0')
getprop(chosen, "bootargs", cmdline, BOOT_COMMAND_LINE_SIZE-1);
printf("\n\rLinux/PowerPC load: %s", cmdline);
/* If possible, edit the command line */ if (console_ops.edit_cmdline && getline_timeout)
console_ops.edit_cmdline(cmdline, BOOT_COMMAND_LINE_SIZE, getline_timeout);
printf("\n\r");
/* Put the command line back into the devtree for the kernel */
setprop_str(chosen, "bootargs", cmdline);
}
/* Do this first, because malloc() could clobber the loader's * command line. Only use the loader command line if a
* built-in command line wasn't set by an external tool */ if ((loader_info.cmdline_len > 0) && (cmdline[0] == '\0'))
memmove(cmdline, loader_info.cmdline,
min(loader_info.cmdline_len, BOOT_COMMAND_LINE_SIZE-1));
if (console_ops.open && (console_ops.open() < 0)) exit(); if (platform_ops.fixups)
platform_ops.fixups();
printf("\n\rzImage starting: loaded at 0x%p (sp: 0x%p)\n\r",
_start, get_sp());
/* Ensure that the device tree has a /chosen node */
chosen = finddevice("/chosen"); if (!chosen)
chosen = create_node(NULL, "chosen");
printf("Finalizing device tree..."); if (dt_ops.finalize)
ft_addr = dt_ops.finalize(); if (ft_addr)
printf(" flat tree at 0x%lx\n\r", ft_addr); else
printf(" using OF tree (promptr=%p)\n\r", loader_info.promptr);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.