Subversion Repositories HelenOS

Rev

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().