srt0.s revision 1.1
11.1Snonaka/*	$NetBSD: srt0.s,v 1.1 2000/02/29 15:21:51 nonaka Exp $	*/
21.1Snonaka
31.1Snonaka/*
41.1Snonaka * Copyright (C) 1996-1999 Cort Dougan (cort@fsmlasb.com).
51.1Snonaka * Copyright (C) 1996-1999 Gary Thomas (gdt@osf.org).
61.1Snonaka * Copyright (C) 1996-1999 Paul Mackeras (paulus@linuxcare.com).
71.1Snonaka * All rights reserved.
81.1Snonaka *
91.1Snonaka * Redistribution and use in source and binary forms, with or without
101.1Snonaka * modification, are permitted provided that the following conditions
111.1Snonaka * are met:
121.1Snonaka * 1. Redistributions of source code must retain the above copyright
131.1Snonaka *    notice, this list of conditions and the following disclaimer.
141.1Snonaka * 2. Redistributions in binary form must reproduce the above copyright
151.1Snonaka *    notice, this list of conditions and the following disclaimer in the
161.1Snonaka *    documentation and/or other materials provided with the distribution.
171.1Snonaka * 3. All advertising materials mentioning features or use of this software
181.1Snonaka *    must display the following acknowledgement:
191.1Snonaka *	This product includes software developed by TooLs GmbH.
201.1Snonaka * 4. The name of TooLs GmbH may not be used to endorse or promote products
211.1Snonaka *    derived from this software without specific prior written permission.
221.1Snonaka *
231.1Snonaka * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
241.1Snonaka * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
251.1Snonaka * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
261.1Snonaka * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
271.1Snonaka * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
281.1Snonaka * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
291.1Snonaka * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
301.1Snonaka * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
311.1Snonaka * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
321.1Snonaka * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
331.1Snonaka */
341.1Snonaka
351.1Snonaka#define MSR_IP		(1<<6)
361.1Snonaka
371.1Snonaka#define HID0_DCI	(1<<10)
381.1Snonaka#define HID0_ICFI	(1<<11)
391.1Snonaka#define	HID0_DCE	(1<<14)
401.1Snonaka#define HID0_ICE	(1<<15)
411.1Snonaka
421.1Snonaka	.text
431.1Snonaka
441.1Snonaka	.globl	_start
451.1Snonaka_start:
461.1Snonaka	bl	start
471.1Snonakastart:
481.1Snonaka	mr	11,3		/* Save pointer to residual/board data */
491.1Snonaka	li	3,MSR_IP	/* Establish default MSR value */
501.1Snonaka	mtmsr	3
511.1Snonaka	isync
521.1Snonaka
531.1Snonaka	mflr	7
541.1Snonaka	bl	flush_icache
551.1Snonaka	mfspr	3,1008
561.1Snonaka	lis	4,~(HID0_ICE|HID0_DCE)@h
571.1Snonaka	ori	4,4,~(HID0_ICE|HID0_DCE)@l
581.1Snonaka	andc	3,3,4
591.1Snonaka	mtspr	1008,3
601.1Snonaka	mtlr	7
611.1Snonaka
621.1Snonaka/*
631.1Snonaka * check if we need to relocate ourselves to the link addr or were we
641.1Snonaka * loaded there to begin with -- Cort
651.1Snonaka */
661.1Snonaka	lis	4,_start@h
671.1Snonaka	ori	4,4,_start@l
681.1Snonaka	mflr	3
691.1Snonaka	subi	3,3,4		/* we get the nip, not the ip of the branch */
701.1Snonaka	mr	8,3
711.1Snonaka	cmp	0,3,4
721.1Snonaka	bne	1f
731.1Snonaka	b	start_ldr
741.1Snonaka1:
751.1Snonaka/*
761.1Snonaka * no matter where we're loaded, move ourselves to -Ttext address
771.1Snonaka */
781.1Snonakarelocate:
791.1Snonaka	mflr	3		/* Compute code bias */
801.1Snonaka	subi	3,3,4
811.1Snonaka	mr	8,3
821.1Snonaka	lis	4,_start@h
831.1Snonaka	ori	4,4,_start@l
841.1Snonaka	lis	5,end@h
851.1Snonaka	ori	5,5,end@l
861.1Snonaka	addi	5,5,3		/* Round up - just in case */
871.1Snonaka	sub	5,5,4		/* Compute # longwords to move */
881.1Snonaka	srwi	5,5,2
891.1Snonaka	mtctr	5
901.1Snonaka	subi	3,3,4		/* Set up for loop */
911.1Snonaka	subi	4,4,4
921.1Snonaka2:
931.1Snonaka	lwzu	5,4(3)
941.1Snonaka	stwu	5,4(4)
951.1Snonaka	bdnz	2b
961.1Snonaka  	lis	3,start_ldr@h
971.1Snonaka	ori	3,3,start_ldr@l
981.1Snonaka	mtlr	3		/* Easiest way to do an absolute jump */
991.1Snonaka	blr
1001.1Snonakastart_ldr:
1011.1Snonaka/* Clear all of BSS */
1021.1Snonaka	lis	3,edata@h
1031.1Snonaka	ori	3,3,edata@l
1041.1Snonaka	lis	4,end@h
1051.1Snonaka	ori	4,4,end@l
1061.1Snonaka	subi	3,3,4
1071.1Snonaka	subi	4,4,4
1081.1Snonaka	li	0,0
1091.1Snonaka3:
1101.1Snonaka	stwu	0,4(3)
1111.1Snonaka	cmp	0,3,4
1121.1Snonaka	bne	3b
1131.1Snonaka	mr	9,1		/* Save old stack pointer */
1141.1Snonaka	lis	1,.stack@h
1151.1Snonaka	ori	1,1,.stack@l
1161.1Snonaka	addi	1,1,4096
1171.1Snonaka	li	2,0x000F
1181.1Snonaka	andc	1,1,2
1191.1Snonaka	mr	3,11		/* arg1: residual/board data */
1201.1Snonaka	mr	4,8		/* arg2: loadaddr */
1211.1Snonaka	bl	boot
1221.1Snonakahang:
1231.1Snonaka	b	hang
1241.1Snonaka
1251.1Snonaka/*
1261.1Snonaka * Execute
1271.1Snonaka * run(startsym, endsym, args, bootinfo, entry)
1281.1Snonaka */
1291.1Snonaka	.globl  run
1301.1Snonakarun:
1311.1Snonaka	mtctr   7                       /* Entry point */
1321.1Snonaka	bctr
1331.1Snonaka
1341.1Snonaka/*
1351.1Snonaka * Flush instruction cache
1361.1Snonaka */
1371.1Snonaka	.globl flush_icache
1381.1Snonakaflush_icache:
1391.1Snonaka	mflr	5
1401.1Snonaka	bl	flush_dcache
1411.1Snonaka	mfspr	4,1008
1421.1Snonaka	li	4,0
1431.1Snonaka	ori	4,4,HID0_ICE|HID0_ICFI
1441.1Snonaka	or	3,3,4
1451.1Snonaka	mtspr	1008,3
1461.1Snonaka	andc	3,3,4
1471.1Snonaka	ori	3,3,HID0_ICE
1481.1Snonaka	mtspr	1008,3
1491.1Snonaka	mtlr	5
1501.1Snonaka	blr
1511.1Snonaka
1521.1Snonaka/*
1531.1Snonaka * Flush data cache
1541.1Snonaka */
1551.1Snonaka	.globl flush_dcache
1561.1Snonakaflush_dcache:
1571.1Snonaka	lis	3,0x1000@h
1581.1Snonaka	ori	3,3,0x1000@l
1591.1Snonaka	li	4,1024
1601.1Snonaka	mtctr	4
1611.1Snonaka1:
1621.1Snonaka	lwz	4,0(3)
1631.1Snonaka	addi	3,3,32
1641.1Snonaka	bdnz	1b
1651.1Snonaka	blr
1661.1Snonaka
1671.1Snonaka/*
1681.1Snonaka * local stack
1691.1Snonaka */
1701.1Snonaka	.comm	.stack,8192,4
171