aboutsummaryrefslogtreecommitdiffstats
path: root/src/arch/x86/init
diff options
context:
space:
mode:
authorKyösti Mälkki <kyosti.malkki@gmail.com>2011-12-05 20:17:17 +0200
committerPatrick Georgi <patrick@georgi-clan.de>2011-12-24 12:10:14 +0100
commitf28dbe0c5d299297029afe01bb7329c6c18ae3db (patch)
tree32b267efa3142b0c330b18280ef36221beb5df9a /src/arch/x86/init
parentf42fdabe651ab327a5c76d672781d60bd9124e94 (diff)
downloadcoreboot-f28dbe0c5d299297029afe01bb7329c6c18ae3db.tar.gz
coreboot-f28dbe0c5d299297029afe01bb7329c6c18ae3db.tar.xz
coreboot-f28dbe0c5d299297029afe01bb7329c6c18ae3db.zip
Only BSP CPU writes CMOS in bootblock code
CMOS accesses are not safe for multi-processor and only the BSP CPU should count reboots and test CMOS sanity. A questionable single byte CMOS read access from AP CPUs remains. AP CPUs should always select the same romstage prefix as BSP CPU. Change-Id: I29118e33c07c0080c94abb90f703e38312c72432 Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com> Reviewed-on: http://review.coreboot.org/446 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi <patrick@georgi-clan.de>
Diffstat (limited to 'src/arch/x86/init')
-rw-r--r--src/arch/x86/init/bootblock_normal.c18
-rw-r--r--src/arch/x86/init/bootblock_simple.c4
2 files changed, 16 insertions, 6 deletions
diff --git a/src/arch/x86/init/bootblock_normal.c b/src/arch/x86/init/bootblock_normal.c
index db9d0f955..f8ae13b9d 100644
--- a/src/arch/x86/init/bootblock_normal.c
+++ b/src/arch/x86/init/bootblock_normal.c
@@ -3,18 +3,28 @@
static void main(unsigned long bist)
{
+ unsigned long entry;
+ int boot_mode;
+
if (boot_cpu()) {
bootblock_northbridge_init();
bootblock_southbridge_init();
bootblock_cpu_init();
- }
#if CONFIG_USE_OPTION_TABLE
- sanitize_cmos();
+ sanitize_cmos();
#endif
+ boot_mode = do_normal_boot();
+ } else {
- unsigned long entry;
- if (do_normal_boot())
+ /* Questionable single byte read from CMOS.
+ * Do not add any other CMOS access in the
+ * bootblock for AP CPUs.
+ */
+ boot_mode = last_boot_normal();
+ }
+
+ if (boot_mode)
entry = findstage("normal/romstage");
else
entry = findstage("fallback/romstage");
diff --git a/src/arch/x86/init/bootblock_simple.c b/src/arch/x86/init/bootblock_simple.c
index 5d7c611aa..41f73b43b 100644
--- a/src/arch/x86/init/bootblock_simple.c
+++ b/src/arch/x86/init/bootblock_simple.c
@@ -6,11 +6,11 @@ static void main(unsigned long bist)
bootblock_northbridge_init();
bootblock_southbridge_init();
bootblock_cpu_init();
- }
#if CONFIG_USE_OPTION_TABLE
- sanitize_cmos();
+ sanitize_cmos();
#endif
+ }
const char* target1 = "fallback/romstage";
unsigned long entry;