Rev 1870 | Rev 1880 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1870 | Rev 1876 | ||
---|---|---|---|
Line 583... | Line 583... | ||
583 | */ |
583 | */ |
584 | rdpr %tl, %g3 |
584 | rdpr %tl, %g3 |
585 | cmp %g3, 1 |
585 | cmp %g3, 1 |
586 | be 1f |
586 | be 1f |
587 | nop |
587 | nop |
588 | 0: ba 0b ! this for debugging, if we ever get here |
588 | 0: ba 0b ! this is for debugging, if we ever get here |
589 | nop ! it will be easy to find |
589 | nop ! it will be easy to find |
590 | 590 | ||
591 | 1: |
591 | 1: |
592 | .if NOT(\is_syscall) |
592 | .if NOT(\is_syscall) |
593 | rdpr %tstate, %g3 |
593 | rdpr %tstate, %g3 |
- | 594 | ||
- | 595 | /* |
|
- | 596 | * One of the ways this handler can be invoked is after a nested MMU trap from |
|
- | 597 | * either spill_1_normal or fill_1_normal traps. Both of these traps manipulate |
|
- | 598 | * the CWP register. We deal with the situation by simulating the MMU trap |
|
- | 599 | * on TL=1 and restart the respective SAVE or RESTORE instruction once the MMU |
|
- | 600 | * trap is resolved. However, because we are in the wrong window from the |
|
- | 601 | * perspective of the MMU trap, we need to synchronize CWP with CWP from TL=0. |
|
- | 602 | */ |
|
- | 603 | and %g3, TSTATE_CWP_MASK, %g4 |
|
- | 604 | wrpr %g4, 0, %cwp ! resynchronize CWP |
|
- | 605 | ||
594 | andcc %g3, TSTATE_PRIV_BIT, %g0 ! if this trap came from the privileged mode... |
606 | andcc %g3, TSTATE_PRIV_BIT, %g0 ! if this trap came from the privileged mode... |
595 | bnz 0f ! ...skip setting of kernel stack and primary context |
607 | bnz 0f ! ...skip setting of kernel stack and primary context |
596 | nop |
608 | nop |
- | 609 | ||
597 | .endif |
610 | .endif |
598 | /* |
611 | /* |
599 | * Normal window spills will go to the userspace window buffer. |
612 | * Normal window spills will go to the userspace window buffer. |
600 | */ |
613 | */ |
601 | wrpr %g0, WSTATE_OTHER(0) | WSTATE_NORMAL(2), %wstate |
614 | wrpr %g0, WSTATE_OTHER(0) | WSTATE_NORMAL(2), %wstate |
Line 883... | Line 896... | ||
883 | * CANRESTORE = NWINDOW - 2 |
896 | * CANRESTORE = NWINDOW - 2 |
884 | * CLEANWIN = NWINDOW - 2 |
897 | * CLEANWIN = NWINDOW - 2 |
885 | * CANSAVE = 0 |
898 | * CANSAVE = 0 |
886 | * OTHERWIN = 0 |
899 | * OTHERWIN = 0 |
887 | * |
900 | * |
888 | * The RESTORE isntruction is therfore to be skipped. |
901 | * The RESTORE instruction is therfore to be skipped. |
889 | */ |
902 | */ |
890 | 2: |
903 | 2: |
891 | wrpr %g0, 0, %otherwin |
904 | wrpr %g0, 0, %otherwin |
892 | wrpr %g0, 0, %cansave |
905 | wrpr %g0, 0, %cansave |
893 | wrpr %g1, 0, %canrestore |
906 | wrpr %g1, 0, %canrestore |