Changes in kernel/arch/sparc64/src/trap/sun4v/trap_table.S [f8f7dba:ba50a34] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/sparc64/src/trap/sun4v/trap_table.S
rf8f7dba rba50a34 48 48 #include <arch/stack.h> 49 49 #include <arch/sun4v/regdef.h> 50 #include <arch/sun4v/arch.h>51 #include <arch/sun4v/cpu.h>52 50 53 51 #define TABLE_SIZE TRAP_TABLE_SIZE … … 62 60 63 61 /* TT = 0x08, TL = 0, instruction_access_exception */ 64 /* TT = 0x08, TL = 0, IAE_privilege_violation on UltraSPARC T2 */65 62 .org trap_table + TT_INSTRUCTION_ACCESS_EXCEPTION*ENTRY_SIZE 66 63 .global instruction_access_exception_tl0 67 64 instruction_access_exception_tl0: 68 PREEMPTIBLE_HANDLER instruction_access_exception 69 70 /* TT = 0x09, TL = 0, instruction_access_mmu_miss */ 71 .org trap_table + TT_INSTRUCTION_ACCESS_MMU_MISS*ENTRY_SIZE 72 .global instruction_access_mmu_miss_handler_tl0 73 ba fast_instruction_access_mmu_miss_handler_tl0 74 nop 65 /*wrpr %g0, PSTATE_AG_BIT | PSTATE_PRIV_BIT, %pstate 66 PREEMPTIBLE_HANDLER instruction_access_exception*/ 75 67 76 68 /* TT = 0x0a, TL = 0, instruction_access_error */ … … 80 72 PREEMPTIBLE_HANDLER instruction_access_error 81 73 82 /* TT = 0x0b, TL = 0, IAE_unauth_access */83 .org trap_table + TT_IAE_UNAUTH_ACCESS*ENTRY_SIZE84 .global iae_unauth_access_tl085 iae_unauth_access_tl0:86 PREEMPTIBLE_HANDLER instruction_access_exception87 88 /* TT = 0x0c, TL = 0, IAE_nfo_page */89 .org trap_table + TT_IAE_NFO_PAGE*ENTRY_SIZE90 .global iae_nfo_page_tl091 iae_nfo_page_tl0:92 PREEMPTIBLE_HANDLER instruction_access_exception93 94 74 /* TT = 0x10, TL = 0, illegal_instruction */ 95 75 .org trap_table + TT_ILLEGAL_INSTRUCTION*ENTRY_SIZE … … 116 96 PREEMPTIBLE_HANDLER unimplemented_STD 117 97 118 /* TT = 0x14, TL = 0, DAE_invalid_asi */119 .org trap_table + TT_DAE_INVALID_ASI*ENTRY_SIZE120 .global dae_invalid_asi_tl0121 dae_invalid_asi_tl0:122 PREEMPTIBLE_HANDLER data_access_exception123 124 /* TT = 0x15, TL = 0, DAE_privilege_violation */125 .org trap_table + TT_DAE_PRIVILEGE_VIOLATION*ENTRY_SIZE126 .global dae_privilege_violation_tl0127 dae_privilege_violation_tl0:128 PREEMPTIBLE_HANDLER data_access_exception129 130 /* TT = 0x16, TL = 0, DAE_nc_page */131 .org trap_table + TT_DAE_NC_PAGE*ENTRY_SIZE132 .global dae_nc_page_tl0133 dae_nc_page_tl0:134 PREEMPTIBLE_HANDLER data_access_exception135 136 /* TT = 0x17, TL = 0, DAE_nfo_page */137 .org trap_table + TT_DAE_NFO_PAGE*ENTRY_SIZE138 .global dae_nfo_page_tl0139 dae_nfo_page_tl0:140 PREEMPTIBLE_HANDLER data_access_exception141 142 98 /* TT = 0x20, TL = 0, fb_disabled handler */ 143 99 .org trap_table + TT_FP_DISABLED*ENTRY_SIZE … … 177 133 178 134 /* TT = 0x30, TL = 0, data_access_exception */ 179 /* TT = 0x30, TL = 0, DAE_side_effect_page for UltraPSARC T2 */180 135 .org trap_table + TT_DATA_ACCESS_EXCEPTION*ENTRY_SIZE 181 136 .global data_access_exception_tl0 182 137 data_access_exception_tl0: 138 wrpr %g0, PSTATE_AG_BIT | PSTATE_PRIV_BIT, %pstate 183 139 PREEMPTIBLE_HANDLER data_access_exception 184 185 /* TT = 0x31, TL = 0, data_access_mmu_miss */186 .org trap_table + TT_DATA_ACCESS_MMU_MISS*ENTRY_SIZE187 .global data_access_mmu_miss_tl0188 data_access_mmu_miss_tl0:189 ba fast_data_access_mmu_miss_handler_tl0190 nop191 140 192 141 /* TT = 0x32, TL = 0, data_access_error */ … … 322 271 INTERRUPT_LEVEL_N_HANDLER 15 323 272 273 /* TT = 0x60, TL = 0, interrupt_vector_trap handler */ 274 .org trap_table + TT_INTERRUPT_VECTOR_TRAP*ENTRY_SIZE 275 .global interrupt_vector_trap_handler_tl0 276 interrupt_vector_trap_handler_tl0: 277 INTERRUPT_VECTOR_TRAP_HANDLER 278 324 279 /* TT = 0x64, TL = 0, fast_instruction_access_MMU_miss */ 325 280 .org trap_table + TT_FAST_INSTRUCTION_ACCESS_MMU_MISS*ENTRY_SIZE … … 339 294 fast_data_access_protection_handler_tl0: 340 295 FAST_DATA_ACCESS_PROTECTION_HANDLER 0 341 342 /* TT = 0x7c, TL = 0, cpu_mondo */343 .org trap_table + TT_CPU_MONDO*ENTRY_SIZE344 .global cpu_mondo_handler_tl0345 cpu_mondo_handler_tl0:346 PREEMPTIBLE_HANDLER cpu_mondo347 296 348 297 /* TT = 0x80, TL = 0, spill_0_normal handler */ … … 403 352 404 353 /* TT = 0x08, TL > 0, instruction_access_exception */ 405 /* TT = 0x08, TL > 0, IAE_privilege_violation on UltraSPARC T2 */406 354 .org trap_table + (TT_INSTRUCTION_ACCESS_EXCEPTION+512)*ENTRY_SIZE 407 355 .global instruction_access_exception_tl1 408 356 instruction_access_exception_tl1: 409 357 wrpr %g0, 1, %tl 358 wrpr %g0, PSTATE_AG_BIT | PSTATE_PRIV_BIT, %pstate 410 359 PREEMPTIBLE_HANDLER instruction_access_exception 411 412 /* TT = 0x09, TL > 0, instruction_access_mmu_miss */413 .org trap_table + (TT_INSTRUCTION_ACCESS_MMU_MISS+512)*ENTRY_SIZE414 .global instruction_access_mmu_miss_handler_tl1415 wrpr %g0, 1, %tl416 ba fast_instruction_access_mmu_miss_handler_tl0417 nop418 360 419 361 /* TT = 0x0a, TL > 0, instruction_access_error */ … … 424 366 PREEMPTIBLE_HANDLER instruction_access_error 425 367 426 /* TT = 0x0b, TL > 0, IAE_unauth_access */427 .org trap_table + (TT_IAE_UNAUTH_ACCESS+512)*ENTRY_SIZE428 .global iae_unauth_access_tl1429 iae_unauth_access_tl1:430 wrpr %g0, 1, %tl431 PREEMPTIBLE_HANDLER instruction_access_exception432 433 /* TT = 0x0c, TL > 0, IAE_nfo_page */434 .org trap_table + (TT_IAE_NFO_PAGE+512)*ENTRY_SIZE435 .global iae_nfo_page_tl1436 iae_nfo_page_tl1:437 wrpr %g0, 1, %tl438 PREEMPTIBLE_HANDLER instruction_access_exception439 440 368 /* TT = 0x10, TL > 0, illegal_instruction */ 441 369 .org trap_table + (TT_ILLEGAL_INSTRUCTION+512)*ENTRY_SIZE … … 445 373 PREEMPTIBLE_HANDLER illegal_instruction 446 374 447 /* TT = 0x14, TL > 0, DAE_invalid_asi */448 .org trap_table + (TT_DAE_INVALID_ASI+512)*ENTRY_SIZE449 .global dae_invalid_asi_tl1450 dae_invalid_asi_tl1:451 wrpr %g0, 1, %tl452 PREEMPTIBLE_HANDLER data_access_exception453 454 /* TT = 0x15, TL > 0, DAE_privilege_violation */455 .org trap_table + (TT_DAE_PRIVILEGE_VIOLATION+512)*ENTRY_SIZE456 .global dae_privilege_violation_tl1457 dae_privilege_violation_tl1:458 wrpr %g0, 1, %tl459 PREEMPTIBLE_HANDLER data_access_exception460 461 /* TT = 0x16, TL > 0, DAE_nc_page */462 .org trap_table + (TT_DAE_NC_PAGE+512)*ENTRY_SIZE463 .global dae_nc_page_tl1464 dae_nc_page_tl1:465 wrpr %g0, 1, %tl466 PREEMPTIBLE_HANDLER data_access_exception467 468 /* TT = 0x17, TL > 0, DAE_nfo_page */469 .org trap_table + (TT_DAE_NFO_PAGE+512)*ENTRY_SIZE470 .global dae_nfo_page_tl1471 dae_nfo_page_tl1:472 wrpr %g0, 1, %tl473 PREEMPTIBLE_HANDLER data_access_exception474 475 375 /* TT = 0x24, TL > 0, clean_window handler */ 476 376 .org trap_table + (TT_CLEAN_WINDOW+512)*ENTRY_SIZE … … 490 390 .global data_access_exception_tl1 491 391 data_access_exception_tl1: 492 /*wrpr %g0, 1, %tl392 wrpr %g0, 1, %tl 493 393 wrpr %g0, PSTATE_AG_BIT | PSTATE_PRIV_BIT, %pstate 494 PREEMPTIBLE_HANDLER data_access_exception*/ 495 496 /* TT = 0x31, TL > 0, data_access_mmu_miss */ 497 .org trap_table + (TT_DATA_ACCESS_MMU_MISS+512)*ENTRY_SIZE 498 .global data_access_mmu_miss_tl1 499 data_access_mmu_miss_tl1: 500 ba fast_data_access_mmu_miss_handler_tl1 501 nop 502 394 PREEMPTIBLE_HANDLER data_access_exception 503 395 504 396 /* TT = 0x32, TL > 0, data_access_error */ … … 527 419 fast_data_access_protection_handler_tl1: 528 420 FAST_DATA_ACCESS_PROTECTION_HANDLER 1 529 530 /* TT = 0x7c, TL > 0, cpu_mondo */531 .org trap_table + (TT_CPU_MONDO+512)*ENTRY_SIZE532 .global cpu_mondo_handler_tl1533 cpu_mondo_handler_tl1:534 wrpr %g0, %tl535 PREEMPTIBLE_HANDLER cpu_mondo536 421 537 422 /* TT = 0x80, TL > 0, spill_0_normal handler */ … … 775 660 .endm 776 661 662 663 #if 0 777 664 /* 778 665 * Preemptible trap handler for handling traps from kernel. … … 790 677 nop ! it will be easy to find 791 678 679 /* prevent unnecessary CLEANWIN exceptions */ 680 wrpr %g0, WSTATE_OTHER(0) | WSTATE_NORMAL(0), %wstate 681 1: 682 /* 683 * Prevent SAVE instruction from causing a spill exception. If the 684 * CANSAVE register is zero, explicitly spill register window 685 * at CWP + 2. 686 */ 687 688 rdpr %cansave, %g3 689 brnz %g3, 2f 690 nop 691 INLINE_SPILL %g3, %g4 692 693 2: 694 /* ask for new register window */ 695 save %sp, -PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE, %sp 696 697 /* copy higher level routine's address and its argument */ 698 mov %g1, %l0 699 mov %g2, %o0 700 701 /* 702 * Save TSTATE, TPC and TNPC aside. 703 */ 704 rdpr %tstate, %g1 705 rdpr %tpc, %g2 706 rdpr %tnpc, %g3 707 708 stx %g1, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_TSTATE] 709 stx %g2, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_TPC] 710 stx %g3, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_TNPC] 711 712 /* 713 * Save the Y register. 714 * This register is deprecated according to SPARC V9 specification 715 * and is only present for backward compatibility with previous 716 * versions of the SPARC architecture. 717 * Surprisingly, gcc makes use of this register without a notice. 718 */ 719 rd %y, %g4 720 stx %g4, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_Y] 721 722 /* switch to TL = 0, explicitly enable FPU */ 723 wrpr %g0, 0, %tl 724 wrpr %g0, 0, %gl 725 wrpr %g0, PSTATE_PRIV_BIT | PSTATE_PEF_BIT, %pstate 726 727 /* g1 -> l1, ..., g7 -> l7 */ 728 SAVE_GLOBALS 729 730 /* call higher-level service routine, pass istate as its 2nd parameter */ 731 call %l0 732 add %sp, PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_TNPC, %o1 733 734 /* l1 -> g1, ..., l7 -> g7 */ 735 RESTORE_GLOBALS 736 737 /* we must prserve the PEF bit */ 738 rdpr %pstate, %l1 739 740 /* TL := 1, GL := 1 */ 741 wrpr %g0, PSTATE_PRIV_BIT, %pstate 742 wrpr %g0, 1, %tl 743 wrpr %g0, 1, %gl 744 745 /* Read TSTATE, TPC and TNPC from saved copy. */ 746 ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_TSTATE], %g1 747 ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_TPC], %g2 748 ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_TNPC], %g3 749 750 /* Copy PSTATE.PEF to the in-register copy of TSTATE. */ 751 and %l1, PSTATE_PEF_BIT, %l1 752 sllx %l1, TSTATE_PSTATE_SHIFT, %l1 753 sethi %hi(TSTATE_PEF_BIT), %g4 ! reset the PEF bit to 0 ... 754 andn %g1, %g4, %g1 755 or %g1, %l1, %g1 ! ... "or" it with saved PEF 756 757 /* Restore TSTATE, TPC and TNPC from saved copies. */ 758 wrpr %g1, 0, %tstate 759 wrpr %g2, 0, %tpc 760 wrpr %g3, 0, %tnpc 761 762 /* Restore Y. */ 763 ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_Y], %g4 764 wr %g4, %y 765 766 /* If TSTATE.CWP + 1 == CWP, then we do not have to fix CWP. */ 767 and %g1, TSTATE_CWP_MASK, %l0 768 inc %l0 769 and %l0, NWINDOWS - 1, %l0 ! %l0 mod NWINDOWS 770 rdpr %cwp, %l1 771 cmp %l0, %l1 772 bz 4f ! CWP is ok 773 nop 774 775 3: 776 /* 777 * Fix CWP. 778 * In order to recapitulate, the input registers in the current 779 * window are the output registers of the window to which we want 780 * to restore. Because the fill trap fills only input and local 781 * registers of a window, we need to preserve those output 782 * registers manually. 783 */ 784 mov %sp, %g2 785 stx %i0, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I0] 786 stx %i1, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I1] 787 stx %i2, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I2] 788 stx %i3, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I3] 789 stx %i4, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I4] 790 stx %i5, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I5] 791 stx %i6, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I6] 792 stx %i7, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I7] 793 wrpr %l0, 0, %cwp 794 mov %g2, %sp 795 ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I0], %i0 796 ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I1], %i1 797 ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I2], %i2 798 ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I3], %i3 799 ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I4], %i4 800 ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I5], %i5 801 ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I6], %i6 802 ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I7], %i7 803 804 4: 805 /* 806 * Prevent RESTORE instruction from causing a fill exception. If the 807 * CANRESTORE register is zero, explicitly fill register window 808 * at CWP - 1. 809 */ 810 rdpr %canrestore, %g1 811 brnz %g1, 5f 812 nop 813 INLINE_FILL %g3, %g4 814 815 5: 816 restore 817 818 retry 819 .endm 820 821 #endif 822 823 /* 824 * Preemptible trap handler for handling traps from kernel. 825 */ 826 .macro PREEMPTIBLE_HANDLER_KERNEL 827 828 /* 829 * ASSERT(%tl == 1) 830 */ 831 rdpr %tl, %g3 832 cmp %g3, 1 833 be 1f 834 nop 835 0: ba 0b ! this is for debugging, if we ever get here 836 nop ! it will be easy to find 837 792 838 1: 793 839 /* prevent unnecessary CLEANWIN exceptions */ … … 826 872 retry 827 873 .endm 874 875 828 876 829 877 /* … … 1044 1092 and %g1, NWINDOWS - 1, %g1 1045 1093 wrpr %g1, 0, %cwp ! CWP-- 1046 1094 1047 1095 .if \is_syscall 1048 1096 done … … 1052 1100 1053 1101 .endm 1102 1103 1054 1104 1055 1105 /* Preemptible trap handler for TL=1. … … 1082 1132 trap_instruction_handler: 1083 1133 PREEMPTIBLE_HANDLER_TEMPLATE 1 1134
Note:
See TracChangeset
for help on using the changeset viewer.