11.3Schristos/*	$NetBSD: srt0.s,v 1.3 2005/12/11 12:18:48 christos 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.2Snonaka	cmpw	3,4
721.2Snonaka	bne	relocate
731.1Snonaka	b	start_ldr
741.2Snonaka
751.1Snonaka/*
761.1Snonaka * no matter where we're loaded, move ourselves to -Ttext address
771.1Snonaka */
781.1Snonakarelocate:
791.1Snonaka	lis	4,_start@h
801.1Snonaka	ori	4,4,_start@l
811.1Snonaka	lis	5,end@h
821.1Snonaka	ori	5,5,end@l
831.1Snonaka	addi	5,5,3		/* Round up - just in case */
841.1Snonaka	sub	5,5,4		/* Compute # longwords to move */
851.1Snonaka	srwi	5,5,2
861.1Snonaka	mtctr	5
871.1Snonaka	subi	3,3,4		/* Set up for loop */
881.1Snonaka	subi	4,4,4
891.1Snonaka2:
901.1Snonaka	lwzu	5,4(3)
911.1Snonaka	stwu	5,4(4)
921.1Snonaka	bdnz	2b
931.1Snonaka  	lis	3,start_ldr@h
941.1Snonaka	ori	3,3,start_ldr@l
951.1Snonaka	mtlr	3		/* Easiest way to do an absolute jump */
961.1Snonaka	blr
971.1Snonakastart_ldr:
981.1Snonaka	mr	9,1		/* Save old stack pointer */
991.1Snonaka	lis	1,.stack@h
1001.1Snonaka	ori	1,1,.stack@l
1011.1Snonaka	addi	1,1,4096
1021.1Snonaka	li	2,0x000F
1031.1Snonaka	andc	1,1,2
1041.1Snonaka	mr	3,11		/* arg1: residual/board data */
1051.1Snonaka	mr	4,8		/* arg2: loadaddr */
1061.1Snonaka	bl	boot
1071.1Snonakahang:
1081.1Snonaka	b	hang
1091.1Snonaka
1101.1Snonaka/*
1111.1Snonaka * Execute
1121.1Snonaka * run(startsym, endsym, args, bootinfo, entry)
1131.1Snonaka */
1141.1Snonaka	.globl  run
1151.1Snonakarun:
1161.1Snonaka	mtctr   7                       /* Entry point */
1171.1Snonaka	bctr
1181.1Snonaka
1191.1Snonaka/*
1201.1Snonaka * Flush instruction cache
1211.1Snonaka */
1221.1Snonaka	.globl flush_icache
1231.1Snonakaflush_icache:
1241.1Snonaka	mflr	5
1251.1Snonaka	bl	flush_dcache
1261.1Snonaka	mfspr	4,1008
1271.1Snonaka	li	4,0
1281.1Snonaka	ori	4,4,HID0_ICE|HID0_ICFI
1291.1Snonaka	or	3,3,4
1301.1Snonaka	mtspr	1008,3
1311.1Snonaka	andc	3,3,4
1321.1Snonaka	ori	3,3,HID0_ICE
1331.1Snonaka	mtspr	1008,3
1341.1Snonaka	mtlr	5
1351.1Snonaka	blr
1361.1Snonaka
1371.1Snonaka/*
1381.1Snonaka * Flush data cache
1391.1Snonaka */
1401.1Snonaka	.globl flush_dcache
1411.1Snonakaflush_dcache:
1421.1Snonaka	lis	3,0x1000@h
1431.1Snonaka	ori	3,3,0x1000@l
1441.1Snonaka	li	4,1024
1451.1Snonaka	mtctr	4
1461.1Snonaka1:
1471.1Snonaka	lwz	4,0(3)
1481.1Snonaka	addi	3,3,32
1491.1Snonaka	bdnz	1b
1501.1Snonaka	blr
1511.1Snonaka
1521.1Snonaka/*
1531.1Snonaka * local stack
1541.1Snonaka */
1551.1Snonaka	.comm	.stack,8192,4
156