head.S 13.3 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3
/*
 *  arch/s390/kernel/head.S
 *
H
Heiko Carstens 已提交
4
 * Copyright (C) IBM Corp. 1999,2006
5 6 7 8 9
 *
 *    Author(s): Hartmut Penner <hp@de.ibm.com>
 *		 Martin Schwidefsky <schwidefsky@de.ibm.com>
 *		 Rob van der Heij <rvdhei@iae.nl>
 *		 Heiko Carstens <heiko.carstens@de.ibm.com>
L
Linus Torvalds 已提交
10 11 12 13 14 15 16 17 18 19 20 21 22
 *
 * There are 5 different IPL methods
 *  1) load the image directly into ram at address 0 and do an PSW restart
 *  2) linload will load the image from address 0x10000 to memory 0x10000
 *     and start the code thru LPSW 0x0008000080010000 (VM only, deprecated)
 *  3) generate the tape ipl header, store the generated image on a tape
 *     and ipl from it
 *     In case of SL tape you need to IPL 5 times to get past VOL1 etc
 *  4) generate the vm reader ipl header, move the generated image to the
 *     VM reader (use option NOH!) and do a ipl from reader (VM only)
 *  5) direct call of start by the SALIPL loader
 *  We use the cpuid to distinguish between VM and native ipl
 *  params for kernel are pushed to 0x10400 (see setup.h)
23
 *
L
Linus Torvalds 已提交
24 25 26 27
 */

#include <asm/setup.h>
#include <asm/lowcore.h>
28
#include <asm/asm-offsets.h>
L
Linus Torvalds 已提交
29 30 31
#include <asm/thread_info.h>
#include <asm/page.h>

32
#ifdef CONFIG_64BIT
33 34 35 36 37
#define ARCH_OFFSET	4
#else
#define ARCH_OFFSET	0
#endif

38
.section ".text.head","ax"
L
Linus Torvalds 已提交
39
#ifndef CONFIG_IPL
H
Heiko Carstens 已提交
40 41
	.org   0
	.long  0x00080000,0x80000000+startup	# Just a restart PSW
L
Linus Torvalds 已提交
42 43 44
#else
#ifdef CONFIG_IPL_TAPE
#define IPL_BS 1024
H
Heiko Carstens 已提交
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
	.org   0
	.long  0x00080000,0x80000000+iplstart	# The first 24 bytes are loaded
	.long  0x27000000,0x60000001		# by ipl to addresses 0-23.
	.long  0x02000000,0x20000000+IPL_BS	# (a PSW and two CCWs).
	.long  0x00000000,0x00000000		# external old psw
	.long  0x00000000,0x00000000		# svc old psw
	.long  0x00000000,0x00000000		# program check old psw
	.long  0x00000000,0x00000000		# machine check old psw
	.long  0x00000000,0x00000000		# io old psw
	.long  0x00000000,0x00000000
	.long  0x00000000,0x00000000
	.long  0x00000000,0x00000000
	.long  0x000a0000,0x00000058		# external new psw
	.long  0x000a0000,0x00000060		# svc new psw
	.long  0x000a0000,0x00000068		# program check new psw
	.long  0x000a0000,0x00000070		# machine check new psw
	.long  0x00080000,0x80000000+.Lioint	# io new psw
L
Linus Torvalds 已提交
62

H
Heiko Carstens 已提交
63
	.org   0x100
L
Linus Torvalds 已提交
64 65
#
# subroutine for loading from tape
H
Heiko Carstens 已提交
66
# Paramters:
L
Linus Torvalds 已提交
67 68
#  R1 = device number
#  R2 = load address
H
Heiko Carstens 已提交
69 70 71 72 73 74 75
.Lloader:
	st	%r14,.Lldret
	la	%r3,.Lorbread		# r3 = address of orb
	la	%r5,.Lirb		# r5 = address of irb
	st	%r2,.Lccwread+4 	# initialize CCW data addresses
	lctl	%c6,%c6,.Lcr6
	slr	%r2,%r2
L
Linus Torvalds 已提交
76
.Lldlp:
H
Heiko Carstens 已提交
77
	la	%r6,3			# 3 retries
