]> asedeno.scripts.mit.edu Git - linux.git/blob - arch/s390/kernel/head.S
s390/head: fix error message on unsupported hardware
[linux.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 # subroutine to set architecture mode
65 #
66 .Lsetmode:
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
71         bras    %r13,0f
72         .fill   16,4,0x0
73 0:      lmh     %r0,%r15,0(%r13)        # clear high-order half of gprs
74         sam31                           # switch to 31 bit addressing mode
75         br      %r14
76
77 #
78 # subroutine to wait for end I/O
79 #
80 .Lirqwait:
81         mvc     0x1f0(16),.Lnewpsw      # set up IO interrupt psw
82         lpsw    .Lwaitpsw
83 .Lioint:
84         br      %r14
85         .align  8
86 .Lnewpsw:
87         .quad   0x0000000080000000,.Lioint
88 .Lwaitpsw:
89         .long   0x020a0000,0x80000000+.Lioint
90
91 #
92 # subroutine for loading cards from the reader
93 #
94 .Lloader:
95         la      %r4,0(%r14)
96         la      %r3,.Lorb               # r2 = address of orb into r2
97         la      %r5,.Lirb               # r4 = address of irb
98         la      %r6,.Lccws
99         la      %r7,20
100 .Linit:
101         st      %r2,4(%r6)              # initialize CCW data addresses
102         la      %r2,0x50(%r2)
103         la      %r6,8(%r6)
104         bct     7,.Linit
105
106         lctl    %c6,%c6,.Lcr6           # set IO subclass mask
107         slr     %r2,%r2
108 .Lldlp:
109         ssch    0(%r3)                  # load chunk of 1600 bytes
110         bnz     .Llderr
111 .Lwait4irq:
112         bas     %r14,.Lirqwait
113         c       %r1,0xb8                # compare subchannel number
114         bne     .Lwait4irq
115         tsch    0(%r5)
116
117         slr     %r0,%r0
118         ic      %r0,8(%r5)              # get device status
119         chi     %r0,8                   # channel end ?
120         be      .Lcont
121         chi     %r0,12                  # channel end + device end ?
122         be      .Lcont
123
124         l       %r0,4(%r5)
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
129         ar      %r2,%r0
130
131         br      %r4                     # r2 contains the total size
132
133 .Lcont:
134         ahi     %r2,0x640               # add 0x640 to total size
135         la      %r6,.Lccws
136         la      %r7,20
137 .Lincr:
138         l       %r0,4(%r6)              # update CCW data addresses
139         ahi     %r0,0x640
140         st      %r0,4(%r6)
141         ahi     %r6,8
142         bct     7,.Lincr
143
144         b       .Lldlp
145 .Llderr:
146         lpsw    .Lcrash
147
148         .align  8
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
152 .Lloadp:.long   0,0
153         .align  8
154 .Lcrash:.long   0x000a0000,0x00000000
155
156         .align  8
157 .Lccws: .rept   19
158         .long   0x02600050,0x00000000
159         .endr
160         .long   0x02200050,0x00000000
161
162 iplstart:
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
171
172 #
173 # load parameter file from ipl device
174 #
175 .Lagain1:
176         l       %r2,.Linitrd            # ramdisk loc. is temp
177         bas     %r14,.Lloader           # load parameter file
178         ltr     %r2,%r2                 # got anything ?
179         bz      .Lnopf
180         chi     %r2,895
181         bnh     .Lnotrunc
182         la      %r2,895
183 .Lnotrunc:
184         l       %r4,.Linitrd
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
189         la      %r5,0(%r4,%r2)
190         lr      %r3,%r2
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)
196         slr     %r0,%r0
197         b       .Lcntlp
198 .Ldelspc:
199         ic      %r0,0(%r2,%r3)
200         chi     %r0,0x20                # is it a space ?
201         be      .Lcntlp
202         ahi     %r2,1
203         b       .Leolp
204 .Lcntlp:
205         brct    %r2,.Ldelspc
206 .Leolp:
207         slr     %r0,%r0
208         stc     %r0,0(%r2,%r3)          # terminate buffer
209 .Lnopf:
210
211 #
212 # load ramdisk from ipl device
213 #
214 .Lagain2:
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
219         ltr     %r2,%r2
220         bnz     .Lrdcont
221         st      %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12) # no ramdisk found
222 .Lrdcont:
223         l       %r2,.Linitrd
224
225         clc     0(3,%r2),.L_hdr         # skip HDRx and EOFx
226         bz      .Lagain2
227         clc     0(3,%r2),.L_eof
228         bz      .Lagain2
229
230 #
231 # reset files in VM reader
232 #
233         stidp   .Lcpuid                 # store cpuid
234         tm      .Lcpuid,0xff            # running VM ?
235         bno     .Lnoreset
236         la      %r2,.Lreset
237         lhi     %r3,26
238         diag    %r2,%r3,8
239         la      %r5,.Lirb
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
244         bz      .Lnoreset
245 .Lwaitforirq:
246         bas     %r14,.Lirqwait          # wait for IO interrupt
247         c       %r1,0xb8                # compare subchannel number
248         bne     .Lwaitforirq
249         la      %r5,.Lirb
250         tsch    0(%r5)
251 .Lnoreset:
252         b       .Lnoload
253
254 #
255 # everything loaded, go for it
256 #
257 .Lnoload:
258         l       %r1,.Lstartup
259         br      %r1
260
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' */
269         .align  8
270 .Lcpuid:.fill   8,1,0
271
272 #
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.
276 #
277         .org    0x800
278 ENTRY(start)
279         stm     %r0,%r15,0x07b0         # store registers
280         bas     %r14,.Lsetmode          # Immediately switch to 64 bit mode
281         basr    %r12,%r0
282 .base:
283         l       %r11,.parm
284         l       %r8,.cmd                # pointer to command buffer
285
286         ltr     %r9,%r9                 # do we have SALIPL parameters?
287         bp      .sk8x8
288
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
292         b       .gotr
293 .sk8x8:
294         mvc     0(240,%r8),0(%r9)       # copy iplparms into buffer
295 .gotr:
296         slr     %r0,%r0
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
302 .lowcase:
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
319
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
336
337 #
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
341 #
342         .org    0x10000
343 ENTRY(startup)
344         j       .Lep_startup_normal
345         .org    0x10008
346 #
347 # This is a list of s390 kernel entry points. At address 0x1000f the number of
348 # valid entry points is stored.
349 #
350 # IMPORTANT: Do not change this table, it is s390 kernel ABI!
351 #
352         .ascii  "S390EP"
353         .byte   0x00,0x01
354 #
355 # kdump startup-code at 0x10010, running in 64 bit absolute addressing mode
356 #
357         .org    0x10010
358 ENTRY(startup_kdump)
359         j       .Lep_startup_kdump
360 .Lep_startup_normal:
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
365         bras    %r13,0f
366         .fill   16,4,0x0
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
370 .LPG0:
371         xc      0x200(256),0x200        # partially clear lowcore
372         xc      0x300(256),0x300
373         xc      0xe00(256),0xe00
374         lctlg   %c0,%c15,0x200(%r0)     # initialize control registers
375         stck    __LC_LAST_UPDATE_CLOCK
376         spt     6f-.LPG0(%r13)
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 ?
382         jz      0f
383         la      %r0,1
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)
388         l       %r3,0(%r2)
389 1:      l       %r0,0(%r1)
390         n       %r0,4(%r2)
391         cl      %r0,4(%r2)
392         jne     2f
393         la      %r1,4(%r1)
394         la      %r2,4(%r2)
395         ahi     %r3,-1
396         jnz     1b
397         j       4f
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)
402         basr    %r14,%r3
403         lpsw    3f-.LPG0(%r13)          # machine type not good enough, crash
404 .Lals_string:
405         .asciz  "The Linux kernel requires more recent processor hardware"
406 .Lsclp_print:
407         .long   _sclp_print_early
408 .Lstack:
409         .long   0x8000 + (1<<(PAGE_SHIFT+THREAD_ORDER))
410         .align 16
411 3:      .long   0x000a0000,0x8badcccc
412
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.
416
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)
426         .long 1, 0xc100efc2
427 #elif defined(CONFIG_MARCH_Z990)
428         .long 1, 0xc0002000
429 #elif defined(CONFIG_MARCH_Z900)
430         .long 1, 0xc0000000
431 #endif
432 4:
433         /* Continue with startup code in head64.S */
434         jg      startup_continue
435
436         .align  8
437 6:      .long   0x7fffffff,0xffffffff
438
439 #include "head_kdump.S"
440
441 #
442 # params at 10400 (setup.h)
443 #
444         .org    PARMAREA
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
450
451         .org    COMMAND_LINE
452         .byte   "root=/dev/ram0 ro"
453         .byte   0
454
455         .org    0x11000