mirror of
https://github.com/u-boot/u-boot.git
synced 2025-01-19 17:23:24 +08:00
[new uImage] Move kernel data find code to get_kernel() routine
Verification of the kernel image (in old format) and finding kernel data is moved to a dedicated routine. The routine will also hold support for, to be added, new image format. Signed-off-by: Marian Balakowicz <m8@semihalf.com>
This commit is contained in:
parent
7b325454fd
commit
5cf746c303
@ -74,6 +74,9 @@ static void fixup_silent_linux (void);
|
||||
#endif
|
||||
|
||||
static void print_type (image_header_t *hdr);
|
||||
static image_header_t *get_kernel (cmd_tbl_t *cmdtp, int flag,
|
||||
int argc, char *argv[], int verify,
|
||||
ulong *os_data, ulong *os_len);
|
||||
extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
|
||||
|
||||
/*
|
||||
@ -121,85 +124,17 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||
int verify = getenv_verify();
|
||||
|
||||
image_header_t *hdr;
|
||||
ulong img_addr;
|
||||
ulong os_data, os_len;
|
||||
|
||||
ulong image_start, image_end;
|
||||
ulong load_start, load_end;
|
||||
|
||||
|
||||
if (argc < 2) {
|
||||
img_addr = load_addr;
|
||||
} else {
|
||||
img_addr = simple_strtoul(argv[1], NULL, 16);
|
||||
}
|
||||
|
||||
show_boot_progress (1);
|
||||
printf ("## Booting image at %08lx ...\n", img_addr);
|
||||
|
||||
#ifdef CONFIG_HAS_DATAFLASH
|
||||
if (addr_dataflash (img_addr)){
|
||||
hdr = (image_header_t *)CFG_LOAD_ADDR;
|
||||
read_dataflash (img_addr, image_get_header_size (), (char *)hdr);
|
||||
} else
|
||||
#endif
|
||||
hdr = (image_header_t *)img_addr;
|
||||
|
||||
if (!image_check_magic(hdr)) {
|
||||
puts ("Bad Magic Number\n");
|
||||
show_boot_progress (-1);
|
||||
/* get kernel image header, start address and length */
|
||||
hdr = get_kernel (cmdtp, flag, argc, argv, verify,
|
||||
&os_data, &os_len);
|
||||
if (hdr == NULL)
|
||||
return 1;
|
||||
}
|
||||
show_boot_progress (2);
|
||||
|
||||
if (!image_check_hcrc (hdr)) {
|
||||
puts ("Bad Header Checksum\n");
|
||||
show_boot_progress (-2);
|
||||
return 1;
|
||||
}
|
||||
show_boot_progress (3);
|
||||
|
||||
#ifdef CONFIG_HAS_DATAFLASH
|
||||
if (addr_dataflash (img_addr))
|
||||
read_dataflash (img_addr + image_get_header_size (),
|
||||
image_get_data_size (hdr),
|
||||
(char *)image_get_data (hdr));
|
||||
#endif
|
||||
|
||||
/* uImage is in a system RAM, pointed to by hdr */
|
||||
print_image_hdr (hdr);
|
||||
|
||||
if (verify) {
|
||||
puts (" Verifying Checksum ... ");
|
||||
if (!image_check_dcrc (hdr)) {
|
||||
printf ("Bad Data CRC\n");
|
||||
show_boot_progress (-3);
|
||||
return 1;
|
||||
}
|
||||
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 1;
|
||||
}
|
||||
show_boot_progress (5);
|
||||
|
||||
switch (image_get_type (hdr)) {
|
||||
case IH_TYPE_KERNEL:
|
||||
os_data = image_get_data (hdr);
|
||||
os_len = image_get_data_size (hdr);
|
||||
break;
|
||||
case IH_TYPE_MULTI:
|
||||
image_multi_getimg (hdr, 0, &os_data, &os_len);
|
||||
break;
|
||||
default:
|
||||
printf ("Wrong Image Type for %s command\n", cmdtp->name);
|
||||
show_boot_progress (-5);
|
||||
return 1;
|
||||
}
|
||||
show_boot_progress (6);
|
||||
|
||||
/*
|
||||
@ -229,7 +164,7 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||
|
||||
switch (image_get_comp (hdr)) {
|
||||
case IH_COMP_NONE:
|
||||
if (image_get_load (hdr) == img_addr) {
|
||||
if (image_get_load (hdr) == (ulong)hdr) {
|
||||
printf (" XIP %s ... ", type_name);
|
||||
} else {
|
||||
printf (" Loading %s ... ", type_name);
|
||||
@ -280,6 +215,7 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||
return 1;
|
||||
}
|
||||
puts ("OK\n");
|
||||
debug (" kernel loaded at 0x%08lx, end = 0x%08lx\n", load_start, load_end);
|
||||
show_boot_progress (7);
|
||||
|
||||
if ((load_start < image_end) && (load_end > image_start)) {
|
||||
@ -340,6 +276,103 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 image_header_t *get_kernel (cmd_tbl_t *cmdtp, int flag,
|
||||
int argc, char *argv[], int verify,
|
||||
ulong *os_data, ulong *os_len)
|
||||
{
|
||||
image_header_t *hdr;
|
||||
ulong img_addr;
|
||||
|
||||
if (argc < 2) {
|
||||
img_addr = load_addr;
|
||||
} else {
|
||||
img_addr = simple_strtoul(argv[1], NULL, 16);
|
||||
}
|
||||
|
||||
show_boot_progress (1);
|
||||
printf ("## Booting image at %08lx ...\n", img_addr);
|
||||
|
||||
#ifdef CONFIG_HAS_DATAFLASH
|
||||
if (addr_dataflash (img_addr)){
|
||||
hdr = (image_header_t *)CFG_LOAD_ADDR;
|
||||
read_dataflash (img_addr, image_get_header_size (), (char *)hdr);
|
||||
} else
|
||||
#endif
|
||||
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);
|
||||
|
||||
#ifdef CONFIG_HAS_DATAFLASH
|
||||
if (addr_dataflash (img_addr))
|
||||
read_dataflash (img_addr + image_get_header_size (),
|
||||
image_get_data_size (hdr),
|
||||
(char *)image_get_data (hdr));
|
||||
#endif
|
||||
|
||||
/* uImage is in a system RAM, pointed to by hdr */
|
||||
print_image_hdr (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;
|
||||
}
|
||||
show_boot_progress (5);
|
||||
|
||||
switch (image_get_type (hdr)) {
|
||||
case IH_TYPE_KERNEL:
|
||||
*os_data = image_get_data (hdr);
|
||||
*os_len = image_get_data_size (hdr);
|
||||
break;
|
||||
case IH_TYPE_MULTI:
|
||||
image_multi_getimg (hdr, 0, os_data, os_len);
|
||||
break;
|
||||
default:
|
||||
printf ("Wrong Image Type for %s command\n", cmdtp->name);
|
||||
show_boot_progress (-5);
|
||||
return NULL;
|
||||
}
|
||||
debug (" kernel data at 0x%08lx, end = 0x%08lx\n",
|
||||
*os_data, *os_data + *os_len);
|
||||
|
||||
return hdr;
|
||||
}
|
||||
|
||||
U_BOOT_CMD(
|
||||
bootm, CFG_MAXARGS, 1, do_bootm,
|
||||
"bootm - boot application image from memory\n",
|
||||
@ -502,7 +535,7 @@ U_BOOT_CMD(
|
||||
#endif
|
||||
|
||||
/*******************************************************************/
|
||||
/* */
|
||||
/* helper routines */
|
||||
/*******************************************************************/
|
||||
void print_image_hdr (image_header_t *hdr)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user