Skip to contentSkip to conversation

bootm: Move to using a function pointer table for the boot os function

PATCH Superseded Kumar Gala 3 participants 6 messages Oct 19, 2008 – Oct 21, 2008

lore
Share & tools
lore

Kumar Gala

author
#0 lore raw

PATCH v2 1/1 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.

---

Fix a bug that showed up in sub command testing in that we didn't sent the relocated flag.

 common/cmd_bootm.c |   68 +++++++++++++++++++++++----------------------------
 1 files changed, 31 insertions(+), 37 deletions(-)
common/cmd_bootm.c +31 -37
index b02da3e..956e1a0 100644
@@ -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 (0 == 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
Signature · 1 line
1.5.5.1
#1 lore raw

PATCH v2 1/1 bootm: Move to using a function pointer table for the boot os function

Quoted 17 lines · Kumar Gala

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.

---

Fix a bug that showed up in sub command testing in that we didn't sent the relocated flag.

 common/cmd_bootm.c |   68 +++++++++++++++++++++++----------------------------
 1 files changed, 31 insertions(+), 37 deletions(-)
common/cmd_bootm.c +0 -0
index b02da3e..956e1a0 100644

common/cmd_bootm.c int do_bootelf (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); · line 124

Quoted 6 lines
common/cmd_bootm.c +3 -0
@@ -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,

why not add config to ative or not netbsd, linux and rterms to reduce U-Boot size?

Best Regards,
J.

author
#2 lore raw

PATCH v2 1/1 bootm: Move to using a function pointer table for the boot os function

Quoted 25 lines · Jean-Christophe PLAGNIOL-VILLARD
Quoted 24 lines · Kumar Gala

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.

---

Fix a bug that showed up in sub command testing in that we didn't sent the relocated
flag.

common/cmd_bootm.c | 68 ++++++++++++++++++++++
+----------------------------

1 files changed, 31 insertions(+), 37 deletions(-)
common/cmd_bootm.c +0 -0
index b02da3e..956e1a0 100644
@@ -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
 
Quoted 6 lines

common/cmd_bootm.c int do_bootelf (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); · line 124

Quoted 3 lines
common/cmd_bootm.c +3 -0
+boot_os_fn * boot_os[] = {
+	[IH_OS_LINUX] = do_bootm_linux,
+	[IH_OS_NETBSD] = do_bootm_netbsd,

why not add config to ative or not netbsd, linux and rterms to reduce U-Boot
size?

ative?

that would be an orthogonal change.

- k

#3 lore raw

PATCH v2 1/1 bootm: Move to using a function pointer table for the boot os function

Dear Kumar Gala,

Quoted 7 lines · In message <[email protected]> you wrote:
Quoted 7 lines
Quoted 7 lines

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.

---

...

Quoted 12 lines
Quoted 11 lines

common/cmd_bootm.c int do_bootelf (cmd_tbl_t *cmdtp, int flag, · line 125

Quoted 8 lines
common/cmd_bootm.c +3 -0
@@ -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,

why not add config to ative or not netbsd, linux and rterms to reduce U-Boot
size?

Quoted 3 lines

ative?

that would be an orthogonal change.

One that we should implement, I think.

Best regards,

Wolfgang Denk

Signature · 4 lines
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
Drawing on my fine command of language, I said nothing.
author
#4 lore raw

PATCH v2 1/1 bootm: Move to using a function pointer table for the boot os function

Quoted 24 lines · Wolfgang Denk

Dear Kumar Gala,

In message <6FA5D356-5762-4185-

Quoted 7 lines · BD0C-1CE3BDEDE2D9 at kernel.crashing.org> you wrote:
Quoted 7 lines
Quoted 7 lines

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.

---

...

Quoted 12 lines
Quoted 11 lines

common/cmd_bootm.c int do_bootelf (cmd_tbl_t *cmdtp, int flag, · line 125

Quoted 8 lines
common/cmd_bootm.c +3 -0
@@ -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,

why not add config to ative or not netbsd, linux and rterms to reduce U-Boot
size?

Quoted 5 lines
Quoted 3 lines

ative?

that would be an orthogonal change.

One that we should implement, I think.

So this means introducing CONFIG_BOOT_RTEMS, CONFIG_BOOT_NETBSD, and CONFIG_BOOT_LINUX.

Should these be enabled in all board configs by default?

- k

#5 lore raw

PATCH v2 1/1 bootm: Move to using a function pointer table for the boot os function

Dear Kumar Gala,

Quoted 5 lines · In message <[email protected]> you wrote:
Quoted 2 lines

One that we should implement, I think.

So this means introducing CONFIG_BOOT_RTEMS, CONFIG_BOOT_NETBSD, and CONFIG_BOOT_LINUX.

ACK.

Quoted 1 line

Should these be enabled in all board configs by default?

I recommend to enable only CONFIG_BOOT_LINUX by default.

Board maintainers, please register now if you have different needs :-)

Best regards,

Wolfgang Denk

Signature · 6 lines
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
If a man had a child who'd gone  anti-social,  killed  perhaps,  he'd
still tend to protect that child.
	-- McCoy, "The Ultimate Computer", stardate 4731.3