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

📄 start.s

📁 open source bios with linux platform, very good and can be reused.
💻 S
字号:
/*  *   Creation Date: <2001/06/16 21:30:18 samuel> *   Time-stamp: <2003/04/04 16:32:06 samuel> *    *	<init.S> *	 *	Asm glue for ELF images run inside MOL *    *   Copyright (C) 2001, 2002, 2003 Samuel Rydh (samuel@ibrium.se) *    *   This program is free software; you can redistribute it and/or *   modify it under the terms of the GNU General Public License *   as published by the Free Software Foundation *    */changequote([[[[[,]]]]]) [[[[[  /* shield includes from m4-expansion */#include "asm/asmdefs.h"#include "asm/processor.h"#include "osi.h"		/************************************************************************//*	Macros								*//************************************************************************/#define ILLEGAL_VECTOR( v )	.org __vectors + v ; bl trap_error ;#define VECTOR( v, dummystr )	.org __vectors + v ; vector__##vMACRO(EXCEPTION_PREAMBLE, [	mtsprg1	r1		// scratch	mfsprg0	r1		// exception stack in sprg0	addi	r1,r1,-80	// push exception frame	stw	r0,0(r1)	// save r0	mfsprg1	r0	stw	r0,4(r1)	// save r1	stw	r2,8(r1)	// save r2	stw	r3,12(r1)	// save r3	stw	r4,16(r1)	stw	r5,20(r1)	stw	r6,24(r1)	stw	r7,28(r1)	stw	r8,32(r1)	stw	r9,36(r1)	stw	r10,40(r1)	stw	r11,44(r1)	stw	r12,48(r1)	mflr	r0	stw	r0,52(r1)	mfcr	r0	stw	r0,56(r1)	mfctr	r0	stw	r0,60(r1)	mfxer	r0	stw	r0,64(r1)	// 76(r1) unused	addi	r1,r1,-16	// call conventions uses 0(r1) and 4(r1)...])/************************************************************************//*	stack space							*//************************************************************************/	.section .bss	.balign 32	.space  32*1024		// 32 K client stackclient_stack:	.space	128	.space	64*1024		// 64 K stackstack:	.space  64	.space  32*1024		// 32 K exception stackestack:	.space	128		/************************************************************************//*	entry								*//************************************************************************/	.textGLOBL(_start):	li	r0,0	mtmsr	r0		LOADI	r1,estack	mtsprg0 r1			// setup exception stack	LOADI	r1,stack	// copy exception vectors	LOADI	r3,__vectors	li	r4,0	li	r5,__vectors_end - __vectors + 16	rlwinm	r5,r5,0,0,281:	lwz	r6,0(r3)	lwz	r7,4(r3)	lwz	r8,8(r3)	lwz	r9,12(r3)	stw	r6,0(r4)	stw	r7,4(r4)	stw	r8,8(r4)	stw	r9,12(r4)	dcbst	0,r4	sync	icbi	0,r4	sync	addi	r5,r5,-16	addi	r3,r3,16	addi	r4,r4,16	cmpwi	r5,0	bgt	1b	isync	bl	setup_mmu	bl	entry1:	nop	b	1b	/* According to IEEE 1275, PPC bindings:	 *		 * 	MSR = FP, ME + (DR|IR)	 *	r1 = stack (32 K + 32 bytes link area above)	 *	r5 = clint interface handler	 *	r6 = address of client program arguments (unused)	 *	r7 = length of client program arguments (unsed)	 */saved_stack:	.long	0	/* void call_elf( entry ) */GLOBL(call_elf):	mflr	r0	stwu	r1,-16(r1)	stw	r0,20(r1)	mtlr	r3	LOADI	r8,saved_stack		// save our stack pointer	stw	r1,0(r8)	LOADI	r1,client_stack	LOADI	r5,of_client_callback	// r5 = callback	li	r6,0			// r6 = address of client program arguments (unused)	li	r7,0			// r7 = length of client program arguments (unused)	li	r0,MSR_FP | MSR_ME | MSR_DR | MSR_IR	mtmsr	r0	blrl	LOADI	r8,saved_stack		// restore stack pointer	mr	r1,r8	lwz	r0,20(r1)	mtlr	r0	addi	r1,r1,16	// XXX: should restore r12-r31 etc.. 	// we should not really come here though	blrGLOBL(of_client_callback):	LOADI	r4,saved_stack	lwz	r4,0(r4)	stwu	r4,-32(r4)	mflr	r5	stw	r5,32+4(r4)	stw	r1,8(r4)		// save caller stack	mr	r1,r4	stw	r2,12(r1)	stw	r0,16(r1)	mfctr	r2	stw	r2,20(r1)	mfcr	r2	stw	r2,24(r1)	mfxer	r2	stw	r2,28(r1)	// do we need to save more registers?	bl	of_client_interface	lwz	r4,32+4(r1)	mtlr	r4	lwz	r2,20(r1)	mtctr	r2	lwz	r2,24(r1)	mtcr	r2	lwz	r2,28(r1)	mtxer	r2	lwz	r2,12(r1)	lwz	r0,16(r1)	lwz	r1,8(r1)		// restore caller stack	blr		/* rtas glue (must be reloctable) */GLOBL(of_rtas_start):	/* r3 = argument buffer, r4 = of_rtas_start */	/* according to the CHRP standard, cr must be preserved (cr0/cr1 too?) */	mr      r6,r3	LOADI	r3,OSI_SC_MAGIC_R3	LOADI	r4,OSI_SC_MAGIC_R4	li	r5,OSI_OF_RTAS	sc	blrGLOBL(of_rtas_end):	/* used in a hack to the newworld calibration */GLOBL(nw_dec_calibration):	.long	0GLOBL(timer_calib_start):	LOADI	r3,nw_dec_calibration	lwz	r3,0(r3)	blrGLOBL(timer_calib_end):/************************************************************************//*	vectors								*//************************************************************************/GLOBL(__vectors):	nop			// NULL-jmp trap1:	nop			//	b	1bexception_return:	addi	r1,r1,16	// pop ABI frame	lwz	r0,52(r1)	mtlr	r0	lwz	r0,56(r1)	mtcr	r0	lwz	r0,60(r1)	mtctr	r0	lwz	r0,64(r1)	mtxer	r0	lwz	r0,0(r1)	// restore r0	lwz	r2,8(r1)	// restore r2	lwz	r3,12(r1)	// restore r3	lwz	r4,16(r1)	lwz	r5,20(r1)	lwz	r6,24(r1)	lwz	r7,28(r1)	lwz	r8,32(r1)	lwz	r9,36(r1)	lwz	r10,40(r1)	lwz	r11,44(r1)	lwz	r12,48(r1)	lwz	r1,4(r1)	// restore r1	rfitrap_error:	mflr	r3	b	unexpected_excepILLEGAL_VECTOR( 0x100 )ILLEGAL_VECTOR( 0x200 )VECTOR( 0x300, "DSI" ):	EXCEPTION_PREAMBLE	LOADI	r3,dsi_exception	mtctr	r3	bctrl	b	exception_returnVECTOR( 0x400, "ISI" ):	EXCEPTION_PREAMBLE	LOADI	r3,isi_exception	mtctr	r3	bctrl	b	exception_return		ILLEGAL_VECTOR( 0x500 )	ILLEGAL_VECTOR( 0x600 )	ILLEGAL_VECTOR( 0x700 )VECTOR( 0x800, "FPU" ):		mtsprg1	r3	mfsrr1	r3	ori	r3,r3,0x2000	mtsrr1	r3	mfsprg1	r3	rfiILLEGAL_VECTOR( 0x900 )ILLEGAL_VECTOR( 0xa00 )ILLEGAL_VECTOR( 0xb00 )ILLEGAL_VECTOR( 0xc00 )ILLEGAL_VECTOR( 0xd00 )ILLEGAL_VECTOR( 0xe00 )ILLEGAL_VECTOR( 0xf00 )ILLEGAL_VECTOR( 0xf20 )ILLEGAL_VECTOR( 0x1000 )ILLEGAL_VECTOR( 0x1100 )ILLEGAL_VECTOR( 0x1200 )ILLEGAL_VECTOR( 0x1300 )ILLEGAL_VECTOR( 0x1400 )ILLEGAL_VECTOR( 0x1500 )ILLEGAL_VECTOR( 0x1600 )ILLEGAL_VECTOR( 0x1700 )GLOBL(__vectors_end):#define CACHE_LINE_SIZE         32#define LG_CACHE_LINE_SIZE      5/* flush_icache_range( ulong start, ulong stop) */GLOBL(flush_icache_range):        li      r5,CACHE_LINE_SIZE-1        andc    r3,r3,r5        subf    r4,r3,r4        add     r4,r4,r5        srwi.   r4,r4,LG_CACHE_LINE_SIZE        beqlr        mtctr   r4        mr      r6,r31:      dcbst   0,r3        addi    r3,r3,CACHE_LINE_SIZE        bdnz    1b        sync                            /* wait for dcbst's to get to ram */        mtctr   r42:      icbi    0,r6        addi    r6,r6,CACHE_LINE_SIZE        bdnz    2b        sync                            /* additional sync needed on g4 */        isync        blr

⌨️ 快捷键说明

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