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