Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / 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
30 #define ARCH_OFFSET     4
31
32 __HEAD
33
34 #define IPL_BS  0x730
35         .org    0
36         .long   0x00080000,0x80000000+iplstart  # The first 24 bytes are loaded
37         .long   0x02000018,0x60000050           # by ipl to addresses 0-23.
38         .long   0x02000068,0x60000050           # (a PSW and two CCWs).
39         .fill   80-24,1,0x40                    # bytes 24-79 are discarded !!
40         .long   0x020000f0,0x60000050           # The next 160 byte are loaded
41         .long   0x02000140,0x60000050           # to addresses 0x18-0xb7
42         .long   0x02000190,0x60000050           # They form the continuation
43         .long   0x020001e0,0x60000050           # of the CCW program started
44         .long   0x02000230,0x60000050           # by ipl and load the range
45         .long   0x02000280,0x60000050           # 0x0f0-0x730 from the image
46         .long   0x020002d0,0x60000050           # to the range 0x0f0-0x730
47         .long   0x02000320,0x60000050           # in memory. At the end of
48         .long   0x02000370,0x60000050           # the channel program the PSW
49         .long   0x020003c0,0x60000050           # at location 0 is loaded.
50         .long   0x02000410,0x60000050           # Initial processing starts
51         .long   0x02000460,0x60000050           # at 0x200 = iplstart.
52         .long   0x020004b0,0x60000050
53         .long   0x02000500,0x60000050
54         .long   0x02000550,0x60000050
55         .long   0x020005a0,0x60000050
56         .long   0x020005f0,0x60000050
57         .long   0x02000640,0x60000050
58         .long   0x02000690,0x60000050
59         .long   0x020006e0,0x20000050
60
61         .org    0x200
62 #
63 # subroutine to set architecture mode
64 #
65 .Lsetmode:
66         mvi     __LC_AR_MODE_ID,1       # set esame flag
67         slr     %r0,%r0                 # set cpuid to zero
68         lhi     %r1,2                   # mode 2 = esame (dump)
69         sigp    %r1,%r0,0x12            # switch to esame mode
70         bras    %r13,0f
71         .fill   16,4,0x0
72 0:      lmh     %r0,%r15,0(%r13)        # clear high-order half of gprs
73         sam31                           # switch to 31 bit addressing mode
74         br      %r14
75
76 #
77 # subroutine to wait for end I/O
78 #
79 .Lirqwait:
80         mvc     0x1f0(16),.Lnewpsw      # set up IO interrupt psw
81         lpsw    .Lwaitpsw
82 .Lioint:
83         br      %r14
84         .align  8
85 .Lnewpsw:
86         .quad   0x0000000080000000,.Lioint
87 .Lwaitpsw:
88         .long   0x020a0000,0x80000000+.Lioint
89
90 #
91 # subroutine for loading cards from the reader
92 #
93 .Lloader:
94         la      %r4,0(%r14)
95         la      %r3,.Lorb               # r2 = address of orb into r2
96         la      %r5,.Lirb               # r4 = address of irb
97         la      %r6,.Lccws
98         la      %r7,20
99 .Linit:
100         st      %r2,4(%r6)              # initialize CCW data addresses
101         la      %r2,0x50(%r2)
102         la      %r6,8(%r6)
103         bct     7,.Linit
104
105         lctl    %c6,%c6,.Lcr6           # set IO subclass mask
106         slr     %r2,%r2
107 .Lldlp:
108         ssch    0(%r3)                  # load chunk of 1600 bytes
109         bnz     .Llderr
110 .Lwait4irq:
111         bas     %r14,.Lirqwait
112         c       %r1,0xb8                # compare subchannel number
113         bne     .Lwait4irq
114         tsch    0(%r5)
115
116         slr     %r0,%r0
117         ic      %r0,8(%r5)              # get device status
118         chi     %r0,8                   # channel end ?
119         be      .Lcont
120         chi     %r0,12                  # channel end + device end ?
121         be      .Lcont
122
123         l       %r0,4(%r5)
124         s       %r0,8(%r3)              # r0/8 = number of ccws executed
125         mhi     %r0,10                  # *10 = number of bytes in ccws
126         lh      %r3,10(%r5)             # get residual count
127         sr      %r0,%r3                 # #ccws*80-residual=#bytes read
128         ar      %r2,%r0
129
130         br      %r4                     # r2 contains the total size
131
132 .Lcont:
133         ahi     %r2,0x640               # add 0x640 to total size
134         la      %r6,.Lccws
135         la      %r7,20
136 .Lincr:
137         l       %r0,4(%r6)              # update CCW data addresses
138         ahi     %r0,0x640
139         st      %r0,4(%r6)
140         ahi     %r6,8
141         bct     7,.Lincr
142
143         b       .Lldlp
144 .Llderr:
145         lpsw    .Lcrash
146
147         .align  8
148 .Lorb:  .long   0x00000000,0x0080ff00,.Lccws
149 .Lirb:  .long   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
150 .Lcr6:  .long   0xff000000
151 .Lloadp:.long   0,0
152         .align  8
153 .Lcrash:.long   0x000a0000,0x00000000
154
155         .align  8
156 .Lccws: .rept   19
157         .long   0x02600050,0x00000000
158         .endr
159         .long   0x02200050,0x00000000
160
161 iplstart:
162         bas     %r14,.Lsetmode          # Immediately switch to 64 bit mode
163         lh      %r1,0xb8                # test if subchannel number
164         bct     %r1,.Lnoload            #  is valid
165         l       %r1,0xb8                # load ipl subchannel number
166         la      %r2,IPL_BS              # load start address
167         bas     %r14,.Lloader           # load rest of ipl image
168         l       %r12,.Lparm             # pointer to parameter area
169         st      %r1,IPL_DEVICE+ARCH_OFFSET-PARMAREA(%r12) # save ipl device number
170
171 #
172 # load parameter file from ipl device
173 #
174 .Lagain1:
175         l       %r2,.Linitrd            # ramdisk loc. is temp
176         bas     %r14,.Lloader           # load parameter file
177         ltr     %r2,%r2                 # got anything ?
178         bz      .Lnopf
179         chi     %r2,895
180         bnh     .Lnotrunc
181         la      %r2,895
182 .Lnotrunc:
183         l       %r4,.Linitrd
184         clc     0(3,%r4),.L_hdr         # if it is HDRx
185         bz      .Lagain1                # skip dataset header
186         clc     0(3,%r4),.L_eof         # if it is EOFx
187         bz      .Lagain1                # skip dateset trailer
188         la      %r5,0(%r4,%r2)
189         lr      %r3,%r2
190         la      %r3,COMMAND_LINE-PARMAREA(%r12) # load adr. of command line
191         mvc     0(256,%r3),0(%r4)
192         mvc     256(256,%r3),256(%r4)
193         mvc     512(256,%r3),512(%r4)
194         mvc     768(122,%r3),768(%r4)
195         slr     %r0,%r0
196         b       .Lcntlp
197 .Ldelspc:
198         ic      %r0,0(%r2,%r3)
199         chi     %r0,0x20                # is it a space ?
200         be      .Lcntlp
201         ahi     %r2,1
202         b       .Leolp
203 .Lcntlp:
204         brct    %r2,.Ldelspc
205 .Leolp:
206         slr     %r0,%r0
207         stc     %r0,0(%r2,%r3)          # terminate buffer
208 .Lnopf:
209
210 #
211 # load ramdisk from ipl device
212 #
213 .Lagain2:
214         l       %r2,.Linitrd            # addr of ramdisk
215         st      %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12)
216         bas     %r14,.Lloader           # load ramdisk
217         st      %r2,INITRD_SIZE+ARCH_OFFSET-PARMAREA(%r12) # store size of rd
218         ltr     %r2,%r2
219         bnz     .Lrdcont
220         st      %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12) # no ramdisk found
221 .Lrdcont:
222         l       %r2,.Linitrd
223
224         clc     0(3,%r2),.L_hdr         # skip HDRx and EOFx
225         bz      .Lagain2
226         clc     0(3,%r2),.L_eof
227         bz      .Lagain2
228
229 #
230 # reset files in VM reader
231 #
232         stidp   .Lcpuid                 # store cpuid
233         tm      .Lcpuid,0xff            # running VM ?
234         bno     .Lnoreset
235         la      %r2,.Lreset
236         lhi     %r3,26
237         diag    %r2,%r3,8
238         la      %r5,.Lirb
239         stsch   0(%r5)                  # check if irq is pending
240         tm      30(%r5),0x0f            # by verifying if any of the
241         bnz     .Lwaitforirq            # activity or status control
242         tm      31(%r5),0xff            # bits is set in the schib
243         bz      .Lnoreset
244 .Lwaitforirq:
245         bas     %r14,.Lirqwait          # wait for IO interrupt
246         c       %r1,0xb8                # compare subchannel number
247         bne     .Lwaitforirq
248         la      %r5,.Lirb
249         tsch    0(%r5)
250 .Lnoreset:
251         b       .Lnoload
252
253 #
254 # everything loaded, go for it
255 #
256 .Lnoload:
257         l       %r1,.Lstartup
258         br      %r1
259
260 .Linitrd:.long _end                     # default address of initrd
261 .Lparm: .long  PARMAREA
262 .Lstartup: .long startup
263 .Lreset:.byte   0xc3,0xc8,0xc1,0xd5,0xc7,0xc5,0x40,0xd9,0xc4,0xd9,0x40
264         .byte   0xc1,0xd3,0xd3,0x40,0xd2,0xc5,0xc5,0xd7,0x40,0xd5,0xd6
265         .byte   0xc8,0xd6,0xd3,0xc4     # "change rdr all keep nohold"
266 .L_eof: .long   0xc5d6c600       /* C'EOF' */
267 .L_hdr: .long   0xc8c4d900       /* C'HDR' */
268         .align  8
269 .Lcpuid:.fill   8,1,0
270
271 #
272 # SALIPL loader support. Based on a patch by Rob van der Heij.
273 # This entry point is called directly from the SALIPL loader and
274 # doesn't need a builtin ipl record.
275 #
276         .org    0x800
277 ENTRY(start)
278         stm     %r0,%r15,0x07b0         # store registers
279         bas     %r14,.Lsetmode          # Immediately switch to 64 bit mode
280         basr    %r12,%r0
281 .base:
282         l       %r11,.parm
283         l       %r8,.cmd                # pointer to command buffer
284
285         ltr     %r9,%r9                 # do we have SALIPL parameters?
286         bp      .sk8x8
287
288         mvc     0(64,%r8),0x00b0        # copy saved registers
289         xc      64(240-64,%r8),0(%r8)   # remainder of buffer
290         tr      0(64,%r8),.lowcase
291         b       .gotr
292 .sk8x8:
293         mvc     0(240,%r8),0(%r9)       # copy iplparms into buffer
294 .gotr:
295         slr     %r0,%r0
296         st      %r0,INITRD_SIZE+ARCH_OFFSET-PARMAREA(%r11)
297         st      %r0,INITRD_START+ARCH_OFFSET-PARMAREA(%r11)
298         j       startup                 # continue with startup
299 .cmd:   .long   COMMAND_LINE            # address of command line buffer
300 .parm:  .long   PARMAREA
301 .lowcase:
302         .byte 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07
303         .byte 0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f
304         .byte 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17
305         .byte 0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f
306         .byte 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27
307         .byte 0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f
308         .byte 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37
309         .byte 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f
310         .byte 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47
311         .byte 0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f
312         .byte 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57
313         .byte 0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f
314         .byte 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67
315         .byte 0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f
316         .byte 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77
317         .byte 0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f
318
319         .byte 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87
320         .byte 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f
321         .byte 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97
322         .byte 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f
323         .byte 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7
324         .byte 0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf
325         .byte 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7
326         .byte 0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf
327         .byte 0xc0,0x81,0x82,0x83,0x84,0x85,0x86,0x87   # .abcdefg
328         .byte 0x88,0x89,0xca,0xcb,0xcc,0xcd,0xce,0xcf   # hi
329         .byte 0xd0,0x91,0x92,0x93,0x94,0x95,0x96,0x97   # .jklmnop
330         .byte 0x98,0x99,0xda,0xdb,0xdc,0xdd,0xde,0xdf   # qr
331         .byte 0xe0,0xe1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7   # ..stuvwx
332         .byte 0xa8,0xa9,0xea,0xeb,0xec,0xed,0xee,0xef   # yz
333         .byte 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7
334         .byte 0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff
335
336 #
337 # startup-code at 0x10000, running in absolute addressing mode
338 # this is called either by the ipl loader or directly by PSW restart
339 # or linload or SALIPL
340 #
341         .org    0x10000
342 ENTRY(startup)
343         j       .Lep_startup_normal
344         .org    0x10008
345 #
346 # This is a list of s390 kernel entry points. At address 0x1000f the number of
347 # valid entry points is stored.
348 #
349 # IMPORTANT: Do not change this table, it is s390 kernel ABI!
350 #
351         .ascii  "S390EP"
352         .byte   0x00,0x01
353 #
354 # kdump startup-code at 0x10010, running in 64 bit absolute addressing mode
355 #
356         .org    0x10010
357 ENTRY(startup_kdump)
358         j       .Lep_startup_kdump
359 .Lep_startup_normal:
360         mvi     __LC_AR_MODE_ID,1       # set esame flag
361         slr     %r0,%r0                 # set cpuid to zero
362         lhi     %r1,2                   # mode 2 = esame (dump)
363         sigp    %r1,%r0,0x12            # switch to esame mode
364         bras    %r13,0f
365         .fill   16,4,0x0
366 0:      lmh     %r0,%r15,0(%r13)        # clear high-order half of gprs
367         sam31                           # switch to 31 bit addressing mode
368         basr    %r13,0                  # get base
369 .LPG0:
370         xc      0x200(256),0x200        # partially clear lowcore
371         xc      0x300(256),0x300
372         xc      0xe00(256),0xe00
373         stck    __LC_LAST_UPDATE_CLOCK
374         spt     6f-.LPG0(%r13)
375         mvc     __LC_LAST_UPDATE_TIMER(8),6f-.LPG0(%r13)
376         xc      __LC_STFL_FAC_LIST(8),__LC_STFL_FAC_LIST
377         # check capabilities against MARCH_{G5,Z900,Z990,Z9_109,Z10}
378         .insn   s,0xb2b10000,0          # store facilities @ __LC_STFL_FAC_LIST
379         tm      __LC_STFL_FAC_LIST,0x01 # stfle available ?
380         jz      0f
381         la      %r0,1
382         .insn   s,0xb2b00000,__LC_STFL_FAC_LIST # store facility list extended
383         # verify if all required facilities are supported by the machine
384 0:      la      %r1,__LC_STFL_FAC_LIST
385         la      %r2,3f+8-.LPG0(%r13)
386         l       %r3,0(%r2)
387 1:      l       %r0,0(%r1)
388         n       %r0,4(%r2)
389         cl      %r0,4(%r2)
390         jne     2f
391         la      %r1,4(%r1)
392         la      %r2,4(%r2)
393         ahi     %r3,-1
394         jnz     1b
395         j       4f
396 2:      l       %r15,.Lstack-.LPG0(%r13)
397         ahi     %r15,-96
398         la      %r2,.Lals_string-.LPG0(%r13)
399         l       %r3,.Lsclp_print-.LPG0(%r13)
400         basr    %r14,%r3
401         lpsw    3f-.LPG0(%r13)          # machine type not good enough, crash
402 .Lals_string:
403         .asciz  "The Linux kernel requires more recent processor hardware"
404 .Lsclp_print:
405         .long   _sclp_print_early
406 .Lstack:
407         .long   0x8000 + (1<<(PAGE_SHIFT+THREAD_ORDER))
408         .align 16
409 3:      .long   0x000a0000,0x8badcccc
410
411 # List of facilities that are required. If not all facilities are present
412 # the kernel will crash. Format is number of facility words with bits set,
413 # followed by the facility words.
414
415 #if defined(CONFIG_MARCH_Z13)
416         .long 3, 0xc100eff2, 0xf46ce800, 0x00400000
417 #elif defined(CONFIG_MARCH_ZEC12)
418         .long 3, 0xc100eff2, 0xf46ce800, 0x00400000
419 #elif defined(CONFIG_MARCH_Z196)
420         .long 2, 0xc100eff2, 0xf46c0000
421 #elif defined(CONFIG_MARCH_Z10)
422         .long 2, 0xc100eff2, 0xf0680000
423 #elif defined(CONFIG_MARCH_Z9_109)
424         .long 1, 0xc100efc2
425 #elif defined(CONFIG_MARCH_Z990)
426         .long 1, 0xc0002000
427 #elif defined(CONFIG_MARCH_Z900)
428         .long 1, 0xc0000000
429 #endif
430 4:
431         /* Continue with 64bit startup code in head64.S */
432         sam64                           # switch to 64 bit mode
433         jg      startup_continue
434
435         .align  8
436 6:      .long   0x7fffffff,0xffffffff
437
438 #include "head_kdump.S"
439
440 #
441 # params at 10400 (setup.h)
442 #
443         .org    PARMAREA
444         .long   0,0                     # IPL_DEVICE
445         .long   0,0                     # INITRD_START
446         .long   0,0                     # INITRD_SIZE
447         .long   0,0                     # OLDMEM_BASE
448         .long   0,0                     # OLDMEM_SIZE
449
450         .org    COMMAND_LINE
451         .byte   "root=/dev/ram0 ro"
452         .byte   0
453
454         .org    0x11000