Annotation of sys/arch/sparc64/stand/ofwboot/srt0.s, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: srt0.s,v 1.6 2006/07/09 19:36:57 miod Exp $ */
2: /* $NetBSD: srt0.s,v 1.1 2000/08/20 14:58:42 mrg Exp $ */
3:
4: /*
5: * Copyright (C) 1995, 1996 Wolfgang Solfrank.
6: * Copyright (C) 1995, 1996 TooLs GmbH.
7: * All rights reserved.
8: *
9: * Redistribution and use in source and binary forms, with or without
10: * modification, are permitted provided that the following conditions
11: * are met:
12: * 1. Redistributions of source code must retain the above copyright
13: * notice, this list of conditions and the following disclaimer.
14: * 2. Redistributions in binary form must reproduce the above copyright
15: * notice, this list of conditions and the following disclaimer in the
16: * documentation and/or other materials provided with the distribution.
17: * 3. All advertising materials mentioning features or use of this software
18: * must display the following acknowledgement:
19: * This product includes software developed by TooLs GmbH.
20: * 4. The name of TooLs GmbH may not be used to endorse or promote products
21: * derived from this software without specific prior written permission.
22: *
23: * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
24: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26: * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
29: * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
30: * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
31: * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
32: * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33: */
34:
35: #include <machine/psl.h>
36: #include <machine/param.h>
37: #include <machine/frame.h>
38: #include <machine/asm.h>
39:
40: /*
41: * Globals
42: */
43: .globl _esym
44: .data
45: _esym: .word 0 /* end of symbol table */
46: .globl _C_LABEL(romp)
47: .align 8
48: .register %g2, #scratch
49: .register %g3, #scratch
50: _C_LABEL(romp): .xword 0 /* openfirmware entry point */
51:
52: /*
53: * Startup entry
54: */
55: .text
56: .globl _start, _C_LABEL(kernel_text)
57: _C_LABEL(kernel_text) = _start
58: _start:
59: nop ! For some reason this is needed to fixup the text section
60:
61: /*
62: * Step 1: Save rom entry pointer -- NOTE this probably needs to change
63: */
64:
65: mov %o4, %g7 ! save prom vector pointer
66: set _C_LABEL(romp), %g1
67: stx %o4, [%g1] ! It's initialized data, I hope
68:
69: /*
70: * Start by creating a stack for ourselves.
71: */
72: /* 64-bit stack */
73: btst 1, %sp
74: set CC64FSZ, %g1 ! Frame Size (negative)
75: bnz 1f
76: set BIAS, %g2 ! Bias (negative)
77: andn %sp, 0x0f, %sp ! 16 byte align, per ELF spec.
78: add %g1, %g2, %g1 ! Frame + Bias
79: 1:
80: sub %sp, %g1, %g1
81: save %g1, %g0, %sp
82:
83: ! mov %i0, %i4 ! Apparently we get our CIF in i0
84:
85: /*
86: * Set the psr into a known state:
87: * Set supervisor mode, interrupt level >= 13, traps enabled
88: */
89: wrpr %g0, 0, %pil ! So I lied
90: wrpr %g0, PSTATE_PRIV+PSTATE_IE, %pstate
91:
92: clr %g4 ! Point %g4 to start of data segment
93: ! only problem is that apparently the
94: ! start of the data segment is 0
95:
96: /*
97: * XXXXXXXX Need to determine what params are passed
98: */
99: call _C_LABEL(setup)
100: nop
101: mov %i1, %o1
102: call _C_LABEL(main)
103: mov %i2, %o0
104: call _C_LABEL(exit)
105: nop
106: call _C_LABEL(_rtt)
107: nop
108:
109: /*
110: * void syncicache(void *start, int size)
111: *
112: * I$ flush. Really simple. Just flush over the whole range.
113: */
114: .align 8
115: .globl _C_LABEL(syncicache)
116: _C_LABEL(syncicache):
117: dec 4, %o1
118: flush %o0
119: brgz,a,pt %o1, _C_LABEL(syncicache)
120: inc 4, %o0
121: retl
122: nop
123:
124: /*
125: * openfirmware(cell* param);
126: *
127: * OpenFirmware entry point
128: *
129: * If we're running in 32-bit mode we need to convert to a 64-bit stack
130: * and 64-bit cells. The cells we'll allocate off the stack for simplicity.
131: */
132: .align 8
133: .globl _C_LABEL(openfirmware)
134: .proc 1
135: FTYPE(openfirmware)
136: _C_LABEL(openfirmware):
137: andcc %sp, 1, %g0
138: bz,pt %icc, 1f
139: sethi %hi(_C_LABEL(romp)), %o1
140:
141: ldx [%o1+%lo(_C_LABEL(romp))], %o4 ! v9 stack, just load the addr and callit
142: save %sp, -CC64FSZ, %sp
143: mov %i0, %o0 ! Copy over our parameter
144: mov %g1, %l1
145: mov %g2, %l2
146: mov %g3, %l3
147: mov %g4, %l4
148: mov %g5, %l5
149: mov %g6, %l6
150: mov %g7, %l7
151: rdpr %pstate, %l0
152: jmpl %i4, %o7
153: wrpr %g0, PSTATE_PROM|PSTATE_IE, %pstate
154: wrpr %l0, %g0, %pstate
155: mov %l1, %g1
156: mov %l2, %g2
157: mov %l3, %g3
158: mov %l4, %g4
159: mov %l5, %g5
160: mov %l6, %g6
161: mov %l7, %g7
162: ret
163: restore %o0, %g0, %o0
164:
165: 1: ! v8 -- need to screw with stack & params
166: save %sp, -CC64FSZ, %sp ! Get a new 64-bit stack frame
167: add %sp, -BIAS, %sp
168: sethi %hi(_C_LABEL(romp)), %o1
169: rdpr %pstate, %l0
170: ldx [%o1+%lo(_C_LABEL(romp))], %o1 ! Do the actual call
171: srl %sp, 0, %sp
172: mov %i0, %o0
173: mov %g1, %l1
174: mov %g2, %l2
175: mov %g3, %l3
176: mov %g4, %l4
177: mov %g5, %l5
178: mov %g6, %l6
179: mov %g7, %l7
180: jmpl %o1, %o7
181: wrpr %g0, PSTATE_PROM|PSTATE_IE, %pstate ! Enable 64-bit addresses for the prom
182: wrpr %l0, 0, %pstate
183: mov %l1, %g1
184: mov %l2, %g2
185: mov %l3, %g3
186: mov %l4, %g4
187: mov %l5, %g5
188: mov %l6, %g6
189: mov %l7, %g7
190: ret
191: restore %o0, %g0, %o0
192:
193: #if 0
194: .data
195: .align 8
196: bootstack:
197: #define STACK_SIZE 0x14000
198: .skip STACK_SIZE
199: ebootstack: ! end (top) of boot stack
200: #endif
CVSweb