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

Attachment: 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

Reply via email to