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,thenpossiblerubbishwedon'tcareabout.But *thekernelbssmustbeclaimed(itwillbezero'dbythe *kernelitself)
*/
printf("Allocating 0x%lx bytes for kernel...\n\r", ei.memsize);
if (platform_ops.vmlinux_alloc) {
addr = platform_ops.vmlinux_alloc(ei.memsize);
} else { /* *Checkifthekernelimage(withoutbss)wouldoverwritethe *bootwrapper.Thedevicetreehasbeenmovedinfdt_init() *toanareaallocatedwithmalloc()(somewherepast_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;
}
/* A buffer that may be edited by tools operating on a zImage binary so as to *editthecommandlinepassedtovmlinux(bysetting/chosen/bootargs). *Thebufferisputinitsownsectionsothattoolsmaylocateiteasier.
*/ 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 *commandline.Onlyusetheloadercommandlineifa
* 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.