summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2013-06-28 00:46:12 -0700
committerTom Rini <trini@ti.com>2013-06-28 16:26:50 -0400
commit5ff0d0832e085fe64740e6c78e11193b048896da (patch)
tree0583eda9afbfca0ffa355eeb2562f87234119ce2 /common
parentd366438d8ac80fd10110dceda9f4792f4a16ac9d (diff)
downloadtalos-obmc-uboot-5ff0d0832e085fe64740e6c78e11193b048896da.tar.gz
talos-obmc-uboot-5ff0d0832e085fe64740e6c78e11193b048896da.zip
bootm: Disable interrupts before loading OS
This restores the ordering of interrupt disable to what it what before commit 35fc84fa. It seems that on some archiectures (e.g. PowerPC) the OS is loaded into an interrupt region, which can cause problems if interrupts are still running. Tested-by: Stefan Roese <sr@denx.de> Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'common')
-rw-r--r--common/cmd_bootm.c53
1 files changed, 27 insertions, 26 deletions
diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c
index 3009ecee54..02a5013c04 100644
--- a/common/cmd_bootm.c
+++ b/common/cmd_bootm.c
@@ -516,36 +516,13 @@ static cmd_tbl_t cmd_bootm_sub[] = {
};
static int boot_selected_os(int argc, char * const argv[], int state,
- bootm_headers_t *images, boot_os_fn *boot_fn, ulong *iflag)
+ bootm_headers_t *images, boot_os_fn *boot_fn)
{
if (images->os.type == IH_TYPE_STANDALONE) {
/* This may return when 'autostart' is 'no' */
bootm_start_standalone(argc, argv);
return 0;
}
- /*
- * We have reached the point of no return: we are going to
- * overwrite all exception vector code, so we cannot easily
- * recover from any failures any more...
- */
- *iflag = disable_interrupts();
-#ifdef CONFIG_NETCONSOLE
- /* Stop the ethernet stack if NetConsole could have left it up */
- eth_halt();
-#endif
-
-#if defined(CONFIG_CMD_USB)
- /*
- * turn off USB to prevent the host controller from writing to the
- * SDRAM while Linux is booting. This could happen (at least for OHCI
- * controller), because the HCCA (Host Controller Communication Area)
- * lies within the SDRAM and the host controller writes continously to
- * this area (as busmaster!). The HccaFrameNumber is for example
- * updated every 1 ms within the HCCA structure in SDRAM! For more
- * details see the OpenHCI specification.
- */
- usb_stop();
-#endif
#ifdef CONFIG_SILENT_CONSOLE
if (images->os.os == IH_OS_LINUX)
fixup_silent_linux();
@@ -611,6 +588,30 @@ static int do_bootm_states(cmd_tbl_t *cmdtp, int flag, int argc,
argc = 0; /* consume the args */
}
+ /*
+ * We have reached the point of no return: we are going to
+ * overwrite all exception vector code, so we cannot easily
+ * recover from any failures any more...
+ */
+ iflag = disable_interrupts();
+#ifdef CONFIG_NETCONSOLE
+ /* Stop the ethernet stack if NetConsole could have left it up */
+ eth_halt();
+#endif
+
+#if defined(CONFIG_CMD_USB)
+ /*
+ * turn off USB to prevent the host controller from writing to the
+ * SDRAM while Linux is booting. This could happen (at least for OHCI
+ * controller), because the HCCA (Host Controller Communication Area)
+ * lies within the SDRAM and the host controller writes continously to
+ * this area (as busmaster!). The HccaFrameNumber is for example
+ * updated every 1 ms within the HCCA structure in SDRAM! For more
+ * details see the OpenHCI specification.
+ */
+ usb_stop();
+#endif
+
/* Load the OS */
if (!ret && (states & BOOTM_STATE_LOADOS)) {
ulong load_end;
@@ -674,7 +675,7 @@ static int do_bootm_states(cmd_tbl_t *cmdtp, int flag, int argc,
char *cmd_list = getenv("fakegocmd");
ret = boot_selected_os(argc, argv, BOOTM_STATE_OS_FAKE_GO,
- images, boot_fn, &iflag);
+ images, boot_fn);
if (!ret && cmd_list)
ret = run_command_list(cmd_list, -1, flag);
}
@@ -682,7 +683,7 @@ static int do_bootm_states(cmd_tbl_t *cmdtp, int flag, int argc,
/* Now run the OS! We hope this doesn't return */
if (!ret && (states & BOOTM_STATE_OS_GO)) {
ret = boot_selected_os(argc, argv, BOOTM_STATE_OS_GO,
- images, boot_fn, &iflag);
+ images, boot_fn);
if (ret)
goto err;
}
OpenPOWER on IntegriCloud