L
Linus Torvalds 已提交
78
.Lssch:
H
Heiko Carstens 已提交
79 80
	ssch	0(%r3)			# load chunk of IPL_BS bytes
	bnz	.Llderr
L
Linus Torvalds 已提交
81
.Lw4end:
H
Heiko Carstens 已提交
82 83 84 85 86 87 88 89 90 91 92 93 94 95
	bas	%r14,.Lwait4io
	tm	8(%r5),0x82		# do we have a problem ?
	bnz	.Lrecov
	slr	%r7,%r7
	icm	%r7,3,10(%r5)		# get residual count
	lcr	%r7,%r7
	la	%r7,IPL_BS(%r7) 	# IPL_BS-residual=#bytes read
	ar	%r2,%r7 		# add to total size
	tm	8(%r5),0x01		# found a tape mark ?
	bnz	.Ldone
	l	%r0,.Lccwread+4 	# update CCW data addresses
	ar	%r0,%r7
	st	%r0,.Lccwread+4
	b	.Lldlp
L
Linus Torvalds 已提交
96
.Ldone:
H
Heiko Carstens 已提交
97 98
	l	%r14,.Lldret
	br	%r14			# r2 contains the total size
L
Linus Torvalds 已提交
99
.Lrecov:
H
Heiko Carstens 已提交
100 101 102
	bas	%r14,.Lsense		# do the sensing
	bct	%r6,.Lssch		# dec. retry count & branch
	b	.Llderr
L
Linus Torvalds 已提交
103 104 105 106
#
# Sense subroutine
#
.Lsense:
H
Heiko Carstens 已提交
107 108 109 110 111 112 113 114 115
	st	%r14,.Lsnsret
	la	%r7,.Lorbsense
	ssch	0(%r7)			# start sense command
	bnz	.Llderr
	bas	%r14,.Lwait4io
	l	%r14,.Lsnsret
	tm	8(%r5),0x82		# do we have a problem ?
	bnz	.Llderr
	br	%r14
L
Linus Torvalds 已提交
116 117 118 119
#
# Wait for interrupt subroutine
#
.Lwait4io:
H
Heiko Carstens 已提交
120
	lpsw	.Lwaitpsw
L
Linus Torvalds 已提交
121
.Lioint:
H
Heiko Carstens 已提交
122 123 124 125 126 127 128 129
	c	%r1,0xb8		# compare subchannel number
	bne	.Lwait4io
	tsch	0(%r5)
	slr	%r0,%r0
	tm	8(%r5),0x82		# do we have a problem ?
	bnz	.Lwtexit
	tm	8(%r5),0x04		# got device end ?
	bz	.Lwait4io
L
Linus Torvalds 已提交
130
.Lwtexit:
H
Heiko Carstens 已提交
131
	br	%r14
L
Linus Torvalds 已提交
132
.Llderr:
H
Heiko Carstens 已提交
133
	lpsw	.Lcrash
L
Linus Torvalds 已提交
134

H
Heiko Carstens 已提交
135
	.align	8
L
Linus Torvalds 已提交
136
.Lorbread:
H
Heiko Carstens 已提交
137 138
	.long	0x00000000,0x0080ff00,.Lccwread
	.align	8
L
Linus Torvalds 已提交
139
.Lorbsense:
H
Heiko Carstens 已提交
140 141
	.long	0x00000000,0x0080ff00,.Lccwsense
	.align	8
L
Linus Torvalds 已提交
142
.Lccwread:
H
Heiko Carstens 已提交
143
	.long	0x02200000+IPL_BS,0x00000000
L
Linus Torvalds 已提交
144
.Lccwsense:
H
Heiko Carstens 已提交
145
	.long	0x04200001,0x00000000
L
Linus Torvalds 已提交
146
.Lwaitpsw:
H
Heiko Carstens 已提交
147
	.long	0x020a0000,0x80000000+.Lioint
L
Linus Torvalds 已提交
148

H
Heiko Carstens 已提交
149 150 151 152 153
.Lirb:	.long	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.Lcr6:	.long	0xff000000
	.align	8
