void *load_bootable_image(const char *kernel, const char *ramdisk, unsigned *sz, const char *cmdline) { void *kdata = 0, *rdata = 0; unsigned ksize = 0, rsize = 0; void *bdata; unsigned bsize; if(kernel == 0) { fprintf(stderr, "no image specified\n"); return 0; } kdata = load_file(kernel, &ksize); if(kdata == 0) { fprintf(stderr, "cannot load '%s': %s\n", kernel, strerror(errno)); return 0; } /* is this actually a boot image? */ if(!memcmp(kdata, BOOT_MAGIC, BOOT_MAGIC_SIZE)) { if(cmdline) bootimg_set_cmdline((boot_img_hdr*) kdata, cmdline); if(ramdisk) { fprintf(stderr, "cannot boot a boot.img *and* ramdisk\n"); return 0; } *sz = ksize; return kdata; } if(ramdisk) { rdata = load_file(ramdisk, &rsize); if(rdata == 0) { fprintf(stderr,"cannot load '%s': %s\n", ramdisk, strerror(errno)); return 0; } } fprintf(stderr,"creating boot image...\n"); bdata = mkbootimg(kdata, ksize, kernel_offset, rdata, rsize, ramdisk_offset, 0, 0, second_offset, page_size, base_addr, tags_offset, &bsize); if(bdata == 0) { fprintf(stderr,"failed to create boot.img\n"); return 0; } if(cmdline) bootimg_set_cmdline((boot_img_hdr*) bdata, cmdline); fprintf(stderr,"creating boot image - %d bytes\n", bsize); *sz = bsize; return bdata; }
static void* load_bootable_image(const char* kernel, const char* ramdisk, const char* secondstage, int64_t* sz, const char* cmdline) { if (kernel == nullptr) { fprintf(stderr, "no image specified\n"); return 0; } int64_t ksize; void* kdata = load_file(kernel, &ksize); if (kdata == nullptr) { fprintf(stderr, "cannot load '%s': %s\n", kernel, strerror(errno)); return 0; } // Is this actually a boot image? if(!memcmp(kdata, BOOT_MAGIC, BOOT_MAGIC_SIZE)) { if (cmdline) bootimg_set_cmdline((boot_img_hdr*) kdata, cmdline); if (ramdisk) { fprintf(stderr, "cannot boot a boot.img *and* ramdisk\n"); return 0; } *sz = ksize; return kdata; } void* rdata = nullptr; int64_t rsize = 0; if (ramdisk) { rdata = load_file(ramdisk, &rsize); if (rdata == nullptr) { fprintf(stderr,"cannot load '%s': %s\n", ramdisk, strerror(errno)); return 0; } } void* sdata = nullptr; int64_t ssize = 0; if (secondstage) { sdata = load_file(secondstage, &ssize); if (sdata == nullptr) { fprintf(stderr,"cannot load '%s': %s\n", secondstage, strerror(errno)); return 0; } } fprintf(stderr,"creating boot image...\n"); int64_t bsize = 0; void* bdata = mkbootimg(kdata, ksize, kernel_offset, rdata, rsize, ramdisk_offset, sdata, ssize, second_offset, page_size, base_addr, tags_offset, &bsize); if (bdata == nullptr) { fprintf(stderr,"failed to create boot.img\n"); return 0; } if (cmdline) bootimg_set_cmdline((boot_img_hdr*) bdata, cmdline); fprintf(stderr, "creating boot image - %" PRId64 " bytes\n", bsize); *sz = bsize; return bdata; }