[U-Boot-Users] U-boot runtime detection

Hi all,
I am currently working on the adm5120 target under Linux and this board is available with at least 4 bootloaders, including U-boot.
We manage getting runtime bootloader detection working using the fw_arg0-3 values for CFE, RouterBoot, Bootbase. Now I would like to do so for U-boot and I could not find any informations if U-boot fills the fw_arg0-3 with some specific values that could let us identify it at runtime. Can you indicate me if such identification is possible ? If not, would another method (like reading the first flash block) work ?
Thank you very much in advance for your answer.

In message 200705301902.50186.florian.fainelli@telecomint.eu you wrote:
I am currently working on the adm5120 target under Linux and this board is available with at least 4 bootloaders, including U-boot.
4 different boot loaderss on one board? What a waste of effort...
We manage getting runtime bootloader detection working using the fw_arg0-3 values for CFE, RouterBoot, Bootbase. Now I would like to do so for U-boot and I could not find any informations if U-boot fills the fw_arg0-3 with some specific values that could let us identify it at runtime. Can you indicate me if such identification is possible ? If not, would another method (like reading the first flash block) work ?
You may want to check "lib_mips/mips_linux.c" to see which arguments get passed to a Linux kernel by U-Boot. Search for "theKernel()" call.
Best regards,
Wolfgang Denk

Hello Wolfgang,
Thank you very much for your answer. Looks like reading linux_env in fw_arg2 and 0 in fw_arg3 should be pretty efficient in saying it is U-boot we were booted from.
Any reasons why fw_arg3 receives 0 instead of a magic number ? Broadcom's CFE passes the string "CFE1" in here, why not passing "UBOO" for instance ?
Le jeudi 31 mai 2007, Wolfgang Denk a écrit :
In message 200705301902.50186.florian.fainelli@telecomint.eu you wrote:
I am currently working on the adm5120 target under Linux and this board is available with at least 4 bootloaders, including U-boot.
4 different boot loaderss on one board? What a waste of effort...
We manage getting runtime bootloader detection working using the fw_arg0-3 values for CFE, RouterBoot, Bootbase. Now I would like to do so for U-boot and I could not find any informations if U-boot fills the fw_arg0-3 with some specific values that could let us identify it at runtime. Can you indicate me if such identification is possible ? If not, would another method (like reading the first flash block) work ?
You may want to check "lib_mips/mips_linux.c" to see which arguments get passed to a Linux kernel by U-Boot. Search for "theKernel()" call.
Best regards,
Wolfgang Denk

Hello,
This patch allows MIPS based Linux kernels to do runtime bootloader detection by reading Linux's fw_arg3 in the PROM code (for instance) filled with the magic number "UBOO". This may not be really useful for other boards than MIPS and in particular those that use several different bootloaders (like ADM5120).
Signed-off-by: Florian Fainelli florian.fainelli@telecomint.eu --

Hi Florian,
This patch allows MIPS based Linux kernels to do runtime bootloader detection by reading Linux's fw_arg3 in the PROM code (for instance) filled with the magic number "UBOO". This may not be really useful for other boards than MIPS and in particular those that use several different bootloaders (like ADM5120).
Signed-off-by: Florian Fainelli florian.fainelli@telecomint.eu
diff --git a/lib_mips/mips_linux.c b/lib_mips/mips_linux.c index 952d5a9..0823bc0 100644 --- a/lib_mips/mips_linux.c +++ b/lib_mips/mips_linux.c @@ -33,6 +33,8 @@ DECLARE_GLOBAL_DATA_PTR; #define LINUX_MAX_ENVS 256 #define LINUX_MAX_ARGS 256
+#define UBOOT_MAGIC_NUMBER 0x55424F4F /* UBOO */
#ifdef CONFIG_SHOW_BOOT_PROGRESS # include <status_led.h> # define SHOW_BOOT_PROGRESS(arg) show_boot_progress(arg) @@ -213,7 +215,7 @@ void do_bootm_linux (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[], /* we assume that the kernel is in place */ printf ("\nStarting kernel ...\n\n");
- theKernel (linux_argc, linux_argv, linux_env, 0);
- theKernel (linux_argc, linux_argv, linux_env, UBOOT_MAGIC_NUMBER);
}
static void linux_params_init (ulong start, char *line)
I know U-Boot is magic - but why have more than needed?
[dzu@pollux u-boot]$ grep IH_MAGIC include/* include/image.h:#define IH_MAGIC 0x27051956 /* Image Magic Number */ [dzu@pollux u-boot]$ grep 27051956 /usr/share/magic 0 belong 0x27051956 u-boot/PPCBoot image
Cheers Detlev

In message 200706061258.37801.florian.fainelli@telecomint.eu you wrote:
Thank you very much for your answer. Looks like reading linux_env in fw_arg2 and 0 in fw_arg3 should be pretty efficient in saying it is U-boot we were booted from.
I have to admit that I don't understand the rationale of all that. IMHO the Linux kernel should never have to know how it was booted and which bootloader might have been used. The kernel has a well-defined interface and expects a certain set of hardware initializations been done before it gets started, but that's it. It should not need any additional information outside this
Any reasons why fw_arg3 receives 0 instead of a magic number ? Broadcom's C> FE passes the string "CFE1" in here, why not passing "UBOO" for instance ?
Because nobody ever cared?
Le jeudi 31 mai 2007, Wolfgang Denk a écrit :
In message 200705301902.50186.florian.fainelli@telecomint.eu you wrote:
I am currently working on the adm5120 target under Linux and this board is available with at least 4 bootloaders, including U-boot.
... Please don't top post / full quote. Please see http://www.netmeister.org/news/learn2quote.html
Best regards,
Wolfgang Denk
participants (3)
-
Detlev Zundel
-
Florian Fainelli
-
Wolfgang Denk