diff options
| author | Kumar Gala <galak@kernel.crashing.org> | 2008-10-21 17:25:44 -0500 | 
|---|---|---|
| committer | Wolfgang Denk <wd@denx.de> | 2008-10-29 00:57:31 +0100 | 
| commit | be08315933537f061bc1ce61f33a29c56458bbad (patch) | |
| tree | ec8caca1688b4935cfd9dd9111e28def987824d6 /common/cmd_bootm.c | |
| parent | d35c451d6cff3e77e40fbdfc7a2933cdcb86ae4b (diff) | |
| download | olio-uboot-2014.01-be08315933537f061bc1ce61f33a29c56458bbad.tar.xz olio-uboot-2014.01-be08315933537f061bc1ce61f33a29c56458bbad.zip | |
bootm: Move to using a function pointer table for the boot os function
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>
Diffstat (limited to 'common/cmd_bootm.c')
| -rw-r--r-- | common/cmd_bootm.c | 68 | 
1 files changed, 31 insertions, 37 deletions
| diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c index b02da3e34..b87ac49e5 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,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(); +	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 |