The gcc 4.5 compiler is optimizing out some code used to bring up auxillary processors. Adding volatile to the auxillary processor jump trampoline memory references gets the bios able to boot with -smp >1 again.


Signed-off-by: Bruce Rogers <brogers@novell.com>


smp.c |    6 +++---

1 file changed, 3 insertions(+), 3 deletions(-)


diff --git a/src/smp.c b/src/smp.c

index dac95bf..ce7c81c 100644

--- a/src/smp.c

+++ b/src/smp.c

@@ -84,11 +84,11 @@ smp_probe(void)

     writel(&CountCPUs, 1);


     // Setup jump trampoline to counter code.

-    u64 old = *(u64*)BUILD_AP_BOOT_ADDR;

+    u64 old = *(volatile u64*)BUILD_AP_BOOT_ADDR;

     // ljmpw $SEG_BIOS, $(smp_ap_boot_code - BUILD_BIOS_ADDR)

     u64 new = (0xea | ((u64)SEG_BIOS<<24)

                | (((u32)smp_ap_boot_code - BUILD_BIOS_ADDR) << 8));

-    *(u64*)BUILD_AP_BOOT_ADDR = new;

+    *(volatile u64*)BUILD_AP_BOOT_ADDR = new;


     // enable local APIC

     u32 val = readl(APIC_SVR);

@@ -117,7 +117,7 @@ smp_probe(void)

     }


     // Restore memory.

-    *(u64*)BUILD_AP_BOOT_ADDR = old;

+    *(volatile u64*)BUILD_AP_BOOT_ADDR = old;


     MaxCountCPUs = qemu_cfg_get_max_cpus();

     if (!MaxCountCPUs || MaxCountCPUs < CountCPUs)