aboutsummaryrefslogtreecommitdiff
path: root/common/cmd_bootm.c
diff options
context:
space:
mode:
authorMarian Balakowicz <m8@semihalf.com>2008-02-27 11:02:07 +0100
committerMarian Balakowicz <m8@semihalf.com>2008-02-27 11:02:07 +0100
commit1efd43601f90de21ec6c0ebb9880823e822927b1 (patch)
tree5e6e83adcb6a6c84690fe2ec66e563979a5969e8 /common/cmd_bootm.c
parent8a5ea3e6168fe6a2780eeaf257a3b19f30dec658 (diff)
[new uImage] Add image_get_kernel() routine
Legacy image specific verification is factored out to a separate helper routine to keep get_kernel() generic and simple. Signed-off-by: Marian Balakowicz <m8@semihalf.com> Acked-by: Kumar Gala <galak@kernel.crashing.org>
Diffstat (limited to 'common/cmd_bootm.c')
-rw-r--r--common/cmd_bootm.c86
1 files changed, 53 insertions, 33 deletions
diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c
index ce2de2e23..e5ed16774 100644
--- a/common/cmd_bootm.c
+++ b/common/cmd_bootm.c
@@ -297,6 +297,57 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
* pointer to image header if valid image was found, plus kernel start
* address and length, otherwise NULL
*/
+static image_header_t *image_get_kernel (ulong img_addr, int verify)
+{
+ image_header_t *hdr = (image_header_t *)img_addr;
+
+ if (!image_check_magic(hdr)) {
+ puts ("Bad Magic Number\n");
+ show_boot_progress (-1);
+ return NULL;
+ }
+ show_boot_progress (2);
+
+ if (!image_check_hcrc (hdr)) {
+ puts ("Bad Header Checksum\n");
+ show_boot_progress (-2);
+ return NULL;
+ }
+
+ show_boot_progress (3);
+ image_print_contents (hdr);
+
+ if (verify) {
+ puts (" Verifying Checksum ... ");
+ if (!image_check_dcrc (hdr)) {
+ printf ("Bad Data CRC\n");
+ show_boot_progress (-3);
+ return NULL;
+ }
+ puts ("OK\n");
+ }
+ show_boot_progress (4);
+
+ if (!image_check_target_arch (hdr)) {
+ printf ("Unsupported Architecture 0x%x\n", image_get_arch (hdr));
+ show_boot_progress (-4);
+ return NULL;
+ }
+ return hdr;
+}
+
+/**
+ * get_kernel - find kernel image
+ * @os_data: pointer to a ulong variable, will hold os data start address
+ * @os_len: pointer to a ulong variable, will hold os data length
+ *
+ * get_kernel() tries to find a kernel image, verifies its integrity
+ * and locates kernel data.
+ *
+ * returns:
+ * pointer to image header if valid image was found, plus kernel start
+ * address and length, otherwise NULL
+ */
static void *get_kernel (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
bootm_headers_t *images, ulong *os_data, ulong *os_len)
{
@@ -339,40 +390,9 @@ static void *get_kernel (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
case IMAGE_FORMAT_LEGACY:
debug ("* kernel: legacy format image\n");
- hdr = (image_header_t *)img_addr;
-
- if (!image_check_magic(hdr)) {
- puts ("Bad Magic Number\n");
- show_boot_progress (-1);
+ hdr = image_get_kernel (img_addr, images->verify);
+ if (!hdr)
return NULL;
- }
- show_boot_progress (2);
-
- if (!image_check_hcrc (hdr)) {
- puts ("Bad Header Checksum\n");
- show_boot_progress (-2);
- return NULL;
- }
-
- show_boot_progress (3);
- image_print_contents (hdr);
-
- if (images->verify) {
- puts (" Verifying Checksum ... ");
- if (!image_check_dcrc (hdr)) {
- printf ("Bad Data CRC\n");
- show_boot_progress (-3);
- return NULL;
- }
- puts ("OK\n");
- }
- show_boot_progress (4);
-
- if (!image_check_target_arch (hdr)) {
- printf ("Unsupported Architecture 0x%x\n", image_get_arch (hdr));
- show_boot_progress (-4);
- return NULL;
- }
show_boot_progress (5);
switch (image_get_type (hdr)) {