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

📄 start.s

📁 国产CPU-龙芯(loongson)BIOS源代码
💻 S
📖 第 1 页 / 共 3 页
字号:
	move	t1, a1	move	t2, a2	/* copy text section */	1:	and	t3,t0,0x0000ffff	bnez	t3,2f	nop	move	a0,t0	bal	hexserial	nop	li	a0,'\r'	bal 	tgt_putchar	nop2:	lw	t3, 0(t1)	nop	sw	t3, 0(t0)	addu	t0, 4	addu	t1, 4	bne t2, t0, 1b	nop	PRINTSTR("copy text section done.\r\n")		/* Clear BSS */	la	a0, _edata	la	a2, _end2:	sw	zero, 0(a0)	bne a2, a0, 2b	addu	a0, 4	TTYDBG("Copy PMON to execute location done.\r\n")	/*sw	0, CpuTertiaryCacheSize*/ /* Set L3 cache size */		move	a0,	msize	srl	a0,20	la	v0, initmips	jalr	v0	nopstuck:#ifdef DEBUG_LOCORE	TTYDBG("Dumping GT64240 setup.\r\n")	TTYDBG("offset----data------------------------.\r\n")	li	s3, 01:	move	a0, s3	bal	hexserial	nop	TTYDBG(": ")2:	add	a0, s3, bonito	lw	a0, 0(a0)	bal	hexserial	addiu	s3, 4	TTYDBG(" ")	li	a0, 0xfff	and	a0, s3	beqz	a0, 3f	li	a0, 0x01f	and	a0, s3	bnez	a0, 2b	TTYDBG("\r\n")	b	1b	nop3:	b	3b	nop#else	b	stuck	nop#endif/* *  Clear the TLB. Normally called from start.S. */#if __mips64#define MTC0 dmtc0#else #define MTC0 mtc0#endifLEAF(CPU_TLBClear)	li	a3, 0			# First TLB index.	li	a2, PG_SIZE_4K	MTC0   a2, COP_0_TLB_PG_MASK   # Whatever...1:	MTC0   zero, COP_0_TLB_HI	# Clear entry high.	MTC0   zero, COP_0_TLB_LO0	# Clear entry low0.	MTC0   zero, COP_0_TLB_LO1	# Clear entry low1.	mtc0    a3, COP_0_TLB_INDEX	# Set the index.	addiu	a3, 1	li	a2, 64	nop	nop	tlbwi				# Write the TLB	bne	a3, a2, 1b	nop	jr	ra	nopEND(CPU_TLBClear)/* *  Set up the TLB. Normally called from start.S. */LEAF(CPU_TLBInit)	li	a3, 0			# First TLB index.	li	a2, PG_SIZE_16M	MTC0   a2, COP_0_TLB_PG_MASK   # All pages are 16Mb.1:	and	a2, a0, PG_SVPN	MTC0   a2, COP_0_TLB_HI	# Set up entry high.	move	a2, a0	srl	a2, a0, PG_SHIFT 	and	a2, a2, PG_FRAME	ori	a2, PG_IOPAGE	MTC0   a2, COP_0_TLB_LO0	# Set up entry low0.	addu	a2, (0x01000000 >> PG_SHIFT)	MTC0   a2, COP_0_TLB_LO1	# Set up entry low1.	mtc0    a3, COP_0_TLB_INDEX	# Set the index.	addiu	a3, 1	li	a2, 0x02000000	subu	a1, a2	nop	tlbwi				# Write the TLB	bgtz	a1, 1b	addu	a0, a2			# Step address 32Mb.	jr	ra	nopEND(CPU_TLBInit)/* * Simple character printing routine used before full initialization */#if 0#define		TXWAIT	0x100000LEAF(tgt_putchar)        /* blocking transmit, with timeout */        li      t0,TXWAIT                       # timeout1:      lbu     t1,PHYS_TO_UNCACHED(0x1fd002fd)       # get LSR        and     t1,0x20                 # tx ready?        bnez    t1,1f                           # yup - go and write	nop        subu    t0,1                            # continue until timeout        bnez    t0,1b	nop1:      sb      a0,PHYS_TO_UNCACHED(0x1fd002f8)               # write data        li      t0,TXWAIT                       # timeout1:      lbu     t1,PHYS_TO_UNCACHED(0x1fd003fd)       # get LSR        and     t1,0x20                 # tx ready?        bnez    t1,1f                           # yup - go and write	nop        subu    t0,1                            # continue until timeout        bnez    t0,1b	nop1:      sb      a0,PHYS_TO_UNCACHED(0x1fd003f8)               # write data	j	ra	nopEND(tgt_putchar)#endifLEAF(stringserial)	move	a2, ra	addu	a1, a0, s0	lbu	a0, 0(a1)1:	beqz	a0, 2f	nop	bal	tgt_putchar	addiu	a1, 1	b	1b	lbu	a0, 0(a1)2:	j	a2	nopEND(stringserial)LEAF(outstring)	move	a2, ra	move	a1, a0	lbu	a0, 0(a1)1:	beqz	a0, 2f	nop	bal	tgt_putchar	addiu	a1, 1	b	1b	lbu	a0, 0(a1)2:	j	a2	nopEND(outstring)LEAF(hexserial)	move	a2, ra	move	a1, a0	li	a3, 71:	rol	a0, a1, 4	move	a1, a0	and	a0, 0xf	la	v0, hexchar	addu	v0, s0	addu	v0, a0	bal	tgt_putchar	lbu	a0, 0(v0)	bnez	a3, 1b	addu	a3, -1	j	a2	nopEND(hexserial)LEAF(tgt_putchar)	la	v0, COM1_BASE_ADDR1:	lbu	v1, NSREG(NS16550_LSR)(v0)	and	v1, LSR_TXRDY	beqz	v1, 1b	nop	sb	a0, NSREG(NS16550_DATA)(v0)	j	ra	nop	END(tgt_putchar)/* baud rate definitions, matching include/termios.h */#define B0      0#define B50     50      #define B75     75#define B110    110#define B134    134#define B150    150#define B200    200#define B300    300#define B600    600#define B1200   1200#define B1800   1800#define B2400   2400#define B4800   4800#define B9600   9600#define B19200  19200#define B38400  38400#define B57600  57600#define B115200 115200LEAF(initserial)	la	v0, COM1_BASE_ADDR1:	li	v1, FIFO_ENABLE|FIFO_RCV_RST|FIFO_XMT_RST|FIFO_TRIGGER_4	sb	v1, NSREG(NS16550_FIFO)(v0)	li	v1, CFCR_DLAB	sb	v1, NSREG(NS16550_CFCR)(v0) 	li	v1, NS16550HZ/(16*CONS_BAUD)	sb	v1, NSREG(NS16550_DATA)(v0)	srl	v1, 8	sb	v1, NSREG(NS16550_IER)(v0)	li	v1, CFCR_8BITS	sb	v1, NSREG(NS16550_CFCR)(v0)#if 0	li	v1, MCR_DTR|MCR_RTS#endif	sb	v1, NSREG(NS16550_MCR)(v0)	li	v1, 0x0	sb	v1, NSREG(NS16550_IER)(v0)	move	v1, v0	la	v0, COM2_BASE_ADDR	bne	v0, v1, 1b	nop	j	ra	nopEND(initserial)#define SMBOFFS(reg) I82371_SMB_SMB##regLEAF(i2cdump)	move	t4,ra		li	a0,PHYS_TO_UNCACHED(ISAPORT_BASE(SMB_PORT))	lbu	a0,SMBOFFS(HSTSTS)(a0)	li	a1,1	bal	hexserial	nop	PRINTSTR("\r\n")			li	a0,PHYS_TO_UNCACHED(ISAPORT_BASE(SMB_PORT))	lbu	a0,SMBOFFS(SLVSTS)(a0)	li	a1,1	bal	hexserial	nop	PRINTSTR("\r\n")		li	a0,PHYS_TO_UNCACHED(ISAPORT_BASE(SMB_PORT))	lbu	a0,SMBOFFS(HSTCNT)(a0)	li	a1,1	bal	hexserial	nop	PRINTSTR("\r\n")		li	a0,PHYS_TO_UNCACHED(ISAPORT_BASE(SMB_PORT))	lbu	a0,SMBOFFS(HSTCMD)(a0)	li	a1,1	bal	hexserial	nop	PRINTSTR("\r\n")		li	a0,PHYS_TO_UNCACHED(ISAPORT_BASE(SMB_PORT))	lbu	a0,SMBOFFS(HSTADD)(a0)	li	a1,1	bal	hexserial	nop	PRINTSTR("\r\n")		li	a0,PHYS_TO_UNCACHED(ISAPORT_BASE(SMB_PORT))	lbu	a0,SMBOFFS(HSTDAT0)(a0)	li	a1,1	bal	hexserial	nop	PRINTSTR("\r\n")		li	a0,PHYS_TO_UNCACHED(ISAPORT_BASE(SMB_PORT))	lbu	a0,SMBOFFS(HSTDAT1)(a0)	li	a1,1	bal	hexserial	nop	PRINTSTR("\r\n")		li	a0,PHYS_TO_UNCACHED(ISAPORT_BASE(SMB_PORT))	lbu	a0,SMBOFFS(BLKDAT)(a0)	li	a1,1	bal	hexserial	nop	PRINTSTR("\r\n")		li	a0,PHYS_TO_UNCACHED(ISAPORT_BASE(SMB_PORT))	lbu	a0,SMBOFFS(SLVCNT)(a0)	li	a1,1	bal	hexserial	nop	PRINTSTR("\r\n")		li	a0,PHYS_TO_UNCACHED(ISAPORT_BASE(SMB_PORT))	lbu	a0,SMBOFFS(SHDWCMD)(a0)	li	a1,1	bal	hexserial	nop	PRINTSTR("\r\n")		li	a0,PHYS_TO_UNCACHED(ISAPORT_BASE(SMB_PORT))	lbu	a0,SMBOFFS(SLVEVT)(a0)	li	a1,1	bal	hexserial	nop	PRINTSTR("\r\n")		li	a0,PHYS_TO_UNCACHED(ISAPORT_BASE(SMB_PORT))	lbu	a0,SMBOFFS(SLVDAT)(a0)	li	a1,1	bal	hexserial	nop	PRINTSTR("\r\n")		jr	t4	nopEND(i2cdump)LEAF(i2cread)	li	t0,PHYS_TO_UNCACHED(ISAPORT_BASE(SMB_PORT))	lbu	t1,SMBOFFS(HSTSTS)(t0)	and	t1,~(I82371_SMB_FAILED|I82371_SMB_BUS_ERR|I82371_SMB_DEV_ERR|I82371_SMB_INTER)	sb	t1,SMBOFFS(HSTSTS)(t0)		sll	t1,a0,1	or	t1,0xa1		# DIMM base address and read bit	sb	t1,SMBOFFS(HSTADD)(t0)	sb	a1,SMBOFFS(HSTCMD)(t0)			li	t1,I82371_SMB_START|I82371_SMB_BDRW	sb	t1,SMBOFFS(HSTCNT)(t0)	li	t3,10000	1:	lbu	t1,SMBOFFS(HSTSTS)(t0)	and	t2,t1,I82371_SMB_FAILED|I82371_SMB_BUS_ERR|I82371_SMB_DEV_ERR|I82371_SMB_INTER	bnez	t2,1f	nop	sub	t3,1	bnez	t3,1b	nop	b	9f			nop1:		# clear pending errors/interrupts	sb	t1,SMBOFFS(HSTSTS)(t0)		and	t2,t1,I82371_SMB_FAILED|I82371_SMB_BUS_ERR|I82371_SMB_DEV_ERR	bnez	t2,9f	nop	lbu	v0,SMBOFFS(HSTDAT0)(t0)	j	ra	nop	9:	li	v0,-1	j	ra	nopEND(i2cread)	__main:	j	ra	nop	.rdatatransmit_pat_msg:	.asciz	"\r\nInvalid transmit pattern.  Must be DDDD or DDxDDx\r\n"v200_msg:	.asciz	"\r\nPANIC! Unexpected TLB refill exception!\r\n"v280_msg:	.asciz	"\r\nPANIC! Unexpected XTLB refill exception!\r\n"v380_msg:	.asciz	"\r\nPANIC! Unexpected General exception!\r\n"v400_msg:	.asciz	"\r\nPANIC! Unexpected Interrupt exception!\r\n"hexchar:	.ascii	"0123456789abcdef"	.text	.align	2/* *   I2C Functions used in early startup code to get SPD info from *   SDRAM modules. This code must be entirely PIC and RAM independent. *//* Delay macro */#define	DELAY(count)	\	li v0, count;	\99:			\	bnz	vo, 99b;\	addiu	v0, -1#define I2C_INT_ENABLE	0x80#define I2C_ENABLE	0x40#define I2C_ACK		0x04#define I2C_INT_FLAG	0x08#define I2C_STOP_BIT	0x10#define I2C_START_BIT	0x20#define	I2C_AMOD_RD	0x01#define	BUS_ERROR				0x00#define	START_CONDITION_TRA			0x08#define	RSTART_CONDITION_TRA			0x10#define	ADDR_AND_WRITE_BIT_TRA_ACK_REC		0x18#define	ADDR_AND_READ_BIT_TRA_ACK_REC		0x40#define	SLAVE_REC_WRITE_DATA_ACK_TRA		0x28#define	MAS_REC_READ_DATA_ACK_NOT_TRA		0x58#define Index_Store_Tag_D			0x05#define Index_Invalidate_I			0x00#define Index_Writeback_Inv_D			0x01LEAF(godson1_cache_init)####part 2####	.set mips3cache_detect_2way:	mfc0	t4, COP_0_CONFIG	andi	t5, t4, 0x0e00	srl	t5, t5, 9	andi	t6, t4, 0x01c0	srl	t6, t6, 6	addiu	t6, t6, 11	addiu	t5, t5, 11	addiu	t4, $0, 1	sllv	t6, t4, t6	sllv	t5, t4, t5	addiu	t7, $0, 2####part 3####	lui	a0, 0x8000	addu	a1, $0, t5	addu	a2, $0, t6cache_init_d2way:#a0=0x80000000, a1=icache_size, a2=dcache_size#a3, v0 and v1 used as local registers	mtc0	$0, COP_0_TAG_HI	addu	v0, $0, a0	addu	v1, a0, a21:	slt	a3, v0, v1	beq	a3, $0, 1f	nop	mtc0	$0, COP_0_TAG_LO	cache	Index_Store_Tag_D, 0x0(v0)	mtc0	$0, COP_0_TAG_LO	cache	Index_Store_Tag_D, 0x1(v0)	beq	$0, $0, 1b	addiu	v0, v0, 0x201:cache_flush_i2way:	addu	v0, $0, a0	addu	v1, a0, a11:	slt	a3, v0, v1	beq	a3, $0, 1f	nop	cache	Index_Invalidate_I, 0x0(v0)#	cache	Index_Invalidate_I, 0x1(v0)	beq	$0, $0, 1b	addiu	v0, v0, 0x201:cache_flush_d2way:	addu	v0, $0, a0	addu	v1, a0, a21:	slt	a3, v0, v1	beq	a3, $0, 1f	nop	cache	Index_Writeback_Inv_D, 0x0(v0)	cache	Index_Writeback_Inv_D, 0x1(v0)	beq	$0, $0, 1b	addiu	v0, v0, 0x201:cache_init_finish:	nop	jr	ra	nopcache_init_panic:	TTYDBG("cache init panic\r\n");1:	b	1b	nop	.set mips2END(godson1_cache_init)LEAF(nullfunction)	jr ra	nopEND(nullfunction)

⌨️ 快捷键说明

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