Only BSP CPU writes CMOS in bootblock code
authorKyösti Mälkki <kyosti.malkki@gmail.com>
Mon, 5 Dec 2011 18:17:17 +0000 (20:17 +0200)
committerPatrick Georgi <patrick@georgi-clan.de>
Sat, 24 Dec 2011 11:10:14 +0000 (12:10 +0100)
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>
src/arch/x86/init/bootblock_normal.c
src/arch/x86/init/bootblock_simple.c

index db9d0f9557f89c355f224afaa01d9e53b030704a..f8ae13b9dddad253f0e2a79c79f8a99fe1f42d3d 100644 (file)
@@ -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");
index 5d7c611aa7df6f29c675c5b9a4015199e05a4a9a..41f73b43b6129b30fee5a1bf6eaf283792c32cc1 100644 (file)
@@ -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;