Initial commit of OpenSPARC T2 architecture model.
[OpenSPARC-T2-SAM] / obp / tools / promif / crt0.s
CommitLineData
920dae64
AT
1/*
2* ========== Copyright Header Begin ==========================================
3*
4* Hypervisor Software File: crt0.s
5*
6* Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
7*
8* - Do no alter or remove copyright notices
9*
10* - Redistribution and use of this software in source and binary forms, with
11* or without modification, are permitted provided that the following
12* conditions are met:
13*
14* - Redistribution of source code must retain the above copyright notice,
15* this list of conditions and the following disclaimer.
16*
17* - Redistribution in binary form must reproduce the above copyright notice,
18* this list of conditions and the following disclaimer in the
19* documentation and/or other materials provided with the distribution.
20*
21* Neither the name of Sun Microsystems, Inc. or the names of contributors
22* may be used to endorse or promote products derived from this software
23* without specific prior written permission.
24*
25* This software is provided "AS IS," without a warranty of any kind.
26* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
27* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
28* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
29* MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
30* ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
31* DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN
32* OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR
33* FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
34* DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
35* ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
36* SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
37*
38* You acknowledge that this software is not designed, licensed or
39* intended for use in the design, construction, operation or maintenance of
40* any nuclear facility.
41*
42* ========== Copyright Header End ============================================
43*/
44/*
45 * Copyright (c) 1986-1995, 2003 Sun Microsystems, Inc. All Rights Reserved
46 * Use is subject to license terms.
47 */
48
49#pragma ident "@(#)srt0.s 1.4 01/03/26 SMI"
50
51/*
52 * srt0.s - standalone startup code
53 * Generate the code with a fake a.out header if INETBOOT is defined.
54 * inetboot is loaded directly by the PROM, other booters are loaded via
55 * a bootblk and don't need the fake a.out header.
56 */
57
58#include <sys/asm_linkage.h>
59#include <sys/cpu.h>
60#include <sys/privregs.h>
61#include <sys/stack.h>
62
63 .seg ".text"
64 .align 8
65 .global end
66 .global edata
67 .global main
68
69
70/*
71 * The following variables are machine-dependent and are set in fiximp.
72 * Space is allocated there.
73 */
74 .seg ".data"
75 .align 8
76
77_local_p1275cif:
78 .word 0
79
80#define STACK_SIZE 0x14000
81 .skip STACK_SIZE
82.ebootstack: ! end (top) of boot stack
83
84/*
85 * The following variables are more or less machine-independent
86 * (or are set outside of fiximp).
87 */
88
89 .seg ".text"
90 .align 8
91 .global prom_exit_to_mon
92 .type prom_exit_to_mon, #function
93
94
95! Each standalone program is responsible for its own stack. Our strategy
96! is that each program which uses this runtime code creates a stack just
97! below its relocation address. Previous windows may (and probably do)
98! have frames allocated on the prior stack; leave them alone. Starting with
99! this window, allocate our own stack frames for our windows. (Overflows
100! or a window flush would then pass seamlessly from our stack to the old.)
101! RESTRICTION: A program running at some relocation address must not exec
102! another which will run at the very same address: the stacks would collide.
103!
104! Careful: don't touch %o4 until the save, since it contains the
105! address of the IEEE 1275 SPARC v9 CIF handler (linkage to the prom).
106!
107!
108! We cannot write to any symbols until we are relocated.
109! Note that with the advent of 5.x boot, we no longer have to
110! relocate ourselves, but this code is kept around cuz we *know*
111! someone would scream if we did the obvious.
112!
113
114
115#ifndef INETBOOT
116
117!
118! Enter here for all booters loaded by a bootblk program.
119! Careful, do not lose value of the SPARC v9 P1275 CIF handler in %o4
120! Setup temporary 32 bit stack at _start.
121!
122! NB: Until the common startup code, AM may not be set.
123!
124
125 ENTRY_NP(_start)
126 set _start - 0x10000, %o1
127! and %o1, ~(STACK_ALIGN64-1), %o1
128! save %o1, -SA(MINFRAME64), %sp ! %i4: 1275 sparcv9 CIF handler
129 and %o6, (STACK_ALIGN64-1), %o2
130 add %o1, -SA(MINFRAME64), %o1
131 save %o1, %o2, %sp ! %i4: 1275 sparcv9 CIF handler
132! ta 0x7f
133 !
134 ! zero the bss
135 !
136 sethi %hi(edata), %o0 ! Beginning of bss
137 or %o0, %lo(edata), %o0
138 set end, %i2
139 call bzero
140 sub %i2, %o0, %o1 ! end - edata = size of bss
141
142#endif !INETBOOT
143
144!
145! All booters end up here...
146!
147
1489:
149#ifndef __sparcv9
150 /*
151 * Use our own 32 bit stack now. But, zero it first (do we have to?)
152 */
153 set .ebootstack, %o0
154 set STACK_SIZE, %o1
155 sub %o0, %o1, %o1
1561: dec 4, %o0
157 st %g0, [%o0]
158 cmp %o0, %o1
159 bne 1b
160 nop
161
162 set .ebootstack, %o0
163 and %o0, ~(STACK_ALIGN64-1), %o0
164 sub %o0, SA64(MINFRAME64), %sp
165
166 /*
167 * Set the psr into a known state:
168 * Set AM, supervisor mode, interrupt level >= 13, traps enabled
169 */
170 wrpr %g0, 13, %pil
171 wr %g0, FPRS_FEF, %fprs
172 wrpr %g0, PSTATE_PEF+PSTATE_AM+PSTATE_PRIV+PSTATE_IE, %pstate
173 nop; nop; nop
174 sethi %hi(_local_p1275cif), %o2
175 st %i4, [%o2 + %lo(_local_p1275cif)]
176#else
177 wrpr %g0, 13, %pil
178 wr %g0, FPRS_FEF, %fprs
179 wrpr %g0, PSTATE_PEF+PSTATE_PRIV+PSTATE_IE, %pstate
180 nop; nop; nop
181 sethi %hi(_local_p1275cif), %o2
182 stx %i4, [%o2 + %lo(_local_p1275cif)]
183#endif
184
185 mov %g0, %o0
186 call prom_init ! prom-init(NULL, prom-cookie)
187 mov %i4, %o1 ! SPARCV9/CIF
188
189 mov %g0, %o0
190 call main ! main(0)
191 mov %g0, %o1 !
192
193 call prom_exit_to_mon ! can't happen .. :-)
194 nop
195 SET_SIZE(_start)
196
197
198/*
199 * The interface for a 32-bit client program
200 * calling the 64-bit romvec OBP.
201 */
202
203#if defined(lint)
204#include <sys/promif.h>
205
206/* ARGSUSED */
207int
208client_handler(void *cif_handler, cell_t **)
209{}
210
211#else /* !lint */
212
213 ENTRY_NP(client_handler)
214 save %sp, -SA64(MINFRAME64), %sp ! 32 bit frame, 64 bit sized
215#ifndef __sparcv9
216 mov %i1, %o0
217 rdpr %pstate, %l1 ! Get the present pstate value
218 wrpr %l1, PSTATE_AM, %pstate ! Set PSTATE_AM = 0
219 jmpl %i0, %o7 ! Call cif handler
220 sub %sp, V9BIAS64, %sp ! delay; Now a 64 bit frame
221 rdpr %pstate, %l1 ! Get the present pstate value
222 wrpr %l1, PSTATE_AM, %pstate ! Set PSTATE_AM = 1
223#else
224 mov %i1, %o0
225 jmpl %i0, %o7 ! Call cif handler
226 nop
227#endif
228 ret ! Return result ...
229 restore %o0, %g0, %o0 ! delay; result in %o0
230
231 SET_SIZE(client_handler)
232
233
234 ENTRY_NP(set_intr) ! Set the interrupt level.
235 rdpr %pil, %o1 ! Save existing intr level.
236 wrpr %o0, 0, %pil ! Write new intr level.
237 retl
238 mov %o1, %o0 ! Return old intr level.
239
240 SET_SIZE(set_intr)
241
242#endif /* !lint */