⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 locore.s

📁 早期freebsd实现
💻 S
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (c) 1992 OMRON Corporation. * Copyright (c) 1990, 1993 *	The Regents of the University of California.  All rights reserved. * * This code is derived from software contributed to Berkeley by * OMRON Corporation. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software *    must display the following acknowledgement: *	This product includes software developed by the University of *	California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * *	@(#)locore.s	8.1 (Berkeley) 6/10/93 */#define	T_BUSERR	0#define	T_ADDRERR	1#define	T_ILLINST	2#define	T_ZERODIV	3#define	T_CHKINST	4#define	T_TRAPVINST	5#define	T_PRIVINST	6#define	T_MMUFLT	8#define	T_FMTERR	10#define	T_FPERR		11#define	T_COPERR	12#define	PSL_LOWIPL	8192#define	PSL_HIGHIPL	9984#define	SPL1		8448#define	SPL2		8704#define	SPL3		8960#define	SPL4		9216#define	SPL5		9472#define	SPL6		9728#define	CLOCK_REG	1660944384#define	CLK_CLR		1#define	ILLGINST	16#define	NMIVEC		124#define	EVTRAPF		188	.text	.globl	Reset	.globl	_buserr,_addrerr	.globl	_illinst,_zerodiv,_chkinst,_trapvinst,_privinst	.globl	_lev6intr,_lev5intr,_lev3intr,_lev2intr,_badtrapReset:	jmp start		/* 0: NOT USED (reset PC) */	.word	0		/* 1: NOT USED (reset PC) */	.long	_buserr		/* 2: bus error */	.long	_addrerr	/* 3: address error */	.long	_illinst	/* 4: illegal instruction */	.long	_zerodiv	/* 5: zero divide */	.long	_chkinst	/* 6: CHK instruction */	.long	_trapvinst	/* 7: TRAPV instruction */	.long	_privinst	/* 8: privilege violation */	.long	_badtrap	/* 9: trace */	.long	_illinst	/* 10: line 1010 emulator */	.long	_illinst	/* 11: line 1111 emulator */	.long	_badtrap	/* 12: unassigned, reserved */	.long	_coperr		/* 13: coprocessor protocol violation */	.long	_fmterr		/* 14: format error */	.long	_badtrap	/* 15: uninitialized interrupt vector */	.long	_badtrap	/* 16: unassigned, reserved */	.long	_badtrap	/* 17: unassigned, reserved */	.long	_badtrap	/* 18: unassigned, reserved */	.long	_badtrap	/* 19: unassigned, reserved */	.long	_badtrap	/* 20: unassigned, reserved */	.long	_badtrap	/* 21: unassigned, reserved */	.long	_badtrap	/* 22: unassigned, reserved */	.long	_badtrap	/* 23: unassigned, reserved */	.long	_badtrap	/* 24: spurious interrupt */	.long	_badtrap	/* 25: level 1 interrupt autovector */	.long	_lev2intr	/* 26: level 2 interrupt autovector */	.long	_lev3intr	/* 27: level 3 interrupt autovector */	.long	_badtrap	/* 28: level 4 interrupt autovector */	.long	_lev5intr	/* 29: level 5 interrupt autovector */	.long	_lev6intr	/* 30: level 6 interrupt autovector */	.long	_badtrap	/* 31: level 7 interrupt autovector */	.long	_illinst	/* 32: syscalls */	.long	_illinst	/* 33: sigreturn syscall or breakpoint */	.long	_illinst	/* 34: breakpoint or sigreturn syscall */	.long	_illinst	/* 35: TRAP instruction vector */	.long	_illinst	/* 36: TRAP instruction vector */	.long	_illinst	/* 37: TRAP instruction vector */	.long	_illinst	/* 38: TRAP instruction vector */	.long	_illinst	/* 39: TRAP instruction vector */	.long	_illinst	/* 40: TRAP instruction vector */	.long	_illinst	/* 41: TRAP instruction vector */	.long	_illinst	/* 42: TRAP instruction vector */	.long	_illinst	/* 43: TRAP instruction vector */	.long	_illinst	/* 44: TRAP instruction vector */	.long	_illinst	/* 45: TRAP instruction vector */	.long	_illinst	/* 46: TRAP instruction vector */	.long	_illinst	/* 47: TRAP instruction vector */ 	.long	_fptrap		/* 48: FPCP branch/set on unordered cond */ 	.long	_fptrap		/* 49: FPCP inexact result */ 	.long	_fptrap		/* 50: FPCP divide by zero */ 	.long	_fptrap		/* 51: FPCP underflow */ 	.long	_fptrap		/* 52: FPCP operand error */ 	.long	_fptrap		/* 53: FPCP overflow */ 	.long	_fptrap		/* 54: FPCP signalling NAN */	.long	_badtrap	/* 55: unassigned, reserved */	.long	_badtrap	/* 56: unassigned, reserved */	.long	_badtrap	/* 57: unassigned, reserved */	.long	_badtrap	/* 58: unassigned, reserved */	.long	_badtrap	/* 59: unassigned, reserved */	.long	_badtrap	/* 60: unassigned, reserved */	.long	_badtrap	/* 61: unassigned, reserved */	.long	_badtrap	/* 62: unassigned, reserved */	.long	_badtrap	/* 63: unassigned, reserved */#define BADTRAP16	.long	_badtrap,_badtrap,_badtrap,_badtrap,\				_badtrap,_badtrap,_badtrap,_badtrap,\				_badtrap,_badtrap,_badtrap,_badtrap,\				_badtrap,_badtrap,_badtrap,_badtrap	BADTRAP16		/* 64-255: user interrupt vectors */	BADTRAP16		/* 64-255: user interrupt vectors */	BADTRAP16		/* 64-255: user interrupt vectors */	BADTRAP16		/* 64-255: user interrupt vectors */	BADTRAP16		/* 64-255: user interrupt vectors */	BADTRAP16		/* 64-255: user interrupt vectors */	BADTRAP16		/* 64-255: user interrupt vectors */	BADTRAP16		/* 64-255: user interrupt vectors */	BADTRAP16		/* 64-255: user interrupt vectors */	BADTRAP16		/* 64-255: user interrupt vectors */	BADTRAP16		/* 64-255: user interrupt vectors */	BADTRAP16		/* 64-255: user interrupt vectors */	.globl  start	.globl  _main	.globl	_etext,_edata,_end	START = 0x700000	STACK = 0x800000	DIPSW = 0x49000000start:        movw    #PSL_HIGHIPL,sr         | no interrupts	movl	#STACK,sp		| set SP	movl	#_prgcore, a2		| save program address	movl	#Reset, a2@+		| save start of core	movl	#_end,  a2@+		| save end of core	movl	#STACK, a2@		| save initial stack addr/* clear BSS area */	movl	#_edata,a2		| start of BSS	movl	#_end,a3		| endLbssclr:	clrb	a2@+			| clear BSS	cmpl	a2,a3			| done?	bne	Lbssclr			| no, keep going/* save address to goto ROM monitor */	movec	vbr,a0			| ROM vbr to a0	movl	a0@(NMIVEC),d0		| restore NMIVEC	movl	#_gotoROM,a0		| save to _gotoROM	movl	d0,a0@			|	movl	#Reset,a0		| BP vbr to a0	movl	#_exit,a0@(NMIVEC)	| save address	/* switch vector tabel */	movec	vbr,a0	movl	a0@(ILLGINST),sp@-	| save ILLINST vector for BrkPtr	movl	a0@(EVTRAPF),sp@-	movl	#Reset,a0	movl	sp@+,a0@(EVTRAPF)	movl	sp@+,a0@(ILLGINST)	| restore ILLINST vector	movec	a0,vbr	movl	#DIPSW,a0	movw	a0@,d0	lsrl	#8,d0	andl	#0xFF,d0	movl	d0,_dipsw1	movw	a0@,d0	andl	#0xFF,d0	movl	d0,_dipsw2/* final setup for C code */        movw    #PSL_LOWIPL,sr		| no interrupts	jsr     _main			| lets go	jsr     start/* * exit to ROM monitor */	ROM_VBR = 0	.globl	_exit_exit:        movw    #PSL_HIGHIPL,sr         | no interrupts	movl	#ROM_VBR,a0	movec	a0,vbr	movl	#_gotoROM,a0	movl	a0@,a1	jmp	a1@/* * Trap/interrupt vector routines */ 	.globl	_trap,_nofault,_longjmp_buserr:	tstl	_nofault		| device probe?	jeq	_addrerr		| no, handle as usual	movl	_nofault,sp@-		| yes,	jbsr	_longjmp		|  longjmp(nofault)_addrerr:	clrw	sp@-			| pad SR to longword	moveml	#0xFFFF,sp@-		| save user registers	movl	usp,a0			| save the user SP	movl	a0,sp@(60)		|   in the savearea	lea	sp@(64),a1		| grab base of HW berr frame	movw	a1@(12),d0		| grab SSW for fault processing	btst	#12,d0			| RB set?	jeq	LbeX0			| no, test RC	bset	#14,d0			| yes, must set FB	movw	d0,a1@(12)		| for hardware tooLbeX0:	btst	#13,d0			| RC set?	jeq	LbeX1			| no, skip	bset	#15,d0			| yes, must set FC	movw	d0,a1@(12)		| for hardware tooLbeX1:	btst	#8,d0			| data fault?	jeq	Lbe0			| no, check for hard cases	movl	a1@(18),d1		| fault address is as given in frame	jra	Lbe10			| thats itLbe0:	btst	#4,a1@(8)		| long (type B) stack frame?	jne	Lbe4			| yes, go handle	movl	a1@(4),d1		| no, can use save PC	btst	#14,d0			| FB set?	jeq	Lbe3			| no, try FC	addql	#4,d1			| yes, adjust address	jra	Lbe10			| doneLbe3:	btst	#15,d0			| FC set?	jeq	Lbe10			| no, done	addql	#2,d1			| yes, adjust address	jra	Lbe10			| doneLbe4:	movl	a1@(38),d1		| long format, use stage B address	btst	#15,d0			| FC set?	jeq	Lbe10			| no, all done	subql	#2,d1			| yes, adjust addressLbe10:	movl	d1,sp@-			| push fault VA	movw	d0,sp@-			| and SSW	clrw	sp@-			|   padded to longword	movw	a1@(8),d0		| get frame format/vector offset	andw	#0x0FFF,d0		| clear out frame format	cmpw	#12,d0			| address error vector?	jeq	Lisaerr			| yes, go to it#if 0	movl	d1,a0			| fault address	.long	0xf0109e11		| ptestr #1,a0@,#7	.long	0xf0176200		| pmove psr,sp@	btst	#7,sp@			| bus error bit set?	jeq	Lismerr			| no, must be MMU fault	clrw	sp@			| yes, re-clear pad word#endif	jra	Lisberr			| and process as normal bus errorLismerr:	movl	#T_MMUFLT,sp@-		| show that we are an MMU fault	jra	Lbexit			| and deal with itLisaerr:	movl	#T_ADDRERR,sp@-		| mark address error	jra	Lbexit			| and deal with itLisberr:	movl	#T_BUSERR,sp@-		| mark bus errorLbexit:	jbsr	_trap			| handle the error	lea	sp@(12),sp		| pop value args	movl	sp@(60),a0		| restore user SP	movl	a0,usp			|   from save area	moveml	sp@+,#0x7FFF		| restore most user regs	addql	#4,sp			| toss SSP	tstw	sp@+			| do we need to clean up stack?	jeq	rei			| no, just continue	btst	#7,sp@(6)		| type 9/10/11 frame?	jeq	rei			| no, nothing to do	btst	#5,sp@(6)		| type 9?	jne	Lbex1			| no, skip	movw	sp@,sp@(12)		| yes, push down SR	movl	sp@(2),sp@(14)		| and PC	clrw	sp@(18)			| and mark as type 0 frame	lea	sp@(12),sp		| clean the excess	jra	rei			| all doneLbex1:	btst	#4,sp@(6)		| type 10?	jne	Lbex2			| no, skip	movw	sp@,sp@(24)		| yes, push down SR	movl	sp@(2),sp@(26)		| and PC	clrw	sp@(30)			| and mark as type 0 frame	lea	sp@(24),sp		| clean the excess	jra	rei			| all doneLbex2:	movw	sp@,sp@(84)		| type 11, push down SR	movl	sp@(2),sp@(86)		| and PC	clrw	sp@(90)			| and mark as type 0 frame	lea	sp@(84),sp		| clean the excess	jra	rei			| all done_illinst:	clrw	sp@-	moveml	#0xFFFF,sp@-	moveq	#T_ILLINST,d0	jra	_fault_zerodiv:	clrw	sp@-	moveml	#0xFFFF,sp@-	moveq	#T_ZERODIV,d0	jra	_fault_chkinst:	clrw	sp@-	moveml	#0xFFFF,sp@-	moveq	#T_CHKINST,d0	jra	_fault_trapvinst:	clrw	sp@-	moveml	#0xFFFF,sp@-	moveq	#T_TRAPVINST,d0	jra	_fault_privinst:	clrw	sp@-	moveml	#0xFFFF,sp@-	moveq	#T_PRIVINST,d0	jra	_fault_coperr:	clrw	sp@-	moveml	#0xFFFF,sp@-	moveq	#T_COPERR,d0	jra	_fault_fmterr:	clrw	sp@-	moveml	#0xFFFF,sp@-	moveq	#T_FMTERR,d0	jra	_fault_fptrap:#ifdef FPCOPROC	clrw	sp@-		| pad SR to longword	moveml	#0xFFFF,sp@-	| save user registers	movl	usp,a0		| and save	movl	a0,sp@(60)	|   the user stack pointer	clrl	sp@-		| no VA arg#if 0	lea	_u+PCB_FPCTX,a0	| address of FP savearea	.word	0xf310		| fsave a0@	tstb	a0@		| null state frame?	jeq	Lfptnull	| yes, safe	clrw	d0		| no, need to tweak BIU	movb	a0@(1),d0	| get frame size	bset	#3,a0@(0,d0:w)	| set exc_pend bit of BIULfptnull:	.word	0xf227,0xa800	| fmovem fpsr,sp@- (code arg)	.word	0xf350		| frestore a0@#else	clrl	sp@-		| push dummy FPSR#endif	movl	#T_FPERR,sp@-	| push type arg	jbsr	_trap		| call trap	lea	sp@(12),sp	| pop value args	movl	sp@(60),a0	| restore	movl	a0,usp		|   user SP	moveml	sp@+,#0x7FFF	| and remaining user registers	addql	#6,sp		| pop SSP and align word	jra	rei		| all done#else	jra	_badtrap	| treat as an unexpected trap#endif	.globl	_fault_fault:	movl	usp,a0		| get and save	movl	a0,sp@(60)	|   the user stack pointer	clrl	sp@-		| no VA arg	clrl	sp@-		| or code arg	movl	d0,sp@-		| push trap type	jbsr	_trap		| handle trap	lea	sp@(12),sp	| pop value args	movl	sp@(60),a0	| restore	movl	a0,usp		|   user SP	moveml	sp@+,#0x7FFF	| restore most user regs	addql	#6,sp		| pop SP and pad word	jra	rei		| all done	.globl	_straytrap_badtrap:	clrw	sp@-	moveml	#0xC0C0,sp@-	movw	sp@(24),sp@-	clrw	sp@-	jbsr	_straytrap	addql	#4,sp	moveml	sp@+,#0x0303	addql	#2,sp	jra	rei/* * Interrupt handlers. * All device interrupts are auto-vectored.  Most can be configured * to interrupt in the range IPL2 to IPL6.  Here are our assignments: * *	Level 0:	 *	Level 1:	 *	Level 2:	SCSI SPC *	Level 3:	 *	Level 4:	 *	Level 5:	System Clock

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -