aboutsummaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorZhaofeng Li <hello@zhaofeng.li>2021-10-20 00:18:14 -0700
committerBin Meng <bmeng.cn@gmail.com>2021-11-01 09:50:55 +0800
commit23f3e399de58712620b10210246831facea550fe (patch)
tree0abf854484a116785d2e3fae2f6efe578968c349 /cmd
parent7a0eecb2bd818faa8fe4f64c5db95d019be701bd (diff)
downloadu-boot-23f3e399de58712620b10210246831facea550fe.zip
u-boot-23f3e399de58712620b10210246831facea550fe.tar.gz
u-boot-23f3e399de58712620b10210246831facea550fe.tar.bz2
pxe_utils: Fix arguments to x86 zboot
bootm and zboot accept different arguments: > bootm [addr [arg ...]] > - boot application image stored in memory > passing arguments 'arg ...'; when booting a Linux kernel, > 'arg' can be the address of an initrd image > zboot [addr] [size] [initrd addr] [initrd size] [setup] [cmdline] > addr - The optional starting address of the bzimage. > If not set it defaults to the environment > variable "fileaddr". > size - The optional size of the bzimage. Defaults to > zero. > initrd addr - The address of the initrd image to use, if any. > initrd size - The size of the initrd image to use, if any. In the zboot flow, the current code will reuse the bootm args and attempt to pass the initrd arg (argv[2]) as the kernel size (should be argv[3]). zboot also expects the initrd address and size to be separate arguments. Let's untangle them and have separate argv/argc locals. Signed-off-by: Zhaofeng Li <hello@zhaofeng.li> Cc: Simon Glass <sjg@chromium.org> Cc: Bin Meng <bmeng.cn@gmail.com> Reviewed-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'cmd')
-rw-r--r--cmd/pxe_utils.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/cmd/pxe_utils.c b/cmd/pxe_utils.c
index 067c24e..78ebfdc 100644
--- a/cmd/pxe_utils.c
+++ b/cmd/pxe_utils.c
@@ -441,11 +441,14 @@ skip_overlay:
static int label_boot(struct cmd_tbl *cmdtp, struct pxe_label *label)
{
char *bootm_argv[] = { "bootm", NULL, NULL, NULL, NULL };
+ char *zboot_argv[] = { "zboot", NULL, "0", NULL, NULL };
char initrd_str[28];
+ char initrd_filesize[10];
char mac_str[29] = "";
char ip_str[68] = "";
char *fit_addr = NULL;
int bootm_argc = 2;
+ int zboot_argc = 3;
int len = 0;
ulong kernel_addr;
void *buf;
@@ -478,6 +481,11 @@ static int label_boot(struct cmd_tbl *cmdtp, struct pxe_label *label)
strcat(bootm_argv[2], ":");
strncat(bootm_argv[2], env_get("filesize"), 9);
bootm_argc = 3;
+
+ strncpy(initrd_filesize, env_get("filesize"), 9);
+ zboot_argv[3] = env_get("ramdisk_addr_r");
+ zboot_argv[4] = initrd_filesize;
+ zboot_argc = 5;
}
if (get_relfile_envaddr(cmdtp, label->kernel, "kernel_addr_r") < 0) {
@@ -529,6 +537,8 @@ static int label_boot(struct cmd_tbl *cmdtp, struct pxe_label *label)
}
bootm_argv[1] = env_get("kernel_addr_r");
+ zboot_argv[1] = env_get("kernel_addr_r");
+
/* for FIT, append the configuration identifier */
if (label->config) {
int len = strlen(bootm_argv[1]) + strlen(label->config) + 1;
@@ -665,7 +675,7 @@ static int label_boot(struct cmd_tbl *cmdtp, struct pxe_label *label)
do_bootz(cmdtp, 0, bootm_argc, bootm_argv);
/* Try booting an x86_64 Linux kernel image */
else if (IS_ENABLED(CONFIG_CMD_ZBOOT))
- do_zboot_parent(cmdtp, 0, bootm_argc, bootm_argv, NULL);
+ do_zboot_parent(cmdtp, 0, zboot_argc, zboot_argv, NULL);
unmap_sysmem(buf);