blob: 984726cbce1607855672dbb6210d7b38b56ea122 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
Heiko Carstensa53c8fa2012-07-20 11:15:04 +02002 * Copyright IBM Corp. 1999, 2010
Heiko Carstens0ad775d2005-11-07 00:59:12 -08003 *
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>
Linus Torvalds1da177e2005-04-16 15:20:36 -07008 *
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)
Heiko Carstens0ad775d2005-11-07 00:59:12 -080021 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070022 */
23
Tim Abbott2133bb82009-04-25 22:11:06 -040024#include <linux/init.h>
Jan Glauber144d6342011-07-24 10:48:19 +020025#include <linux/linkage.h>
Sam Ravnborg0013a852005-09-09 20:57:26 +020026#include <asm/asm-offsets.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070027#include <asm/thread_info.h>
28#include <asm/page.h>
29
Martin Schwidefsky347a8dc2006-01-06 00:19:28 -080030#ifdef CONFIG_64BIT
Heiko Carstens0ad775d2005-11-07 00:59:12 -080031#define ARCH_OFFSET 4
32#else
33#define ARCH_OFFSET 0
34#endif
35
Tim Abbott2133bb82009-04-25 22:11:06 -040036__HEAD
Linus Torvalds1da177e2005-04-16 15:20:36 -070037
Heiko Carstens25d83cb2006-09-28 16:56:37 +020038#define IPL_BS 0x730
39 .org 0
40 .long 0x00080000,0x80000000+iplstart # The first 24 bytes are loaded
41 .long 0x02000018,0x60000050 # by ipl to addresses 0-23.
42 .long 0x02000068,0x60000050 # (a PSW and two CCWs).
43 .fill 80-24,1,0x40 # bytes 24-79 are discarded !!
44 .long 0x020000f0,0x60000050 # The next 160 byte are loaded
45 .long 0x02000140,0x60000050 # to addresses 0x18-0xb7
46 .long 0x02000190,0x60000050 # They form the continuation
47 .long 0x020001e0,0x60000050 # of the CCW program started
48 .long 0x02000230,0x60000050 # by ipl and load the range
49 .long 0x02000280,0x60000050 # 0x0f0-0x730 from the image
50 .long 0x020002d0,0x60000050 # to the range 0x0f0-0x730
51 .long 0x02000320,0x60000050 # in memory. At the end of
52 .long 0x02000370,0x60000050 # the channel program the PSW
53 .long 0x020003c0,0x60000050 # at location 0 is loaded.
54 .long 0x02000410,0x60000050 # Initial processing starts
Martin Schwidefsky51eee032012-08-23 16:18:09 +020055 .long 0x02000460,0x60000050 # at 0x200 = iplstart.
Heiko Carstens25d83cb2006-09-28 16:56:37 +020056 .long 0x020004b0,0x60000050
57 .long 0x02000500,0x60000050
58 .long 0x02000550,0x60000050
59 .long 0x020005a0,0x60000050
60 .long 0x020005f0,0x60000050
61 .long 0x02000640,0x60000050
62 .long 0x02000690,0x60000050
63 .long 0x020006e0,0x20000050
Linus Torvalds1da177e2005-04-16 15:20:36 -070064
Martin Schwidefsky51eee032012-08-23 16:18:09 +020065 .org 0x200
66#
67# subroutine to set architecture mode
68#
69.Lsetmode:
70#ifdef CONFIG_64BIT
71 mvi __LC_AR_MODE_ID,1 # set esame flag
72 slr %r0,%r0 # set cpuid to zero
73 lhi %r1,2 # mode 2 = esame (dump)
74 sigp %r1,%r0,0x12 # switch to esame mode
75 bras %r13,0f
76 .fill 16,4,0x0
770: lmh %r0,%r15,0(%r13) # clear high-order half of gprs
78 sam31 # switch to 31 bit addressing mode
79#else
80 mvi __LC_AR_MODE_ID,0 # set ESA flag (mode 0)
81#endif
82 br %r14
83
84#
85# subroutine to wait for end I/O
86#
87.Lirqwait:
88#ifdef CONFIG_64BIT
89 mvc 0x1f0(16),.Lnewpsw # set up IO interrupt psw
90 lpsw .Lwaitpsw
91.Lioint:
92 br %r14
93 .align 8
94.Lnewpsw:
95 .quad 0x0000000080000000,.Lioint
96#else
97 mvc 0x78(8),.Lnewpsw # set up IO interrupt psw
98 lpsw .Lwaitpsw
99.Lioint:
100 br %r14
101 .align 8
102.Lnewpsw:
103 .long 0x00080000,0x80000000+.Lioint
104#endif
105.Lwaitpsw:
106 .long 0x020a0000,0x80000000+.Lioint
107
Linus Torvalds1da177e2005-04-16 15:20:36 -0700108#
109# subroutine for loading cards from the reader
110#
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200111.Lloader:
Martin Schwidefsky51eee032012-08-23 16:18:09 +0200112 la %r4,0(%r14)
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200113 la %r3,.Lorb # r2 = address of orb into r2
114 la %r5,.Lirb # r4 = address of irb
115 la %r6,.Lccws
116 la %r7,20
Linus Torvalds1da177e2005-04-16 15:20:36 -0700117.Linit:
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200118 st %r2,4(%r6) # initialize CCW data addresses
119 la %r2,0x50(%r2)
120 la %r6,8(%r6)
121 bct 7,.Linit
Linus Torvalds1da177e2005-04-16 15:20:36 -0700122
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200123 lctl %c6,%c6,.Lcr6 # set IO subclass mask
124 slr %r2,%r2
Linus Torvalds1da177e2005-04-16 15:20:36 -0700125.Lldlp:
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200126 ssch 0(%r3) # load chunk of 1600 bytes
127 bnz .Llderr
Linus Torvalds1da177e2005-04-16 15:20:36 -0700128.Lwait4irq:
Martin Schwidefsky51eee032012-08-23 16:18:09 +0200129 bas %r14,.Lirqwait
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200130 c %r1,0xb8 # compare subchannel number
131 bne .Lwait4irq
132 tsch 0(%r5)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700133
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200134 slr %r0,%r0
135 ic %r0,8(%r5) # get device status
136 chi %r0,8 # channel end ?
137 be .Lcont
138 chi %r0,12 # channel end + device end ?
139 be .Lcont
Linus Torvalds1da177e2005-04-16 15:20:36 -0700140
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200141 l %r0,4(%r5)
142 s %r0,8(%r3) # r0/8 = number of ccws executed
143 mhi %r0,10 # *10 = number of bytes in ccws
144 lh %r3,10(%r5) # get residual count
145 sr %r0,%r3 # #ccws*80-residual=#bytes read
146 ar %r2,%r0
147
Martin Schwidefsky51eee032012-08-23 16:18:09 +0200148 br %r4 # r2 contains the total size
Linus Torvalds1da177e2005-04-16 15:20:36 -0700149
150.Lcont:
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200151 ahi %r2,0x640 # add 0x640 to total size
152 la %r6,.Lccws
153 la %r7,20
Linus Torvalds1da177e2005-04-16 15:20:36 -0700154.Lincr:
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200155 l %r0,4(%r6) # update CCW data addresses
156 ahi %r0,0x640
157 st %r0,4(%r6)
158 ahi %r6,8
159 bct 7,.Lincr
Linus Torvalds1da177e2005-04-16 15:20:36 -0700160
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200161 b .Lldlp
Linus Torvalds1da177e2005-04-16 15:20:36 -0700162.Llderr:
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200163 lpsw .Lcrash
Linus Torvalds1da177e2005-04-16 15:20:36 -0700164
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200165 .align 8
166.Lorb: .long 0x00000000,0x0080ff00,.Lccws
167.Lirb: .long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
168.Lcr6: .long 0xff000000
169.Lloadp:.long 0,0
170 .align 8
171.Lcrash:.long 0x000a0000,0x00000000
Linus Torvalds1da177e2005-04-16 15:20:36 -0700172
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200173 .align 8
174.Lccws: .rept 19
175 .long 0x02600050,0x00000000
176 .endr
177 .long 0x02200050,0x00000000
Linus Torvalds1da177e2005-04-16 15:20:36 -0700178
179iplstart:
Martin Schwidefsky51eee032012-08-23 16:18:09 +0200180 bas %r14,.Lsetmode # Immediately switch to 64 bit mode
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200181 lh %r1,0xb8 # test if subchannel number
182 bct %r1,.Lnoload # is valid
183 l %r1,0xb8 # load ipl subchannel number
184 la %r2,IPL_BS # load start address
185 bas %r14,.Lloader # load rest of ipl image
186 l %r12,.Lparm # pointer to parameter area
187 st %r1,IPL_DEVICE+ARCH_OFFSET-PARMAREA(%r12) # save ipl device number
Linus Torvalds1da177e2005-04-16 15:20:36 -0700188
189#
190# load parameter file from ipl device
191#
192.Lagain1:
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200193 l %r2,.Linitrd # ramdisk loc. is temp
194 bas %r14,.Lloader # load parameter file
195 ltr %r2,%r2 # got anything ?
196 bz .Lnopf
197 chi %r2,895
198 bnh .Lnotrunc
199 la %r2,895
Linus Torvalds1da177e2005-04-16 15:20:36 -0700200.Lnotrunc:
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200201 l %r4,.Linitrd
202 clc 0(3,%r4),.L_hdr # if it is HDRx
203 bz .Lagain1 # skip dataset header
204 clc 0(3,%r4),.L_eof # if it is EOFx
205 bz .Lagain1 # skip dateset trailer
206 la %r5,0(%r4,%r2)
207 lr %r3,%r2
Martin Schwidefsky61fd3302010-02-26 22:37:51 +0100208 la %r3,COMMAND_LINE-PARMAREA(%r12) # load adr. of command line
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200209 mvc 0(256,%r3),0(%r4)
210 mvc 256(256,%r3),256(%r4)
211 mvc 512(256,%r3),512(%r4)
212 mvc 768(122,%r3),768(%r4)
213 slr %r0,%r0
214 b .Lcntlp
Linus Torvalds1da177e2005-04-16 15:20:36 -0700215.Ldelspc:
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200216 ic %r0,0(%r2,%r3)
217 chi %r0,0x20 # is it a space ?
218 be .Lcntlp
219 ahi %r2,1
220 b .Leolp
Linus Torvalds1da177e2005-04-16 15:20:36 -0700221.Lcntlp:
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200222 brct %r2,.Ldelspc
Linus Torvalds1da177e2005-04-16 15:20:36 -0700223.Leolp:
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200224 slr %r0,%r0
225 stc %r0,0(%r2,%r3) # terminate buffer
Linus Torvalds1da177e2005-04-16 15:20:36 -0700226.Lnopf:
227
228#
229# load ramdisk from ipl device
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200230#
Linus Torvalds1da177e2005-04-16 15:20:36 -0700231.Lagain2:
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200232 l %r2,.Linitrd # addr of ramdisk
233 st %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12)
234 bas %r14,.Lloader # load ramdisk
235 st %r2,INITRD_SIZE+ARCH_OFFSET-PARMAREA(%r12) # store size of rd
236 ltr %r2,%r2
237 bnz .Lrdcont
238 st %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12) # no ramdisk found
Linus Torvalds1da177e2005-04-16 15:20:36 -0700239.Lrdcont:
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200240 l %r2,.Linitrd
Linus Torvalds1da177e2005-04-16 15:20:36 -0700241
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200242 clc 0(3,%r2),.L_hdr # skip HDRx and EOFx
243 bz .Lagain2
244 clc 0(3,%r2),.L_eof
245 bz .Lagain2
Linus Torvalds1da177e2005-04-16 15:20:36 -0700246
Linus Torvalds1da177e2005-04-16 15:20:36 -0700247#
248# reset files in VM reader
249#
Martin Schwidefsky51eee032012-08-23 16:18:09 +0200250 stidp .Lcpuid # store cpuid
251 tm .Lcpuid,0xff # running VM ?
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200252 bno .Lnoreset
253 la %r2,.Lreset
254 lhi %r3,26
255 diag %r2,%r3,8
256 la %r5,.Lirb
257 stsch 0(%r5) # check if irq is pending
258 tm 30(%r5),0x0f # by verifying if any of the
259 bnz .Lwaitforirq # activity or status control
260 tm 31(%r5),0xff # bits is set in the schib
261 bz .Lnoreset
Heiko Carstens350e3ad2005-07-29 14:03:36 -0700262.Lwaitforirq:
Martin Schwidefsky51eee032012-08-23 16:18:09 +0200263 bas %r14,.Lirqwait # wait for IO interrupt
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200264 c %r1,0xb8 # compare subchannel number
Martin Schwidefsky51eee032012-08-23 16:18:09 +0200265 bne .Lwaitforirq
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200266 la %r5,.Lirb
267 tsch 0(%r5)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700268.Lnoreset:
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200269 b .Lnoload
Heiko Carstens2b071882005-06-21 17:16:31 -0700270
Linus Torvalds1da177e2005-04-16 15:20:36 -0700271#
272# everything loaded, go for it
273#
274.Lnoload:
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200275 l %r1,.Lstartup
276 br %r1
Linus Torvalds1da177e2005-04-16 15:20:36 -0700277
Heiko Carstense033b9a2010-08-09 18:12:57 +0200278.Linitrd:.long _end # default address of initrd
Linus Torvalds1da177e2005-04-16 15:20:36 -0700279.Lparm: .long PARMAREA
280.Lstartup: .long startup
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200281.Lreset:.byte 0xc3,0xc8,0xc1,0xd5,0xc7,0xc5,0x40,0xd9,0xc4,0xd9,0x40
282 .byte 0xc1,0xd3,0xd3,0x40,0xd2,0xc5,0xc5,0xd7,0x40,0xd5,0xd6
283 .byte 0xc8,0xd6,0xd3,0xc4 # "change rdr all keep nohold"
284.L_eof: .long 0xc5d6c600 /* C'EOF' */
285.L_hdr: .long 0xc8c4d900 /* C'HDR' */
Martin Schwidefsky51eee032012-08-23 16:18:09 +0200286 .align 8
287.Lcpuid:.fill 8,1,0
Linus Torvalds1da177e2005-04-16 15:20:36 -0700288
Linus Torvalds1da177e2005-04-16 15:20:36 -0700289#
290# SALIPL loader support. Based on a patch by Rob van der Heij.
291# This entry point is called directly from the SALIPL loader and
292# doesn't need a builtin ipl record.
293#
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200294 .org 0x800
Jan Glauber144d6342011-07-24 10:48:19 +0200295ENTRY(start)
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200296 stm %r0,%r15,0x07b0 # store registers
Martin Schwidefsky51eee032012-08-23 16:18:09 +0200297 bas %r14,.Lsetmode # Immediately switch to 64 bit mode
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200298 basr %r12,%r0
Linus Torvalds1da177e2005-04-16 15:20:36 -0700299.base:
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200300 l %r11,.parm
301 l %r8,.cmd # pointer to command buffer
Linus Torvalds1da177e2005-04-16 15:20:36 -0700302
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200303 ltr %r9,%r9 # do we have SALIPL parameters?
304 bp .sk8x8
Linus Torvalds1da177e2005-04-16 15:20:36 -0700305
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200306 mvc 0(64,%r8),0x00b0 # copy saved registers
307 xc 64(240-64,%r8),0(%r8) # remainder of buffer
308 tr 0(64,%r8),.lowcase
309 b .gotr
Linus Torvalds1da177e2005-04-16 15:20:36 -0700310.sk8x8:
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200311 mvc 0(240,%r8),0(%r9) # copy iplparms into buffer
Linus Torvalds1da177e2005-04-16 15:20:36 -0700312.gotr:
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200313 slr %r0,%r0
314 st %r0,INITRD_SIZE+ARCH_OFFSET-PARMAREA(%r11)
315 st %r0,INITRD_START+ARCH_OFFSET-PARMAREA(%r11)
316 j startup # continue with startup
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200317.cmd: .long COMMAND_LINE # address of command line buffer
318.parm: .long PARMAREA
Linus Torvalds1da177e2005-04-16 15:20:36 -0700319.lowcase:
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200320 .byte 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07
Linus Torvalds1da177e2005-04-16 15:20:36 -0700321 .byte 0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200322 .byte 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17
Linus Torvalds1da177e2005-04-16 15:20:36 -0700323 .byte 0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200324 .byte 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27
Linus Torvalds1da177e2005-04-16 15:20:36 -0700325 .byte 0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200326 .byte 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37
Linus Torvalds1da177e2005-04-16 15:20:36 -0700327 .byte 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200328 .byte 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47
Linus Torvalds1da177e2005-04-16 15:20:36 -0700329 .byte 0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200330 .byte 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57
Linus Torvalds1da177e2005-04-16 15:20:36 -0700331 .byte 0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200332 .byte 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67
Linus Torvalds1da177e2005-04-16 15:20:36 -0700333 .byte 0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200334 .byte 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77
Linus Torvalds1da177e2005-04-16 15:20:36 -0700335 .byte 0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f
336
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200337 .byte 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87
Linus Torvalds1da177e2005-04-16 15:20:36 -0700338 .byte 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200339 .byte 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97
Linus Torvalds1da177e2005-04-16 15:20:36 -0700340 .byte 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200341 .byte 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7
Linus Torvalds1da177e2005-04-16 15:20:36 -0700342 .byte 0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200343 .byte 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7
Linus Torvalds1da177e2005-04-16 15:20:36 -0700344 .byte 0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200345 .byte 0xc0,0x81,0x82,0x83,0x84,0x85,0x86,0x87 # .abcdefg
Linus Torvalds1da177e2005-04-16 15:20:36 -0700346 .byte 0x88,0x89,0xca,0xcb,0xcc,0xcd,0xce,0xcf # hi
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200347 .byte 0xd0,0x91,0x92,0x93,0x94,0x95,0x96,0x97 # .jklmnop
Linus Torvalds1da177e2005-04-16 15:20:36 -0700348 .byte 0x98,0x99,0xda,0xdb,0xdc,0xdd,0xde,0xdf # qr
349 .byte 0xe0,0xe1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7 # ..stuvwx
350 .byte 0xa8,0xa9,0xea,0xeb,0xec,0xed,0xee,0xef # yz
Heiko Carstens25d83cb2006-09-28 16:56:37 +0200351 .byte 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7
Linus Torvalds1da177e2005-04-16 15:20:36 -0700352 .byte 0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff
353
Martin Schwidefskye37f50e2008-12-25 13:39:19 +0100354#
355# startup-code at 0x10000, running in absolute addressing mode
356# this is called either by the ipl loader or directly by PSW restart
357# or linload or SALIPL
358#
359 .org 0x10000
Jan Glauber144d6342011-07-24 10:48:19 +0200360ENTRY(startup)
Michael Holzheu60a0c682011-10-30 15:16:40 +0100361 j .Lep_startup_normal
362 .org 0x10008
363#
364# This is a list of s390 kernel entry points. At address 0x1000f the number of
365# valid entry points is stored.
366#
367# IMPORTANT: Do not change this table, it is s390 kernel ABI!
368#
369 .ascii "S390EP"
370 .byte 0x00,0x01
371#
372# kdump startup-code at 0x10010, running in 64 bit absolute addressing mode
373#
374 .org 0x10010
375ENTRY(startup_kdump)
376 j .Lep_startup_kdump
377.Lep_startup_normal:
Martin Schwidefsky51eee032012-08-23 16:18:09 +0200378#ifdef CONFIG_64BIT
379 mvi __LC_AR_MODE_ID,1 # set esame flag
380 slr %r0,%r0 # set cpuid to zero
381 lhi %r1,2 # mode 2 = esame (dump)
382 sigp %r1,%r0,0x12 # switch to esame mode
383 bras %r13,0f
384 .fill 16,4,0x0
3850: lmh %r0,%r15,0(%r13) # clear high-order half of gprs
386 sam31 # switch to 31 bit addressing mode
387#else
388 mvi __LC_AR_MODE_ID,0 # set ESA flag (mode 0)
389#endif
Martin Schwidefsky1844c9b2010-02-26 22:37:53 +0100390 basr %r13,0 # get base
Martin Schwidefskye37f50e2008-12-25 13:39:19 +0100391.LPG0:
Martin Schwidefsky866ba282009-03-26 15:24:44 +0100392 xc 0x200(256),0x200 # partially clear lowcore
393 xc 0x300(256),0x300
Michael Holzheu60a0c682011-10-30 15:16:40 +0100394 xc 0xe00(256),0xe00
Martin Schwidefsky1844c9b2010-02-26 22:37:53 +0100395 stck __LC_LAST_UPDATE_CLOCK
396 spt 5f-.LPG0(%r13)
397 mvc __LC_LAST_UPDATE_TIMER(8),5f-.LPG0(%r13)
Michael Holzheu37e37c22012-04-11 14:28:11 +0200398 xc __LC_STFL_FAC_LIST(8),__LC_STFL_FAC_LIST
Martin Schwidefskye37f50e2008-12-25 13:39:19 +0100399#ifndef CONFIG_MARCH_G5
Martin Schwidefsky8c4caa42009-06-12 10:26:23 +0200400 # check capabilities against MARCH_{G5,Z900,Z990,Z9_109,Z10}
Martin Schwidefsky88381012011-04-04 09:43:33 +0200401 .insn s,0xb2b10000,__LC_STFL_FAC_LIST # store facility list
Martin Schwidefsky8c4caa42009-06-12 10:26:23 +0200402 tm __LC_STFL_FAC_LIST,0x01 # stfle available ?
403 jz 0f
404 la %r0,0
405 .insn s,0xb2b00000,__LC_STFL_FAC_LIST # store facility list extended
4060: l %r0,__LC_STFL_FAC_LIST
407 n %r0,2f+8-.LPG0(%r13)
408 cl %r0,2f+8-.LPG0(%r13)
409 jne 1f
410 l %r0,__LC_STFL_FAC_LIST+4
411 n %r0,2f+12-.LPG0(%r13)
412 cl %r0,2f+12-.LPG0(%r13)
413 je 3f
Heiko Carstensd90cbd42009-06-12 10:26:24 +02004141: l %r15,.Lstack-.LPG0(%r13)
Heiko Carstensd90cbd42009-06-12 10:26:24 +0200415 ahi %r15,-96
416 la %r2,.Lals_string-.LPG0(%r13)
417 l %r3,.Lsclp_print-.LPG0(%r13)
418 basr %r14,%r3
419 lpsw 2f-.LPG0(%r13) # machine type not good enough, crash
420.Lals_string:
421 .asciz "The Linux kernel requires more recent processor hardware"
422.Lsclp_print:
423 .long _sclp_print_early
424.Lstack:
Martin Schwidefsky1844c9b2010-02-26 22:37:53 +0100425 .long 0x8000 + (1<<(PAGE_SHIFT+THREAD_ORDER))
Martin Schwidefskye37f50e2008-12-25 13:39:19 +0100426 .align 16
Martin Schwidefsky8c4caa42009-06-12 10:26:23 +02004272: .long 0x000a0000,0x8badcccc
428#if defined(CONFIG_64BIT)
Heiko Carstensf861e402010-10-25 16:10:17 +0200429#if defined(CONFIG_MARCH_Z196)
430 .long 0xc100efe3, 0xf46c0000
431#elif defined(CONFIG_MARCH_Z10)
Martin Schwidefsky8c4caa42009-06-12 10:26:23 +0200432 .long 0xc100efe3, 0xf0680000
Martin Schwidefskye37f50e2008-12-25 13:39:19 +0100433#elif defined(CONFIG_MARCH_Z9_109)
Martin Schwidefsky8c4caa42009-06-12 10:26:23 +0200434 .long 0xc100efc3, 0x00000000
Martin Schwidefskye37f50e2008-12-25 13:39:19 +0100435#elif defined(CONFIG_MARCH_Z990)
Martin Schwidefsky8c4caa42009-06-12 10:26:23 +0200436 .long 0xc0002000, 0x00000000
Martin Schwidefskye37f50e2008-12-25 13:39:19 +0100437#elif defined(CONFIG_MARCH_Z900)
Martin Schwidefsky8c4caa42009-06-12 10:26:23 +0200438 .long 0xc0000000, 0x00000000
Martin Schwidefskye37f50e2008-12-25 13:39:19 +0100439#endif
Martin Schwidefsky8c4caa42009-06-12 10:26:23 +0200440#else
Heiko Carstensf861e402010-10-25 16:10:17 +0200441#if defined(CONFIG_MARCH_Z196)
442 .long 0x8100c880, 0x00000000
443#elif defined(CONFIG_MARCH_Z10)
Martin Schwidefsky8c4caa42009-06-12 10:26:23 +0200444 .long 0x8100c880, 0x00000000
445#elif defined(CONFIG_MARCH_Z9_109)
446 .long 0x8100c880, 0x00000000
447#elif defined(CONFIG_MARCH_Z990)
448 .long 0x80002000, 0x00000000
449#elif defined(CONFIG_MARCH_Z900)
450 .long 0x80000000, 0x00000000
451#endif
452#endif
4533:
Martin Schwidefskye37f50e2008-12-25 13:39:19 +0100454#endif
455
Martin Schwidefsky1844c9b2010-02-26 22:37:53 +0100456#ifdef CONFIG_64BIT
Martin Schwidefsky51eee032012-08-23 16:18:09 +0200457 /* Continue with 64bit startup code in head64.S */
Martin Schwidefsky1844c9b2010-02-26 22:37:53 +0100458 sam64 # switch to 64 bit mode
459 jg startup_continue
460#else
Martin Schwidefsky51eee032012-08-23 16:18:09 +0200461 /* Continue with 31bit startup code in head31.S */
Martin Schwidefskyb6112cc2009-04-14 15:36:28 +0200462 l %r13,4f-.LPG0(%r13)
Martin Schwidefskye37f50e2008-12-25 13:39:19 +0100463 b 0(%r13)
Martin Schwidefskyab96e792009-04-14 15:36:29 +0200464 .align 8
Martin Schwidefsky1844c9b2010-02-26 22:37:53 +01004654: .long startup_continue
466#endif
Martin Schwidefsky51eee032012-08-23 16:18:09 +0200467
Martin Schwidefsky1844c9b2010-02-26 22:37:53 +0100468 .align 8
4695: .long 0x7fffffff,0xffffffff
Martin Schwidefskye37f50e2008-12-25 13:39:19 +0100470
Michael Holzheu60a0c682011-10-30 15:16:40 +0100471#include "head_kdump.S"
472
Martin Schwidefskye37f50e2008-12-25 13:39:19 +0100473#
474# params at 10400 (setup.h)
475#
476 .org PARMAREA
477 .long 0,0 # IPL_DEVICE
478 .long 0,0 # INITRD_START
479 .long 0,0 # INITRD_SIZE
Michael Holzheu60a0c682011-10-30 15:16:40 +0100480 .long 0,0 # OLDMEM_BASE
481 .long 0,0 # OLDMEM_SIZE
Martin Schwidefskye37f50e2008-12-25 13:39:19 +0100482
483 .org COMMAND_LINE
484 .byte "root=/dev/ram0 ro"
485 .byte 0
486
Martin Schwidefsky1844c9b2010-02-26 22:37:53 +0100487 .org 0x11000