2 * Copyright IBM Corp. 1999, 2010
4 * Author(s): Hartmut Penner <hp@de.ibm.com>
5 * Martin Schwidefsky <schwidefsky@de.ibm.com>
6 * Rob van der Heij <rvdhei@iae.nl>
7 * Heiko Carstens <heiko.carstens@de.ibm.com>
9 * There are 5 different IPL methods
10 * 1) load the image directly into ram at address 0 and do an PSW restart
11 * 2) linload will load the image from address 0x10000 to memory 0x10000
12 * and start the code thru LPSW 0x0008000080010000 (VM only, deprecated)
13 * 3) generate the tape ipl header, store the generated image on a tape
15 * In case of SL tape you need to IPL 5 times to get past VOL1 etc
16 * 4) generate the vm reader ipl header, move the generated image to the
17 * VM reader (use option NOH!) and do a ipl from reader (VM only)
18 * 5) direct call of start by the SALIPL loader
19 * We use the cpuid to distinguish between VM and native ipl
20 * params for kernel are pushed to 0x10400 (see setup.h)
24 #include <linux/init.h>
25 #include <linux/linkage.h>
26 #include <asm/asm-offsets.h>
27 #include <asm/thread_info.h>
29 #include <asm/ptrace.h>
37 .long 0x00080000,0x80000000+iplstart # The first 24 bytes are loaded
38 .long 0x02000018,0x60000050 # by ipl to addresses 0-23.
39 .long 0x02000068,0x60000050 # (a PSW and two CCWs).
40 .fill 80-24,1,0x40 # bytes 24-79 are discarded !!
41 .long 0x020000f0,0x60000050 # The next 160 byte are loaded
42 .long 0x02000140,0x60000050 # to addresses 0x18-0xb7
43 .long 0x02000190,0x60000050 # They form the continuation
44 .long 0x020001e0,0x60000050 # of the CCW program started
45 .long 0x02000230,0x60000050 # by ipl and load the range
46 .long 0x02000280,0x60000050 # 0x0f0-0x730 from the image
47 .long 0x020002d0,0x60000050 # to the range 0x0f0-0x730
48 .long 0x02000320,0x60000050 # in memory. At the end of
49 .long 0x02000370,0x60000050 # the channel program the PSW
50 .long 0x020003c0,0x60000050 # at location 0 is loaded.
51 .long 0x02000410,0x60000050 # Initial processing starts
52 .long 0x02000460,0x60000050 # at 0x200 = iplstart.
53 .long 0x020004b0,0x60000050
54 .long 0x02000500,0x60000050
55 .long 0x02000550,0x60000050
56 .long 0x020005a0,0x60000050
57 .long 0x020005f0,0x60000050
58 .long 0x02000640,0x60000050
59 .long 0x02000690,0x60000050
60 .long 0x020006e0,0x20000050
64 # subroutine to set architecture mode
67 mvi __LC_AR_MODE_ID,1 # set esame flag
68 slr %r0,%r0 # set cpuid to zero
69 lhi %r1,2 # mode 2 = esame (dump)
70 sigp %r1,%r0,0x12 # switch to esame mode
73 0: lmh %r0,%r15,0(%r13) # clear high-order half of gprs
74 sam31 # switch to 31 bit addressing mode
78 # subroutine to wait for end I/O
81 mvc 0x1f0(16),.Lnewpsw # set up IO interrupt psw
87 .quad 0x0000000080000000,.Lioint
89 .long 0x020a0000,0x80000000+.Lioint
92 # subroutine for loading cards from the reader
96 la %r3,.Lorb # r2 = address of orb into r2
97 la %r5,.Lirb # r4 = address of irb
101 st %r2,4(%r6) # initialize CCW data addresses
106 lctl %c6,%c6,.Lcr6 # set IO subclass mask
109 ssch 0(%r3) # load chunk of 1600 bytes
113 c %r1,0xb8 # compare subchannel number
118 ic %r0,8(%r5) # get device status
119 chi %r0,8 # channel end ?
121 chi %r0,12 # channel end + device end ?
125 s %r0,8(%r3) # r0/8 = number of ccws executed
126 mhi %r0,10 # *10 = number of bytes in ccws
127 lh %r3,10(%r5) # get residual count
128 sr %r0,%r3 # #ccws*80-residual=#bytes read
131 br %r4 # r2 contains the total size
134 ahi %r2,0x640 # add 0x640 to total size
138 l %r0,4(%r6) # update CCW data addresses
149 .Lorb: .long 0x00000000,0x0080ff00,.Lccws
150 .Lirb: .long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
151 .Lcr6: .long 0xff000000
154 .Lcrash:.long 0x000a0000,0x00000000
158 .long 0x02600050,0x00000000
160 .long 0x02200050,0x00000000
163 bas %r14,.Lsetmode # Immediately switch to 64 bit mode
164 lh %r1,0xb8 # test if subchannel number
165 bct %r1,.Lnoload # is valid
166 l %r1,0xb8 # load ipl subchannel number
167 la %r2,IPL_BS # load start address
168 bas %r14,.Lloader # load rest of ipl image
169 l %r12,.Lparm # pointer to parameter area
170 st %r1,IPL_DEVICE+ARCH_OFFSET-PARMAREA(%r12) # save ipl device number
173 # load parameter file from ipl device
176 l %r2,.Linitrd # ramdisk loc. is temp
177 bas %r14,.Lloader # load parameter file
178 ltr %r2,%r2 # got anything ?
185 clc 0(3,%r4),.L_hdr # if it is HDRx
186 bz .Lagain1 # skip dataset header
187 clc 0(3,%r4),.L_eof # if it is EOFx
188 bz .Lagain1 # skip dateset trailer
191 la %r3,COMMAND_LINE-PARMAREA(%r12) # load adr. of command line
192 mvc 0(256,%r3),0(%r4)
193 mvc 256(256,%r3),256(%r4)
194 mvc 512(256,%r3),512(%r4)
195 mvc 768(122,%r3),768(%r4)
200 chi %r0,0x20 # is it a space ?
208 stc %r0,0(%r2,%r3) # terminate buffer
212 # load ramdisk from ipl device
215 l %r2,.Linitrd # addr of ramdisk
216 st %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12)
217 bas %r14,.Lloader # load ramdisk
218 st %r2,INITRD_SIZE+ARCH_OFFSET-PARMAREA(%r12) # store size of rd
221 st %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12) # no ramdisk found
225 clc 0(3,%r2),.L_hdr # skip HDRx and EOFx
231 # reset files in VM reader
233 stidp .Lcpuid # store cpuid
234 tm .Lcpuid,0xff # running VM ?
240 stsch 0(%r5) # check if irq is pending
241 tm 30(%r5),0x0f # by verifying if any of the
242 bnz .Lwaitforirq # activity or status control
243 tm 31(%r5),0xff # bits is set in the schib
246 bas %r14,.Lirqwait # wait for IO interrupt
247 c %r1,0xb8 # compare subchannel number
255 # everything loaded, go for it
261 .Linitrd:.long _end # default address of initrd
262 .Lparm: .long PARMAREA
263 .Lstartup: .long startup
264 .Lreset:.byte 0xc3,0xc8,0xc1,0xd5,0xc7,0xc5,0x40,0xd9,0xc4,0xd9,0x40
265 .byte 0xc1,0xd3,0xd3,0x40,0xd2,0xc5,0xc5,0xd7,0x40,0xd5,0xd6
266 .byte 0xc8,0xd6,0xd3,0xc4 # "change rdr all keep nohold"
267 .L_eof: .long 0xc5d6c600 /* C'EOF' */
268 .L_hdr: .long 0xc8c4d900 /* C'HDR' */
273 # SALIPL loader support. Based on a patch by Rob van der Heij.
274 # This entry point is called directly from the SALIPL loader and
275 # doesn't need a builtin ipl record.
279 stm %r0,%r15,0x07b0 # store registers
280 bas %r14,.Lsetmode # Immediately switch to 64 bit mode
284 l %r8,.cmd # pointer to command buffer
286 ltr %r9,%r9 # do we have SALIPL parameters?
289 mvc 0(64,%r8),0x00b0 # copy saved registers
290 xc 64(240-64,%r8),0(%r8) # remainder of buffer
291 tr 0(64,%r8),.lowcase
294 mvc 0(240,%r8),0(%r9) # copy iplparms into buffer
297 st %r0,INITRD_SIZE+ARCH_OFFSET-PARMAREA(%r11)
298 st %r0,INITRD_START+ARCH_OFFSET-PARMAREA(%r11)
299 j startup # continue with startup
300 .cmd: .long COMMAND_LINE # address of command line buffer
301 .parm: .long PARMAREA
303 .byte 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07
304 .byte 0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f
305 .byte 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17
306 .byte 0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f
307 .byte 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27
308 .byte 0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f
309 .byte 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37
310 .byte 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f
311 .byte 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47
312 .byte 0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f
313 .byte 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57
314 .byte 0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f
315 .byte 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67
316 .byte 0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f
317 .byte 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77
318 .byte 0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f
320 .byte 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87
321 .byte 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f
322 .byte 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97
323 .byte 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f
324 .byte 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7
325 .byte 0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf
326 .byte 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7
327 .byte 0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf
328 .byte 0xc0,0x81,0x82,0x83,0x84,0x85,0x86,0x87 # .abcdefg
329 .byte 0x88,0x89,0xca,0xcb,0xcc,0xcd,0xce,0xcf # hi
330 .byte 0xd0,0x91,0x92,0x93,0x94,0x95,0x96,0x97 # .jklmnop
331 .byte 0x98,0x99,0xda,0xdb,0xdc,0xdd,0xde,0xdf # qr
332 .byte 0xe0,0xe1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7 # ..stuvwx
333 .byte 0xa8,0xa9,0xea,0xeb,0xec,0xed,0xee,0xef # yz
334 .byte 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7
335 .byte 0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff
338 # startup-code at 0x10000, running in absolute addressing mode
339 # this is called either by the ipl loader or directly by PSW restart
340 # or linload or SALIPL
344 j .Lep_startup_normal
347 # This is a list of s390 kernel entry points. At address 0x1000f the number of
348 # valid entry points is stored.
350 # IMPORTANT: Do not change this table, it is s390 kernel ABI!
355 # kdump startup-code at 0x10010, running in 64 bit absolute addressing mode
361 mvi __LC_AR_MODE_ID,1 # set esame flag
362 slr %r0,%r0 # set cpuid to zero
363 lhi %r1,2 # mode 2 = esame (dump)
364 sigp %r1,%r0,0x12 # switch to esame mode
367 0: lmh %r0,%r15,0(%r13) # clear high-order half of gprs
368 sam64 # switch to 64 bit addressing mode
369 basr %r13,0 # get base
371 xc 0x200(256),0x200 # partially clear lowcore
374 lctlg %c0,%c15,0x200(%r0) # initialize control registers
375 stck __LC_LAST_UPDATE_CLOCK
377 mvc __LC_LAST_UPDATE_TIMER(8),6f-.LPG0(%r13)
378 xc __LC_STFL_FAC_LIST(8),__LC_STFL_FAC_LIST
379 # check capabilities against MARCH_{G5,Z900,Z990,Z9_109,Z10}
380 .insn s,0xb2b10000,0 # store facilities @ __LC_STFL_FAC_LIST
381 tm __LC_STFL_FAC_LIST,0x01 # stfle available ?
384 .insn s,0xb2b00000,__LC_STFL_FAC_LIST # store facility list extended
385 # verify if all required facilities are supported by the machine
386 0: la %r1,__LC_STFL_FAC_LIST
387 la %r2,3f+8-.LPG0(%r13)
398 2: l %r15,.Lstack-.LPG0(%r13)
399 ahi %r15,-STACK_FRAME_OVERHEAD
400 la %r2,.Lals_string-.LPG0(%r13)
401 l %r3,.Lsclp_print-.LPG0(%r13)
403 lpsw 3f-.LPG0(%r13) # machine type not good enough, crash
405 .asciz "The Linux kernel requires more recent processor hardware"
407 .long _sclp_print_early
409 .long 0x8000 + (1<<(PAGE_SHIFT+THREAD_ORDER))
411 3: .long 0x000a0000,0x8badcccc
413 # List of facilities that are required. If not all facilities are present
414 # the kernel will crash. Format is number of facility words with bits set,
415 # followed by the facility words.
417 #if defined(CONFIG_MARCH_Z13)
418 .long 2, 0xc100eff2, 0xf46cc800
419 #elif defined(CONFIG_MARCH_ZEC12)
420 .long 2, 0xc100eff2, 0xf46cc800
421 #elif defined(CONFIG_MARCH_Z196)
422 .long 2, 0xc100eff2, 0xf46c0000
423 #elif defined(CONFIG_MARCH_Z10)
424 .long 2, 0xc100eff2, 0xf0680000
425 #elif defined(CONFIG_MARCH_Z9_109)
427 #elif defined(CONFIG_MARCH_Z990)
429 #elif defined(CONFIG_MARCH_Z900)
433 /* Continue with startup code in head64.S */
437 6: .long 0x7fffffff,0xffffffff
439 #include "head_kdump.S"
442 # params at 10400 (setup.h)
445 .long 0,0 # IPL_DEVICE
446 .long 0,0 # INITRD_START
447 .long 0,0 # INITRD_SIZE
448 .long 0,0 # OLDMEM_BASE
449 .long 0,0 # OLDMEM_SIZE
452 .byte "root=/dev/ram0 ro"