On Monday 21 April 2008, Mike Frysinger wrote:
> On Monday 21 April 2008, Wolfgang Denk wrote:
> > Providing both a "go" and a "jump" command which differ just in cahce
> > handling seems broken to me. If you want to add such a feature, then
> > I recommend to do it as part of "go", but make it optional, i. e. in-
> > troduce a new optional argument to the "go" command, something like
> >
> > go [ -cache={off,d-off,i-off,on,d-on,i-on} ] addr [ args ... ]
>
> cache is just an example. other arches may want to do other sort of
> "system breakdown/cleanup" before relinquishing control. option flags to
> commands really doesnt fit the style of u-boot (i expect that sort of
> painful option parsing in redboot, not really u-boot).
>
> so we can do:
> go [-noret] addr [args...]
> or we can add "jump" to cmd_boot.c and merge the differences by just using
> a function pointer to "do_go_exec" or "do_jump_exec".untested poc attached -mike
signature.asc
Description: This is a digitally signed message part.
diff --git a/common/cmd_boot.c b/common/cmd_boot.c
index d83f5af..0c34572 100644
--- a/common/cmd_boot.c
+++ b/common/cmd_boot.c
@@ -34,8 +34,14 @@ unsigned long do_go_exec (ulong (*entry)(int, char *[]), int argc, char *argv[])
{
return entry (argc, argv);
}
+__attribute__((weak))
+unsigned long do_jump_exec (ulong (*entry)(int, char *[]), int argc, char *argv[])
+{
+ return entry (argc, argv);
+}
-int do_go (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+int do_it (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
+ unsigned long (*exec_hook)(ulong (*entry)(int, char *[]), int argc, char *argv[]))
{
ulong addr, rc;
int rcode = 0;
@@ -53,13 +59,22 @@ int do_go (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
* pass address parameter as argv[0] (aka command name),
* and all remaining args
*/
- rc = do_go_exec ((void *)addr, argc - 1, argv + 1);
+ rc = exec_hook ((void *)addr, argc - 1, argv + 1);
if (rc != 0) rcode = 1;
printf ("## Application terminated, rc = 0x%lX\n", rc);
return rcode;
}
+int do_go (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+ return do_it (cmdtp, flag, argc, argv, do_go_exec);
+}
+int do_jump (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+ return do_it (cmdtp, flag, argc, argv, do_jump_exec);
+}
+
/* -------------------------------------------------------------------- */
U_BOOT_CMD(
@@ -69,6 +84,13 @@ U_BOOT_CMD(
" passing 'arg' as arguments\n"
);
+U_BOOT_CMD(
+ jump, CFG_MAXARGS, 1, do_jump,
+ "jump - start executing code at address 'addr' and never return\n",
+ "addr [arg ...]\n - jump to address 'addr'\n"
+ " passing 'arg' as arguments\n"
+);
+
extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
U_BOOT_CMD(
------------------------------------------------------------------------- This SF.net email is sponsored by the 2008 JavaOne(SM) Conference Don't miss this year's exciting event. There's still time to save $100. Use priority code J8TL2D2. http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________ U-Boot-Users mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/u-boot-users
