sandbox: Add a way to specify the sandbox executable

At present the sandbox executable is assumed to be arg[0] but this only
works for a single jump (e.g. from SPL to U-Boot). Add a new arg to solve
this issue, along with a detailed comment.

Signed-off-by: Simon Glass <sjg@chromium.org>
diff --git a/arch/sandbox/cpu/start.c b/arch/sandbox/cpu/start.c
index 642be16..622df41 100644
--- a/arch/sandbox/cpu/start.c
+++ b/arch/sandbox/cpu/start.c
@@ -244,6 +244,36 @@
 }
 SANDBOX_CMDLINE_OPT_SHORT(jump, 'j', 1, "Jumped from previous U-Boot");
 
+static int sandbox_cmdline_cb_program(struct sandbox_state *state,
+				      const char *arg)
+{
+	/*
+	 * Record the program name to use when jumping to future phases. This
+	 * is the original executable which holds all the phases. We need to
+	 * use this instead of argv[0] since each phase is started by
+	 * extracting a particular binary from the full program, then running
+	 * it. Therefore in that binary, argv[0] contains only the
+	 * current-phase executable.
+	 *
+	 * For example, sandbox TPL may be started using image file:
+	 *
+	 *     ./image.bin
+	 *
+	 * but then TPL needs to run VPL, which it does by extracting the VPL
+	 * image from the image.bin file.
+	 *
+	 *    ./temp-vpl
+	 *
+	 * When VPL runs it needs access to the original image.bin so it can
+	 * extract the next phase (SPL). This works if we use '-f image.bin'
+	 * when starting the original image.bin file.
+	 */
+	state->prog_fname = arg;
+
+	return 0;
+}
+SANDBOX_CMDLINE_OPT_SHORT(program, 'p', 1, "U-Boot program name");
+
 static int sandbox_cmdline_cb_memory(struct sandbox_state *state,
 				     const char *arg)
 {