Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/abs32le/include/barrier.h

    rfb52db8 r50fda24  
    2727 */
    2828
    29 /** @addtogroup abs32le
     29/** @addtogroup ia32
    3030 * @{
    3131 */
     
    3333 */
    3434
    35 #ifndef KERN_abs32le_BARRIER_H_
    36 #define KERN_abs32le_BARRIER_H_
     35#ifndef KERN_ia32_BARRIER_H_
     36#define KERN_ia32_BARRIER_H_
     37
     38/*
     39 * NOTE:
     40 * No barriers for critical section (i.e. spinlock) on IA-32 are needed:
     41 * - spinlock_lock() and spinlock_trylock() use serializing XCHG instruction
     42 * - writes cannot pass reads on IA-32 => spinlock_unlock() needs no barriers
     43 */
    3744
    3845/*
     
    4047 */
    4148
    42 #define CS_ENTER_BARRIER()
    43 #define CS_LEAVE_BARRIER()
     49#define CS_ENTER_BARRIER()  asm volatile ("" ::: "memory")
     50#define CS_LEAVE_BARRIER()  asm volatile ("" ::: "memory")
    4451
    45 #define memory_barrier()
    46 #define read_barrier()
    47 #define write_barrier()
     52static inline void cpuid_serialization(void)
     53{
     54        asm volatile (
     55                "xorl %%eax, %%eax\n"
     56                "cpuid\n"
     57                ::: "eax", "ebx", "ecx", "edx", "memory"
     58        );
     59}
    4860
    49 #define smc_coherence(addr)
    50 #define smc_coherence_block(addr, size)
     61#if defined(CONFIG_FENCES_P4)
     62        #define memory_barrier()  asm volatile ("mfence\n" ::: "memory")
     63        #define read_barrier()    asm volatile ("lfence\n" ::: "memory")
     64        #ifdef CONFIG_WEAK_MEMORY
     65                #define write_barrier()  asm volatile ("sfence\n" ::: "memory")
     66        #else
     67                #define write_barrier()  asm volatile ("" ::: "memory");
     68        #endif
     69#elif defined(CONFIG_FENCES_P3)
     70        #define memory_barrier()  cpuid_serialization()
     71        #define read_barrier()    cpuid_serialization()
     72        #ifdef CONFIG_WEAK_MEMORY
     73                #define write_barrier()  asm volatile ("sfence\n" ::: "memory")
     74        #else
     75                #define write_barrier()  asm volatile ("" ::: "memory");
     76        #endif
     77#else
     78        #define memory_barrier()  cpuid_serialization()
     79        #define read_barrier()    cpuid_serialization()
     80        #ifdef CONFIG_WEAK_MEMORY
     81                #define write_barrier()  cpuid_serialization()
     82        #else
     83                #define write_barrier()  asm volatile ("" ::: "memory");
     84        #endif
     85#endif
     86
     87/*
     88 * On ia32, the hardware takes care about instruction and data cache coherence,
     89 * even on SMP systems.  We issue a write barrier to be sure that writes
     90 * queueing in the store buffer drain to the memory (even though it would be
     91 * sufficient for them to drain to the D-cache).
     92 */
     93#define smc_coherence(a)           write_barrier()
     94#define smc_coherence_block(a, l)  write_barrier()
    5195
    5296#endif
Note: See TracChangeset for help on using the changeset viewer.