barrier.h

Go to the documentation of this file.
00001 /*
00002  * Copyright (C) 2005 Jakub Jermar
00003  * All rights reserved.
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions
00007  * are met:
00008  *
00009  * - Redistributions of source code must retain the above copyright
00010  *   notice, this list of conditions and the following disclaimer.
00011  * - Redistributions in binary form must reproduce the above copyright
00012  *   notice, this list of conditions and the following disclaimer in the
00013  *   documentation and/or other materials provided with the distribution.
00014  * - The name of the author may not be used to endorse or promote products
00015  *   derived from this software without specific prior written permission.
00016  *
00017  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
00018  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
00019  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
00020  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
00021  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
00022  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
00023  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
00024  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00025  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
00026  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00027  */
00028 
00035 #ifndef __ia32_BARRIER_H__
00036 #define __ia32_BARRIER_H__
00037 
00038 /*
00039  * NOTE:
00040  * No barriers for critical section (i.e. spinlock) on IA-32 are needed:
00041  * - spinlock_lock() and spinlock_trylock() use serializing XCHG instruction
00042  * - writes cannot pass reads on IA-32 => spinlock_unlock() needs no barriers
00043  */
00044 
00045 /*
00046  * Provisions are made to prevent compiler from reordering instructions itself.
00047  */
00048 
00049 #define CS_ENTER_BARRIER()      __asm__ volatile ("" ::: "memory")
00050 #define CS_LEAVE_BARRIER()      __asm__ volatile ("" ::: "memory")
00051 
00052 static inline void cpuid_serialization(void)
00053 {
00054         __asm__ volatile (
00055                 "xorl %%eax, %%eax\n"
00056                 "cpuid\n"
00057                 ::: "eax", "ebx", "ecx", "edx", "memory"
00058         );
00059 }
00060 
00061 #ifdef CONFIG_FENCES_P4
00062 #       define memory_barrier()         __asm__ volatile ("mfence\n" ::: "memory")
00063 #       define read_barrier()           __asm__ volatile ("lfence\n" ::: "memory")
00064 #       ifdef CONFIG_WEAK_MEMORY
00065 #               define write_barrier()  __asm__ volatile ("sfence\n" ::: "memory")
00066 #       else
00067 #               define write_barrier()  __asm__ volatile( "" ::: "memory");
00068 #       endif
00069 #elif CONFIG_FENCES_P3
00070 #       define memory_barrier()         cpuid_serialization()
00071 #       define read_barrier()           cpuid_serialization()
00072 #       ifdef CONFIG_WEAK_MEMORY
00073 #               define write_barrier()  __asm__ volatile ("sfence\n" ::: "memory")
00074 #       else
00075 #               define write_barrier()  __asm__ volatile( "" ::: "memory");
00076 #       endif
00077 #else
00078 #       define memory_barrier()         cpuid_serialization()
00079 #       define read_barrier()           cpuid_serialization()
00080 #       ifdef CONFIG_WEAK_MEMORY
00081 #               define write_barrier()  cpuid_serialization()
00082 #       else
00083 #               define write_barrier()  __asm__ volatile( "" ::: "memory");
00084 #       endif
00085 #endif
00086 
00087 #endif
00088 

Generated on Sun Jun 18 16:38:50 2006 for HelenOS Kernel (ia32) by  doxygen 1.4.6