bootm: Move to using a function pointer table for the boot os function
authorKumar Gala <galak@kernel.crashing.org>
Tue, 21 Oct 2008 22:25:44 +0000 (17:25 -0500)
committerWolfgang Denk <wd@denx.de>
Tue, 28 Oct 2008 23:57:31 +0000 (00:57 +0100)
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 <galak@kernel.crashing.org>
Signed-off-by: Wolfgang Denk <wd@denx.de>
common/cmd_bootm.c

index b02da3e34a692fb536703ff464ec1ca91939f1d0..b87ac49e520b6ec829bd80db32a387d71362e645 100644 (file)
@@ -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,22 @@ 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 (!relocated) {
+               int i;
+               for (i = 0; i < ARRAY_SIZE(boot_os); i++)
+                       boot_os[i] += gd->reloc_off;
+               relocated = 1;
+       }
 
        if (bootm_start(cmdtp, flag, argc, argv))
                return 1;
@@ -454,45 +480,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();
-#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;
+       if (images.os.os == IH_OS_LINUX)
+               fixup_silent_linux();
 #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