From: Simon Glass <sjg@chromium.org>
Split the init code from sandbox_main() into a separate sandbox_init()
function that handles all setup up to the call to board_init_f(). This
allows the init to be called independently of the main execution flow.
Co-developed-by: Claude <noreply@anthropic.com>
Signed-off-by: Simon Glass <sjg@chromium.org>
---
arch/sandbox/cpu/start.c | 25 ++++++++++++++++-------
arch/sandbox/include/asm/u-boot-sandbox.h | 21 +++++++++++++++++++
2 files changed, 39 insertions(+), 7 deletions(-)
@@ -601,18 +601,16 @@ static int last_stage_init(void)
}
EVENT_SPY_SIMPLE(EVT_LAST_STAGE_INIT, last_stage_init);
-int sandbox_main(int argc, char *argv[])
+int sandbox_init(int argc, char *argv[], struct global_data *data)
{
struct sandbox_state *state;
void * text_base;
- gd_t data;
int size;
int ret;
text_base = os_find_text_base();
- memset(&data, '\0', sizeof(data));
- gd = &data;
+ gd = data;
/*
* This must be the first invocation of os_malloc() to have
@@ -620,7 +618,7 @@ int sandbox_main(int argc, char *argv[])
*/
ret = state_init();
if (ret)
- goto err;
+ return ret;
/*
* Copy argv[] so that we can pass the arguments in the original
@@ -663,13 +661,13 @@ int sandbox_main(int argc, char *argv[])
if (state->read_state && state->state_fname) {
ret = sandbox_read_state(state, state->state_fname);
if (ret)
- goto err;
+ return ret;
}
if (state->handle_signals) {
ret = os_setup_signal_handlers();
if (ret)
- goto err;
+ return ret;
}
if (state->upl)
@@ -692,6 +690,19 @@ int sandbox_main(int argc, char *argv[])
/* sandbox test: log functions called before log_init in board_init_f */
log_debug("debug: %s\n", __func__);
+ return 0;
+}
+
+int sandbox_main(int argc, char *argv[])
+{
+ gd_t data;
+ int ret;
+
+ memset(&data, '\0', sizeof(data));
+ ret = sandbox_init(argc, argv, &data);
+ if (ret)
+ goto err;
+
/* Do pre- and post-relocation init */
board_init_f(gd->flags);
@@ -16,6 +16,8 @@
#include <linux/compiler_attributes.h>
+struct global_data;
+
/* board/.../... */
int board_init(void);
@@ -41,6 +43,22 @@ void sandbox_reset(void);
/* Exit sandbox (quit U-Boot) */
void __noreturn sandbox_exit(void);
+/**
+ * sandbox_init() - init sandbox
+ *
+ * This function initialises sandbox state, parses arguments, and sets up the
+ * global data structure, but does not call board_init_f().
+ *
+ * The caller must zero @data before calling this function. This function sets
+ * gd to point to @data so it must remain valid for the life of sandbox.
+ *
+ * @argc: the number of arguments passed to the program
+ * @argv: array of argc pointers, plus a NULL terminator
+ * @data: pointer to global data structure to init
+ * Return: 0 if OK, -ve on error
+ */
+int sandbox_init(int argc, char *argv[], struct global_data *data);
+
/**
* sandbox_main() - main entrypoint for sandbox
*
@@ -50,6 +68,9 @@ void __noreturn sandbox_exit(void);
* This calls sandbox_init(), then board_init_f/r(). It does not return unless
* something goes wrong.
*
+ * @argc: the number of arguments passed to the program
+ * @argv: array of argc pointers, plus a NULL terminator
+ *
* Return: 1 on error
*/
int sandbox_main(int argc, char *argv[]);