Rev 1863 | Rev 1865 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 1863 | Rev 1864 | ||
|---|---|---|---|
| Line 216... | Line 216... | ||
| 216 | .org trap_table + TT_SPILL_2_NORMAL*ENTRY_SIZE |
216 | .org trap_table + TT_SPILL_2_NORMAL*ENTRY_SIZE |
| 217 | .global spill_2_normal |
217 | .global spill_2_normal |
| 218 | spill_2_normal: |
218 | spill_2_normal: |
| 219 | SPILL_TO_USPACE_WINDOW_BUFFER |
219 | SPILL_TO_USPACE_WINDOW_BUFFER |
| 220 | 220 | ||
| - | 221 | /* TT = 0xa0, TL = 0, spill_0_other handler */ |
|
| - | 222 | .org trap_table + TT_SPILL_0_OTHER*ENTRY_SIZE |
|
| - | 223 | .global spill_0_other |
|
| - | 224 | spill_0_other: |
|
| - | 225 | SPILL_TO_USPACE_WINDOW_BUFFER |
|
| - | 226 | ||
| 221 | /* TT = 0xc0, TL = 0, fill_0_normal handler */ |
227 | /* TT = 0xc0, TL = 0, fill_0_normal handler */ |
| 222 | .org trap_table + TT_FILL_0_NORMAL*ENTRY_SIZE |
228 | .org trap_table + TT_FILL_0_NORMAL*ENTRY_SIZE |
| 223 | .global fill_0_normal |
229 | .global fill_0_normal |
| 224 | fill_0_normal: |
230 | fill_0_normal: |
| 225 | FILL_NORMAL_HANDLER_KERNEL |
231 | FILL_NORMAL_HANDLER_KERNEL |
| Line 545... | Line 551... | ||
| 545 | mov %i2, %o4 |
551 | mov %i2, %o4 |
| 546 | mov %i3, %o5 |
552 | mov %i3, %o5 |
| 547 | .endif |
553 | .endif |
| 548 | 554 | ||
| 549 | /* |
555 | /* |
| 550 | * Mark the CANSAVE windows as OTHER windows. |
556 | * Mark the CANRESTORE windows as OTHER windows. |
| 551 | * Set CLEANWIN to NWINDOW-1 so that clean_window traps do not occur. |
557 | * Set CLEANWIN to NWINDOW-1 so that clean_window traps do not occur. |
| 552 | */ |
558 | */ |
| 553 | rdpr %cansave, %l0 |
559 | rdpr %canrestore, %l0 |
| 554 | wrpr %l0, %otherwin |
560 | wrpr %l0, %otherwin |
| 555 | wrpr %g0, %cansave |
561 | wrpr %g0, %canrestore |
| 556 | wrpr %g0, NWINDOW - 1, %cleanwin |
562 | wrpr %g0, NWINDOW - 1, %cleanwin |
| 557 | 563 | ||
| 558 | /* |
564 | /* |
| 559 | * Switch to primary context 0. |
565 | * Switch to primary context 0. |
| 560 | */ |
566 | */ |
| Line 639... | Line 645... | ||
| 639 | wrpr %g2, 0, %tpc |
645 | wrpr %g2, 0, %tpc |
| 640 | wrpr %g3, 0, %tnpc |
646 | wrpr %g3, 0, %tnpc |
| 641 | 647 | ||
| 642 | /* |
648 | /* |
| 643 | * If OTHERWIN is zero, then all the userspace windows have been |
649 | * If OTHERWIN is zero, then all the userspace windows have been |
| 644 | * spilled to kernel memory (i.e. register window buffer). If |
650 | * spilled to kernel memory (i.e. register window buffer). Moreover, |
| - | 651 | * if the scheduler was called in the meantime, all valid windows |
|
| - | 652 | * belonging to other threads were spilled by context_restore(). |
|
| 645 | * OTHERWIN is non-zero, then some userspace windows are still |
653 | * If OTHERWIN is non-zero, then some userspace windows are still |
| 646 | * valid. Others might have been spilled. However, the CWP pointer |
654 | * valid. Others might have been spilled. However, the CWP pointer |
| 647 | * needs no fixing because the scheduler had not been called. |
655 | * needs no fixing because the scheduler had not been called. |
| 648 | */ |
656 | */ |
| 649 | rdpr %otherwin, %l0 |
657 | rdpr %otherwin, %l0 |
| 650 | brnz %l0, 0f |
658 | brnz %l0, 0f |
| Line 657... | Line 665... | ||
| 657 | /* |
665 | /* |
| 658 | * If TSTATE.CWP + 1 == CWP, then we still do not have to fix CWP. |
666 | * If TSTATE.CWP + 1 == CWP, then we still do not have to fix CWP. |
| 659 | */ |
667 | */ |
| 660 | and %g1, TSTATE_CWP_MASK, %l0 |
668 | and %g1, TSTATE_CWP_MASK, %l0 |
| 661 | inc %l0 |
669 | inc %l0 |
| 662 | and %l0, TSTATE_CWP_MASK, %l0 ! %l0 mod NWINDOW |
670 | and %l0, NWINDOW - 1, %l0 ! %l0 mod NWINDOW |
| 663 | rdpr %cwp, %l1 |
671 | rdpr %cwp, %l1 |
| 664 | cmp %l0, %l1 |
672 | cmp %l0, %l1 |
| 665 | bz 0f ! CWP is ok |
673 | bz 0f ! CWP is ok |
| 666 | nop |
674 | nop |
| 667 | 675 | ||
| 668 | /* |
676 | /* |
| 669 | * Fix CWP. |
677 | * Fix CWP. |
| 670 | * Just for reminder, the input registers in the current window |
678 | * In order to recapitulate, the input registers in the current |
| 671 | * are the output registers of the window to which we want to |
679 | * window are the output registers of the window to which we want |
| 672 | * restore. Because the fill trap fills only input and local |
680 | * to restore. Because the fill trap fills only input and local |
| 673 | * registers of a window, we need to preserve those output |
681 | * registers of a window, we need to preserve those output |
| 674 | * registers manually. |
682 | * registers manually. |
| 675 | */ |
683 | */ |
| 676 | flushw |
- | |
| 677 | mov %sp, %g2 |
684 | mov %sp, %g2 |
| 678 | stx %i0, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I0] |
685 | stx %i0, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I0] |
| 679 | stx %i1, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I1] |
686 | stx %i1, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I1] |
| 680 | stx %i2, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I2] |
687 | stx %i2, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I2] |
| 681 | stx %i3, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I3] |
688 | stx %i3, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I3] |
| Line 736... | Line 743... | ||
| 736 | /* |
743 | /* |
| 737 | * CWP is now in the window last saved in the userspace window buffer. |
744 | * CWP is now in the window last saved in the userspace window buffer. |
| 738 | * Fill all windows stored in the buffer. |
745 | * Fill all windows stored in the buffer. |
| 739 | */ |
746 | */ |
| 740 | clr %g4 |
747 | clr %g4 |
| - | 748 | set PAGE_SIZE - 1, %g5 |
|
| 741 | 0: andcc %g7, PAGE_WIDTH - 1, %g0 ! PAGE_SIZE alignment check |
749 | 0: andcc %g7, %g5, %g0 ! PAGE_SIZE alignment check |
| 742 | bz 0f ! %g7 is page-aligned, no more windows to refill |
750 | bz 0f ! %g7 is page-aligned, no more windows to refill |
| 743 | nop |
751 | nop |
| 744 | 752 | ||
| 745 | add %g7, -STACK_WINDOW_SAVE_AREA_SIZE, %g7 |
753 | add %g7, -STACK_WINDOW_SAVE_AREA_SIZE, %g7 |
| 746 | ldx [%g7 + L0_OFFSET], %l0 |
754 | ldx [%g7 + L0_OFFSET], %l0 |