Rev 1880 | Rev 1883 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 1880 | Rev 1882 | ||
|---|---|---|---|
| Line 80... | Line 80... | ||
| 80 | .org trap_table + TT_PRIVILEGED_OPCODE*ENTRY_SIZE |
80 | .org trap_table + TT_PRIVILEGED_OPCODE*ENTRY_SIZE |
| 81 | .global privileged_opcode_tl0 |
81 | .global privileged_opcode_tl0 |
| 82 | privileged_opcode_tl0: |
82 | privileged_opcode_tl0: |
| 83 | PREEMPTIBLE_HANDLER privileged_opcode |
83 | PREEMPTIBLE_HANDLER privileged_opcode |
| 84 | 84 | ||
| - | 85 | /* TT = 0x20, TL = 0, fb_disabled handler */ |
|
| - | 86 | .org trap_table + TT_FP_DISABLED*ENTRY_SIZE |
|
| - | 87 | .global fb_disabled_tl0 |
|
| - | 88 | fp_disabled_tl0: |
|
| - | 89 | PREEMPTIBLE_HANDLER fp_disabled |
|
| - | 90 | ||
| 85 | /* TT = 0x24, TL = 0, clean_window handler */ |
91 | /* TT = 0x24, TL = 0, clean_window handler */ |
| 86 | .org trap_table + TT_CLEAN_WINDOW*ENTRY_SIZE |
92 | .org trap_table + TT_CLEAN_WINDOW*ENTRY_SIZE |
| 87 | .global clean_window_handler_tl0 |
93 | .global clean_window_tl0 |
| 88 | clean_window_handler_tl0: |
94 | clean_window_tl0: |
| 89 | CLEAN_WINDOW_HANDLER |
95 | CLEAN_WINDOW_HANDLER |
| 90 | 96 | ||
| 91 | /* TT = 0x28, TL = 0, division_by_zero */ |
97 | /* TT = 0x28, TL = 0, division_by_zero */ |
| 92 | .org trap_table + TT_DIVISION_BY_ZERO*ENTRY_SIZE |
98 | .org trap_table + TT_DIVISION_BY_ZERO*ENTRY_SIZE |
| 93 | .global division_by_zero_tl0 |
99 | .global division_by_zero_tl0 |
| Line 487... | Line 493... | ||
| 487 | wrpr %g0, 1, %tl |
493 | wrpr %g0, 1, %tl |
| 488 | PREEMPTIBLE_HANDLER illegal_instruction |
494 | PREEMPTIBLE_HANDLER illegal_instruction |
| 489 | 495 | ||
| 490 | /* TT = 0x24, TL > 0, clean_window handler */ |
496 | /* TT = 0x24, TL > 0, clean_window handler */ |
| 491 | .org trap_table + (TT_CLEAN_WINDOW+512)*ENTRY_SIZE |
497 | .org trap_table + (TT_CLEAN_WINDOW+512)*ENTRY_SIZE |
| 492 | .global clean_window_handler_tl1 |
498 | .global clean_window_tl1 |
| 493 | clean_window_handler_tl1: |
499 | clean_window_tl1: |
| 494 | CLEAN_WINDOW_HANDLER |
500 | CLEAN_WINDOW_HANDLER |
| 495 | 501 | ||
| 496 | /* TT = 0x28, TL > 0, division_by_zero */ |
502 | /* TT = 0x28, TL > 0, division_by_zero */ |
| 497 | .org trap_table + (TT_DIVISION_BY_ZERO+512)*ENTRY_SIZE |
503 | .org trap_table + (TT_DIVISION_BY_ZERO+512)*ENTRY_SIZE |
| 498 | .global division_by_zero_tl1 |
504 | .global division_by_zero_tl1 |
| Line 686... | Line 692... | ||
| 686 | stx %g1, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_TSTATE] |
692 | stx %g1, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_TSTATE] |
| 687 | stx %g2, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_TPC] |
693 | stx %g2, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_TPC] |
| 688 | stx %g3, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_TNPC] |
694 | stx %g3, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_TNPC] |
| 689 | 695 | ||
| 690 | wrpr %g0, 0, %tl |
696 | wrpr %g0, 0, %tl |
| 691 | wrpr %g0, PSTATE_PRIV_BIT, %pstate |
697 | wrpr %g0, PSTATE_PRIV_BIT | PSTATE_PEF_BIT, %pstate |
| 692 | SAVE_GLOBALS |
698 | SAVE_GLOBALS |
| 693 | 699 | ||
| 694 | /* |
700 | /* |
| 695 | * Call the higher-level handler and pass istate as second parameter. |
701 | * Call the higher-level handler and pass istate as second parameter. |
| 696 | */ |
702 | */ |
| Line 703... | Line 709... | ||
| 703 | */ |
709 | */ |
| 704 | mov %o0, %i0 |
710 | mov %o0, %i0 |
| 705 | .endif |
711 | .endif |
| 706 | 712 | ||
| 707 | RESTORE_GLOBALS |
713 | RESTORE_GLOBALS |
| - | 714 | rdpr %pstate, %l1 ! we must preserve the PEF bit |
|
| 708 | wrpr %g0, PSTATE_AG_BIT | PSTATE_PRIV_BIT, %pstate |
715 | wrpr %g0, PSTATE_AG_BIT | PSTATE_PRIV_BIT, %pstate |
| 709 | wrpr %g0, 1, %tl |
716 | wrpr %g0, 1, %tl |
| 710 | 717 | ||
| 711 | /* |
718 | /* |
| 712 | * Read TSTATE, TPC and TNPC from saved copy. |
719 | * Read TSTATE, TPC and TNPC from saved copy. |
| Line 714... | Line 721... | ||
| 714 | ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_TSTATE], %g1 |
721 | ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_TSTATE], %g1 |
| 715 | ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_TPC], %g2 |
722 | ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_TPC], %g2 |
| 716 | ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_TNPC], %g3 |
723 | ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_TNPC], %g3 |
| 717 | 724 | ||
| 718 | /* |
725 | /* |
| - | 726 | * Copy PSTATE.PEF to the in-register copy of TSTATE. |
|
| - | 727 | */ |
|
| - | 728 | and %l1, PSTATE_PEF_BIT, %l1 |
|
| - | 729 | sllx %l1, TSTATE_PSTATE_SHIFT, %l1 |
|
| - | 730 | sethi %hi(TSTATE_PEF_BIT), %g4 |
|
| - | 731 | andn %g1, %g4, %g1 |
|
| - | 732 | or %g1, %l1, %g1 |
|
| - | 733 | ||
| - | 734 | /* |
|
| 719 | * Restore TSTATE, TPC and TNPC from saved copies. |
735 | * Restore TSTATE, TPC and TNPC from saved copies. |
| 720 | */ |
736 | */ |
| 721 | wrpr %g1, 0, %tstate |
737 | wrpr %g1, 0, %tstate |
| 722 | wrpr %g2, 0, %tpc |
738 | wrpr %g2, 0, %tpc |
| 723 | wrpr %g3, 0, %tnpc |
739 | wrpr %g3, 0, %tnpc |
| 724 | 740 | ||
| - | 741 | ||
| 725 | /* |
742 | /* |
| 726 | * If OTHERWIN is zero, then all the userspace windows have been |
743 | * If OTHERWIN is zero, then all the userspace windows have been |
| 727 | * spilled to kernel memory (i.e. register window buffer). Moreover, |
744 | * spilled to kernel memory (i.e. register window buffer). Moreover, |
| 728 | * if the scheduler was called in the meantime, all valid windows |
745 | * if the scheduler was called in the meantime, all valid windows |
| 729 | * belonging to other threads were spilled by context_restore(). |
746 | * belonging to other threads were spilled by context_restore(). |