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