mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-07-06 03:06:16 +09: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
|
#endif
|
||||||
|
|
||||||
static void print_type (image_header_t *hdr);
|
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[]);
|
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();
|
int verify = getenv_verify();
|
||||||
|
|
||||||
image_header_t *hdr;
|
image_header_t *hdr;
|
||||||
ulong img_addr;
|
|
||||||
ulong os_data, os_len;
|
ulong os_data, os_len;
|
||||||
|
|
||||||
ulong image_start, image_end;
|
ulong image_start, image_end;
|
||||||
ulong load_start, load_end;
|
ulong load_start, load_end;
|
||||||
|
|
||||||
|
/* get kernel image header, start address and length */
|
||||||
if (argc < 2) {
|
hdr = get_kernel (cmdtp, flag, argc, argv, verify,
|
||||||
img_addr = load_addr;
|
&os_data, &os_len);
|
||||||
} else {
|
if (hdr == NULL)
|
||||||
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 1;
|
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);
|
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)) {
|
switch (image_get_comp (hdr)) {
|
||||||
case IH_COMP_NONE:
|
case IH_COMP_NONE:
|
||||||
if (image_get_load (hdr) == img_addr) {
|
if (image_get_load (hdr) == (ulong)hdr) {
|
||||||
printf (" XIP %s ... ", type_name);
|
printf (" XIP %s ... ", type_name);
|
||||||
} else {
|
} else {
|
||||||
printf (" Loading %s ... ", type_name);
|
printf (" Loading %s ... ", type_name);
|
||||||
|
@ -280,6 +215,7 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
puts ("OK\n");
|
puts ("OK\n");
|
||||||
|
debug (" kernel loaded at 0x%08lx, end = 0x%08lx\n", load_start, load_end);
|
||||||
show_boot_progress (7);
|
show_boot_progress (7);
|
||||||
|
|
||||||
if ((load_start < image_end) && (load_end > image_start)) {
|
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;
|
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(
|
U_BOOT_CMD(
|
||||||
bootm, CFG_MAXARGS, 1, do_bootm,
|
bootm, CFG_MAXARGS, 1, do_bootm,
|
||||||
"bootm - boot application image from memory\n",
|
"bootm - boot application image from memory\n",
|
||||||
|
@ -502,7 +535,7 @@ U_BOOT_CMD(
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*******************************************************************/
|
/*******************************************************************/
|
||||||
/* */
|
/* helper routines */
|
||||||
/*******************************************************************/
|
/*******************************************************************/
|
||||||
void print_image_hdr (image_header_t *hdr)
|
void print_image_hdr (image_header_t *hdr)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue
Block a user