This removes a bit of code and makes it easier for the upcoming sub bootm
command support to call into the proper OS specific handler.

Signed-off-by: Kumar Gala <[EMAIL PROTECTED]>
---
 common/cmd_bootm.c |   67 +++++++++++++++++++++++----------------------------
 1 files changed, 30 insertions(+), 37 deletions(-)

diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c
index b02da3e..5182124 100644
--- a/common/cmd_bootm.c
+++ b/common/cmd_bootm.c
@@ -119,6 +119,22 @@ int do_bootelf (cmd_tbl_t *cmdtp, int flag, int argc, char 
*argv[]);
 static boot_os_fn do_bootm_integrity;
 #endif
 
+boot_os_fn * boot_os[] = {
+       [IH_OS_LINUX] = do_bootm_linux,
+       [IH_OS_NETBSD] = do_bootm_netbsd,
+#ifdef CONFIG_LYNXKDI
+       [IH_OS_LYNXOS] = do_bootm_lynxkdi,
+#endif
+       [IH_OS_RTEMS] = do_bootm_rtems,
+#if defined(CONFIG_CMD_ELF)
+       [IH_OS_VXWORKS] = do_bootm_vxworks,
+       [IH_OS_QNX] = do_bootm_qnxelf,
+#endif
+#ifdef CONFIG_INTEGRITY
+       [IH_OS_INTEGRITY] = do_bootm_integrity,
+#endif
+};
+
 ulong load_addr = CONFIG_SYS_LOAD_ADDR;        /* Default Load Address */
 static bootm_headers_t images;         /* pointers to os/initrd/fdt images */
 
@@ -386,12 +402,21 @@ static int bootm_load_os(image_info_t os, ulong 
*load_end, int boot_progress)
 /*******************************************************************/
 /* bootm - boot application image from image in memory */
 /*******************************************************************/
+static int relocated = 0;
+
 int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 {
-
        ulong           iflag;
        ulong           load_end = 0;
        int             ret;
+       boot_os_fn      *boot_fn;
+
+       /* relocate boot function table */
+       if (0 == relocated) {
+               int i;
+               for (i = 0; i < ARRAY_SIZE(boot_os); i++)
+                       boot_os[i] += gd->reloc_off;
+       }
 
        if (bootm_start(cmdtp, flag, argc, argv))
                return 1;
@@ -454,45 +479,13 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char 
*argv[])
 
        show_boot_progress (8);
 
-       switch (images.os.os) {
-       default:                        /* handled by (original) Linux case */
-       case IH_OS_LINUX:
 #ifdef CONFIG_SILENT_CONSOLE
-           fixup_silent_linux();
+       if (images.os.os == IH_OS_LINUX)
+               fixup_silent_linux();
 #endif
-           do_bootm_linux (0, argc, argv, &images);
-           break;
-
-       case IH_OS_NETBSD:
-           do_bootm_netbsd (0, argc, argv, &images);
-           break;
 
-#ifdef CONFIG_LYNXKDI
-       case IH_OS_LYNXOS:
-           do_bootm_lynxkdi (0, argc, argv, &images);
-           break;
-#endif
-
-       case IH_OS_RTEMS:
-           do_bootm_rtems (0, argc, argv, &images);
-           break;
-
-#if defined(CONFIG_CMD_ELF)
-       case IH_OS_VXWORKS:
-           do_bootm_vxworks (0, argc, argv, &images);
-           break;
-
-       case IH_OS_QNX:
-           do_bootm_qnxelf (0, argc, argv, &images);
-           break;
-#endif
-
-#ifdef CONFIG_INTEGRITY
-       case IH_OS_INTEGRITY:
-           do_bootm_integrity (0, argc, argv, &images);
-           break;
-#endif
-       }
+       boot_fn = boot_os[images.os.os];
+       boot_fn(0, argc, argv, &images);
 
        show_boot_progress (-9);
 #ifdef DEBUG
-- 
1.5.5.1

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to