Changeset 7328ff4 in mainline for kernel/arch/arm32
- Timestamp:
- 2018-09-06T18:18:52Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- ffa73c6
- Parents:
- d51cca8
- git-author:
- Jiří Zárevúcky <jiri.zarevucky@…> (2018-08-13 01:29:17)
- git-committer:
- Jiří Zárevúcky <jiri.zarevucky@…> (2018-09-06 18:18:52)
- Location:
- kernel/arch/arm32
- Files:
-
- 1 added
- 6 edited
-
Makefile.inc (modified) (1 diff)
-
include/arch/barrier.h (modified) (3 diffs)
-
include/arch/mm/page.h (modified) (1 diff)
-
include/arch/mm/page_armv4.h (modified) (1 diff)
-
src/atomic.c (modified) (2 diffs)
-
src/mm/tlb.c (modified) (3 diffs)
-
src/smc.c (added)
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/arm32/Makefile.inc
rd51cca8 r7328ff4 57 57 arch/$(KARCH)/src/exception.c \ 58 58 arch/$(KARCH)/src/userspace.c \ 59 arch/$(KARCH)/src/smc.c \ 59 60 arch/$(KARCH)/src/debug/stacktrace.c \ 60 61 arch/$(KARCH)/src/debug/stacktrace_asm.S \ -
kernel/arch/arm32/include/arch/barrier.h
rd51cca8 r7328ff4 37 37 #define KERN_arm32_BARRIER_H_ 38 38 39 #ifdef KERNEL40 39 #include <arch/cache.h> 41 40 #include <arch/cp15.h> 42 41 #include <align.h> 43 #else44 #include <libarch/cp15.h>45 #endif46 47 #define CS_ENTER_BARRIER() asm volatile ("" ::: "memory")48 #define CS_LEAVE_BARRIER() asm volatile ("" ::: "memory")49 42 50 43 #if defined PROCESSOR_ARCH_armv7_a 44 51 45 /* 52 46 * ARMv7 uses instructions for memory barriers see ARM Architecture reference … … 57 51 * and functionality on armv7 architecture. 58 52 */ 59 #define memory_barrier() asm volatile ("dmb" ::: "memory") 60 #define read_barrier() asm volatile ("dsb" ::: "memory") 61 #define write_barrier() asm volatile ("dsb st" ::: "memory") 62 #define inst_barrier() asm volatile ("isb" ::: "memory") 63 #elif defined PROCESSOR_ARCH_armv6 | defined KERNEL 53 #define dmb() asm volatile ("dmb" ::: "memory") 54 #define dsb() asm volatile ("dsb" ::: "memory") 55 #define isb() asm volatile ("isb" ::: "memory") 56 57 #elif defined PROCESSOR_ARCH_armv6 58 64 59 /* 65 60 * ARMv6 introduced user access of the following commands: … … 75 70 * CP15 implementation is mandatory only for armv6+. 76 71 */ 77 #if defined(PROCESSOR_ARCH_armv6) || defined(PROCESSOR_ARCH_armv7_a) 78 #define memory_barrier() CP15DMB_write(0) 72 #define dmb() CP15DMB_write(0) 73 #define dsb() CP15DSB_write(0) 74 #define isb() CP15ISB_write(0) 75 79 76 #else 80 #define memory_barrier() CP15DSB_write(0)81 #endif82 #define read_barrier() CP15DSB_write(0)83 #define write_barrier() read_barrier()84 #if defined(PROCESSOR_ARCH_armv6) || defined(PROCESSOR_ARCH_armv7_a)85 #define inst_barrier() CP15ISB_write(0)86 #else87 #define inst_barrier()88 #endif89 #else90 /*91 * Older manuals mention syscalls as a way to implement cache coherency and92 * barriers. See for example ARM Architecture Reference Manual Version D93 * chapter 2.7.4 Prefetching and self-modifying code (p. A2-28)94 */95 // TODO implement on per PROCESSOR basis or via syscalls96 #define memory_barrier() asm volatile ("" ::: "memory")97 #define read_barrier() asm volatile ("" ::: "memory")98 #define write_barrier() asm volatile ("" ::: "memory")99 #define inst_barrier() asm volatile ("" ::: "memory")100 #endif101 77 102 #ifdef KERNEL 103 104 /* 105 * There are multiple ways ICache can be implemented on ARM machines. Namely 106 * PIPT, VIPT, and ASID and VMID tagged VIVT (see ARM Architecture Reference 107 * Manual B3.11.2 (p. 1383). However, CortexA8 Manual states: "For maximum 108 * compatibility across processors, ARM recommends that operating systems target 109 * the ARMv7 base architecture that uses ASID-tagged VIVT instruction caches, 110 * and do not assume the presence of the IVIPT extension. Software that relies 111 * on the IVIPT extension might fail in an unpredictable way on an ARMv7 112 * implementation that does not include the IVIPT extension." (7.2.6 p. 245). 113 * Only PIPT invalidates cache for all VA aliases if one block is invalidated. 114 * 115 * @note: Supporting ASID and VMID tagged VIVT may need to add ICache 116 * maintenance to other places than just smc. 117 */ 118 119 #ifdef KERNEL 120 121 /* 122 * @note: Cache type register is not available in uspace. We would need 123 * to export the cache line value, or use syscall for uspace smc_coherence 124 */ 125 #define smc_coherence(a, l) \ 126 do { \ 127 for (uintptr_t addr = (uintptr_t) a; addr < (uintptr_t) a + l; \ 128 addr += CP15_C7_MVA_ALIGN) \ 129 dcache_clean_mva_pou(ALIGN_DOWN((uintptr_t) a, CP15_C7_MVA_ALIGN)); \ 130 write_barrier(); /* Wait for completion */\ 131 icache_invalidate();\ 132 write_barrier();\ 133 inst_barrier(); /* Wait for Inst refetch */\ 134 } while (0) 78 #define dmb() CP15DSB_write(0) 79 #define dsb() CP15DSB_write(0) 80 #define isb() 135 81 136 82 #endif 137 138 #endif /* KERNEL */139 83 140 84 #endif -
kernel/arch/arm32/include/arch/mm/page.h
rd51cca8 r7328ff4 41 41 #include <arch/exception.h> 42 42 #include <barrier.h> 43 #include <arch/barrier.h> 43 44 #include <arch/cp15.h> 44 45 #include <trace.h> -
kernel/arch/arm32/include/arch/mm/page_armv4.h
rd51cca8 r7328ff4 37 37 #ifndef KERN_arm32_PAGE_armv4_H_ 38 38 #define KERN_arm32_PAGE_armv4_H_ 39 40 #include <arch/cache.h> 39 41 40 42 #ifndef KERN_arm32_PAGE_H_ -
kernel/arch/arm32/src/atomic.c
rd51cca8 r7328ff4 35 35 36 36 #include <synch/spinlock.h> 37 #include <arch/barrier.h> 37 38 38 39 … … 64 65 65 66 return cur_val; 67 } 68 69 void __sync_synchronize(void) 70 { 71 dsb(); 66 72 } 67 73 -
kernel/arch/arm32/src/mm/tlb.c
rd51cca8 r7328ff4 41 41 #include <arch/mm/page.h> 42 42 #include <arch/cache.h> 43 #include <arch/barrier.h> 43 44 44 45 /** Invalidate all entries in TLB. … … 59 60 * ARM Architecture reference Manual ch. B3.10.1 p. B3-1374 B3-1375 60 61 */ 61 read_barrier();62 i nst_barrier();62 dsb(); 63 isb(); 63 64 } 64 65 … … 105 106 * ARM Architecture reference Manual ch. B3.10.1 p. B3-1374 B3-1375 106 107 */ 107 read_barrier();108 i nst_barrier();108 dsb(); 109 isb(); 109 110 } 110 111
Note:
See TracChangeset
for help on using the changeset viewer.
