Re: Force consecutive operation when using asm volatile macro

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

Ian Lance Taylor wrote:
Jari Kuusisto <jari.h.kuusisto@xxxxxxxxx> writes:

Here's an example function from uC/OS where the critical section asm
macro code seems not to work as expected (but with critical section
function it works).

It might help to see how it fails.  That said...

   #define OS_ENTER_CRITICAL() asm volatile("mfmsr
%0":"=r"(cpu_sr));asm volatile("mtspr 81,r0")
   #define OS_EXIT_CRITICAL()  asm volatile("mtmsr %0"::"r"(cpu_sr))

...there is nothing in these asm statements which tells the compiler
that it can't schedule instructions across them.  The asm statements
say that the asm must not be deleted, but they don't say anything
about running before or after any other instructions.

Depending upon your requirements, it may suffice to simply say
    asm volatile("mfmsr %" : "=r" : : "memory");
    asm volatile("mtspr 81,r0" : : : "memory");
and
    asm volatile("mtmsr %0" : : "r" (cpu_sr) : "memory");

Ian

I've now tested this method, the exact macro lines are now:

#define OS_ENTER_CRITICAL() asm volatile("mfmsr %0":"=r"(cpu_sr) : : "memory");asm volatile("mtspr 81,r0" : : : "memory") #define OS_EXIT_CRITICAL() asm volatile("mtmsr %0"::"r"(cpu_sr) : "memory")

An this solution seems to be working, and performance values were now improved. Could you please explain to me what this "memory" section in asm line actually does?

Thanks for your help!

BR. Jari


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux