Changeset e08162b in mainline for kernel/arch/sparc64/src/mm/sun4v
- Timestamp:
- 2016-01-07T13:41:38Z (10 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f4582c6
- Parents:
- 7254df6
- Location:
- kernel/arch/sparc64/src/mm/sun4v
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/sparc64/src/mm/sun4v/as.c
r7254df6 re08162b 66 66 { 67 67 #ifdef CONFIG_TSB 68 uintptr_t tsb = 69 frame_alloc(SIZE2FRAMES(TSB_ENTRY_COUNT * sizeof(tsb_entry_t)), 70 flags, 0); 71 if (!tsb) 68 uintptr_t tsb_base = frame_alloc(TSB_FRAMES, flags, TSB_SIZE - 1); 69 if (!tsb_base) 72 70 return -1; 73 71 72 tsb_entry_t *tsb = (tsb_entry_t *) PA2KA(tsb_base); 73 74 74 as->arch.tsb_description.page_size = PAGESIZE_8K; 75 75 as->arch.tsb_description.associativity = 1; 76 76 as->arch.tsb_description.num_ttes = TSB_ENTRY_COUNT; 77 77 as->arch.tsb_description.pgsize_mask = 1 << PAGESIZE_8K; 78 as->arch.tsb_description.tsb_base = tsb ;78 as->arch.tsb_description.tsb_base = tsb_base; 79 79 as->arch.tsb_description.reserved = 0; 80 80 as->arch.tsb_description.context = 0; 81 81 82 memsetb((void *) PA2KA(as->arch.tsb_description.tsb_base), 83 TSB_ENTRY_COUNT * sizeof(tsb_entry_t), 0); 82 memsetb(tsb, TSB_SIZE, 0); 84 83 #endif 85 84 … … 90 89 { 91 90 #ifdef CONFIG_TSB 92 size_t frames = SIZE2FRAMES(TSB_ENTRY_COUNT * sizeof(tsb_entry_t)); 93 frame_free(as->arch.tsb_description.tsb_base, frames); 91 frame_free(as->arch.tsb_description.tsb_base, TSB_FRAMES); 94 92 95 return frames;93 return TSB_FRAMES; 96 94 #else 97 95 return 0; … … 126 124 uintptr_t tsb = PA2KA(as->arch.tsb_description.tsb_base); 127 125 128 if (!overlaps(tsb, 8 * MMU_PAGE_SIZE, base, 1 << KERNEL_PAGE_WIDTH)) {126 if (!overlaps(tsb, TSB_SIZE, base, 1 << KERNEL_PAGE_WIDTH)) { 129 127 /* 130 128 * TSBs were allocated from memory not covered … … 137 135 } 138 136 139 __hypercall_fast2(MMU_TSB_CTXNON0, 1, KA2PA(& (as->arch.tsb_description)));137 __hypercall_fast2(MMU_TSB_CTXNON0, 1, KA2PA(&as->arch.tsb_description)); 140 138 #endif 141 139 } … … 166 164 uintptr_t tsb = PA2KA(as->arch.tsb_description.tsb_base); 167 165 168 if (!overlaps(tsb, 8 * MMU_PAGE_SIZE, base, 1 << KERNEL_PAGE_WIDTH)) {166 if (!overlaps(tsb, TSB_SIZE, base, 1 << KERNEL_PAGE_WIDTH)) { 169 167 /* 170 168 * TSBs were allocated from memory not covered -
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.