.Lcrash:.long	0x000a0000,0x00000000
.Lldret:.long	0
L
Linus Torvalds 已提交
154
.Lsnsret: .long 0
H
Heiko Carstens 已提交
155
#endif	/* CONFIG_IPL_TAPE */
L
Linus Torvalds 已提交
156 157

#ifdef CONFIG_IPL_VM
H
Heiko Carstens 已提交
158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
#define IPL_BS	0x730
	.org	0
	.long	0x00080000,0x80000000+iplstart	# The first 24 bytes are loaded
	.long	0x02000018,0x60000050		# by ipl to addresses 0-23.
	.long	0x02000068,0x60000050		# (a PSW and two CCWs).
	.fill	80-24,1,0x40			# bytes 24-79 are discarded !!
	.long	0x020000f0,0x60000050		# The next 160 byte are loaded
	.long	0x02000140,0x60000050		# to addresses 0x18-0xb7
	.long	0x02000190,0x60000050		# They form the continuation
	.long	0x020001e0,0x60000050		# of the CCW program started
	.long	0x02000230,0x60000050		# by ipl and load the range
	.long	0x02000280,0x60000050		# 0x0f0-0x730 from the image
	.long	0x020002d0,0x60000050		# to the range 0x0f0-0x730
	.long	0x02000320,0x60000050		# in memory. At the end of
	.long	0x02000370,0x60000050		# the channel program the PSW
	.long	0x020003c0,0x60000050		# at location 0 is loaded.
	.long	0x02000410,0x60000050		# Initial processing starts
	.long	0x02000460,0x60000050		# at 0xf0 = iplstart.
	.long	0x020004b0,0x60000050
	.long	0x02000500,0x60000050
	.long	0x02000550,0x60000050
	.long	0x020005a0,0x60000050
	.long	0x020005f0,0x60000050
	.long	0x02000640,0x60000050
	.long	0x02000690,0x60000050
	.long	0x020006e0,0x20000050
L
Linus Torvalds 已提交
184

H
Heiko Carstens 已提交
185
	.org	0xf0
L
Linus Torvalds 已提交
186 187 188
#
# subroutine for loading cards from the reader
#
H
Heiko Carstens 已提交
189 190 191 192 193
.Lloader:
	la	%r3,.Lorb		# r2 = address of orb into r2
	la	%r5,.Lirb		# r4 = address of irb
	la	%r6,.Lccws
	la	%r7,20
L
Linus Torvalds 已提交
194
.Linit:
H
Heiko Carstens 已提交
195 196 197 198
	st	%r2,4(%r6)		# initialize CCW data addresses
	la	%r2,0x50(%r2)
	la	%r6,8(%r6)
	bct	7,.Linit
L
Linus Torvalds 已提交
199

H
Heiko Carstens 已提交
200 201
	lctl	%c6,%c6,.Lcr6		# set IO subclass mask
	slr	%r2,%r2
L
Linus Torvalds 已提交
202
.Lldlp:
H
Heiko Carstens 已提交
203 204
	ssch	0(%r3)			# load chunk of 1600 bytes
	bnz	.Llderr
L
Linus Torvalds 已提交
205
.Lwait4irq:
H
Heiko Carstens 已提交
206 207
	mvc	0x78(8),.Lnewpsw	# set up IO interrupt psw
	lpsw	.Lwaitpsw
L
Linus Torvalds 已提交
208
.Lioint:
H
Heiko Carstens 已提交
209 210 211
	c	%r1,0xb8		# compare subchannel number
	bne	.Lwait4irq
	tsch	0(%r5)
L
Linus Torvalds 已提交
212

H
Heiko Carstens 已提交
213 214 215 216 217 218
	slr	%r0,%r0
	ic	%r0,8(%r5)		# get device status
	chi	%r0,8			# channel end ?
	be	.Lcont
	chi	%r0,12			# channel end + device end ?
	be	.Lcont
L
Linus Torvalds 已提交
219

