Changes in kernel/arch/sparc64/src/mm/sun4v/tsb.c [e08162b:9d58539] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/sparc64/src/mm/sun4v/tsb.c
re08162b r9d58539 44 44 #include <debug.h> 45 45 46 #define TSB_INDEX_MASK ((1 << (21 + 1 + TSB_SIZE - MMU_PAGE_WIDTH)) - 1) 47 46 48 /** Invalidate portion of TSB. 47 49 * … … 56 58 void tsb_invalidate(as_t *as, uintptr_t page, size_t pages) 57 59 { 58 tsb_entry_t *tsb;59 60 size_t i0, i; 60 61 size_t cnt; … … 62 63 ASSERT(as->arch.tsb_description.tsb_base); 63 64 64 i0 = (page >> MMU_PAGE_WIDTH) & TSB_ENTRY_MASK; 65 i0 = (page >> MMU_PAGE_WIDTH) & TSB_INDEX_MASK; 66 ASSERT(i0 < TSB_ENTRY_COUNT); 65 67 66 if (pages == (size_t) - 1 || pages> TSB_ENTRY_COUNT)68 if (pages == (size_t) - 1 || (pages) > TSB_ENTRY_COUNT) 67 69 cnt = TSB_ENTRY_COUNT; 68 70 else 69 71 cnt = pages; 70 72 71 tsb = (tsb_entry_t *) PA2KA(as->arch.tsb_description.tsb_base); 72 for (i = 0; i < cnt; i++) 73 tsb[(i0 + i) & TSB_ENTRY_MASK].data.v = false; 73 for (i = 0; i < cnt; i++) { 74 ((tsb_entry_t *) PA2KA(as->arch.tsb_description.tsb_base))[ 75 (i0 + i) & (TSB_ENTRY_COUNT - 1)].data.v = false; 76 } 74 77 } 75 78 … … 82 85 as_t *as; 83 86 tsb_entry_t *tsb; 84 tsb_entry_t *tte; 85 size_t index; 87 size_t entry; 86 88 87 89 as = t->as; 88 index = (t->page >> MMU_PAGE_WIDTH) & TSB_ENTRY_MASK; 89 90 tsb = (tsb_entry_t *) PA2KA(as->arch.tsb_description.tsb_base); 91 tte = &tsb[index]; 90 entry = (t->page >> MMU_PAGE_WIDTH) & TSB_INDEX_MASK; 91 ASSERT(entry < TSB_ENTRY_COUNT); 92 tsb = &((tsb_entry_t *) PA2KA(as->arch.tsb_description.tsb_base))[entry]; 92 93 93 94 /* … … 97 98 */ 98 99 99 t te->data.v = false;100 tsb->data.v = false; 100 101 101 102 write_barrier(); 102 103 103 t te->tag.va_tag = t->page >> VA_TAG_PAGE_SHIFT;104 tsb->tag.va_tag = t->page >> VA_TAG_PAGE_SHIFT; 104 105 105 t te->data.value = 0;106 t te->data.nfo = false;107 t te->data.ra = t->frame >> MMU_FRAME_WIDTH;108 t te->data.ie = false;109 t te->data.e = false;110 t te->data.cp = t->c; /* cp as cache in phys.-idxed, c as cacheable */111 t te->data.cv = false;112 t te->data.p = t->k; /* p as privileged, k as kernel */113 t te->data.x = true;114 t te->data.w = false;115 t te->data.size = PAGESIZE_8K;106 tsb->data.value = 0; 107 tsb->data.nfo = false; 108 tsb->data.ra = t->frame >> MMU_FRAME_WIDTH; 109 tsb->data.ie = false; 110 tsb->data.e = false; 111 tsb->data.cp = t->c; /* cp as cache in phys.-idxed, c as cacheable */ 112 tsb->data.cv = false; 113 tsb->data.p = t->k; /* p as privileged, k as kernel */ 114 tsb->data.x = true; 115 tsb->data.w = false; 116 tsb->data.size = PAGESIZE_8K; 116 117 117 118 write_barrier(); 118 119 119 t te->data.v = t->p; /* v as valid, p as present */120 tsb->data.v = t->p; /* v as valid, p as present */ 120 121 } 121 122 … … 129 130 as_t *as; 130 131 tsb_entry_t *tsb; 131 tsb_entry_t *tte; 132 size_t index; 132 size_t entry; 133 133 134 134 as = t->as; 135 index = (t->page >> MMU_PAGE_WIDTH) & TSB_ENTRY_MASK;136 tsb = (tsb_entry_t *) PA2KA(as->arch.tsb_description.tsb_base);137 t te = &tsb[index];135 entry = (t->page >> MMU_PAGE_WIDTH) & TSB_INDEX_MASK; 136 ASSERT(entry < TSB_ENTRY_COUNT); 137 tsb = &((tsb_entry_t *) PA2KA(as->arch.tsb_description.tsb_base))[entry]; 138 138 139 139 /* … … 143 143 */ 144 144 145 t te->data.v = false;145 tsb->data.v = false; 146 146 147 147 write_barrier(); 148 148 149 t te->tag.va_tag = t->page >> VA_TAG_PAGE_SHIFT;149 tsb->tag.va_tag = t->page >> VA_TAG_PAGE_SHIFT; 150 150 151 t te->data.value = 0;152 t te->data.nfo = false;153 t te->data.ra = t->frame >> MMU_FRAME_WIDTH;154 t te->data.ie = false;155 t te->data.e = false;156 t te->data.cp = t->c; /* cp as cache in phys.-idxed, c as cacheable */151 tsb->data.value = 0; 152 tsb->data.nfo = false; 153 tsb->data.ra = t->frame >> MMU_FRAME_WIDTH; 154 tsb->data.ie = false; 155 tsb->data.e = false; 156 tsb->data.cp = t->c; /* cp as cache in phys.-idxed, c as cacheable */ 157 157 #ifdef CONFIG_VIRT_IDX_DCACHE 158 t te->data.cv = t->c;158 tsb->data.cv = t->c; 159 159 #endif /* CONFIG_VIRT_IDX_DCACHE */ 160 t te->data.p = t->k; /* p as privileged, k as kernel */161 t te->data.x = true;162 t te->data.w = ro ? false : t->w;163 t te->data.size = PAGESIZE_8K;160 tsb->data.p = t->k; /* p as privileged, k as kernel */ 161 tsb->data.x = true; 162 tsb->data.w = ro ? false : t->w; 163 tsb->data.size = PAGESIZE_8K; 164 164 165 165 write_barrier(); 166 166 167 t te->data.v = t->p; /* v as valid, p as present */167 tsb->data.v = t->p; /* v as valid, p as present */ 168 168 } 169 169
Note:
See TracChangeset
for help on using the changeset viewer.