Rudolf Marek ([email protected]) just uploaded a new patch set to gerrit, 
which you can find at http://review.coreboot.org/81

-gerrit

commit 6974e425a31b1c798dd05e346e9ca4521e31079f
Author: Rudolf Marek <[email protected]>
Date:   Sat Jul 2 16:03:24 2011 +0200

    Small SMM fixups
    
    Align the spinlock to the 4 byte boundary (CPU will guarantee atomicity of 
XCHG).
    While at it add the PAUSE instruction to spinlock loop to hint the CPU we 
are just
    spinlocking. The rep nop could not be used because "as" complains that rep 
is used
    without string instructions.
    
    Change-Id: I325cd83de3a6557b1bee6758bc151bc81e874f8c
    Signed-off-by: Rudolf Marek <[email protected]>
---
 src/cpu/x86/smm/smihandler.c |    8 ++++++--
 1 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/cpu/x86/smm/smihandler.c b/src/cpu/x86/smm/smihandler.c
index d44a3ea..a6ab87f 100644
--- a/src/cpu/x86/smm/smihandler.c
+++ b/src/cpu/x86/smm/smihandler.c
@@ -28,7 +28,7 @@
 typedef enum { SMI_LOCKED, SMI_UNLOCKED } smi_semaphore;
 
 /* SMI multiprocessing semaphore */
-static volatile smi_semaphore smi_handler_status = SMI_UNLOCKED;
+static volatile smi_semaphore smi_handler_status __attribute__ ((aligned (4))) 
 = SMI_UNLOCKED;
 
 static int smi_obtain_lock(void)
 {
@@ -121,7 +121,11 @@ void smi_handler(u32 smm_revision)
                /* For security reasons we don't release the other CPUs
                 * until the CPU with the lock is actually done
                 */
-               while (smi_handler_status == SMI_LOCKED) /* wait */ ;
+               while (smi_handler_status == SMI_LOCKED) {
+                       asm volatile (
+                               ".byte 0xf3, 0x90\n"  /* hint a CPU we are in 
spinlock (PAUSE instruction, REP NOP) */
+                       );
+               }
                return;
        }
 

-- 
coreboot mailing list: [email protected]
http://www.coreboot.org/mailman/listinfo/coreboot

Reply via email to