Rev 3343 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3343 | Rev 3743 | ||
---|---|---|---|
Line 26... | Line 26... | ||
26 | # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
27 | # |
27 | # |
28 | 28 | ||
29 | #include <arch/arch.h> |
29 | #include <arch/arch.h> |
30 | #include <arch/stack.h> |
30 | #include <arch/stack.h> |
31 | #include <arch/regdef.h> |
- | |
32 | #include <arch/mm/mmu.h> |
- | |
33 | 31 | ||
34 | .text |
32 | .text |
35 | 33 | ||
36 | .register %g2, #scratch |
34 | .register %g2, #scratch |
37 | .register %g3, #scratch |
35 | .register %g3, #scratch |
Line 227... | Line 225... | ||
227 | memsetb: |
225 | memsetb: |
228 | b _memsetb |
226 | b _memsetb |
229 | nop |
227 | nop |
230 | 228 | ||
231 | 229 | ||
232 | .macro WRITE_ALTERNATE_REGISTER reg, bit |
- | |
233 | rdpr %pstate, %g1 ! save PSTATE.PEF |
- | |
234 | wrpr %g0, (\bit | PSTATE_PRIV_BIT), %pstate |
- | |
235 | mov %o0, \reg |
- | |
236 | wrpr %g0, PSTATE_PRIV_BIT, %pstate |
- | |
237 | retl |
- | |
238 | wrpr %g1, 0, %pstate ! restore PSTATE.PEF |
- | |
239 | .endm |
- | |
240 | - | ||
241 | .macro READ_ALTERNATE_REGISTER reg, bit |
- | |
242 | rdpr %pstate, %g1 ! save PSTATE.PEF |
- | |
243 | wrpr %g0, (\bit | PSTATE_PRIV_BIT), %pstate |
- | |
244 | mov \reg, %o0 |
- | |
245 | wrpr %g0, PSTATE_PRIV_BIT, %pstate |
- | |
246 | retl |
- | |
247 | wrpr %g1, 0, %pstate ! restore PSTATE.PEF |
- | |
248 | .endm |
- | |
249 | - | ||
250 | .global write_to_ag_g6 |
- | |
251 | write_to_ag_g6: |
- | |
252 | WRITE_ALTERNATE_REGISTER %g6, PSTATE_AG_BIT |
- | |
253 | - | ||
254 | .global write_to_ag_g7 |
- | |
255 | write_to_ag_g7: |
- | |
256 | WRITE_ALTERNATE_REGISTER %g7, PSTATE_AG_BIT |
- | |
257 | - | ||
258 | .global write_to_ig_g6 |
- | |
259 | write_to_ig_g6: |
- | |
260 | WRITE_ALTERNATE_REGISTER %g6, PSTATE_IG_BIT |
- | |
261 | - | ||
262 | .global read_from_ag_g7 |
- | |
263 | read_from_ag_g7: |
- | |
264 | READ_ALTERNATE_REGISTER %g7, PSTATE_AG_BIT |
- | |
265 | - | ||
266 | - | ||
267 | /** Switch to userspace. |
- | |
268 | * |
- | |
269 | * %o0 Userspace entry address. |
- | |
270 | * %o1 Userspace stack pointer address. |
- | |
271 | * %o2 Userspace address of uarg structure. |
- | |
272 | */ |
- | |
273 | .global switch_to_userspace |
- | |
274 | switch_to_userspace: |
- | |
275 | save %o1, -STACK_WINDOW_SAVE_AREA_SIZE, %sp |
- | |
276 | flushw |
- | |
277 | wrpr %g0, 0, %cleanwin ! avoid information leak |
- | |
278 | - | ||
279 | mov %i2, %o0 ! uarg |
- | |
280 | xor %o1, %o1, %o1 ! %o1 is defined to hold pcb_ptr |
- | |
281 | ! set it to 0 |
- | |
282 | - | ||
283 | clr %i2 |
- | |
284 | clr %i3 |
- | |
285 | clr %i4 |
- | |
286 | clr %i5 |
- | |
287 | clr %i6 |
- | |
288 | - | ||
289 | wrpr %g0, 1, %tl ! enforce mapping via nucleus |
- | |
290 | - | ||
291 | rdpr %cwp, %g1 |
- | |
292 | wrpr %g1, TSTATE_IE_BIT, %tstate |
- | |
293 | wrpr %i0, 0, %tnpc |
- | |
294 | - | ||
295 | /* |
- | |
296 | * Set primary context according to secondary context. |
- | |
297 | * Secondary context has been already installed by |
- | |
298 | * higher-level functions. |
- | |
299 | */ |
- | |
300 | wr %g0, ASI_DMMU, %asi |
- | |
301 | ldxa [VA_SECONDARY_CONTEXT_REG] %asi, %g1 |
- | |
302 | stxa %g1, [VA_PRIMARY_CONTEXT_REG] %asi |
- | |
303 | flush %i7 |
- | |
304 | - | ||
305 | /* |
- | |
306 | * Spills and fills will be handled by the userspace handlers. |
- | |
307 | */ |
- | |
308 | wrpr %g0, WSTATE_OTHER(0) | WSTATE_NORMAL(1), %wstate |
- | |
309 | - | ||
310 | done ! jump to userspace |
- | |
311 | - |