
This patch is just a quick work up to see how to handle a particular problem I've got. The idea is that I want finer control over what happens when I 'go' to piece of code. The idea is it looks more like a native function call than the current go which is more main() like.
The calling convention/num of args is specific to the PPC ABI.
I'm looking for suggestions, better names, etc.
thanks
- k
diff --git a/common/cmd_boot.c b/common/cmd_boot.c index e68f16f..5b0bbe4 100644 --- a/common/cmd_boot.c +++ b/common/cmd_boot.c @@ -32,6 +32,42 @@ DECLARE_GLOBAL_DATA_PTR; #endif
+int do_go_raw (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +{ + ulong addr, i; + ulong r[8] = { 0 }; + + void (*img)(ulong, ulong, ulong, ulong, + ulong, ulong, ulong, ulong); + + if ((argc < 2) || (argc > 9)) { + printf ("Usage:\n%s\n", cmdtp->usage); + return 1; + } + + addr = simple_strtoul(argv[1], NULL, 16); + + img = (void (*)(ulong, ulong, ulong, ulong, + ulong, ulong, ulong, ulong)) addr; + + for (i = 2; i < argc; i++) + r[i-2] = simple_strtoul(argv[i], NULL, 16); + + (*img)(r[0], r[1], r[2], r[3], r[4], r[5], r[6], r[7]); + /* does not return */ + + return 0; +} + +/* -------------------------------------------------------------------- */ + +U_BOOT_CMD( + go_raw, CFG_MAXARGS, 1, do_go_raw, + "go_raw - start application at address 'addr'\n", + "addr [arg ...]\n - start application at address 'addr'\n" + " passing 'arg' as arguments\n" +); + int do_go (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { ulong addr, rc;