Changes in kernel/arch/sparc64/src/mm/sun4u/tsb.c [e08162b:9d58539] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/sparc64/src/mm/sun4u/tsb.c
re08162b r9d58539 42 42 #include <debug.h> 43 43 44 #define TSB_INDEX_MASK ((1 << (21 + 1 + TSB_SIZE - MMU_PAGE_WIDTH)) - 1) 45 44 46 /** Invalidate portion of TSB. 45 47 * … … 58 60 size_t cnt; 59 61 60 ASSERT(as->arch.itsb); 61 ASSERT(as->arch.dtsb); 62 ASSERT(as->arch.itsb && as->arch.dtsb); 62 63 63 i0 = (page >> MMU_PAGE_WIDTH) & ITSB_ENTRY_MASK; 64 i0 = (page >> MMU_PAGE_WIDTH) & TSB_INDEX_MASK; 65 ASSERT(i0 < ITSB_ENTRY_COUNT && i0 < DTSB_ENTRY_COUNT); 64 66 65 67 if (pages == (size_t) -1 || (pages * 2) > ITSB_ENTRY_COUNT) … … 69 71 70 72 for (i = 0; i < cnt; i++) { 71 as->arch.itsb[(i0 + i) & ITSB_ENTRY_MASK].tag.invalid = true; 72 as->arch.dtsb[(i0 + i) & DTSB_ENTRY_MASK].tag.invalid = true; 73 as->arch.itsb[(i0 + i) & (ITSB_ENTRY_COUNT - 1)].tag.invalid = 74 true; 75 as->arch.dtsb[(i0 + i) & (DTSB_ENTRY_COUNT - 1)].tag.invalid = 76 true; 73 77 } 74 78 } … … 82 86 { 83 87 as_t *as; 84 tsb_entry_t *t te;88 tsb_entry_t *tsb; 85 89 size_t entry; 86 90 … … 88 92 89 93 as = t->as; 90 entry = ((t->page >> MMU_PAGE_WIDTH) + index) & ITSB_ENTRY_MASK; 91 tte = &as->arch.itsb[entry]; 94 entry = ((t->page >> MMU_PAGE_WIDTH) + index) & TSB_INDEX_MASK; 95 ASSERT(entry < ITSB_ENTRY_COUNT); 96 tsb = &as->arch.itsb[entry]; 92 97 93 98 /* … … 97 102 */ 98 103 99 t te->tag.invalid = true; /* invalidate the entry104 tsb->tag.invalid = true; /* invalidate the entry 100 105 * (tag target has this 101 106 * set to 0) */ … … 103 108 write_barrier(); 104 109 105 t te->tag.context = as->asid;110 tsb->tag.context = as->asid; 106 111 /* the shift is bigger than PAGE_WIDTH, do not bother with index */ 107 t te->tag.va_tag = t->page >> VA_TAG_PAGE_SHIFT;108 t te->data.value = 0;109 t te->data.size = PAGESIZE_8K;110 t te->data.pfn = (t->frame >> MMU_FRAME_WIDTH) + index;111 t te->data.cp = t->c; /* cp as cache in phys.-idxed, c as cacheable */112 t te->data.p = t->k; /* p as privileged, k as kernel */113 t te->data.v = t->p; /* v as valid, p as present */112 tsb->tag.va_tag = t->page >> VA_TAG_PAGE_SHIFT; 113 tsb->data.value = 0; 114 tsb->data.size = PAGESIZE_8K; 115 tsb->data.pfn = (t->frame >> MMU_FRAME_WIDTH) + index; 116 tsb->data.cp = t->c; /* cp as cache in phys.-idxed, c as cacheable */ 117 tsb->data.p = t->k; /* p as privileged, k as kernel */ 118 tsb->data.v = t->p; /* v as valid, p as present */ 114 119 115 120 write_barrier(); 116 121 117 t te->tag.invalid = false; /* mark the entry as valid */122 tsb->tag.invalid = false; /* mark the entry as valid */ 118 123 } 119 124 … … 127 132 { 128 133 as_t *as; 129 tsb_entry_t *t te;134 tsb_entry_t *tsb; 130 135 size_t entry; 131 136 … … 133 138 134 139 as = t->as; 135 entry = ((t->page >> MMU_PAGE_WIDTH) + index) & DTSB_ENTRY_MASK; 136 tte = &as->arch.dtsb[entry]; 140 entry = ((t->page >> MMU_PAGE_WIDTH) + index) & TSB_INDEX_MASK; 141 ASSERT(entry < DTSB_ENTRY_COUNT); 142 tsb = &as->arch.dtsb[entry]; 137 143 138 144 /* … … 142 148 */ 143 149 144 t te->tag.invalid = true; /* invalidate the entry150 tsb->tag.invalid = true; /* invalidate the entry 145 151 * (tag target has this 146 152 * set to 0) */ … … 148 154 write_barrier(); 149 155 150 t te->tag.context = as->asid;156 tsb->tag.context = as->asid; 151 157 /* the shift is bigger than PAGE_WIDTH, do not bother with index */ 152 t te->tag.va_tag = t->page >> VA_TAG_PAGE_SHIFT;153 t te->data.value = 0;154 t te->data.size = PAGESIZE_8K;155 t te->data.pfn = (t->frame >> MMU_FRAME_WIDTH) + index;156 t te->data.cp = t->c;158 tsb->tag.va_tag = t->page >> VA_TAG_PAGE_SHIFT; 159 tsb->data.value = 0; 160 tsb->data.size = PAGESIZE_8K; 161 tsb->data.pfn = (t->frame >> MMU_FRAME_WIDTH) + index; 162 tsb->data.cp = t->c; 157 163 #ifdef CONFIG_VIRT_IDX_DCACHE 158 t te->data.cv = t->c;164 tsb->data.cv = t->c; 159 165 #endif /* CONFIG_VIRT_IDX_DCACHE */ 160 t te->data.p = t->k; /* p as privileged */161 t te->data.w = ro ? false : t->w;162 t te->data.v = t->p;166 tsb->data.p = t->k; /* p as privileged */ 167 tsb->data.w = ro ? false : t->w; 168 tsb->data.v = t->p; 163 169 164 170 write_barrier(); 165 171 166 t te->tag.invalid = false; /* mark the entry as valid */172 tsb->tag.invalid = false; /* mark the entry as valid */ 167 173 } 168 174
Note:
See TracChangeset
for help on using the changeset viewer.