Hi,

The memory barrier routines are macros which calls a routine called
alternative, the call is something is like this : (for mb())

#define mb() alternative("lock; addl $0,0(%%esp)", "mfence", X86_FEATURE_XMM2)

can someone please help me understanding the alternative inline assembly, i am 
finding it a bit confusing.
source is in : include/asm-i386/system.h
#define alternative(oldinstr, newinstr, feature)        \
        asm volatile ("661:\n\t" oldinstr "\n662:\n"                 \
                      ".section .altinstructions,\"a\"\n"            \
                      "  .align 4\n"                                   \
                      "  .long 661b\n"            /* label */          \
                      "  .long 663f\n"            /* new instruction */         
\
                      "  .byte %c0\n"             /* feature bit */    \
                      "  .byte 662b-661b\n"       /* sourcelen */      \
                      "  .byte 664f-663f\n"       /* replacementlen */ \
                      ".previous\n"                                             
\
                      ".section .altinstr_replacement,\"ax\"\n"                 
\
                      "663:\n\t" newinstr "\n664:\n"   /* replacement */    \
                      ".previous" :: "i" (feature) : "memory")

Reply via email to