H
Heiko Carstens 已提交
220 221 222 223 224 225 226 227
	l	%r0,4(%r5)
	s	%r0,8(%r3)		# r0/8 = number of ccws executed
	mhi	%r0,10			# *10 = number of bytes in ccws
	lh	%r3,10(%r5)		# get residual count
	sr	%r0,%r3 		# #ccws*80-residual=#bytes read
	ar	%r2,%r0

	br	%r14			# r2 contains the total size
L
Linus Torvalds 已提交
228 229

.Lcont:
H
Heiko Carstens 已提交
230 231 232
	ahi	%r2,0x640		# add 0x640 to total size
	la	%r6,.Lccws
	la	%r7,20
L
Linus Torvalds 已提交
233
.Lincr:
H
Heiko Carstens 已提交
234 235 236 237 238
	l	%r0,4(%r6)		# update CCW data addresses
	ahi	%r0,0x640
	st	%r0,4(%r6)
	ahi	%r6,8
	bct	7,.Lincr
L
Linus Torvalds 已提交
239

H
Heiko Carstens 已提交
240
	b	.Lldlp
L
Linus Torvalds 已提交
241
.Llderr:
H
Heiko Carstens 已提交
242
	lpsw	.Lcrash
L
Linus Torvalds 已提交
243

H
Heiko Carstens 已提交
244 245 246 247 248 249 250
	.align	8
.Lorb:	.long	0x00000000,0x0080ff00,.Lccws
.Lirb:	.long	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.Lcr6:	.long	0xff000000
.Lloadp:.long	0,0
	.align	8
.Lcrash:.long	0x000a0000,0x00000000
L
Linus Torvalds 已提交
251
.Lnewpsw:
H
Heiko Carstens 已提交
252
	.long	0x00080000,0x80000000+.Lioint
L
Linus Torvalds 已提交
253
.Lwaitpsw:
H
Heiko Carstens 已提交
254
	.long	0x020a0000,0x80000000+.Lioint
L
Linus Torvalds 已提交
255

H
Heiko Carstens 已提交
256 257 258 259 260 261
	.align	8
.Lccws: .rept	19
	.long	0x02600050,0x00000000
	.endr
	.long	0x02200050,0x00000000
#endif	/* CONFIG_IPL_VM */
L
Linus Torvalds 已提交
262 263

iplstart:
H
Heiko Carstens 已提交
264 265 266 267 268 269 270
	lh	%r1,0xb8		# test if subchannel number
	bct	%r1,.Lnoload		#  is valid
	l	%r1,0xb8		# load ipl subchannel number
	la	%r2,IPL_BS		# load start address
	bas	%r14,.Lloader		# load rest of ipl image
	l	%r12,.Lparm		# pointer to parameter area
	st	%r1,IPL_DEVICE+ARCH_OFFSET-PARMAREA(%r12) # save ipl device number
L
Linus Torvalds 已提交
271 272 273 274 275

#
# load parameter file from ipl device
#
.Lagain1:
H
Heiko Carstens 已提交
276 277 278 279 280 281 282
	l	%r2,.Linitrd		# ramdisk loc. is temp
	bas	%r14,.Lloader		# load parameter file
	ltr	%r2,%r2 		# got anything ?
	bz	.Lnopf
	chi	%r2,895
	bnh	.Lnotrunc
	la	%r2,895
L
Linus Torvalds 已提交
283
.Lnotrunc:
H
Heiko Carstens 已提交
284 285 286 287 288 289 290
	l	%r4,.Linitrd
	clc	0(3,%r4),.L_hdr		# if it is HDRx
	bz	.Lagain1		# skip dataset header
	clc	0(3,%r4),.L_eof		# if it is EOFx
	bz	.Lagain1		# skip dateset trailer
	la	%r5,0(%r4,%r2)
	lr	%r3,%r2
L
Linus Torvalds 已提交
291
.Lidebc:
H
Heiko Carstens 已提交
292 293 294 295 296
	tm	0(%r5),0x80		# high order bit set ?
	bo	.Ldocv			#  yes -> convert from EBCDIC
	ahi	%r5,-1
	bct	%r3,.Lidebc
	b	.Lnocv
