|
@@ -24,184 +24,6 @@
|
|
|
#include <asm/byteorder.h>
|
|
|
#include <asm/io.h>
|
|
|
|
|
|
-/**
|
|
|
- * get_default_image() - Return default property from /images
|
|
|
- *
|
|
|
- * Return: Pointer to value of default property (or NULL)
|
|
|
- */
|
|
|
-static const char *get_default_image(const void *fit)
|
|
|
-{
|
|
|
- int images_noffset;
|
|
|
-
|
|
|
- images_noffset = fdt_path_offset(fit, FIT_IMAGES_PATH);
|
|
|
- if (images_noffset < 0)
|
|
|
- return NULL;
|
|
|
-
|
|
|
- return fdt_getprop(fit, images_noffset, FIT_DEFAULT_PROP, NULL);
|
|
|
-}
|
|
|
-
|
|
|
-int image_locate_script(void *buf, int size, const char *fit_uname,
|
|
|
- const char *confname, char **datap, uint *lenp)
|
|
|
-{
|
|
|
- ulong len;
|
|
|
- const struct legacy_img_hdr *hdr;
|
|
|
- u32 *data;
|
|
|
- int verify;
|
|
|
- const void* fit_hdr;
|
|
|
- int noffset;
|
|
|
- const void *fit_data;
|
|
|
- size_t fit_len;
|
|
|
-
|
|
|
- verify = env_get_yesno("verify");
|
|
|
-
|
|
|
- switch (genimg_get_format(buf)) {
|
|
|
- case IMAGE_FORMAT_LEGACY:
|
|
|
- if (IS_ENABLED(CONFIG_LEGACY_IMAGE_FORMAT)) {
|
|
|
- hdr = buf;
|
|
|
-
|
|
|
- if (!image_check_magic(hdr)) {
|
|
|
- puts("Bad magic number\n");
|
|
|
- return 1;
|
|
|
- }
|
|
|
-
|
|
|
- if (!image_check_hcrc(hdr)) {
|
|
|
- puts("Bad header crc\n");
|
|
|
- return 1;
|
|
|
- }
|
|
|
-
|
|
|
- if (verify) {
|
|
|
- if (!image_check_dcrc(hdr)) {
|
|
|
- puts("Bad data crc\n");
|
|
|
- return 1;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (!image_check_type(hdr, IH_TYPE_SCRIPT)) {
|
|
|
- puts("Bad image type\n");
|
|
|
- return 1;
|
|
|
- }
|
|
|
-
|
|
|
- /* get length of script */
|
|
|
- data = (u32 *)image_get_data(hdr);
|
|
|
-
|
|
|
- len = uimage_to_cpu(*data);
|
|
|
- if (!len) {
|
|
|
- puts("Empty Script\n");
|
|
|
- return 1;
|
|
|
- }
|
|
|
-
|
|
|
- /*
|
|
|
- * scripts are just multi-image files with one
|
|
|
- * component, so seek past the zero-terminated sequence
|
|
|
- * of image lengths to get to the actual image data
|
|
|
- */
|
|
|
- while (*data++);
|
|
|
- }
|
|
|
- break;
|
|
|
- case IMAGE_FORMAT_FIT:
|
|
|
- if (IS_ENABLED(CONFIG_FIT)) {
|
|
|
- fit_hdr = buf;
|
|
|
- if (fit_check_format(fit_hdr, IMAGE_SIZE_INVAL)) {
|
|
|
- puts("Bad FIT image format\n");
|
|
|
- return 1;
|
|
|
- }
|
|
|
-
|
|
|
- if (!fit_uname) {
|
|
|
- /* If confname is empty, use the default */
|
|
|
- if (confname && *confname)
|
|
|
- noffset = fit_conf_get_node(fit_hdr, confname);
|
|
|
- else
|
|
|
- noffset = fit_conf_get_node(fit_hdr, NULL);
|
|
|
- if (noffset < 0) {
|
|
|
- if (!confname)
|
|
|
- goto fallback;
|
|
|
- printf("Could not find config %s\n", confname);
|
|
|
- return 1;
|
|
|
- }
|
|
|
-
|
|
|
- if (verify && fit_config_verify(fit_hdr, noffset))
|
|
|
- return 1;
|
|
|
-
|
|
|
- noffset = fit_conf_get_prop_node(fit_hdr,
|
|
|
- noffset,
|
|
|
- FIT_SCRIPT_PROP,
|
|
|
- IH_PHASE_NONE);
|
|
|
- if (noffset < 0) {
|
|
|
- if (!confname)
|
|
|
- goto fallback;
|
|
|
- printf("Could not find script in %s\n", confname);
|
|
|
- return 1;
|
|
|
- }
|
|
|
- } else {
|
|
|
-fallback:
|
|
|
- if (!fit_uname || !*fit_uname)
|
|
|
- fit_uname = get_default_image(fit_hdr);
|
|
|
- if (!fit_uname) {
|
|
|
- puts("No FIT subimage unit name\n");
|
|
|
- return 1;
|
|
|
- }
|
|
|
-
|
|
|
- /* get script component image node offset */
|
|
|
- noffset = fit_image_get_node(fit_hdr, fit_uname);
|
|
|
- if (noffset < 0) {
|
|
|
- printf("Can't find '%s' FIT subimage\n",
|
|
|
- fit_uname);
|
|
|
- return 1;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (!fit_image_check_type(fit_hdr, noffset,
|
|
|
- IH_TYPE_SCRIPT)) {
|
|
|
- puts("Not a image image\n");
|
|
|
- return 1;
|
|
|
- }
|
|
|
-
|
|
|
- /* verify integrity */
|
|
|
- if (verify && !fit_image_verify(fit_hdr, noffset)) {
|
|
|
- puts("Bad Data Hash\n");
|
|
|
- return 1;
|
|
|
- }
|
|
|
-
|
|
|
- /* get script subimage data address and length */
|
|
|
- if (fit_image_get_data(fit_hdr, noffset, &fit_data, &fit_len)) {
|
|
|
- puts("Could not find script subimage data\n");
|
|
|
- return 1;
|
|
|
- }
|
|
|
-
|
|
|
- data = (u32 *)fit_data;
|
|
|
- len = (ulong)fit_len;
|
|
|
- }
|
|
|
- break;
|
|
|
- default:
|
|
|
- puts("Wrong image format for \"source\" command\n");
|
|
|
- return -EPERM;
|
|
|
- }
|
|
|
-
|
|
|
- *datap = (char *)data;
|
|
|
- *lenp = len;
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-int image_source_script(ulong addr, const char *fit_uname, const char *confname)
|
|
|
-{
|
|
|
- char *data;
|
|
|
- void *buf;
|
|
|
- uint len;
|
|
|
- int ret;
|
|
|
-
|
|
|
- buf = map_sysmem(addr, 0);
|
|
|
- ret = image_locate_script(buf, 0, fit_uname, confname, &data, &len);
|
|
|
- unmap_sysmem(buf);
|
|
|
- if (ret)
|
|
|
- return CMD_RET_FAILURE;
|
|
|
-
|
|
|
- debug("** Script length: %d\n", len);
|
|
|
- return run_command_list(data, len, 0);
|
|
|
-}
|
|
|
-
|
|
|
-/**************************************************/
|
|
|
-#if defined(CONFIG_CMD_SOURCE)
|
|
|
static int do_source(struct cmd_tbl *cmdtp, int flag, int argc,
|
|
|
char *const argv[])
|
|
|
{
|
|
@@ -228,7 +50,7 @@ static int do_source(struct cmd_tbl *cmdtp, int flag, int argc,
|
|
|
}
|
|
|
|
|
|
printf ("## Executing script at %08lx\n", addr);
|
|
|
- rcode = image_source_script(addr, fit_uname, confname);
|
|
|
+ rcode = cmd_source_script(addr, fit_uname, confname);
|
|
|
return rcode;
|
|
|
}
|
|
|
|
|
@@ -250,4 +72,3 @@ U_BOOT_CMD(
|
|
|
source, 2, 0, do_source,
|
|
|
"run script from memory", source_help_text
|
|
|
);
|
|
|
-#endif
|