xref: /netbsd/sys/arch/mvmeppc/stand/libsa/srt0.S (revision 6550d01e)
1/*	$NetBSD: srt0.S,v 1.4 2011/01/19 09:03:15 he Exp $	*/
2
3/*-
4 * Copyright (c) 2002 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Steve C. Woodford.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32#include <machine/asm.h>
33#include <machine/psl.h>
34#include <powerpc/spr.h>
35#include <powerpc/oea/spr.h>
36
37#define	STACK_SIZE	8192
38
39/*
40 * The main entry point when loaded by PPC-Bug.
41 *
42 * There are two possible entry conditions here:
43 *
44 *   1) We were booted in `PReP' mode, either from disk or the network.
45 *      In this case, we have no control over the load address so we
46 *      have to relocate ourselves to the appropriate place.
47 *      The firmware passes us the following registers:
48 *
49 *        %r1  -> Temporary stack
50 *        %r3  -> Residual Data
51 *        %r4  -> The address we were loaded to
52 *        %r5  -> Zero
53 *
54 *   2) We were booted over the network in Non-PReP mode. In this case,
55 *      the load address is usually set using PPC-Bug's "niot" command,
56 *      but we won't depend on it so relocation may be required. The
57 *      firmware passes us the following registers:
58 *
59 *        %r1  -> Temporary stack
60 *        %r3  -> CLUN of the network device we booted from
61 *        %r4  -> DLUN of the network device we booted from
62 *        %r5  -> Non-zero
63 *        %r6  -> Base address of network device
64 *        %r7  -> Execution address of loaded program
65 *        %r8  -> Address of IP-address data structure
66 *        %r9  -> Pointer to start of filename string
67 *        %r10 -> Pointer to end+1 of filename string
68 *        %r11 -> Pointer to start of argument string
69 *        %r12 -> Pointer to end+1 of argument string
70 *
71 * The obvious way to distinguish between the two boot modes is by
72 * checking the value of %r5.
73 */
74ENTRY(_start)
75	bl	1f
761:	xor	%r0,%r0,%r0
77
78	/* First, switch off Instruction and Data caches. */
79	mfspr	%r13,SPR_HID0
80	LDCONST(%r14, HID0_DCE|HID0_ICE)
81	andc	%r13,%r13,%r14
82	sync
83	mtspr	SPR_HID0,%r13
84
85
86	/*
87	 * All registers now available. Let's see if we need to relocate
88	 */
89	LDCONST(%r13,_C_LABEL(_start))	/* Where we'd like to be */
90	LDCONST(%r14,_C_LABEL(edata))	/* End of data section */
91	LDCONST(%r15,0x3)
92	add	%r14,%r14,%r15
93	andc	%r14,%r14,%r15		/* Rounded up to the nearest 32-bits */
94	sub	%r15,%r14,%r13		/* Our size, in bytes */
95	mflr	%r16			/* Get address we were loaded to */
96	subi	%r16,%r16,0x4		/* Correct for branch */
97	cmp	%cr0,%r13,%r16		/* Do we need to relocate? */
98	beq	_ASM_LABEL(clrbss)	/* No relocation necessary */
99	li	%r17,0x4
100	bgt	1f			/* Relocate using forward copy? */
101
102	/* Nope. Need to copy in reverse in case of overlap */
103	mr	%r13,%r14		/* dest -> end */
104	add	%r16,%r16,%r15		/* src + size */
105	subi	%r17,%r17,0x8		/* Increment is -4 */
106
107	/*
108	 * Do the relocation
109	 *  %r13  -> dest
110	 *  %r15  -> number of bytes
111	 *  %r16  -> src
112	 *  %r17  -> Increment (+4 or -4)
113	 */
1141:	srwi	%r15,%r15,0x2		/* Convert length to 32-bit words */
115	mtctr	%r15			/* Save in counter register */
116
1172:	lwz	%r15,0(%r16)
118	stw	%r15,0(%r13)
119	add	%r16,%r16,%r17
120	add	%r13,%r13,%r17
121	bdnz	2b
122
123	/* Now do an absolute jump to the relocated code */
124	LDCONST(%r13,_ASM_LABEL(clrbss))
125	mtlr	%r13
126	blr
127
128ASENTRY(clrbss)
129	LDCONST(%r13,_C_LABEL(edata))	/* End of the data section */
130	LDCONST(%r14,_C_LABEL(end))	/* End of BSS */
131	LDCONST(%r15,0x3)
132	add	%r14,%r14,%r15
133	andc	%r14,%r14,%r15		/* Round-up end of BSS to 32-bits */
134	sub	%r15,%r14,%r13		/* r15 == length of BSS */
135	srwi	%r15,%r15,0x2
136	mtctr	%r15			/* CTR == # of 32-bit words in BSS */
1371:	stw	%r0,0(%r13)		/* Clear BSS */
138	addi	%r13,%r13,4
139	bdnz	1b
140
141	/* Fix up our own stack */
142	LDCONST(%r1,stack)
143	addi	%r1,%r1,STACK_SIZE-0x10
144	LDCONST(%r13,0x0f)
145	andc	%r1,%r1,%r13
146
147	/*
148	 * Copy the arguments passed in from Bug into bug_bootinfo
149	 *
150	 * See bugsyscalls.h for details.
151	 */
152	LDCONST(%r13,_C_LABEL(bug_bootinfo))
153	stw	%r5,0x00(%r13)
154	stw	%r3,0x04(%r13)
155	stw	%r4,0x08(%r13)
156	stw	%r6,0x0c(%r13)
157	stw	%r7,0x10(%r13)
158	stw	%r8,0x14(%r13)
159	stw	%r9,0x18(%r13)
160	stw	%r10,0x1c(%r13)
161	stw	%r11,0x20(%r13)
162	stw	%r12,0x24(%r13)
163
164	mr	%r3,%r13
165	bl	_C_LABEL(main)		/* void main(void) */
166	/* FALLTHROUGH */
167
168/*
169 * Return to the debugger, either because main() returned or via panic().
170 */
171ENTRY(_rtt)
172	addi	%r10,0,0x0063
173	sc
1741:	nop
175	b	1b
176
177	/*
178	 * C code runs on this stack.
179	 */
180	.comm	stack,STACK_SIZE,4
181	.comm	errno,4,4
182	.comm	debug,4,4
183