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
65 # subroutine to wait for end I/O
68 mvc 0x1f0(16),.Lnewpsw # set up IO interrupt psw
74 .quad 0x0000000080000000,.Lioint
76 .long 0x020a0000,0x80000000+.Lioint
79 # subroutine for loading cards from the reader
83 la %r3,.Lorb # r2 = address of orb into r2
84 la %r5,.Lirb # r4 = address of irb
88 st %r2,4(%r6) # initialize CCW data addresses
93 lctl %c6,%c6,.Lcr6 # set IO subclass mask
96 ssch 0(%r3) # load chunk of 1600 bytes
100 c %r1,0xb8 # compare subchannel number
105 ic %r0,8(%r5) # get device status
106 chi %r0,8 # channel end ?
108 chi %r0,12 # channel end + device end ?
112 s %r0,8(%r3) # r0/8 = number of ccws executed
113 mhi %r0,10 # *10 = number of bytes in ccws
114 lh %r3,10(%r5) # get residual count
115 sr %r0,%r3 # #ccws*80-residual=#bytes read
118 br %r4 # r2 contains the total size
121 ahi %r2,0x640 # add 0x640 to total size
125 l %r0,4(%r6) # update CCW data addresses
136 .Lorb: .long 0x00000000,0x0080ff00,.Lccws
137 .Lirb: .long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
138 .Lcr6: .long 0xff000000
141 .Lcrash:.long 0x000a0000,0x00000000
145 .long 0x02600050,0x00000000
147 .long 0x02200050,0x00000000
150 mvi __LC_AR_MODE_ID,1 # set esame flag
151 slr %r0,%r0 # set cpuid to zero
152 lhi %r1,2 # mode 2 = esame (dump)
153 sigp %r1,%r0,0x12 # switch to esame mode
156 0: lmh %r0,%r15,0(%r13) # clear high-order half of gprs
157 sam31 # switch to 31 bit addressing mode
158 lh %r1,0xb8 # test if subchannel number
159 bct %r1,.Lnoload # is valid
160 l %r1,0xb8 # load ipl subchannel number
161 la %r2,IPL_BS # load start address
162 bas %r14,.Lloader # load rest of ipl image
163 l %r12,.Lparm # pointer to parameter area
164 st %r1,IPL_DEVICE+ARCH_OFFSET-PARMAREA(%r12) # save ipl device number
167 # load parameter file from ipl device
170 l %r2,.Linitrd # ramdisk loc. is temp
171 bas %r14,.Lloader # load parameter file
172 ltr %r2,%r2 # got anything ?
179 clc 0(3,%r4),.L_hdr # if it is HDRx
180 bz .Lagain1 # skip dataset header
181 clc 0(3,%r4),.L_eof # if it is EOFx
182 bz .Lagain1 # skip dateset trailer
185 la %r3,COMMAND_LINE-PARMAREA(%r12) # load adr. of command line
186 mvc 0(256,%r3),0(%r4)
187 mvc 256(256,%r3),256(%r4)
188 mvc 512(256,%r3),512(%r4)
189 mvc 768(122,%r3),768(%r4)
194 chi %r0,0x20 # is it a space ?
202 stc %r0,0(%r2,%r3) # terminate buffer
206 # load ramdisk from ipl device
209 l %r2,.Linitrd # addr of ramdisk
210 st %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12)
211 bas %r14,.Lloader # load ramdisk
212 st %r2,INITRD_SIZE+ARCH_OFFSET-PARMAREA(%r12) # store size of rd
215 st %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12) # no ramdisk found
219 clc 0(3,%r2),.L_hdr # skip HDRx and EOFx
225 # reset files in VM reader
227 stidp .Lcpuid # store cpuid
228 tm .Lcpuid,0xff # running VM ?
234 stsch 0(%r5) # check if irq is pending
235 tm 30(%r5),0x0f # by verifying if any of the
236 bnz .Lwaitforirq # activity or status control
237 tm 31(%r5),0xff # bits is set in the schib
240 bas %r14,.Lirqwait # wait for IO interrupt
241 c %r1,0xb8 # compare subchannel number
249 # everything loaded, go for it
255 .Linitrd:.long _end # default address of initrd
256 .Lparm: .long PARMAREA
257 .Lstartup: .long startup
258 .Lreset:.byte 0xc3,0xc8,0xc1,0xd5,0xc7,0xc5,0x40,0xd9,0xc4,0xd9,0x40
259 .byte 0xc1,0xd3,0xd3,0x40,0xd2,0xc5,0xc5,0xd7,0x40,0xd5,0xd6
260 .byte 0xc8,0xd6,0xd3,0xc4 # "change rdr all keep nohold"
261 .L_eof: .long 0xc5d6c600 /* C'EOF' */
262 .L_hdr: .long 0xc8c4d900 /* C'HDR' */
267 # startup-code at 0x10000, running in absolute addressing mode
268 # this is called either by the ipl loader or directly by PSW restart
269 # or linload or SALIPL
273 j .Lep_startup_normal
276 # This is a list of s390 kernel entry points. At address 0x1000f the number of
277 # valid entry points is stored.
279 # IMPORTANT: Do not change this table, it is s390 kernel ABI!
284 # kdump startup-code at 0x10010, running in 64 bit absolute addressing mode
290 mvi __LC_AR_MODE_ID,1 # set esame flag
291 slr %r0,%r0 # set cpuid to zero
292 lhi %r1,2 # mode 2 = esame (dump)
293 sigp %r1,%r0,0x12 # switch to esame mode
296 0: lmh %r0,%r15,0(%r13) # clear high-order half of gprs
297 sam64 # switch to 64 bit addressing mode
298 basr %r13,0 # get base
300 xc 0x200(256),0x200 # partially clear lowcore
303 lctlg %c0,%c15,0x200(%r0) # initialize control registers
304 stck __LC_LAST_UPDATE_CLOCK
306 mvc __LC_LAST_UPDATE_TIMER(8),6f-.LPG0(%r13)
307 xc __LC_STFL_FAC_LIST(8),__LC_STFL_FAC_LIST
308 # check capabilities against MARCH_{G5,Z900,Z990,Z9_109,Z10}
309 .insn s,0xb2b10000,0 # store facilities @ __LC_STFL_FAC_LIST
310 tm __LC_STFL_FAC_LIST,0x01 # stfle available ?
313 .insn s,0xb2b00000,__LC_STFL_FAC_LIST # store facility list extended
314 # verify if all required facilities are supported by the machine
315 0: la %r1,__LC_STFL_FAC_LIST
316 la %r2,3f+8-.LPG0(%r13)
327 2: l %r15,.Lstack-.LPG0(%r13)
328 ahi %r15,-STACK_FRAME_OVERHEAD
329 la %r2,.Lals_string-.LPG0(%r13)
330 l %r3,.Lsclp_print-.LPG0(%r13)
332 lpsw 3f-.LPG0(%r13) # machine type not good enough, crash
334 .asciz "The Linux kernel requires more recent processor hardware"
336 .long _sclp_print_early
338 .long 0x8000 + (1<<(PAGE_SHIFT+THREAD_ORDER))
340 3: .long 0x000a0000,0x8badcccc
342 # List of facilities that are required. If not all facilities are present
343 # the kernel will crash. Format is number of facility words with bits set,
344 # followed by the facility words.
346 #if defined(CONFIG_MARCH_Z13)
347 .long 2, 0xc100eff2, 0xf46cc800
348 #elif defined(CONFIG_MARCH_ZEC12)
349 .long 2, 0xc100eff2, 0xf46cc800
350 #elif defined(CONFIG_MARCH_Z196)
351 .long 2, 0xc100eff2, 0xf46c0000
352 #elif defined(CONFIG_MARCH_Z10)
353 .long 2, 0xc100eff2, 0xf0680000
354 #elif defined(CONFIG_MARCH_Z9_109)
356 #elif defined(CONFIG_MARCH_Z990)
358 #elif defined(CONFIG_MARCH_Z900)
362 /* Continue with startup code in head64.S */
366 6: .long 0x7fffffff,0xffffffff
368 #include "head_kdump.S"
371 # params at 10400 (setup.h)
374 .long 0,0 # IPL_DEVICE
375 .long 0,0 # INITRD_START
376 .long 0,0 # INITRD_SIZE
377 .long 0,0 # OLDMEM_BASE
378 .long 0,0 # OLDMEM_SIZE
381 .byte "root=/dev/ram0 ro"