]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/blob - arch/s390/kernel/head.S
Merge remote-tracking branches 'spi/topic/dw', 'spi/topic/dw-mid', 'spi/topic/fsl...
[mirror_ubuntu-hirsute-kernel.git] / arch / s390 / kernel / head.S
1 /*
2 * Copyright IBM Corp. 1999, 2010
3 *
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>
8 *
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
14 * and ipl from it
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)
21 *
22 */
23
24 #include <linux/init.h>
25 #include <linux/linkage.h>
26 #include <asm/asm-offsets.h>
27 #include <asm/thread_info.h>
28 #include <asm/page.h>
29 #include <asm/ptrace.h>
30
31 #define ARCH_OFFSET 4
32
33 __HEAD
34
35 #define IPL_BS 0x730
36 .org 0
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
61
62 .org 0x200
63
64 #
65 # subroutine to wait for end I/O
66 #
67 .Lirqwait:
68 mvc 0x1f0(16),.Lnewpsw # set up IO interrupt psw
69 lpsw .Lwaitpsw
70 .Lioint:
71 br %r14
72 .align 8
73 .Lnewpsw:
74 .quad 0x0000000080000000,.Lioint
75 .Lwaitpsw:
76 .long 0x020a0000,0x80000000+.Lioint
77
78 #
79 # subroutine for loading cards from the reader
80 #
81 .Lloader:
82 la %r4,0(%r14)
83 la %r3,.Lorb # r2 = address of orb into r2
84 la %r5,.Lirb # r4 = address of irb
85 la %r6,.Lccws
86 la %r7,20
87 .Linit:
88 st %r2,4(%r6) # initialize CCW data addresses
89 la %r2,0x50(%r2)
90 la %r6,8(%r6)
91 bct 7,.Linit
92
93 lctl %c6,%c6,.Lcr6 # set IO subclass mask
94 slr %r2,%r2
95 .Lldlp:
96 ssch 0(%r3) # load chunk of 1600 bytes
97 bnz .Llderr
98 .Lwait4irq:
99 bas %r14,.Lirqwait
100 c %r1,0xb8 # compare subchannel number
101 bne .Lwait4irq
102 tsch 0(%r5)
103
104 slr %r0,%r0
105 ic %r0,8(%r5) # get device status
106 chi %r0,8 # channel end ?
107 be .Lcont
108 chi %r0,12 # channel end + device end ?
109 be .Lcont
110
111 l %r0,4(%r5)
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
116 ar %r2,%r0
117
118 br %r4 # r2 contains the total size
119
120 .Lcont:
121 ahi %r2,0x640 # add 0x640 to total size
122 la %r6,.Lccws
123 la %r7,20
124 .Lincr:
125 l %r0,4(%r6) # update CCW data addresses
126 ahi %r0,0x640
127 st %r0,4(%r6)
128 ahi %r6,8
129 bct 7,.Lincr
130
131 b .Lldlp
132 .Llderr:
133 lpsw .Lcrash
134
135 .align 8
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
139 .Lloadp:.long 0,0
140 .align 8
141 .Lcrash:.long 0x000a0000,0x00000000
142
143 .align 8
144 .Lccws: .rept 19
145 .long 0x02600050,0x00000000
146 .endr
147 .long 0x02200050,0x00000000
148
149 iplstart:
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
154 bras %r13,0f
155 .fill 16,4,0x0
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
165
166 #
167 # load parameter file from ipl device
168 #
169 .Lagain1:
170 l %r2,.Linitrd # ramdisk loc. is temp
171 bas %r14,.Lloader # load parameter file
172 ltr %r2,%r2 # got anything ?
173 bz .Lnopf
174 chi %r2,895
175 bnh .Lnotrunc
176 la %r2,895
177 .Lnotrunc:
178 l %r4,.Linitrd
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
183 la %r5,0(%r4,%r2)
184 lr %r3,%r2
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)
190 slr %r0,%r0
191 b .Lcntlp
192 .Ldelspc:
193 ic %r0,0(%r2,%r3)
194 chi %r0,0x20 # is it a space ?
195 be .Lcntlp
196 ahi %r2,1
197 b .Leolp
198 .Lcntlp:
199 brct %r2,.Ldelspc
200 .Leolp:
201 slr %r0,%r0
202 stc %r0,0(%r2,%r3) # terminate buffer
203 .Lnopf:
204
205 #
206 # load ramdisk from ipl device
207 #
208 .Lagain2:
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
213 ltr %r2,%r2
214 bnz .Lrdcont
215 st %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12) # no ramdisk found
216 .Lrdcont:
217 l %r2,.Linitrd
218
219 clc 0(3,%r2),.L_hdr # skip HDRx and EOFx
220 bz .Lagain2
221 clc 0(3,%r2),.L_eof
222 bz .Lagain2
223
224 #
225 # reset files in VM reader
226 #
227 stidp .Lcpuid # store cpuid
228 tm .Lcpuid,0xff # running VM ?
229 bno .Lnoreset
230 la %r2,.Lreset
231 lhi %r3,26
232 diag %r2,%r3,8
233 la %r5,.Lirb
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
238 bz .Lnoreset
239 .Lwaitforirq:
240 bas %r14,.Lirqwait # wait for IO interrupt
241 c %r1,0xb8 # compare subchannel number
242 bne .Lwaitforirq
243 la %r5,.Lirb
244 tsch 0(%r5)
245 .Lnoreset:
246 b .Lnoload
247
248 #
249 # everything loaded, go for it
250 #
251 .Lnoload:
252 l %r1,.Lstartup
253 br %r1
254
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' */
263 .align 8
264 .Lcpuid:.fill 8,1,0
265
266 #
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
270 #
271 .org 0x10000
272 ENTRY(startup)
273 j .Lep_startup_normal
274 .org 0x10008
275 #
276 # This is a list of s390 kernel entry points. At address 0x1000f the number of
277 # valid entry points is stored.
278 #
279 # IMPORTANT: Do not change this table, it is s390 kernel ABI!
280 #
281 .ascii "S390EP"
282 .byte 0x00,0x01
283 #
284 # kdump startup-code at 0x10010, running in 64 bit absolute addressing mode
285 #
286 .org 0x10010
287 ENTRY(startup_kdump)
288 j .Lep_startup_kdump
289 .Lep_startup_normal:
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
294 bras %r13,0f
295 .fill 16,4,0x0
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
299 .LPG0:
300 xc 0x200(256),0x200 # partially clear lowcore
301 xc 0x300(256),0x300
302 xc 0xe00(256),0xe00
303 lctlg %c0,%c15,0x200(%r0) # initialize control registers
304 stck __LC_LAST_UPDATE_CLOCK
305 spt 6f-.LPG0(%r13)
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 ?
311 jz 0f
312 la %r0,1
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)
317 l %r3,0(%r2)
318 1: l %r0,0(%r1)
319 n %r0,4(%r2)
320 cl %r0,4(%r2)
321 jne 2f
322 la %r1,4(%r1)
323 la %r2,4(%r2)
324 ahi %r3,-1
325 jnz 1b
326 j 4f
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)
331 basr %r14,%r3
332 lpsw 3f-.LPG0(%r13) # machine type not good enough, crash
333 .Lals_string:
334 .asciz "The Linux kernel requires more recent processor hardware"
335 .Lsclp_print:
336 .long _sclp_print_early
337 .Lstack:
338 .long 0x8000 + (1<<(PAGE_SHIFT+THREAD_ORDER))
339 .align 16
340 3: .long 0x000a0000,0x8badcccc
341
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.
345
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)
355 .long 1, 0xc100efc2
356 #elif defined(CONFIG_MARCH_Z990)
357 .long 1, 0xc0002000
358 #elif defined(CONFIG_MARCH_Z900)
359 .long 1, 0xc0000000
360 #endif
361 4:
362 /* Continue with startup code in head64.S */
363 jg startup_continue
364
365 .align 8
366 6: .long 0x7fffffff,0xffffffff
367
368 #include "head_kdump.S"
369
370 #
371 # params at 10400 (setup.h)
372 #
373 .org PARMAREA
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
379
380 .org COMMAND_LINE
381 .byte "root=/dev/ram0 ro"
382 .byte 0
383
384 .org 0x11000