L
Linus Torvalds 已提交
297
.Ldocv:
H
Heiko Carstens 已提交
298 299 300 301 302 303 304 305 306 307 308 309
	l	%r3,.Lcvtab
	tr	0(256,%r4),0(%r3)	# convert parameters to ascii
	tr	256(256,%r4),0(%r3)
	tr	512(256,%r4),0(%r3)
	tr	768(122,%r4),0(%r3)
.Lnocv: la	%r3,COMMAND_LINE-PARMAREA(%r12) # load adr. of command line
	mvc	0(256,%r3),0(%r4)
	mvc	256(256,%r3),256(%r4)
	mvc	512(256,%r3),512(%r4)
	mvc	768(122,%r3),768(%r4)
	slr	%r0,%r0
	b	.Lcntlp
L
Linus Torvalds 已提交
310
.Ldelspc:
H
Heiko Carstens 已提交
311 312 313 314 315
	ic	%r0,0(%r2,%r3)
	chi	%r0,0x20		# is it a space ?
	be	.Lcntlp
	ahi	%r2,1
	b	.Leolp
L
Linus Torvalds 已提交
316
.Lcntlp:
H
Heiko Carstens 已提交
317
	brct	%r2,.Ldelspc
L
Linus Torvalds 已提交
318
.Leolp:
H
Heiko Carstens 已提交
319 320
	slr	%r0,%r0
	stc	%r0,0(%r2,%r3)		# terminate buffer
L
Linus Torvalds 已提交
321 322 323 324
.Lnopf:

#
# load ramdisk from ipl device
H
Heiko Carstens 已提交
325
#
L
Linus Torvalds 已提交
326
.Lagain2:
H
Heiko Carstens 已提交
327 328 329 330 331 332 333
	l	%r2,.Linitrd		# addr of ramdisk
	st	%r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12)
	bas	%r14,.Lloader		# load ramdisk
	st	%r2,INITRD_SIZE+ARCH_OFFSET-PARMAREA(%r12) # store size of rd
	ltr	%r2,%r2
	bnz	.Lrdcont
	st	%r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12) # no ramdisk found
L
Linus Torvalds 已提交
334
.Lrdcont:
H
Heiko Carstens 已提交
335
	l	%r2,.Linitrd
L
Linus Torvalds 已提交
336

H
Heiko Carstens 已提交
337 338 339 340
	clc	0(3,%r2),.L_hdr		# skip HDRx and EOFx
	bz	.Lagain2
	clc	0(3,%r2),.L_eof
	bz	.Lagain2
L
Linus Torvalds 已提交
341 342 343 344 345

#ifdef CONFIG_IPL_VM
#
# reset files in VM reader
#
H
Heiko Carstens 已提交
346 347 348 349 350 351 352 353 354 355 356 357
	stidp	__LC_CPUID		# store cpuid
	tm	__LC_CPUID,0xff 	# running VM ?
	bno	.Lnoreset
	la	%r2,.Lreset
	lhi	%r3,26
	diag	%r2,%r3,8
	la	%r5,.Lirb
	stsch	0(%r5)			# check if irq is pending
	tm	30(%r5),0x0f		# by verifying if any of the
	bnz	.Lwaitforirq		# activity or status control
	tm	31(%r5),0xff		# bits is set in the schib
	bz	.Lnoreset
358
.Lwaitforirq:
H
Heiko Carstens 已提交
359
	mvc	0x78(8),.Lrdrnewpsw	# set up IO interrupt psw
360
.Lwaitrdrirq:
H
Heiko Carstens 已提交
361
	lpsw	.Lrdrwaitpsw
362
.Lrdrint:
H
Heiko Carstens 已提交
363 364 365 366
	c	%r1,0xb8		# compare subchannel number
	bne	.Lwaitrdrirq
	la	%r5,.Lirb
	tsch	0(%r5)
L
Linus Torvalds 已提交
367
.Lnoreset:
H
Heiko Carstens 已提交
368
	b	.Lnoload
369

H
Heiko Carstens 已提交
370
	.align	8
