Subversion Repositories HelenOS

Rev

Rev 1864 | Rev 1870 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1864 Rev 1865
Line 25... Line 25...
25
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
#
27
#
28
 
28
 
29
/**
29
/**
-
 
30
 * @file
30
 * This file contains kernel trap table.
31
 * @brief This file contains kernel trap table.
31
 */
32
 */
32
 
33
 
33
.register %g2, #scratch
34
.register %g2, #scratch
34
.register %g3, #scratch
35
.register %g3, #scratch
35
 
36
 
Line 82... Line 83...
82
 
83
 
83
/* TT = 0x34, TL = 0, mem_address_not_aligned */
84
/* TT = 0x34, TL = 0, mem_address_not_aligned */
84
.org trap_table + TT_MEM_ADDRESS_NOT_ALIGNED*ENTRY_SIZE
85
.org trap_table + TT_MEM_ADDRESS_NOT_ALIGNED*ENTRY_SIZE
85
.global mem_address_not_aligned
86
.global mem_address_not_aligned
86
mem_address_not_aligned:
87
mem_address_not_aligned:
87
	PREEMPTIBLE_HANDLER do_mem_address_not_aligned
88
	MEM_ADDRESS_NOT_ALIGNED_HANDLER
88
 
89
 
89
/* TT = 0x41, TL = 0, interrupt_level_1 handler */
90
/* TT = 0x41, TL = 0, interrupt_level_1 handler */
90
.org trap_table + TT_INTERRUPT_LEVEL_1*ENTRY_SIZE
91
.org trap_table + TT_INTERRUPT_LEVEL_1*ENTRY_SIZE
91
.global interrupt_level_1_handler
92
.global interrupt_level_1_handler
92
interrupt_level_1_handler:
93
interrupt_level_1_handler:
Line 458... Line 459...
458
 
459
 
459
/* TT = 0x34, TL > 0, mem_address_not_aligned */
460
/* TT = 0x34, TL > 0, mem_address_not_aligned */
460
.org trap_table + (TT_MEM_ADDRESS_NOT_ALIGNED+512)*ENTRY_SIZE
461
.org trap_table + (TT_MEM_ADDRESS_NOT_ALIGNED+512)*ENTRY_SIZE
461
.global mem_address_not_aligned_high
462
.global mem_address_not_aligned_high
462
mem_address_not_aligned_high:
463
mem_address_not_aligned_high:
463
	PREEMPTIBLE_HANDLER do_mem_address_not_aligned
464
	MEM_ADDRESS_NOT_ALIGNED_HANDLER
464
 
465
 
465
/* TT = 0x64, TL > 0, fast_instruction_access_MMU_miss */
466
/* TT = 0x64, TL > 0, fast_instruction_access_MMU_miss */
466
.org trap_table + (TT_FAST_INSTRUCTION_ACCESS_MMU_MISS+512)*ENTRY_SIZE
467
.org trap_table + (TT_FAST_INSTRUCTION_ACCESS_MMU_MISS+512)*ENTRY_SIZE
467
.global fast_instruction_access_mmu_miss_handler_high
468
.global fast_instruction_access_mmu_miss_handler_high
468
fast_instruction_access_mmu_miss_handler_high:
469
fast_instruction_access_mmu_miss_handler_high:
Line 522... Line 523...
522
 * 	%g2	 	First argument for the function.
523
 * 	%g2	 	First argument for the function.
523
 *	%g6		Pre-set as kernel stack base if trap from userspace.
524
 *	%g6		Pre-set as kernel stack base if trap from userspace.
524
 *	%g7		Pre-set as address of the userspace window buffer.
525
 *	%g7		Pre-set as address of the userspace window buffer.
525
 */
526
 */
526
.macro PREEMPTIBLE_HANDLER_TEMPLATE is_syscall
527
.macro PREEMPTIBLE_HANDLER_TEMPLATE is_syscall
-
 
