|
|
1.1 root 1: /******************************************************************************
2: * Copyright (c) 2004, 2011 IBM Corporation
3: * All rights reserved.
4: * This program and the accompanying materials
5: * are made available under the terms of the BSD License
6: * which accompanies this distribution, and is available at
7: * http://www.opensource.org/licenses/bsd-license.php
8: *
9: * Contributors:
10: * IBM Corporation - initial implementation
11: *****************************************************************************/
12:
13: /* SLOF for QEMU -- boot code.
14: * Initial entry point
15: */
16:
17: #include "termctrl.h"
18: #include <product.h>
19: #include <xvect.h>
20: #include <cpu.h>
21: #include <macros.h>
22:
23: /* qemu entry:
24: *
25: * __start loaded at 0x100
26: *
27: * CPU 0 starts at 0 with GPR3 pointing to the flat devtree
28: *
29: * All other CPUs are held in stopped state by qemu and are
30: * started via RTAS
31: */
32: .text
33: .globl __start
34: __start:
35: b _start
36: .long 0xDEADBEE0
37: .long 0x0 /* size */
38: .long 0x0 /* crc */
39: .long relTag - __start
40:
41: /* Some exception vectors
42: *
43: * FIXME: Also need 0280, 0380, 0f20, etc.
44: */
45:
46: .irp i, 0x0100,0x0180,0x0200,0x0280,0x0300,0x0380,0x0400,0x0500, \
47: 0x0600,0x0700,0x0800,0x0900,0x0a00,0x0b00,0x0c00,0x0d00, \
48: 0x0e00,0x0f00,0x1000,0x1100,0x1200,0x1300,0x1400,0x1500, \
49: 0x1600,0x1700, \
50: 0x1800,0x1900,0x1a00,0x1b00,0x1c00,0x1d00,0x1e00,0x1f00, \
51: 0x2000,0x2100,0x2200,0x2300,0x2400,0x2500,0x2600,0x2700, \
52: 0x2800,0x2900,0x2a00,0x2b00,0x2c00,0x2d00,0x2e00
53: . = \i
54:
55: /* enable this if you get exceptions before the console works */
56: /* this will allow using the hardware debugger to see where */
57: /* it traps, and with what register values etc. */
58: // b $
59:
60: mtsprg 0,r0
61: mfctr r0
62: mtsprg 2,r0
63: mflr r0
64: // 10
65: mtsprg 3,r0
66: ld r0, (\i + 0x160)(0)
67: mtctr r0
68: li r0, \i + 0x100
69: // 20
70: bctr
71:
72: . = \i + 0x60
73: .quad intHandler2C
74: .endr
75:
76: . = XVECT_M_HANDLER - 0x100
77: .quad 0x00
78: .text
79:
80: /* Here's the startup code for the master CPU */
81: .org 0x4000 - 0x100
82: _start:
83: /* Save device-tree pointer */
84: mr r31,r3
85:
86: /* Switch to 64-bit mode with 64-bit exceptions */
87: #define MSR_SF_LG 63 /* Enable 64 bit mode */
88: #define MSR_ISF_LG 61 /* Interrupt 64b mode valid on 630 */
89: #define __MASK(X) (1<<(X))
90: #define MSR_SF __MASK(MSR_SF_LG) /* Enable 64 bit mode */
91: #define MSR_ISF __MASK(MSR_ISF_LG) /* Interrupt 64b mode */
92: mfmsr r11 /* grab the current MSR */
93: li r12,(MSR_SF | MSR_ISF)@highest
94: sldi r12,r12,48
95: or r11,r11,r12
96: mtmsrd r11
97: isync
98:
99: /* Early greet */
100: li r3,10
101: bl putc
102: li r3,13
103: bl putc
104: li r3,10
105: bl putc
106: li r3,'S'
107: bl putc
108:
109: li r3,'L'
110: bl putc
111: li r3,'O'
112: bl putc
113: li r3,'F'
114: bl putc
115:
116: /* give live sign *****************************/
117: bl 0f
118: .ascii TERM_CTRL_RESET
119: .ascii TERM_CTRL_CRSOFF
120: .ascii " **********************************************************************"
121: .ascii "\r\n"
122: .ascii TERM_CTRL_BRIGHT
123: .ascii PRODUCT_NAME
124: .ascii " Starting\r\n"
125: .ascii TERM_CTRL_RESET
126: .ascii " Build Date = ", __DATE__, " ", __TIME__
127: .ascii "\r\n"
128: .ascii " FW Version = " , RELEASE
129: .ascii "\r\n\0"
130: .align 2
131: 0: mflr r3
132: bl io_print
133:
134: /* go! */
135: li r3,__startC@l
136: mtctr r3
137: bctrl
138:
139: /* write a character to the HV console */
140: putc: sldi r6,r3,(24+32)
141: li r3,0x58
142: li r4,0
143: li r5,1
144: .long 0x44000022
145: blr
146:
147: relTag:
148: .ascii RELEASE
149: .ascii "\0"
150: .align 2
151:
152: C_ENTRY(proceedInterrupt)
153:
154: ld r3,exception_stack_frame@got(r2)
155: ld r1,0(r3)
156:
157: .irp i, 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16, \
158: 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, \
159: 27, 28, 29, 30, 31
160: ld r\i, 0x30+\i*8 (r1)
161: .endr
162:
163: ld r14,0x138(r1);
164: mtsrr0 r14
165:
166: ld r14,0x140(r1);
167: mtsrr1 r14
168:
169: ld r14,0x148(r1);
170: mtcr r14
171:
172: ld 0,XVECT_M_HANDLER(0)
173: mtctr 0
174:
175: ld r0,0x30(r1); # restore vector number
176: ld r1,0x38(r1);
177:
178: bctr
179:
180: intHandler2C:
181: mtctr r1 # save old stack pointer
182: lis r1,0x4
183: stdu r1, -0x160(r1)
184: .irp i, 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16, \
185: 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, \
186: 27, 28, 29, 30, 31
187: std r\i, 0x30+\i*8 (r1)
188: .endr
189:
190: std r0,0x30(r1); # save vector number
191:
192: mfctr r14
193: std r14,0x38(r1); # save old r1
194:
195: mfsrr0 r14
196: std r14,0x138(r1);
197:
198: mfsrr1 r14
199: std r14,0x140(r1);
200:
201: mfcr r14
202: std r14,0x148(r1);
203:
204: mfxer r14
205: std r14,0x150(r1);
206:
207: bl toc_init
208:
209: ld r3,exception_stack_frame@got(r2)
210: std r1,0(r3)
211:
212:
213: mr r3,r0
214: bl .c_interrupt
215:
216: ld r14,0x138(r1);
217: mtsrr0 r14
218:
219: ld r14,0x140(r1);
220: mtsrr1 r14
221:
222: ld r14,0x148(r1);
223: mtcr r14
224:
225: ld r14,0x150(r1);
226: mtxer r14
227:
228:
229: .irp i, 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16, \
230: 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, \
231: 27, 28, 29, 30, 31
232: ld r\i, 0x30+\i*8 (r1)
233: .endr
234:
235: ld r1,0x38(r1);
236:
237: mfsprg r0,2
238: mtctr r0
239: mfsprg r0,3
240: mtlr r0
241: mfsprg r0,0
242: rfid
243:
244: /* Set exception handler for given exception vector.
245: r3: exception vector offset
246: r4: exception handler
247: */
248: .globl .set_exception
249: .set_exception:
250: .globl set_exception
251: set_exception:
252: ld r4,0x0(r4)
253: .globl .set_exception_asm
254: .set_exception_asm:
255: .globl set_exception_asm
256: set_exception_asm:
257: std r4, 0x60(r3) # fixme diff 1f - 0b
258: blr
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.