371
.Lrdrnewpsw:
H
Heiko Carstens 已提交
372
	.long	0x00080000,0x80000000+.Lrdrint
373
.Lrdrwaitpsw:
H
Heiko Carstens 已提交
374
	.long	0x020a0000,0x80000000+.Lrdrint
L
Linus Torvalds 已提交
375
#endif
376

L
Linus Torvalds 已提交
377 378 379 380
#
# everything loaded, go for it
#
.Lnoload:
H
Heiko Carstens 已提交
381 382
	l	%r1,.Lstartup
	br	%r1
L
Linus Torvalds 已提交
383

H
Heiko Carstens 已提交
384
.Linitrd:.long _end + 0x400000		# default address of initrd
L
Linus Torvalds 已提交
385 386
.Lparm:	.long  PARMAREA
.Lstartup: .long startup
H
Heiko Carstens 已提交
387 388 389 390 391 392
.Lcvtab:.long	_ebcasc 		# ebcdic to ascii table
.Lreset:.byte	0xc3,0xc8,0xc1,0xd5,0xc7,0xc5,0x40,0xd9,0xc4,0xd9,0x40
	.byte	0xc1,0xd3,0xd3,0x40,0xd2,0xc5,0xc5,0xd7,0x40,0xd5,0xd6
	.byte	0xc8,0xd6,0xd3,0xc4	# "change rdr all keep nohold"
.L_eof: .long	0xc5d6c600	 /* C'EOF' */
.L_hdr: .long	0xc8c4d900	 /* C'HDR' */
L
Linus Torvalds 已提交
393

H
Heiko Carstens 已提交
394
#endif	/* CONFIG_IPL */
L
Linus Torvalds 已提交
395 396 397 398 399 400

#
# SALIPL loader support. Based on a patch by Rob van der Heij.
# This entry point is called directly from the SALIPL loader and
# doesn't need a builtin ipl record.
#
H
Heiko Carstens 已提交
401 402
	.org	0x800
	.globl	start
L
Linus Torvalds 已提交
403
start:
H
Heiko Carstens 已提交
404 405
	stm	%r0,%r15,0x07b0		# store registers
	basr	%r12,%r0
L
Linus Torvalds 已提交
406
.base:
H
Heiko Carstens 已提交
407 408
	l	%r11,.parm
	l	%r8,.cmd		# pointer to command buffer
L
Linus Torvalds 已提交
409

H
Heiko Carstens 已提交
410 411
	ltr	%r9,%r9			# do we have SALIPL parameters?
	bp	.sk8x8
L
Linus Torvalds 已提交
412

H
Heiko Carstens 已提交
413 414 415 416
	mvc	0(64,%r8),0x00b0	# copy saved registers
	xc	64(240-64,%r8),0(%r8)	# remainder of buffer
	tr	0(64,%r8),.lowcase
	b	.gotr
L
Linus Torvalds 已提交
417
.sk8x8:
H
Heiko Carstens 已提交
418
	mvc	0(240,%r8),0(%r9)	# copy iplparms into buffer
L
Linus Torvalds 已提交
419
.gotr:
H
Heiko Carstens 已提交
420 421 422 423 424 425 426 427 428
	l	%r10,.tbl		# EBCDIC to ASCII table
	tr	0(240,%r8),0(%r10)
	slr	%r0,%r0
	st	%r0,INITRD_SIZE+ARCH_OFFSET-PARMAREA(%r11)
	st	%r0,INITRD_START+ARCH_OFFSET-PARMAREA(%r11)
	j	startup 		# continue with startup
.tbl:	.long	_ebcasc			# translate table
.cmd:	.long	COMMAND_LINE		# address of command line buffer
.parm:	.long	PARMAREA
L
Linus Torvalds 已提交
429
.lowcase:
H
Heiko Carstens 已提交
430
	.byte 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07
L
Linus Torvalds 已提交
431
	.byte 0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f
H
Heiko Carstens 已提交
432
	.byte 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17
L
Linus Torvalds 已提交
433
	.byte 0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f
H
Heiko Carstens 已提交
434
	.byte 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27
