summaryrefslogtreecommitdiffstats
path: root/commands/go.c
diff options
context:
space:
mode:
Diffstat (limited to 'commands/go.c')
-rw-r--r--commands/go.c59
1 files changed, 52 insertions, 7 deletions
diff --git a/commands/go.c b/commands/go.c
index 0c0b4cb15e..3449a2181a 100644
--- a/commands/go.c
+++ b/commands/go.c
@@ -8,21 +8,44 @@
#include <complete.h>
#include <fs.h>
#include <fcntl.h>
+#include <getopt.h>
#include <linux/ctype.h>
#include <errno.h>
+#define INT_ARGS_MAX 4
+
static int do_go(int argc, char *argv[])
{
void *addr;
int rcode = 1;
int fd = -1;
- int (*func)(int argc, char *argv[]);
+ void (*func)(ulong r0, ulong r1, ulong r2, ulong r3);
+ int opt;
+ ulong arg[INT_ARGS_MAX] = {};
+ bool pass_argv = true;
+
+ while ((opt = getopt(argc, argv, "+si")) > 0) {
+ switch (opt) {
+ case 's':
+ pass_argv = true;
+ break;
+ case 'i':
+ pass_argv = false;
+ break;
+ default:
+ return COMMAND_ERROR_USAGE;
+ }
+ }
+
+ /* skip options */
+ argv += optind;
+ argc -= optind;
- if (argc < 2)
+ if (argc == 0 || (!pass_argv && argc - 1 > INT_ARGS_MAX))
return COMMAND_ERROR_USAGE;
- if (!isdigit(*argv[1])) {
- fd = open(argv[1], O_RDONLY);
+ if (!isdigit(*argv[0])) {
+ fd = open(argv[0], O_RDONLY);
if (fd < 0) {
perror("open");
goto out;
@@ -34,7 +57,7 @@ static int do_go(int argc, char *argv[])
goto out;
}
} else
- addr = (void *)simple_strtoul(argv[1], NULL, 16);
+ addr = (void *)simple_strtoul(argv[0], NULL, 16);
printf("## Starting application at 0x%p ...\n", addr);
@@ -42,9 +65,28 @@ static int do_go(int argc, char *argv[])
func = addr;
+ if (pass_argv) {
+ arg[0] = argc;
+ arg[1] = (ulong)argv;
+ } else {
+ int i;
+
+ /* skip argv[0] */
+ argc--;
+ argv++;
+
+ for (i = 0; i < argc; i++) {
+ rcode = kstrtoul(argv[i], 0, &arg[i]);
+ if (rcode) {
+ printf("Can't parse \"%s\" as an integer value\n", argv[i]);
+ goto out;
+ }
+ }
+ }
+
shutdown_barebox();
- func(argc - 1, &argv[1]);
+ func(arg[0], arg[1], arg[2], arg[3]);
/*
* The application returned. Since we have shutdown barebox and
@@ -64,12 +106,15 @@ BAREBOX_CMD_HELP_TEXT("Start application at ADDR passing ARG as arguments.")
BAREBOX_CMD_HELP_TEXT("")
BAREBOX_CMD_HELP_TEXT("If addr does not start with a digit it is interpreted as a filename")
BAREBOX_CMD_HELP_TEXT("in which case the file is memmapped and executed")
+BAREBOX_CMD_HELP_TEXT("Options:")
+BAREBOX_CMD_HELP_OPT("-s", "pass all arguments as strings referenced by argc, argv arguments (default)")
+BAREBOX_CMD_HELP_OPT("-i", "pass up to four integer arguments using default calling convention")
BAREBOX_CMD_HELP_END
BAREBOX_CMD_START(go)
.cmd = do_go,
BAREBOX_CMD_DESC("start application at address or file")
- BAREBOX_CMD_OPTS("ADDR [ARG...]")
+ BAREBOX_CMD_OPTS("[-si] ADDR [ARG...]")
BAREBOX_CMD_GROUP(CMD_GRP_BOOT)
BAREBOX_CMD_HELP(cmd_go_help)
BAREBOX_CMD_COMPLETE(command_var_complete)