1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#include <linux/init.h>
25#include <asm/setup.h>
26#include <asm/lowcore.h>
27#include <asm/asm-offsets.h>
28#include <asm/thread_info.h>
29#include <asm/page.h>
30#include <asm/cpu.h>
31
32#ifdef CONFIG_64BIT
33#define ARCH_OFFSET 4
34#else
35#define ARCH_OFFSET 0
36#endif
37
38__HEAD
39#ifndef CONFIG_IPL
40 .org 0
41 .long 0x00080000,0x80000000+startup
42#else
43#ifdef CONFIG_IPL_TAPE
44#define IPL_BS 1024
45 .org 0
46 .long 0x00080000,0x80000000+iplstart
47 .long 0x27000000,0x60000001
48 .long 0x02000000,0x20000000+IPL_BS
49 .long 0x00000000,0x00000000
50 .long 0x00000000,0x00000000
51 .long 0x00000000,0x00000000
52 .long 0x00000000,0x00000000
53 .long 0x00000000,0x00000000
54 .long 0x00000000,0x00000000
55 .long 0x00000000,0x00000000
56 .long 0x00000000,0x00000000
57 .long 0x000a0000,0x00000058
58 .long 0x000a0000,0x00000060
59 .long 0x000a0000,0x00000068
60 .long 0x000a0000,0x00000070
61 .long 0x00080000,0x80000000+.Lioint
62
63 .org 0x100
64
65
66
67
68
69.Lloader:
70 st %r14,.Lldret
71 la %r3,.Lorbread
72 la %r5,.Lirb
73 st %r2,.Lccwread+4
74 lctl %c6,%c6,.Lcr6
75 slr %r2,%r2
76.Lldlp:
77 la %r6,3
78.Lssch:
79 ssch 0(%r3)
80 bnz .Llderr
81.Lw4end:
82 bas %r14,.Lwait4io
83 tm 8(%r5),0x82
84 bnz .Lrecov
85 slr %r7,%r7
86 icm %r7,3,10(%r5)
87 lcr %r7,%r7
88 la %r7,IPL_BS(%r7)
89 ar %r2,%r7
90 tm 8(%r5),0x01
91 bnz .Ldone
92 l %r0,.Lccwread+4
93 ar %r0,%r7
94 st %r0,.Lccwread+4
95 b .Lldlp
96.Ldone:
97 l %r14,.Lldret
98 br %r14
99.Lrecov:
100 bas %r14,.Lsense
101 bct %r6,.Lssch
102 b .Llderr
103
104
105
106.Lsense:
107 st %r14,.Lsnsret
108 la %r7,.Lorbsense
109 ssch 0(%r7)
110 bnz .Llderr
111 bas %r14,.Lwait4io
112 l %r14,.Lsnsret
113 tm 8(%r5),0x82
114 bnz .Llderr
115 br %r14
116
117
118
119.Lwait4io:
120 lpsw .Lwaitpsw
121.Lioint:
122 c %r1,0xb8
123 bne .Lwait4io
124 tsch 0(%r5)
125 slr %r0,%r0
126 tm 8(%r5),0x82
127 bnz .Lwtexit
128 tm 8(%r5),0x04
129 bz .Lwait4io
130.Lwtexit:
131 br %r14
132.Llderr:
133 lpsw .Lcrash
134
135 .align 8
136.Lorbread:
137 .long 0x00000000,0x0080ff00,.Lccwread
138 .align 8
139.Lorbsense:
140 .long 0x00000000,0x0080ff00,.Lccwsense
141 .align 8
142.Lccwread:
143 .long 0x02200000+IPL_BS,0x00000000
144.Lccwsense:
145 .long 0x04200001,0x00000000
146.Lwaitpsw:
147 .long 0x020a0000,0x80000000+.Lioint
148
149.Lirb: .long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
150.Lcr6: .long 0xff000000
151 .align 8
152.Lcrash:.long 0x000a0000,0x00000000
153.Lldret:.long 0
154.Lsnsret: .long 0
155#endif
156
157#ifdef CONFIG_IPL_VM
158#define IPL_BS 0x730
159 .org 0
160 .long 0x00080000,0x80000000+iplstart
161 .long 0x02000018,0x60000050
162 .long 0x02000068,0x60000050
163 .fill 80-24,1,0x40
164 .long 0x020000f0,0x60000050
165 .long 0x02000140,0x60000050
166 .long 0x02000190,0x60000050
167 .long 0x020001e0,0x60000050
168 .long 0x02000230,0x60000050
169 .long 0x02000280,0x60000050
170 .long 0x020002d0,0x60000050
171 .long 0x02000320,0x60000050
172 .long 0x02000370,0x60000050
173 .long 0x020003c0,0x60000050
174 .long 0x02000410,0x60000050
175 .long 0x02000460,0x60000050
176 .long 0x020004b0,0x60000050
177 .long 0x02000500,0x60000050
178 .long 0x02000550,0x60000050
179 .long 0x020005a0,0x60000050
180 .long 0x020005f0,0x60000050
181 .long 0x02000640,0x60000050
182 .long 0x02000690,0x60000050
183 .long 0x020006e0,0x20000050
184
185 .org 0xf0
186
187
188
189.Lloader:
190 la %r3,.Lorb
191 la %r5,.Lirb
192 la %r6,.Lccws
193 la %r7,20
194.Linit:
195 st %r2,4(%r6)
196 la %r2,0x50(%r2)
197 la %r6,8(%r6)
198 bct 7,.Linit
199
200 lctl %c6,%c6,.Lcr6
201 slr %r2,%r2
202.Lldlp:
203 ssch 0(%r3)
204 bnz .Llderr
205.Lwait4irq:
206 mvc 0x78(8),.Lnewpsw
207 lpsw .Lwaitpsw
208.Lioint:
209 c %r1,0xb8
210 bne .Lwait4irq
211 tsch 0(%r5)
212
213 slr %r0,%r0
214 ic %r0,8(%r5)
215 chi %r0,8
216 be .Lcont
217 chi %r0,12
218 be .Lcont
219
220 l %r0,4(%r5)
221 s %r0,8(%r3)
222 mhi %r0,10
223 lh %r3,10(%r5)
224 sr %r0,%r3
225 ar %r2,%r0
226
227 br %r14
228
229.Lcont:
230 ahi %r2,0x640
231 la %r6,.Lccws
232 la %r7,20
233.Lincr:
234 l %r0,4(%r6)
235 ahi %r0,0x640
236 st %r0,4(%r6)
237 ahi %r6,8
238 bct 7,.Lincr
239
240 b .Lldlp
241.Llderr:
242 lpsw .Lcrash
243
244 .align 8
245.Lorb: .long 0x00000000,0x0080ff00,.Lccws
246.Lirb: .long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
247.Lcr6: .long 0xff000000
248.Lloadp:.long 0,0
249 .align 8
250.Lcrash:.long 0x000a0000,0x00000000
251.Lnewpsw:
252 .long 0x00080000,0x80000000+.Lioint
253.Lwaitpsw:
254 .long 0x020a0000,0x80000000+.Lioint
255
256 .align 8
257.Lccws: .rept 19
258 .long 0x02600050,0x00000000
259 .endr
260 .long 0x02200050,0x00000000
261#endif
262
263iplstart:
264 lh %r1,0xb8
265 bct %r1,.Lnoload
266 l %r1,0xb8
267 la %r2,IPL_BS
268 bas %r14,.Lloader
269 l %r12,.Lparm
270 st %r1,IPL_DEVICE+ARCH_OFFSET-PARMAREA(%r12)
271
272
273
274
275.Lagain1:
276 l %r2,.Linitrd
277 bas %r14,.Lloader
278 ltr %r2,%r2
279 bz .Lnopf
280 chi %r2,895
281 bnh .Lnotrunc
282 la %r2,895
283.Lnotrunc:
284 l %r4,.Linitrd
285 clc 0(3,%r4),.L_hdr
286 bz .Lagain1
287 clc 0(3,%r4),.L_eof
288 bz .Lagain1
289 la %r5,0(%r4,%r2)
290 lr %r3,%r2
291.Lidebc:
292 tm 0(%r5),0x80
293 bo .Ldocv
294 ahi %r5,-1
295 bct %r3,.Lidebc
296 b .Lnocv
297.Ldocv:
298 l %r3,.Lcvtab
299 tr 0(256,%r4),0(%r3)
300 tr 256(256,%r4),0(%r3)
301 tr 512(256,%r4),0(%r3)
302 tr 768(122,%r4),0(%r3)
303.Lnocv: la %r3,COMMAND_LINE-PARMAREA(%r12)
304 mvc 0(256,%r3),0(%r4)
305 mvc 256(256,%r3),256(%r4)
306 mvc 512(256,%r3),512(%r4)
307 mvc 768(122,%r3),768(%r4)
308 slr %r0,%r0
309 b .Lcntlp
310.Ldelspc:
311 ic %r0,0(%r2,%r3)
312 chi %r0,0x20
313 be .Lcntlp
314 ahi %r2,1
315 b .Leolp
316.Lcntlp:
317 brct %r2,.Ldelspc
318.Leolp:
319 slr %r0,%r0
320 stc %r0,0(%r2,%r3)
321.Lnopf:
322
323
324
325
326.Lagain2:
327 l %r2,.Linitrd
328 st %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12)
329 bas %r14,.Lloader
330 st %r2,INITRD_SIZE+ARCH_OFFSET-PARMAREA(%r12)
331 ltr %r2,%r2
332 bnz .Lrdcont
333 st %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12)
334.Lrdcont:
335 l %r2,.Linitrd
336
337 clc 0(3,%r2),.L_hdr
338 bz .Lagain2
339 clc 0(3,%r2),.L_eof
340 bz .Lagain2
341
342#ifdef CONFIG_IPL_VM
343
344
345
346 stidp __LC_CPUID
347 tm __LC_CPUID,0xff
348 bno .Lnoreset
349 la %r2,.Lreset
350 lhi %r3,26
351 diag %r2,%r3,8
352 la %r5,.Lirb
353 stsch 0(%r5)
354 tm 30(%r5),0x0f
355 bnz .Lwaitforirq
356 tm 31(%r5),0xff
357 bz .Lnoreset
358.Lwaitforirq:
359 mvc 0x78(8),.Lrdrnewpsw
360.Lwaitrdrirq:
361 lpsw .Lrdrwaitpsw
362.Lrdrint:
363 c %r1,0xb8
364 bne .Lwaitrdrirq
365 la %r5,.Lirb
366 tsch 0(%r5)
367.Lnoreset:
368 b .Lnoload
369
370 .align 8
371.Lrdrnewpsw:
372 .long 0x00080000,0x80000000+.Lrdrint
373.Lrdrwaitpsw:
374 .long 0x020a0000,0x80000000+.Lrdrint
375#endif
376
377
378
379
380.Lnoload:
381 l %r1,.Lstartup
382 br %r1
383
384.Linitrd:.long _end + 0x400000
385.Lparm: .long PARMAREA
386.Lstartup: .long startup
387.Lcvtab:.long _ebcasc
388.Lreset:.byte 0xc3,0xc8,0xc1,0xd5,0xc7,0xc5,0x40,0xd9,0xc4,0xd9,0x40
389 .byte 0xc1,0xd3,0xd3,0x40,0xd2,0xc5,0xc5,0xd7,0x40,0xd5,0xd6
390 .byte 0xc8,0xd6,0xd3,0xc4
391.L_eof: .long 0xc5d6c600
392.L_hdr: .long 0xc8c4d900
393
394#endif
395
396
397
398
399
400
401 .org 0x800
402 .globl start
403start:
404 stm %r0,%r15,0x07b0
405 basr %r12,%r0
406.base:
407 l %r11,.parm
408 l %r8,.cmd
409
410 ltr %r9,%r9
411 bp .sk8x8
412
413 mvc 0(64,%r8),0x00b0
414 xc 64(240-64,%r8),0(%r8)
415 tr 0(64,%r8),.lowcase
416 b .gotr
417.sk8x8:
418 mvc 0(240,%r8),0(%r9)
419.gotr:
420 l %r10,.tbl
421 tr 0(240,%r8),0(%r10)
422 slr %r0,%r0
423 st %r0,INITRD_SIZE+ARCH_OFFSET-PARMAREA(%r11)
424 st %r0,INITRD_START+ARCH_OFFSET-PARMAREA(%r11)
425 j startup
426.tbl: .long _ebcasc
427.cmd: .long COMMAND_LINE
428.parm: .long PARMAREA
429.lowcase:
430 .byte 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07
431 .byte 0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f
432 .byte 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17
433 .byte 0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f
434 .byte 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27
435 .byte 0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f
436 .byte 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37
437 .byte 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f
438 .byte 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47
439 .byte 0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f
440 .byte 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57
441 .byte 0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f
442 .byte 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67
443 .byte 0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f
444 .byte 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77
445 .byte 0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f
446
447 .byte 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87
448 .byte 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f
449 .byte 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97
450 .byte 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f
451 .byte 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7
452 .byte 0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf
453 .byte 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7
454 .byte 0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf
455 .byte 0xc0,0x81,0x82,0x83,0x84,0x85,0x86,0x87
456 .byte 0x88,0x89,0xca,0xcb,0xcc,0xcd,0xce,0xcf
457 .byte 0xd0,0x91,0x92,0x93,0x94,0x95,0x96,0x97
458 .byte 0x98,0x99,0xda,0xdb,0xdc,0xdd,0xde,0xdf
459 .byte 0xe0,0xe1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7
460 .byte 0xa8,0xa9,0xea,0xeb,0xec,0xed,0xee,0xef
461 .byte 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7
462 .byte 0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff
463
464
465
466
467
468
469 .org 0x10000
470startup:basr %r13,0
471.LPG0:
472 xc 0x200(256),0x200
473 xc 0x300(256),0x300
474 l %r1,5f-.LPG0(%r13)
475 stck 0(%r1)
476 spt 6f-.LPG0(%r13)
477 mvc __LC_LAST_UPDATE_CLOCK(8),0(%r1)
478 mvc __LC_LAST_UPDATE_TIMER(8),6f-.LPG0(%r13)
479 mvc __LC_EXIT_TIMER(8),5f-.LPG0(%r13)
480#ifndef CONFIG_MARCH_G5
481
482 xc __LC_STFL_FAC_LIST(8),__LC_STFL_FAC_LIST
483 stfl __LC_STFL_FAC_LIST
484 tm __LC_STFL_FAC_LIST,0x01
485 jz 0f
486 la %r0,0
487 .insn s,0xb2b00000,__LC_STFL_FAC_LIST
4880: l %r0,__LC_STFL_FAC_LIST
489 n %r0,2f+8-.LPG0(%r13)
490 cl %r0,2f+8-.LPG0(%r13)
491 jne 1f
492 l %r0,__LC_STFL_FAC_LIST+4
493 n %r0,2f+12-.LPG0(%r13)
494 cl %r0,2f+12-.LPG0(%r13)
495 je 3f
4961: l %r15,.Lstack-.LPG0(%r13)
497 ahi %r15,1<<(PAGE_SHIFT+THREAD_ORDER)
498 ahi %r15,-96
499 la %r2,.Lals_string-.LPG0(%r13)
500 l %r3,.Lsclp_print-.LPG0(%r13)
501 basr %r14,%r3
502 lpsw 2f-.LPG0(%r13)
503.Lals_string:
504 .asciz "The Linux kernel requires more recent processor hardware"
505.Lsclp_print:
506 .long _sclp_print_early
507.Lstack:
508 .long init_thread_union
509 .align 16
5102: .long 0x000a0000,0x8badcccc
511
512
513 .long 0xc100efe3, 0xf0680000
514
515 .long 0xc100efc3, 0x00000000
516
517 .long 0xc0002000, 0x00000000
518
519 .long 0xc0000000, 0x00000000
520#endif
521#else
522
523 .long 0x8100c880, 0x00000000
524
525 .long 0x8100c880, 0x00000000
526
527 .long 0x80002000, 0x00000000
528
529 .long 0x80000000, 0x00000000
530#endif
531#endif
5323:
533#endif
534
535 l %r13,4f-.LPG0(%r13)
536 b 0(%r13)
537 .align 4
5384: .long startup_continue
5395: .long sched_clock_base_cc
540 .align 8
5416: .long 0x7fffffff,0xffffffff
542
543
544
545
546 .org PARMAREA
547 .long 0,0
548 .long 0,0
549 .long 0,0
550
551 .org COMMAND_LINE
552 .byte "root=/dev/ram0 ro"
553 .byte 0
554
555#ifdef CONFIG_64BIT
556#include "head64.S"
557#else
558#include "head31.S"
559#endif
560