
On Sun, 2007-12-16 at 22:27 +0100, Joakim Tjernlund wrote:
-----Original Message----- From: wd@denx.de [mailto:wd@denx.de] Sent: den 16 december 2007 21:15 To: joakim.tjernlund@transmode.se Cc: 'Jerry Van Baren'; u-boot-users@lists.sourceforge.net Subject: Re: [U-Boot-Users] Can U-boot Autodetect arch/ppcversusarch/powerpc from info in the uImage?
In message 1197647601.21876.12.camel@gentoo-jocke.transmode.se you wrote:
This is what I came up with to make $dtb a hush variable that don't end up in the environment:
#define FLAG_PARSE_SEMICOLON (1 << 1) #define FLAG_EXIT_FROM_LOOP 1 int misc_init_r (void) { char *bootstr, dtb_str[30], workstr[256];
u_boot_hush_start();
Be careful. You are invoking undefined behaviour heare. The idea is that u_boot_hush_start() is supposed to be called exactly once only. [Yes, I know from looking at the code that at the moment this seems to be OK, but ther eis no guarantee for it.]
Yes, I suspected this. Maybe it would be a good idea to move the call to u_boot_hush_start() earlier in common code so that there is no need to do it here?
sprintf(dtb_str, "dtb=0x%lx", (ulong)dt_blob_start); /* Set $dtb in local HUSH env.to my OF tree */ if (parse_string_outer(dtb_str, FLAG_PARSE_SEMICOLON |
FLAG_EXIT_FROM_LOOP) != 0) {
/* Add " - $dtb" to $bootcmd if it is missing */ bootstr = getenv("bootcmd"); if (bootstr && !strstr(bootstr, "- $dtb")) { strcpy(workstr, bootstr); strcat(workstr, " - $dtb"); setenv("bootcmd", workstr); }
} return 0; }
It is fairly ugly, but it works. Comments?
I don't understand why you make it so complicated when a preboot command would do exactly the same?
hmm, didn't think of that. Will look into that tmw, thanks
There is a chance that the preboot variable will end up in the environment and that could break the old boot when downgrading. Anyhow, I got an solution now that works and after a few releases, I can remove it.
When looking through the code I noticed that there is a lot of #ifdef CFG_HUSH_PARSER, especially code like this: #ifndef CFG_HUSH_PARSER if (run_command (arg, flag) == -1) return 1; #else if (parse_string_outer(arg, FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP) != 0) return 1; #endif It seems to me that arse_string_outer() could be moved inside the run_command() instead. That would make the code cleaner and make the image smaller. I guess there is a reason why it is the way it is?
Jocke