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

📄 start.s

📁 uboot for at91rm9200dk
💻 S
📖 第 1 页 / 共 3 页
字号:
	mtesr	r4			/* clear Exception Syndrome Reg */	mttcr	r4			/* clear Timer Control Reg */	mtxer	r4			/* clear Fixed-Point Exception Reg */	mtevpr	r4			/* clear Exception Vector Prefix Reg */	addi	r4,r0,0x1000		/* set ME bit (Machine Exceptions) */	oris	r4,r4,0x0002		/* set CE bit (Critical Exceptions) */	mtmsr	r4			/* change MSR */	addi	r4,r0,(0xFFFF-0x10000)		/* set r4 to 0xFFFFFFFF (status in the */					/* dbsr is cleared by setting bits to 1) */	mtdbsr	r4			/* clear/reset the dbsr */	/*----------------------------------------------------------------------- */	/* Invalidate I and D caches. Enable I cache for defined memory regions */	/* to speed things up. Leave the D cache disabled for now. It will be */	/* enabled/left disabled later based on user selected menu options. */	/* Be aware that the I cache may be disabled later based on the menu */	/* options as well. See miscLib/main.c. */	/*----------------------------------------------------------------------- */	bl	invalidate_icache	bl	invalidate_dcache	/*----------------------------------------------------------------------- */	/* Enable two 128MB cachable regions. */	/*----------------------------------------------------------------------- */	addis	r4,r0,0x8000	addi	r4,r4,0x0001	mticcr	r4			/* instruction cache */	isync	addis	r4,r0,0x0000	addi	r4,r4,0x0000	mtdccr	r4			/* data cache */#if !(defined(CFG_EBC_PB0AP) && defined(CFG_EBC_PB0CR))	/*----------------------------------------------------------------------- */	/* Tune the speed and size for flash CS0  */	/*----------------------------------------------------------------------- */	bl	ext_bus_cntlr_init#endif#if defined(CONFIG_405EP)	/*----------------------------------------------------------------------- */	/* DMA Status, clear to come up clean */	/*----------------------------------------------------------------------- */	addis   r3,r0, 0xFFFF         /* Clear all existing DMA status */	ori     r3,r3, 0xFFFF	mtdcr   dmasr, r3	bl	ppc405ep_init         /* do ppc405ep specific init */#endif /* CONFIG_405EP */#if defined(CFG_OCM_DATA_ADDR) && defined(CFG_OCM_DATA_SIZE)	/********************************************************************	 * Setup OCM - On Chip Memory	 *******************************************************************/	/* Setup OCM */	lis	r0, 0x7FFF	ori	r0, r0, 0xFFFF	mfdcr	r3, ocmiscntl 		/* get instr-side IRAM config */	mfdcr	r4, ocmdscntl	/* get data-side IRAM config */	and	r3, r3, r0	/* disable data-side IRAM */	and	r4, r4, r0	/* disable data-side IRAM */	mtdcr	ocmiscntl, r3	/* set instr-side IRAM config */	mtdcr	ocmdscntl, r4	/* set data-side IRAM config */	isync	addis	r3, 0, CFG_OCM_DATA_ADDR@h /* OCM location */	mtdcr	ocmdsarc, r3	addis	r4, 0, 0xC000		/* OCM data area enabled */	mtdcr	ocmdscntl, r4	isync#endif	/*----------------------------------------------------------------------- */	/* Setup temporary stack in DCACHE or OCM if needed for SDRAM SPD. */	/*----------------------------------------------------------------------- */#ifdef CFG_INIT_DCACHE_CS	/*----------------------------------------------------------------------- */	/* Memory Bank x (nothingness) initialization 1GB+64MEG */	/* used as temporary stack pointer for stage0  */	/*----------------------------------------------------------------------- */	li	r4,PBxAP	mtdcr	ebccfga,r4	lis	r4,0x0380	ori	r4,r4,0x0480	mtdcr	ebccfgd,r4	addi	r4,0,PBxCR	mtdcr	ebccfga,r4	lis	r4,0x400D	ori	r4,r4,0xa000	mtdcr	ebccfgd,r4	/* turn on data chache for this region */	lis	r4,0x0080	mtdccr	r4	/* set stack pointer and clear stack to known value */	lis	r1,CFG_INIT_RAM_ADDR@h	ori     r1,r1,CFG_INIT_SP_OFFSET@l	li	r4,2048			/* we store 2048 words to stack */	mtctr	r4	lis	r2,CFG_INIT_RAM_ADDR@h		/* we also clear data area */	ori	r2,r2,CFG_INIT_RAM_END@l 	/* so cant copy value from r1 */	lis	r4,0xdead		/* we store 0xdeaddead in the stack */	ori	r4,r4,0xdead..stackloop:	stwu	r4,-4(r2)	bdnz	..stackloop	li	r0, 0			/* Make room for stack frame header and */	stwu	r0, -4(r1)		/* clear final stack frame so that	*/	stwu	r0, -4(r1)		/* stack backtraces terminate cleanly	*/	/*	 * Set up a dummy frame to store reset vector as return address.	 * this causes stack underflow to reset board.	 */	stwu	r1, -8(r1)		/* Save back chain and move SP */	addis	r0, 0, RESET_VECTOR@h	/* Address of reset vector */	ori	r0, r0, RESET_VECTOR@l	stwu	r1, -8(r1)		/* Save back chain and move SP */	stw	r0, +12(r1)		/* Save return addr (underflow vect) */#elif defined(CFG_TEMP_STACK_OCM) && \	(defined(CFG_OCM_DATA_ADDR) && defined(CFG_OCM_DATA_SIZE))	/*	 * Stack in OCM.	 */	/* Set up Stack at top of OCM */	lis	r1, (CFG_INIT_RAM_ADDR + CFG_INIT_SP_OFFSET)@h	ori	r1, r1, (CFG_INIT_RAM_ADDR + CFG_INIT_SP_OFFSET)@l	/* Set up a zeroized stack frame so that backtrace works right */	li	r0, 0	stwu	r0, -4(r1)	stwu	r0, -4(r1)	/*	 * Set up a dummy frame to store reset vector as return address.	 * this causes stack underflow to reset board.	 */	stwu	r1, -8(r1)		/* Save back chain and move SP */	lis	r0, RESET_VECTOR@h	/* Address of reset vector */	ori	r0, r0, RESET_VECTOR@l	stwu	r1, -8(r1)		/* Save back chain and move SP */	stw	r0, +12(r1)		/* Save return addr (underflow vect) */#endif /* CFG_INIT_DCACHE_CS */	/*----------------------------------------------------------------------- */	/* Initialize SDRAM Controller  */	/*----------------------------------------------------------------------- */	bl	sdram_init	/*	 * Setup temporary stack pointer only for boards	 * that do not use SDRAM SPD I2C stuff since it	 * is already initialized to use DCACHE or OCM	 * stacks.	 */#if !(defined(CFG_INIT_DCACHE_CS) || defined(CFG_TEMP_STACK_OCM))	lis	r1, CFG_INIT_RAM_ADDR@h	ori	r1,r1,CFG_INIT_SP_OFFSET /* set up the stack in SDRAM */	li	r0, 0			/* Make room for stack frame header and */	stwu	r0, -4(r1)		/* clear final stack frame so that	*/	stwu	r0, -4(r1)		/* stack backtraces terminate cleanly	*/	/*	 * Set up a dummy frame to store reset vector as return address.	 * this causes stack underflow to reset board.	 */	stwu	r1, -8(r1)		/* Save back chain and move SP */	lis	r0, RESET_VECTOR@h	/* Address of reset vector */	ori	r0, r0, RESET_VECTOR@l	stwu	r1, -8(r1)		/* Save back chain and move SP */	stw	r0, +12(r1)		/* Save return addr (underflow vect) */#endif /* !(CFG_INIT_DCACHE_CS  || !CFG_TEM_STACK_OCM) */	GET_GOT			/* initialize GOT access			*/	bl	cpu_init_f	/* run low-level CPU init code     (from Flash)	*/	/* NEVER RETURNS! */	bl	board_init_f	/* run first part of init code (from Flash)	*/#endif	/* CONFIG_405GP || CONFIG_405CR || CONFIG_405 || CONFIG_405EP */	/*----------------------------------------------------------------------- *//*****************************************************************************/	.globl	_start_of_vectors_start_of_vectors:#if 0/*TODO Fixup _start above so we can do this*//* Critical input. */	CRIT_EXCEPTION(0x100, CritcalInput, CritcalInputException)#endif/* Machine check */	CRIT_EXCEPTION(0x200, MachineCheck, MachineCheckException)/* Data Storage exception. */	STD_EXCEPTION(0x300, DataStorage, UnknownException)/* Instruction Storage exception. */	STD_EXCEPTION(0x400, InstStorage, UnknownException)/* External Interrupt exception. */	STD_EXCEPTION(0x500, ExtInterrupt, external_interrupt)/* Alignment exception. */	. = 0x600Alignment:	EXCEPTION_PROLOG	mfspr	r4,DAR	stw	r4,_DAR(r21)	mfspr	r5,DSISR	stw	r5,_DSISR(r21)	addi	r3,r1,STACK_FRAME_OVERHEAD	li	r20,MSR_KERNEL	rlwimi	r20,r23,0,16,16		/* copy EE bit from saved MSR */	lwz	r6,GOT(transfer_to_handler)	mtlr	r6	blrl.L_Alignment:	.long	AlignmentException - _start + EXC_OFF_SYS_RESET	.long	int_return - _start + EXC_OFF_SYS_RESET/* Program check exception */	. = 0x700ProgramCheck:	EXCEPTION_PROLOG	addi	r3,r1,STACK_FRAME_OVERHEAD	li	r20,MSR_KERNEL	rlwimi	r20,r23,0,16,16		/* copy EE bit from saved MSR */	lwz	r6,GOT(transfer_to_handler)	mtlr	r6	blrl.L_ProgramCheck:	.long	ProgramCheckException - _start + EXC_OFF_SYS_RESET	.long	int_return - _start + EXC_OFF_SYS_RESET	/* No FPU on MPC8xx.  This exception is not supposed to happen.	*/	STD_EXCEPTION(0x800, FPUnavailable, UnknownException)	/* I guess we could implement decrementer, and may have	 * to someday for timekeeping.	 */	STD_EXCEPTION(0x900, Decrementer, timer_interrupt)	STD_EXCEPTION(0xa00, Trap_0a, UnknownException)	STD_EXCEPTION(0xb00, Trap_0b, UnknownException)	STD_EXCEPTION(0xc00, SystemCall, UnknownException)	STD_EXCEPTION(0xd00, SingleStep, UnknownException)	STD_EXCEPTION(0xe00, Trap_0e, UnknownException)	STD_EXCEPTION(0xf00, Trap_0f, UnknownException)	/* On the MPC8xx, this is a software emulation interrupt.  It occurs	 * for all unimplemented and illegal instructions.	 */	STD_EXCEPTION(0x1000, PIT, PITException)	STD_EXCEPTION(0x1100, InstructionTLBMiss, UnknownException)	STD_EXCEPTION(0x1200, DataTLBMiss, UnknownException)	STD_EXCEPTION(0x1300, InstructionTLBError, UnknownException)	STD_EXCEPTION(0x1400, DataTLBError, UnknownException)	STD_EXCEPTION(0x1500, Reserved5, UnknownException)	STD_EXCEPTION(0x1600, Reserved6, UnknownException)	STD_EXCEPTION(0x1700, Reserved7, UnknownException)	STD_EXCEPTION(0x1800, Reserved8, UnknownException)	STD_EXCEPTION(0x1900, Reserved9, UnknownException)	STD_EXCEPTION(0x1a00, ReservedA, UnknownException)	STD_EXCEPTION(0x1b00, ReservedB, UnknownException)	STD_EXCEPTION(0x1c00, DataBreakpoint, UnknownException)	STD_EXCEPTION(0x1d00, InstructionBreakpoint, UnknownException)	STD_EXCEPTION(0x1e00, PeripheralBreakpoint, UnknownException)	STD_EXCEPTION(0x1f00, DevPortBreakpoint, UnknownException)	CRIT_EXCEPTION(0x2000, DebugBreakpoint, DebugException )	.globl	_end_of_vectors_end_of_vectors:	. = 0x2100/* * This code finishes saving the registers to the exception frame * and jumps to the appropriate handler for the exception. * Register r21 is pointer into trap frame, r1 has new stack pointer. */	.globl	transfer_to_handlertransfer_to_handler:	stw	r22,_NIP(r21)	lis	r22,MSR_POW@h	andc	r23,r23,r22	stw	r23,_MSR(r21)	SAVE_GPR(7, r21)	SAVE_4GPRS(8, r21)	SAVE_8GPRS(12, r21)	SAVE_8GPRS(24, r21)#if 0	andi.	r23,r23,MSR_PR	mfspr	r23,SPRG3		/* if from user, fix up tss.regs */	beq	2f	addi	r24,r1,STACK_FRAME_OVERHEAD	stw	r24,PT_REGS(r23)2:	addi	r2,r23,-TSS		/* set r2 to current */	tovirt(r2,r2,r23)#endif	mflr	r23	andi.	r24,r23,0x3f00		/* get vector offset */	stw	r24,TRAP(r21)	li	r22,0	stw	r22,RESULT(r21)	mtspr	SPRG2,r22		/* r1 is now kernel sp */#if 0	addi	r24,r2,TASK_STRUCT_SIZE /* check for kernel stack overflow */	cmplw	0,r1,r2	cmplw	1,r1,r24	crand	1,1,4	bgt	stack_ovf		/* if r2 < r1 < r2+TASK_STRUCT_SIZE */#endif	lwz	r24,0(r23)		/* virtual address of handler */	lwz	r23,4(r23)		/* where to go when done */	mtspr	SRR0,r24	mtspr	SRR1,r20	mtlr	r23	SYNC	rfi				/* jump to handler, enable MMU */int_return:	mfmsr	r28		/* Disable interrupts */	li	r4,0	ori	r4,r4,MSR_EE	andc	r28,r28,r4	SYNC			/* Some chip revs need this... */	mtmsr	r28	SYNC	lwz	r2,_CTR(r1)	lwz	r0,_LINK(r1)	mtctr	r2	mtlr	r0	lwz	r2,_XER(r1)	lwz	r0,_CCR(r1)	mtspr	XER,r2	mtcrf	0xFF,r0	REST_10GPRS(3, r1)	REST_10GPRS(13, r1)	REST_8GPRS(23, r1)	REST_GPR(31, r1)	lwz	r2,_NIP(r1)	/* Restore environment */	lwz	r0,_MSR(r1)	mtspr	SRR0,r2	mtspr	SRR1,r0	lwz	r0,GPR0(r1)	lwz	r2,GPR2(r1)	lwz	r1,GPR1(r1)	SYNC	rficrit_return:	mfmsr	r28		/* Disable interrupts */	li	r4,0	ori	r4,r4,MSR_EE	andc	r28,r28,r4	SYNC			/* Some chip revs need this... */	mtmsr	r28	SYNC	lwz	r2,_CTR(r1)	lwz	r0,_LINK(r1)	mtctr	r2	mtlr	r0	lwz	r2,_XER(r1)	lwz	r0,_CCR(r1)	mtspr	XER,r2	mtcrf	0xFF,r0	REST_10GPRS(3, r1)	REST_10GPRS(13, r1)	REST_8GPRS(23, r1)	REST_GPR(31, r1)	lwz	r2,_NIP(r1)	/* Restore environment */	lwz	r0,_MSR(r1)	mtspr	990,r2		/* SRR2 */	mtspr	991,r0		/* SRR3 */	lwz	r0,GPR0(r1)	lwz	r2,GPR2(r1)	lwz	r1,GPR1(r1)	SYNC	rfci/* Cache functions.*/invalidate_icache:	iccci	r0,r0			/* for 405, iccci invalidates the */	blr				/*   entire I cache */invalidate_dcache:	addi	r6,0,0x0000		/* clear GPR 6 */	/* Do loop for # of dcache congruence classes. */	addi	r7,r0, (CFG_DCACHE_SIZE / CFG_CACHELINE_SIZE / 2)					/* NOTE: dccci invalidates both */	mtctr	r7			/* ways in the D cache */..dcloop:	dccci	0,r6			/* invalidate line */	addi	r6,r6, CFG_CACHELINE_SIZE /* bump to next line */	bdnz	..dcloop	blrflush_dcache:	addis	r9,r0,0x0002		/* set mask for EE and CE msr bits */	ori	r9,r9,0x8000	mfmsr	r12			/* save msr */	andc	r9,r12,r9	mtmsr	r9			/* disable EE and CE */	addi	r10,r0,0x0001		/* enable data cache for unused memory */	mfdccr	r9			/* region 0xF8000000-0xFFFFFFFF via */	or	r10,r10,r9		/* bit 31 in dccr */	mtdccr	r10	/* do loop for # of congruence classes. */	addi	r10,r0,(CFG_DCACHE_SIZE / CFG_CACHELINE_SIZE / 2)	addi	r11,r0,(CFG_DCACHE_SIZE / 2) /* D cache set size - 2 way sets */	mtctr	r10	addi	r10,r0,(0xE000-0x10000)	/* start at 0xFFFFE000 */	add	r11,r10,r11		/* add to get to other side of cache line */..flush_dcache_loop:	lwz	r3,0(r10)		/* least recently used side */	lwz	r3,0(r11)		/* the other side */	dccci	r0,r11			/* invalidate both sides */	addi	r10,r10,CFG_CACHELINE_SIZE /* bump to next line */	addi	r11,r11,CFG_CACHELINE_SIZE /* bump to next line */	bdnz	..flush_dcache_loop	sync				/* allow memory access to complete */	mtdccr	r9			/* restore dccr */	mtmsr	r12			/* restore msr */	blr	.globl	icache_enableicache_enable:	mflr	r8	bl	invalidate_icache	mtlr	r8	isync	addis	r3,r0, 0x8000	      /* set bit 0 */	mticcr	r3	blr	.globl	icache_disableicache_disable:	addis	r3,r0, 0x0000	      /* clear bit 0 */	mticcr	r3	isync	blr	.globl	icache_statusicache_status:	mficcr	r3	srwi	r3, r3, 31	/* >>31 => select bit 0 */	blr	.globl	dcache_enabledcache_enable:	mflr	r8	bl	invalidate_dcache	mtlr	r8	isync	addis	r3,r0, 0x8000	      /* set bit 0 */	mtdccr	r3	blr	.globl	dcache_disabledcache_disable:	mflr	r8	bl	flush_dcache	mtlr	r8	addis	r3,r0, 0x0000	      /* clear bit 0 */	mtdccr	r3	blr	.globl	dcache_statusdcache_status:	mfdccr	r3	srwi	r3, r3, 31	/* >>31 => select bit 0 */	blr	.globl get_pvrget_pvr:	mfspr	r3, PVR	blr#if !defined(CONFIG_440)	.globl wr_pitwr_pit:	mtspr	pit, r3	blr#endif	.globl wr_tcrwr_tcr:	mtspr	tcr, r3	blr/*------------------------------------------------------------------------------- *//* Function:	 in8 */

⌨️ 快捷键说明

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