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