528
	/*
-
 
529
	 * ASSERT(%tl == 1)
-
 
530
	 */
-
 
531
	rdpr %tl, %g3
-
 
532
	cmp %g3, 1
-
 
533
	be 1f
-
 
534
	nop
-
 
535
0:	ba 0b					! this for debugging, if we ever get here
-
 
536
	nop					! it will be easy to find
-
 
537
 
-
 
538
1:
527
.if NOT(\is_syscall)
539
.if NOT(\is_syscall)
528
	rdpr %tstate, %g3
540
	rdpr %tstate, %g3
529
	andcc %g3, TSTATE_PRIV_BIT, %g0		! if this trap came from the privileged mode...
541
	andcc %g3, TSTATE_PRIV_BIT, %g0		! if this trap came from the privileged mode...
530
	bnz 0f					! ...skip setting of kernel stack and primary context
542
	bnz 0f					! ...skip setting of kernel stack and primary context
531
	nop
543
	nop
Line 533... Line 545...
533
	/*
545
	/*
534
	 * Normal window spills will go to the userspace window buffer.
546
	 * Normal window spills will go to the userspace window buffer.
535
	 */
547
	 */
536
	wrpr %g0, WSTATE_OTHER(0) | WSTATE_NORMAL(2), %wstate
548
	wrpr %g0, WSTATE_OTHER(0) | WSTATE_NORMAL(2), %wstate
537
 
549
 
-
 
550
	wrpr %g0, NWINDOW - 1, %cleanwin	! prevent unnecessary clean_window exceptions
-
 
551
 
538
	/*
552
	/*
539
	 * Switch to kernel stack. The old stack is
553
	 * Switch to kernel stack. The old stack is
540
	 * automatically saved in the old window's %sp
554
	 * automatically saved in the old window's %sp
541
	 * and the new window's %fp.
555
	 * and the new window's %fp.
542
	 */
556
	 */
Line 552... Line 566...
552
	mov %i3, %o5
566
	mov %i3, %o5
553
.endif
567
.endif
554
 
568
 
555
	/*
569
	/*
556
	 * Mark the CANRESTORE windows as OTHER windows.
570
	 * Mark the CANRESTORE windows as OTHER windows.
557
	 * Set CLEANWIN to NWINDOW-1 so that clean_window traps do not occur.
-
 
558
	 */
571
	 */
559
	rdpr %canrestore, %l0
572
	rdpr %canrestore, %l0
560
	wrpr %l0, %otherwin
573
	wrpr %l0, %otherwin
561
	wrpr %g0, %canrestore
574
	wrpr %g0, %canrestore
562
	wrpr %g0, NWINDOW - 1, %cleanwin
-
 
563
 
575
 
564
	/*
576
	/*
565
	 * Switch to primary context 0.
577
	 * Switch to primary context 0.
566
	 */
578
	 */
567
	mov VA_PRIMARY_CONTEXT_REG, %l0
579
	mov VA_PRIMARY_CONTEXT_REG, %l0
Line 724... Line 736...
724
	 * Set primary context according to secondary context.
736
	 * Set primary context according to secondary context.
725
	 */
737
	 */
726
	wr %g0, ASI_DMMU, %asi
738
	wr %g0, ASI_DMMU, %asi
727
	ldxa [VA_SECONDARY_CONTEXT_REG] %asi, %g1
739
	ldxa [VA_SECONDARY_CONTEXT_REG] %asi, %g1
728
	stxa %g1, [VA_PRIMARY_CONTEXT_REG] %asi
740
	stxa %g1, [VA_PRIMARY_CONTEXT_REG] %asi
-
 
741
	rd %pc, %g1
729
	flush %o7
742
	flush %g1
730
	
743
	
731
	rdpr %cwp, %g1
744
	rdpr %cwp, %g1
732
	rdpr %otherwin, %g2
745
	rdpr %otherwin, %g2
733
 
746
 
734
	/*
747
	/*