Changes in kernel/arch/arm32/src/mm/tlb.c [bb75646:9d58539] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/arm32/src/mm/tlb.c
rbb75646 r9d58539 37 37 #include <arch/mm/asid.h> 38 38 #include <arch/asm.h> 39 #include <arch/cp15.h>40 39 #include <typedefs.h> 41 40 #include <arch/mm/page.h> 42 #include <arch/cache.h>43 41 44 42 /** Invalidate all entries in TLB. … … 48 46 void tlb_invalidate_all(void) 49 47 { 50 TLBIALL_write(0); 51 /* 52 * "A TLB maintenance operation is only guaranteed to be complete after 53 * the execution of a DSB instruction." 54 * "An ISB instruction, or a return from an exception, causes the 55 * effect of all completed TLB maintenance operations that appear in 56 * program order before the ISB or return from exception to be visible 57 * to all subsequent instructions, including the instruction fetches 58 * for those instructions." 59 * ARM Architecture reference Manual ch. B3.10.1 p. B3-1374 B3-1375 60 */ 61 read_barrier(); 62 inst_barrier(); 48 asm volatile ( 49 "eor r1, r1\n" 50 "mcr p15, 0, r1, c8, c7, 0\n" 51 ::: "r1" 52 ); 63 53 } 64 54 … … 70 60 { 71 61 tlb_invalidate_all(); 72 // TODO: why not TLBIASID_write(asid) ?73 62 } 74 63 … … 76 65 * 77 66 * @param page Virtual adress of the page 78 */ 67 */ 79 68 static inline void invalidate_page(uintptr_t page) 80 69 { 81 //TODO: What about TLBIMVAA? 82 TLBIMVA_write(page); 83 /* 84 * "A TLB maintenance operation is only guaranteed to be complete after 85 * the execution of a DSB instruction." 86 * "An ISB instruction, or a return from an exception, causes the 87 * effect of all completed TLB maintenance operations that appear in 88 * program order before the ISB or return from exception to be visible 89 * to all subsequent instructions, including the instruction fetches 90 * for those instructions." 91 * ARM Architecture reference Manual ch. B3.10.1 p. B3-1374 B3-1375 92 */ 93 read_barrier(); 94 inst_barrier(); 70 asm volatile ( 71 "mcr p15, 0, %[page], c8, c7, 1\n" 72 :: [page] "r" (page) 73 ); 95 74 } 96 75 … … 104 83 void tlb_invalidate_pages(asid_t asid __attribute__((unused)), uintptr_t page, size_t cnt) 105 84 { 106 for (unsigned i = 0; i < cnt; i++) 85 unsigned int i; 86 87 for (i = 0; i < cnt; i++) 107 88 invalidate_page(page + i * PAGE_SIZE); 108 89 }
Note:
See TracChangeset
for help on using the changeset viewer.