1 /* 2 * (C) Copyright 2001 3 * Kyle Harris, kharris@nexus-tech.net 4 * 5 * SPDX-License-Identifier: GPL-2.0+ 6 */ 7 8 /* 9 * The "source" command allows to define "script images", i. e. files 10 * that contain command sequences that can be executed by the command 11 * interpreter. It returns the exit status of the last command 12 * executed from the script. This is very similar to running a shell 13 * script in a UNIX shell, hence the name for the command. 14 */ 15 16 /* #define DEBUG */ 17 18 #include <common.h> 19 #include <command.h> 20 #include <image.h> 21 #include <malloc.h> 22 #include <mapmem.h> 23 #include <asm/byteorder.h> 24 #include <asm/io.h> 25 26 int 27 source (ulong addr, const char *fit_uname) 28 { 29 ulong len; 30 #if defined(CONFIG_IMAGE_FORMAT_LEGACY) 31 const image_header_t *hdr; 32 #endif 33 u32 *data; 34 int verify; 35 void *buf; 36 #if defined(CONFIG_FIT) 37 const void* fit_hdr; 38 int noffset; 39 const void *fit_data; 40 size_t fit_len; 41 #endif 42 43 verify = getenv_yesno ("verify"); 44 45 buf = map_sysmem(addr, 0); 46 switch (genimg_get_format(buf)) { 47 #if defined(CONFIG_IMAGE_FORMAT_LEGACY) 48 case IMAGE_FORMAT_LEGACY: 49 hdr = buf; 50 51 if (!image_check_magic (hdr)) { 52 puts ("Bad magic number\n"); 53 return 1; 54 } 55 56 if (!image_check_hcrc (hdr)) { 57 puts ("Bad header crc\n"); 58 return 1; 59 } 60 61 if (verify) { 62 if (!image_check_dcrc (hdr)) { 63 puts ("Bad data crc\n"); 64 return 1; 65 } 66 } 67 68 if (!image_check_type (hdr, IH_TYPE_SCRIPT)) { 69 puts ("Bad image type\n"); 70 return 1; 71 } 72 73 /* get length of script */ 74 data = (u32 *)image_get_data (hdr); 75 76 if ((len = uimage_to_cpu (*data)) == 0) { 77 puts ("Empty Script\n"); 78 return 1; 79 } 80 81 /* 82 * scripts are just multi-image files with one component, seek 83 * past the zero-terminated sequence of image lengths to get 84 * to the actual image data 85 */ 86 while (*data++); 87 break; 88 #endif 89 #if defined(CONFIG_FIT) 90 case IMAGE_FORMAT_FIT: 91 if (fit_uname == NULL) { 92 puts ("No FIT subimage unit name\n"); 93 return 1; 94 } 95 96 fit_hdr = buf; 97 if (!fit_check_format (fit_hdr)) { 98 puts ("Bad FIT image format\n"); 99 return 1; 100 } 101 102 /* get script component image node offset */ 103 noffset = fit_image_get_node (fit_hdr, fit_uname); 104 if (noffset < 0) { 105 printf ("Can't find '%s' FIT subimage\n", fit_uname); 106 return 1; 107 } 108 109 if (!fit_image_check_type (fit_hdr, noffset, IH_TYPE_SCRIPT)) { 110 puts ("Not a image image\n"); 111 return 1; 112 } 113 114 /* verify integrity */ 115 if (verify) { 116 if (!fit_image_verify(fit_hdr, noffset)) { 117 puts ("Bad Data Hash\n"); 118 return 1; 119 } 120 } 121 122 /* get script subimage data address and length */ 123 if (fit_image_get_data (fit_hdr, noffset, &fit_data, &fit_len)) { 124 puts ("Could not find script subimage data\n"); 125 return 1; 126 } 127 128 data = (u32 *)fit_data; 129 len = (ulong)fit_len; 130 break; 131 #endif 132 default: 133 puts ("Wrong image format for \"source\" command\n"); 134 return 1; 135 } 136 137 debug ("** Script length: %ld\n", len); 138 return run_command_list((char *)data, len, 0); 139 } 140 141 /**************************************************/ 142 #if defined(CONFIG_CMD_SOURCE) 143 static int do_source(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 144 { 145 ulong addr; 146 int rcode; 147 const char *fit_uname = NULL; 148 149 /* Find script image */ 150 if (argc < 2) { 151 addr = CONFIG_SYS_LOAD_ADDR; 152 debug ("* source: default load address = 0x%08lx\n", addr); 153 #if defined(CONFIG_FIT) 154 } else if (fit_parse_subimage (argv[1], load_addr, &addr, &fit_uname)) { 155 debug ("* source: subimage '%s' from FIT image at 0x%08lx\n", 156 fit_uname, addr); 157 #endif 158 } else { 159 addr = simple_strtoul(argv[1], NULL, 16); 160 debug ("* source: cmdline image address = 0x%08lx\n", addr); 161 } 162 163 printf ("## Executing script at %08lx\n", addr); 164 rcode = source (addr, fit_uname); 165 return rcode; 166 } 167 168 #ifdef CONFIG_SYS_LONGHELP 169 static char source_help_text[] = 170 "[addr]\n" 171 "\t- run script starting at addr\n" 172 "\t- A valid image header must be present" 173 #if defined(CONFIG_FIT) 174 "\n" 175 "For FIT format uImage addr must include subimage\n" 176 "unit name in the form of addr:<subimg_uname>" 177 #endif 178 ""; 179 #endif 180 181 U_BOOT_CMD( 182 source, 2, 0, do_source, 183 "run script from memory", source_help_text 184 ); 185 #endif 186