1// SPDX-License-Identifier: GPL-2.0+
2/*
3 * (C) Copyright 2001
4 * Kyle Harris, kharris@nexus-tech.net
5 */
6
7/*
8 * The "source" command allows to define "script images", i. e. files
9 * that contain command sequences that can be executed by the command
10 * interpreter. It returns the exit status of the last command
11 * executed from the script. This is very similar to running a shell
12 * script in a UNIX shell, hence the name for the command.
13 */
14
15/* #define DEBUG */
16
17#include <common.h>
18#include <command.h>
19#include <env.h>
20#include <image.h>
21#include <log.h>
22#include <malloc.h>
23#include <mapmem.h>
24#include <asm/byteorder.h>
25#include <asm/io.h>
26
27static int do_source(struct cmd_tbl *cmdtp, int flag, int argc,
28		     char *const argv[])
29{
30	ulong addr;
31	int rcode;
32	const char *fit_uname = NULL, *confname = NULL;
33
34	/* Find script image */
35	if (argc < 2) {
36		addr = CONFIG_SYS_LOAD_ADDR;
37		debug("*  source: default load address = 0x%08lx\n", addr);
38#if defined(CONFIG_FIT)
39	} else if (fit_parse_subimage(argv[1], image_load_addr, &addr,
40				      &fit_uname)) {
41		debug("*  source: subimage '%s' from FIT image at 0x%08lx\n",
42		      fit_uname, addr);
43	} else if (fit_parse_conf(argv[1], image_load_addr, &addr, &confname)) {
44		debug("*  source: config '%s' from FIT image at 0x%08lx\n",
45		      confname, addr);
46#endif
47	} else {
48		addr = hextoul(argv[1], NULL);
49		debug("*  source: cmdline image address = 0x%08lx\n", addr);
50	}
51
52	printf ("## Executing script at %08lx\n", addr);
53	rcode = cmd_source_script(addr, fit_uname, confname);
54	return rcode;
55}
56
57U_BOOT_LONGHELP(source,
58#if defined(CONFIG_FIT)
59	"[<addr>][:[<image>]|#[<config>]]\n"
60	"\t- Run script starting at addr\n"
61	"\t- A FIT config name or subimage name may be specified with : or #\n"
62	"\t  (like bootm). If the image or config name is omitted, the\n"
63	"\t  default is used."
64#else
65	"[<addr>]\n"
66	"\t- Run script starting at addr"
67#endif
68	);
69
70U_BOOT_CMD(
71	source, 2, 0,	do_source,
72	"run script from memory", source_help_text
73);
74