Changes in kernel/arch/arm32/include/barrier.h [7dc8bf1:2a8f38a] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/arm32/include/barrier.h
r7dc8bf1 r2a8f38a 39 39 /* 40 40 * TODO: implement true ARM memory barriers for macros below. 41 * ARMv6 introduced user access of the following commands:42 * • Prefetch flush43 * • Data synchronization barrier44 * • Data memory barrier45 * • Clean and prefetch range operations.46 * ARM Architecture Reference Manual version I ch. B.3.2.1 p. B3-447 41 */ 48 42 #define CS_ENTER_BARRIER() asm volatile ("" ::: "memory") … … 60 54 #define read_barrier() asm volatile ("dsb" ::: "memory") 61 55 #define write_barrier() asm volatile ("dsb st" ::: "memory") 56 #elif defined PROCESSOR_ARCH_armv6 57 /* ARMv6- use system control coprocessor (CP15) for memory barrier instructions. 58 * Although at least mcr p15, 0, r0, c7, c10, 4 is mentioned in earlier archs, 59 * CP15 implementation is mandatory only for armv6+. 60 */ 61 #define memory_barrier() asm volatile ("ldr r0, =0\nmcr p15, 0, r0, c7, c10, 5" ::: "r0", "memory") 62 #define read_barrier() asm volatile ("ldr r0, =0\nmcr p15, 0, r0, c7, c10, 4" ::: "r0", "memory") 63 #define write_barrier() read_barrier() 62 64 #else 65 /* Older manuals mention syscalls as a way to implement cache coherency and 66 * barriers. See for example ARM Architecture Reference Manual Version D 67 * chapter 2.7.4 Prefetching and self-modifying code (p. A2-28) 68 */ 69 // TODO implement on per PROCESSOR basis 63 70 #define memory_barrier() asm volatile ("" ::: "memory") 64 71 #define read_barrier() asm volatile ("" ::: "memory") 65 72 #define write_barrier() asm volatile ("" ::: "memory") 66 73 #endif 74 67 75 /* 68 76 * There are multiple ways ICache can be implemented on ARM machines. Namely … … 80 88 */ 81 89 82 #ifdef PROCESSOR_ARCH_armv7_a 83 #define smc_coherence(a) asm volatile ( "isb" ::: "memory") 84 #define smc_coherence_block(a, l) smc_coherence(a) 85 #else 86 /* Available on all supported arms, 90 /* Available on both all supported arms, 87 91 * invalidates entire ICache so the written value does not matter. */ 88 //TODO might be PL1 only on armv5 -89 92 #define smc_coherence(a) asm volatile ( "mcr p15, 0, r0, c7, c5, 0") 90 93 #define smc_coherence_block(a, l) smc_coherence(a) 91 #endif92 94 93 95
Note:
See TracChangeset
for help on using the changeset viewer.