fastboot: add the support of the second stage image [DO NOT MERGE]

The AOSP bootimage format allows the use of a second stage image
however the fastboot boot and flash:row commands do not allow the
"secondstage" optional argument.  This patch adds the support of this
argument for both commands.

Change-Id: I00403a95d7460a00233841ba0fe0e8a69d78c7b4
Signed-off-by: Jeremy Compostella <jeremy.compostella@intel.com>
This commit is contained in:
Jeremy Compostella 2014-07-17 17:17:54 +02:00 committed by Patrick Tjin
parent 69d68b69e5
commit a42adff905

View file

@ -298,8 +298,9 @@ void usage(void)
" Can override the fs type and/or\n" " Can override the fs type and/or\n"
" size the bootloader reports.\n" " size the bootloader reports.\n"
" getvar <variable> display a bootloader variable\n" " getvar <variable> display a bootloader variable\n"
" boot <kernel> [ <ramdisk> ] download and boot kernel\n" " boot <kernel> [ <ramdisk> [ <second> ] ] download and boot kernel\n"
" flash:raw boot <kernel> [ <ramdisk> ] create bootimage and flash it\n" " flash:raw boot <kernel> [ <ramdisk> [ <second> ] ] create bootimage and \n"
" flash it\n"
" devices list all connected devices\n" " devices list all connected devices\n"
" continue continue with autoboot\n" " continue continue with autoboot\n"
" reboot reboot device normally\n" " reboot reboot device normally\n"
@ -327,10 +328,11 @@ void usage(void)
} }
void *load_bootable_image(const char *kernel, const char *ramdisk, void *load_bootable_image(const char *kernel, const char *ramdisk,
unsigned *sz, const char *cmdline) const char *secondstage, unsigned *sz,
const char *cmdline)
{ {
void *kdata = 0, *rdata = 0; void *kdata = 0, *rdata = 0, *sdata = 0;
unsigned ksize = 0, rsize = 0; unsigned ksize = 0, rsize = 0, ssize = 0;
void *bdata; void *bdata;
unsigned bsize; unsigned bsize;
@ -366,10 +368,18 @@ void *load_bootable_image(const char *kernel, const char *ramdisk,
} }
} }
if (secondstage) {
sdata = load_file(secondstage, &ssize);
if(sdata == 0) {
fprintf(stderr,"cannot load '%s': %s\n", secondstage, strerror(errno));
return 0;
}
}
fprintf(stderr,"creating boot image...\n"); fprintf(stderr,"creating boot image...\n");
bdata = mkbootimg(kdata, ksize, kernel_offset, bdata = mkbootimg(kdata, ksize, kernel_offset,
rdata, rsize, ramdisk_offset, rdata, rsize, ramdisk_offset,
0, 0, second_offset, sdata, ssize, second_offset,
page_size, base_addr, tags_offset, &bsize); page_size, base_addr, tags_offset, &bsize);
if(bdata == 0) { if(bdata == 0) {
fprintf(stderr,"failed to create boot.img\n"); fprintf(stderr,"failed to create boot.img\n");
@ -1147,6 +1157,7 @@ int main(int argc, char **argv)
} else if(!strcmp(*argv, "boot")) { } else if(!strcmp(*argv, "boot")) {
char *kname = 0; char *kname = 0;
char *rname = 0; char *rname = 0;
char *sname = 0;
skip(1); skip(1);
if (argc > 0) { if (argc > 0) {
kname = argv[0]; kname = argv[0];
@ -1156,7 +1167,11 @@ int main(int argc, char **argv)
rname = argv[0]; rname = argv[0];
skip(1); skip(1);
} }
data = load_bootable_image(kname, rname, &sz, cmdline); if (argc > 0) {
sname = argv[0];
skip(1);
}
data = load_bootable_image(kname, rname, sname, &sz, cmdline);
if (data == 0) return 1; if (data == 0) return 1;
fb_queue_download("boot.img", data, sz); fb_queue_download("boot.img", data, sz);
fb_queue_command("boot", "booting"); fb_queue_command("boot", "booting");
@ -1180,14 +1195,18 @@ int main(int argc, char **argv)
char *pname = argv[1]; char *pname = argv[1];
char *kname = argv[2]; char *kname = argv[2];
char *rname = 0; char *rname = 0;
char *sname = 0;
require(3); require(3);
if(argc > 3) { skip(3);
rname = argv[3]; if (argc > 0) {
skip(4); rname = argv[0];
} else { skip(1);
skip(3);
} }
data = load_bootable_image(kname, rname, &sz, cmdline); if (argc > 0) {
sname = argv[0];
skip(1);
}
data = load_bootable_image(kname, rname, sname, &sz, cmdline);
if (data == 0) die("cannot load bootable image"); if (data == 0) die("cannot load bootable image");
fb_queue_flash(pname, data, sz); fb_queue_flash(pname, data, sz);
} else if(!strcmp(*argv, "flashall")) { } else if(!strcmp(*argv, "flashall")) {