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 | ||