Rev 2144 | Rev 2272 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2144 | Rev 2170 | ||
---|---|---|---|
Line 40... | Line 40... | ||
40 | #include <config.h> |
40 | #include <config.h> |
41 | 41 | ||
42 | #ifdef CONFIG_TSB |
42 | #ifdef CONFIG_TSB |
43 | #include <arch/mm/tsb.h> |
43 | #include <arch/mm/tsb.h> |
44 | #include <arch/memstr.h> |
44 | #include <arch/memstr.h> |
45 | #include <synch/mutex.h> |
- | |
46 | #include <arch/asm.h> |
45 | #include <arch/asm.h> |
47 | #include <mm/frame.h> |
46 | #include <mm/frame.h> |
48 | #include <bitops.h> |
47 | #include <bitops.h> |
49 | #include <macros.h> |
48 | #include <macros.h> |
50 | #endif /* CONFIG_TSB */ |
49 | #endif /* CONFIG_TSB */ |
Line 98... | Line 97... | ||
98 | } |
97 | } |
99 | 98 | ||
100 | int as_create_arch(as_t *as, int flags) |
99 | int as_create_arch(as_t *as, int flags) |
101 | { |
100 | { |
102 | #ifdef CONFIG_TSB |
101 | #ifdef CONFIG_TSB |
103 | ipl_t ipl; |
- | |
104 | - | ||
105 | ipl = interrupts_disable(); |
- | |
106 | mutex_lock_active(&as->lock); /* completely unnecessary, but polite */ |
- | |
107 | tsb_invalidate(as, 0, (count_t) -1); |
102 | tsb_invalidate(as, 0, (count_t) -1); |
108 | mutex_unlock(&as->lock); |
- | |
109 | interrupts_restore(ipl); |
- | |
110 | #endif |
103 | #endif |
111 | return 0; |
104 | return 0; |
112 | } |
105 | } |
113 | 106 | ||
114 | /** 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 121... | Line 114... | ||
121 | void as_install_arch(as_t *as) |
114 | void as_install_arch(as_t *as) |
122 | { |
115 | { |
123 | tlb_context_reg_t ctx; |
116 | tlb_context_reg_t ctx; |
124 | 117 | ||
125 | /* |
118 | /* |
126 | * Note that we don't lock the address space. |
119 | * Note that we don't and may not lock the address space. That's ok |
127 | * That's correct - we can afford it here |
- | |
128 | * because we only read members that are |
120 | * since we only read members that are currently read-only. |
- | 121 | * |
|
129 | * currently read-only. |
122 | * Moreover, the as->asid is protected by asidlock, which is being held. |
130 | */ |
123 | */ |
131 | 124 | ||
132 | /* |
125 | /* |
133 | * Write ASID to secondary context register. |
126 | * Write ASID to secondary context register. The primary context |
134 | * The primary context register has to be set |
- | |
135 | * from TL>0 so it will be filled from the |
127 | * register has to be set from TL>0 so it will be filled from the |
136 | * secondary context register from the TL=1 |
128 | * secondary context register from the TL=1 code just before switch to |
137 | * code just before switch to userspace. |
129 | * userspace. |
138 | */ |
130 | */ |
139 | ctx.v = 0; |
131 | ctx.v = 0; |
140 | ctx.context = as->asid; |
132 | ctx.context = as->asid; |
141 | mmu_secondary_context_write(ctx.v); |
133 | mmu_secondary_context_write(ctx.v); |
142 | 134 | ||
Line 182... | Line 174... | ||
182 | */ |
174 | */ |
183 | void as_deinstall_arch(as_t *as) |
175 | void as_deinstall_arch(as_t *as) |
184 | { |
176 | { |
185 | 177 | ||
186 | /* |
178 | /* |
187 | * Note that we don't lock the address space. |
179 | * Note that we don't and may not lock the address space. That's ok |
188 | * That's correct - we can afford it here |
- | |
189 | * because we only read members that are |
180 | * since we only read members that are currently read-only. |
- | 181 | * |
|
190 | * currently read-only. |
182 | * Moreover, the as->asid is protected by asidlock, which is being held. |
191 | */ |
183 | */ |
192 | 184 | ||
193 | #ifdef CONFIG_TSB |
185 | #ifdef CONFIG_TSB |
194 | uintptr_t base = ALIGN_DOWN(config.base, 1 << KERNEL_PAGE_WIDTH); |
186 | uintptr_t base = ALIGN_DOWN(config.base, 1 << KERNEL_PAGE_WIDTH); |
195 | 187 |