L
Linus Torvalds 已提交
435
	.byte 0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f
H
Heiko Carstens 已提交
436
	.byte 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37
L
Linus Torvalds 已提交
437
	.byte 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f
H
Heiko Carstens 已提交
438
	.byte 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47
L
Linus Torvalds 已提交
439
	.byte 0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f
H
Heiko Carstens 已提交
440
	.byte 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57
L
Linus Torvalds 已提交
441
	.byte 0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f
H
Heiko Carstens 已提交
442
	.byte 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67
L
Linus Torvalds 已提交
443
	.byte 0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f
H
Heiko Carstens 已提交
444
	.byte 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77
L
Linus Torvalds 已提交
445 446
	.byte 0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f

H
Heiko Carstens 已提交
447
	.byte 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87
L
Linus Torvalds 已提交
448
	.byte 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f
H
Heiko Carstens 已提交
449
	.byte 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97
L
Linus Torvalds 已提交
450
	.byte 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f
H
Heiko Carstens 已提交
451
	.byte 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7
L
Linus Torvalds 已提交
452
	.byte 0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf
H
Heiko Carstens 已提交
453
	.byte 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7
L
Linus Torvalds 已提交
454
	.byte 0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf
H
Heiko Carstens 已提交
455
	.byte 0xc0,0x81,0x82,0x83,0x84,0x85,0x86,0x87	# .abcdefg
L
Linus Torvalds 已提交
456
	.byte 0x88,0x89,0xca,0xcb,0xcc,0xcd,0xce,0xcf	# hi
H
Heiko Carstens 已提交
457
	.byte 0xd0,0x91,0x92,0x93,0x94,0x95,0x96,0x97	# .jklmnop
L
Linus Torvalds 已提交
458 459 460
	.byte 0x98,0x99,0xda,0xdb,0xdc,0xdd,0xde,0xdf	# qr
	.byte 0xe0,0xe1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7	# ..stuvwx
	.byte 0xa8,0xa9,0xea,0xeb,0xec,0xed,0xee,0xef	# yz
H
Heiko Carstens 已提交
461
	.byte 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7
L
Linus Torvalds 已提交
462 463
	.byte 0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff

464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512
#
# startup-code at 0x10000, running in absolute addressing mode
# this is called either by the ipl loader or directly by PSW restart
# or linload or SALIPL
#
	.org	0x10000
startup:basr	%r13,0			# get base
.LPG0:

#ifndef CONFIG_MARCH_G5
	# check processor version against MARCH_{G5,Z900,Z990,Z9_109,Z10}
	stidp	__LC_CPUID		# store cpuid
	lhi	%r0,(3f-2f) / 2
	la	%r1,2f-.LPG0(%r13)
0:	clc	__LC_CPUID+4(2),0(%r1)
	jne	3f
	lpsw	1f-.LPG0(13)		# machine type not good enough, crash
	.align 16
1:	.long	0x000a0000,0x00000000
2:
#if defined(CONFIG_MARCH_Z10)
	.short 0x9672, 0x2064, 0x2066, 0x2084, 0x2086, 0x2094, 0x2096
#elif defined(CONFIG_MARCH_Z9_109)
	.short 0x9672, 0x2064, 0x2066, 0x2084, 0x2086
#elif defined(CONFIG_MARCH_Z990)
	.short 0x9672, 0x2064, 0x2066
#elif defined(CONFIG_MARCH_Z900)
	.short 0x9672
#endif
3:	la	%r1,2(%r1)
	brct	%r0,0b
#endif

	l	%r13,0f-.LPG0(%r13)
	b	0(%r13)
0:	.long	startup_continue

#
# params at 10400 (setup.h)
#
	.org	PARMAREA
	.long	0,0			# IPL_DEVICE
	.long	0,0			# INITRD_START
	.long	0,0			# INITRD_SIZE

	.org	COMMAND_LINE
	.byte	"root=/dev/ram0 ro"
	.byte	0

513
#ifdef CONFIG_64BIT
514 515 516
#include "head64.S"
#else
#include "head31.S"
L
Linus Torvalds 已提交
517
#endif