Rev 4130 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4130 | Rev 4433 | ||
---|---|---|---|
Line 64... | Line 64... | ||
64 | { |
64 | { |
65 | #ifdef CONFIG_TSB |
65 | #ifdef CONFIG_TSB |
66 | int order = fnzb32( |
66 | int order = fnzb32( |
67 | (TSB_ENTRY_COUNT * sizeof(tsb_entry_t)) >> FRAME_WIDTH); |
67 | (TSB_ENTRY_COUNT * sizeof(tsb_entry_t)) >> FRAME_WIDTH); |
68 | 68 | ||
69 | uintptr_t tsb = (uintptr_t) frame_alloc(order, flags | FRAME_KA); |
69 | uintptr_t tsb = (uintptr_t) frame_alloc(order, flags); |
70 | 70 | ||
71 | if (!tsb) |
71 | if (!tsb) |
72 | return -1; |
72 | return -1; |
73 | 73 | ||
74 | as->arch.tsb_description.page_size = PAGESIZE_8K; |
74 | as->arch.tsb_description.page_size = PAGESIZE_8K; |
75 | as->arch.tsb_description.associativity = 1; |
75 | as->arch.tsb_description.associativity = 1; |
76 | as->arch.tsb_description.num_ttes = TSB_ENTRY_COUNT; |
76 | as->arch.tsb_description.num_ttes = TSB_ENTRY_COUNT; |
77 | as->arch.tsb_description.pgsize_mask = 1 << PAGESIZE_8K; |
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; |
79 | as->arch.tsb_description.reserved = 0; |
79 | as->arch.tsb_description.reserved = 0; |
- | 80 | as->arch.tsb_description.context = 0; |
|
80 | 81 | ||
81 | memsetb((void *) as->arch.tsb_description.tsb_base, |
82 | memsetb((void *) PA2KA(as->arch.tsb_description.tsb_base), |
82 | TSB_ENTRY_COUNT * sizeof(tsb_entry_t), 0); |
83 | TSB_ENTRY_COUNT * sizeof(tsb_entry_t), 0); |
83 | #endif |
84 | #endif |
84 | return 0; |
85 | return 0; |
85 | } |
86 | } |
86 | 87 | ||
87 | int as_destructor_arch(as_t *as) |
88 | int as_destructor_arch(as_t *as) |
88 | { |
89 | { |
89 | #ifdef CONFIG_TSB |
90 | #ifdef CONFIG_TSB |
90 | count_t cnt = (TSB_ENTRY_COUNT * sizeof(tsb_entry_t)) >> FRAME_WIDTH; |
91 | count_t cnt = (TSB_ENTRY_COUNT * sizeof(tsb_entry_t)) >> FRAME_WIDTH; |
91 | frame_free(KA2PA((uintptr_t) as->arch.tsb_description.tsb_base)); |
92 | frame_free((uintptr_t) as->arch.tsb_description.tsb_base); |
92 | return cnt; |
93 | return cnt; |
93 | #else |
94 | #else |
94 | return 0; |
95 | return 0; |
95 | #endif |
96 | #endif |
96 | } |
97 | } |
97 | 98 | ||
98 | int as_create_arch(as_t *as, int flags) |
99 | int as_create_arch(as_t *as, int flags) |
99 | { |
100 | { |
100 | #ifdef CONFIG_TSB |
101 | #ifdef CONFIG_TSB |
101 | tsb_invalidate(as, 0, (count_t) -1); |
102 | tsb_invalidate(as, 0, (count_t) -1); |
102 | as->arch.tsb_description.context = as->asid; |
- | |
103 | #endif |
103 | #endif |
104 | return 0; |
104 | return 0; |
105 | } |
105 | } |
106 | 106 | ||
107 | /** Perform sparc64-specific tasks when an address space becomes active on the |
107 | /** Perform sparc64-specific tasks when an address space becomes active on the |
Line 117... | Line 117... | ||
117 | 117 | ||
118 | #ifdef CONFIG_TSB |
118 | #ifdef CONFIG_TSB |
119 | uintptr_t base = ALIGN_DOWN(config.base, 1 << KERNEL_PAGE_WIDTH); |
119 | uintptr_t base = ALIGN_DOWN(config.base, 1 << KERNEL_PAGE_WIDTH); |
120 | 120 | ||
121 | ASSERT(as->arch.tsb_description.tsb_base); |
121 | ASSERT(as->arch.tsb_description.tsb_base); |
122 | uintptr_t tsb = as->arch.tsb_description.tsb_base; |
122 | uintptr_t tsb = PA2KA(as->arch.tsb_description.tsb_base); |
123 | 123 | ||
124 | if (!overlaps(tsb, 8 * MMU_PAGE_SIZE, base, 1 << KERNEL_PAGE_WIDTH)) { |
124 | if (!overlaps(tsb, 8 * MMU_PAGE_SIZE, base, 1 << KERNEL_PAGE_WIDTH)) { |
125 | /* |
125 | /* |
126 | * TSBs were allocated from memory not covered |
126 | * TSBs were allocated from memory not covered |
127 | * by the locked 4M kernel DTLB entry. We need |
127 | * by the locked 4M kernel DTLB entry. We need |
Line 129... | Line 129... | ||
129 | */ |
129 | */ |
130 | mmu_demap_page(tsb, 0, MMU_FLAG_DTLB); |
130 | mmu_demap_page(tsb, 0, MMU_FLAG_DTLB); |
131 | dtlb_insert_mapping(tsb, KA2PA(tsb), PAGESIZE_64K, true, true); |
131 | dtlb_insert_mapping(tsb, KA2PA(tsb), PAGESIZE_64K, true, true); |
132 | } |
132 | } |
133 | 133 | ||
134 | __hypercall_fast2(MMU_TSB_CTX0, 1, as->arch.tsb_description.tsb_base); |
134 | __hypercall_fast2(MMU_TSB_CTXNON0, 1, KA2PA(&(as->arch.tsb_description))); |
135 | 135 | ||
136 | #endif |
136 | #endif |
137 | } |
137 | } |
138 | 138 | ||
139 | /** Perform sparc64-specific tasks when an address space is removed from the |
139 | /** Perform sparc64-specific tasks when an address space is removed from the |
Line 154... | Line 154... | ||
154 | #ifdef CONFIG_TSB |
154 | #ifdef CONFIG_TSB |
155 | uintptr_t base = ALIGN_DOWN(config.base, 1 << KERNEL_PAGE_WIDTH); |
155 | uintptr_t base = ALIGN_DOWN(config.base, 1 << KERNEL_PAGE_WIDTH); |
156 | 156 | ||
157 | ASSERT(as->arch.tsb_description.tsb_base); |
157 | ASSERT(as->arch.tsb_description.tsb_base); |
158 | 158 | ||
159 | uintptr_t tsb = as->arch.tsb_description.tsb_base; |
159 | uintptr_t tsb = PA2KA(as->arch.tsb_description.tsb_base); |
160 | 160 | ||
161 | if (!overlaps(tsb, 8 * MMU_PAGE_SIZE, base, 1 << KERNEL_PAGE_WIDTH)) { |
161 | if (!overlaps(tsb, 8 * MMU_PAGE_SIZE, base, 1 << KERNEL_PAGE_WIDTH)) { |
162 | /* |
162 | /* |
163 | * TSBs were allocated from memory not covered |
163 | * TSBs were allocated from memory not covered |
164 | * by the locked 4M kernel DTLB entry. We need |
164 | * by the locked 4M kernel DTLB entry. We need |