All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bryan Wu <cooloney@gmail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v3 1/2] image: fix bootm failure for FIT image
Date: Fri, 15 Aug 2014 16:51:38 -0700	[thread overview]
Message-ID: <1408146699-27959-1-git-send-email-pengw@nvidia.com> (raw)

Commit b3dd64f5d537 "bootm: use genimg_get_kernel_addr()" introduced
a bug for booting FIT image. It's because calling fit_parse_config()
twice will give us wrong value in img_addr.

Add a new function genimg_get_kernel_addr_fit() whichl will always
return fit_uname_config and fit_uname_kernel for CONFIG_FIT.
genimg_get_kernel_addr() will ignore those to parameters.

Reported-by: York Sun <yorksun@freescale.com>
Signed-off-by: Bryan Wu <pengw@nvidia.com>
---
 common/bootm.c  |  9 +++------
 common/image.c  | 39 +++++++++++++++++++++++++++------------
 include/image.h |  3 +++
 3 files changed, 33 insertions(+), 18 deletions(-)

diff --git a/common/bootm.c b/common/bootm.c
index 76d811c..245c82a 100644
--- a/common/bootm.c
+++ b/common/bootm.c
@@ -725,13 +725,14 @@ static const void *boot_get_kernel(cmd_tbl_t *cmdtp, int flag, int argc,
 #endif
 	ulong		img_addr;
 	const void *buf;
-#if defined(CONFIG_FIT)
 	const char	*fit_uname_config = NULL;
 	const char	*fit_uname_kernel = NULL;
+#if defined(CONFIG_FIT)
 	int		os_noffset;
 #endif
 
-	img_addr = genimg_get_kernel_addr(argv[0]);
+	img_addr = genimg_get_kernel_addr_fit(argv[0], &fit_uname_config,
+					  &fit_uname_kernel);
 
 	bootstage_mark(BOOTSTAGE_ID_CHECK_MAGIC);
 
@@ -788,10 +789,6 @@ static const void *boot_get_kernel(cmd_tbl_t *cmdtp, int flag, int argc,
 #endif
 #if defined(CONFIG_FIT)
 	case IMAGE_FORMAT_FIT:
-		if (!fit_parse_conf(argv[0], load_addr, &img_addr,
-					&fit_uname_config))
-			fit_parse_subimage(argv[0], load_addr, &img_addr,
-					&fit_uname_kernel);
 		os_noffset = fit_image_load(images, img_addr,
 				&fit_uname_kernel, &fit_uname_config,
 				IH_ARCH_DEFAULT, IH_TYPE_KERNEL,
diff --git a/common/image.c b/common/image.c
index a2999c0..d4ccff0 100644
--- a/common/image.c
+++ b/common/image.c
@@ -643,22 +643,24 @@ int genimg_get_comp_id(const char *name)
 
 #ifndef USE_HOSTCC
 /**
- * genimg_get_kernel_addr - get the real kernel address
+ * genimg_get_kernel_addr_fit - get the real kernel address and return 2
+ *                              FIT strings
  * @img_addr: a string might contain real image address
+ * @fit_uname_config: double pointer to a char, will hold pointer to a
+ *                    configuration unit name
+ * @fit_uname_kernel: double pointer to a char, will hold pointer to a subimage
+ *                    name
  *
- * genimg_get_kernel_addr() get the real kernel start address from a string
+ * genimg_get_kernel_addr_fit get the real kernel start address from a string
  * which is normally the first argv of bootm/bootz
  *
  * returns:
  *     kernel start address
  */
-ulong genimg_get_kernel_addr(char * const img_addr)
+ulong genimg_get_kernel_addr_fit(char * const img_addr,
+			     const char **fit_uname_config,
+			     const char **fit_uname_kernel)
 {
-#if defined(CONFIG_FIT)
-	const char	*fit_uname_config = NULL;
-	const char	*fit_uname_kernel = NULL;
-#endif
-
 	ulong kernel_addr;
 
 	/* find out kernel image address */
@@ -668,13 +670,13 @@ ulong genimg_get_kernel_addr(char * const img_addr)
 		      load_addr);
 #if defined(CONFIG_FIT)
 	} else if (fit_parse_conf(img_addr, load_addr, &kernel_addr,
-				  &fit_uname_config)) {
+				  fit_uname_config)) {
 		debug("*  kernel: config '%s' from image at 0x%08lx\n",
-		      fit_uname_config, kernel_addr);
+		      *fit_uname_config, kernel_addr);
 	} else if (fit_parse_subimage(img_addr, load_addr, &kernel_addr,
-				     &fit_uname_kernel)) {
+				     fit_uname_kernel)) {
 		debug("*  kernel: subimage '%s' from image at 0x%08lx\n",
-		      fit_uname_kernel, kernel_addr);
+		      *fit_uname_kernel, kernel_addr);
 #endif
 	} else {
 		kernel_addr = simple_strtoul(img_addr, NULL, 16);
@@ -686,6 +688,19 @@ ulong genimg_get_kernel_addr(char * const img_addr)
 }
 
 /**
+ * genimg_get_kernel_addr() is the simple version of
+ * genimg_get_kernel_addr_fit(). It ignores those return FIT strings
+ */
+ulong genimg_get_kernel_addr(char * const img_addr)
+{
+	const char *fit_uname_config = NULL;
+	const char *fit_uname_kernel = NULL;
+
+	return genimg_get_kernel_addr_fit(img_addr, &fit_uname_config,
+					  &fit_uname_kernel);
+}
+
+/**
  * genimg_get_format - get image format type
  * @img_addr: image start address
  *
diff --git a/include/image.h b/include/image.h
index ca2fe86..69f86ad 100644
--- a/include/image.h
+++ b/include/image.h
@@ -424,6 +424,9 @@ enum fit_load_op {
 #define IMAGE_FORMAT_FIT	0x02	/* new, libfdt based format */
 #define IMAGE_FORMAT_ANDROID	0x03	/* Android boot image */
 
+ulong genimg_get_kernel_addr_fit(char * const img_addr,
+			         const char **fit_uname_config,
+			         const char **fit_uname_kernel);
 ulong genimg_get_kernel_addr(char * const img_addr);
 int genimg_get_format(const void *img_addr);
 int genimg_has_config(bootm_headers_t *images);
-- 
1.9.1

             reply	other threads:[~2014-08-15 23:51 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-08-15 23:51 Bryan Wu [this message]
2014-08-15 23:51 ` [U-Boot] [PATCH 2/2] bootm: make sure pass NULL when argc < 1 Bryan Wu
2014-08-22 20:37   ` Simon Glass
2014-08-23 12:43   ` [U-Boot] [U-Boot,2/2] " Tom Rini
2014-08-20 17:24 ` [U-Boot] [PATCH v3 1/2] image: fix bootm failure for FIT image Bryan Wu
2014-08-20 23:32   ` Simon Glass
2014-08-22 20:17 ` Simon Glass
2014-08-22 21:38   ` Tom Rini
2014-08-22 21:53     ` Tom Rini
2014-08-22 23:00       ` Simon Glass
2014-08-23 12:42 ` [U-Boot] [U-Boot, v3, " Tom Rini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1408146699-27959-1-git-send-email-pengw@nvidia.com \
    --to=cooloney@gmail.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.