head.S 9.8 KB
Newer Older
L
Linus Torvalds 已提交
1
/*
2
 * Copyright IBM Corp. 1999, 2010
3 4 5 6 7
 *
 *    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 已提交
8 9 10 11 12 13 14 15 16 17 18 19 20
 *
 * 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)
21
 *
L
Linus Torvalds 已提交
22 23
 */

24
#include <linux/init.h>
25
#include <linux/linkage.h>
26
#include <asm/asm-offsets.h>
L
Linus Torvalds 已提交
27 28
#include <asm/thread_info.h>
#include <asm/page.h>
29
#include <asm/ptrace.h>
L
Linus Torvalds 已提交
30

31 32
#define ARCH_OFFSET	4

33
__HEAD
L
Linus Torvalds 已提交
34

H
Heiko Carstens 已提交
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
#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
52
	.long	0x02000460,0x60000050		# at 0x200 = iplstart.
H
Heiko Carstens 已提交
53 54 55 56 57 58 59 60
	.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 已提交
61

62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
	.org	0x200

#
# subroutine to wait for end I/O
#
.Lirqwait:
	mvc	0x1f0(16),.Lnewpsw	# set up IO interrupt psw
	lpsw	.Lwaitpsw
.Lioint:
	br	%r14
	.align	8
.Lnewpsw:
	.quad	0x0000000080000000,.Lioint
.Lwaitpsw:
	.long	0x020a0000,0x80000000+.Lioint

L
Linus Torvalds 已提交
78 79 80
#
# subroutine for loading cards from the reader
#
H
Heiko Carstens 已提交
81
.Lloader:
82
	la	%r4,0(%r14)
H
Heiko Carstens 已提交
83 84 85 86
	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 已提交
87
.Linit:
H
Heiko Carstens 已提交
88 89 90 91
	st	%r2,4(%r6)		# initialize CCW data addresses
	la	%r2,0x50(%r2)
	la	%r6,8(%r6)
	bct	7,.Linit
L
Linus Torvalds 已提交
92

H
Heiko Carstens 已提交
93 94
	lctl	%c6,%c6,.Lcr6		# set IO subclass mask
	slr	%r2,%r2
L
Linus Torvalds 已提交
95
.Lldlp:
H
Heiko Carstens 已提交
96 97
	ssch	0(%r3)			# load chunk of 1600 bytes
	bnz	.Llderr
L
Linus Torvalds 已提交
98
.Lwait4irq:
99
	bas	%r14,.Lirqwait
H
Heiko Carstens 已提交
100 101 102
	c	%r1,0xb8		# compare subchannel number
	bne	.Lwait4irq
	tsch	0(%r5)
L
Linus Torvalds 已提交
103

H
Heiko Carstens 已提交
104 105 106 107 108 109
	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 已提交
110

H
Heiko Carstens 已提交
111 112 113 114 115 116 117
	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

118
	br	%r4			# r2 contains the total size
L
Linus Torvalds 已提交
119 120

.Lcont:
H
Heiko Carstens 已提交
121 122 123
	ahi	%r2,0x640		# add 0x640 to total size
	la	%r6,.Lccws
	la	%r7,20
L
Linus Torvalds 已提交
124
.Lincr:
H
Heiko Carstens 已提交
125 126 127 128 129
	l	%r0,4(%r6)		# update CCW data addresses
	ahi	%r0,0x640
	st	%r0,4(%r6)
	ahi	%r6,8
	bct	7,.Lincr
L
Linus Torvalds 已提交
130

H
Heiko Carstens 已提交
131
	b	.Lldlp
L
Linus Torvalds 已提交
132
.Llderr:
H
Heiko Carstens 已提交
133
	lpsw	.Lcrash
L
Linus Torvalds 已提交
134

H
Heiko Carstens 已提交
135 136 137 138 139 140 141
	.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 已提交
142

H
Heiko Carstens 已提交
143 144 145 146 147
	.align	8
.Lccws: .rept	19
	.long	0x02600050,0x00000000
	.endr
	.long	0x02200050,0x00000000
L
Linus Torvalds 已提交
148 149

iplstart:
H
Heiko Carstens 已提交
150 151 152 153 154 155 156 157
	mvi	__LC_AR_MODE_ID,1	# set esame flag
	slr	%r0,%r0			# set cpuid to zero
	lhi	%r1,2			# mode 2 = esame (dump)
	sigp	%r1,%r0,0x12		# switch to esame mode
	bras	%r13,0f
	.fill	16,4,0x0
0:	lmh	%r0,%r15,0(%r13)	# clear high-order half of gprs
	sam31				# switch to 31 bit addressing mode
H
Heiko Carstens 已提交
158 159 160 161 162 163 164
	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 已提交
165 166 167 168 169

#
# load parameter file from ipl device
#
.Lagain1:
H
Heiko Carstens 已提交
170 171 172 173 174 175 176
	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 已提交
177
.Lnotrunc:
H
Heiko Carstens 已提交
178 179 180 181 182 183 184
	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
185
	la	%r3,COMMAND_LINE-PARMAREA(%r12) # load adr. of command line
H
Heiko Carstens 已提交
186 187 188 189 190 191
	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 已提交
192
.Ldelspc:
H
Heiko Carstens 已提交
193 194 195 196 197
	ic	%r0,0(%r2,%r3)
	chi	%r0,0x20		# is it a space ?
	be	.Lcntlp
	ahi	%r2,1
	b	.Leolp
L
Linus Torvalds 已提交
198
.Lcntlp:
H
Heiko Carstens 已提交
199
	brct	%r2,.Ldelspc
L
Linus Torvalds 已提交
200
.Leolp:
H
Heiko Carstens 已提交
201 202
	slr	%r0,%r0
	stc	%r0,0(%r2,%r3)		# terminate buffer
L
Linus Torvalds 已提交
203 204 205 206
.Lnopf:

#
# load ramdisk from ipl device
H
Heiko Carstens 已提交
207
#
L
Linus Torvalds 已提交
208
.Lagain2:
H
Heiko Carstens 已提交
209 210 211 212 213 214 215
	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 已提交
216
.Lrdcont:
H
Heiko Carstens 已提交
217
	l	%r2,.Linitrd
L
Linus Torvalds 已提交
218

H
Heiko Carstens 已提交
219 220 221 222
	clc	0(3,%r2),.L_hdr		# skip HDRx and EOFx
	bz	.Lagain2
	clc	0(3,%r2),.L_eof
	bz	.Lagain2
L
Linus Torvalds 已提交
223 224 225 226

#
# reset files in VM reader
#
227 228
	stidp	.Lcpuid			# store cpuid
	tm	.Lcpuid,0xff		# running VM ?
H
Heiko Carstens 已提交
229 230 231 232 233 234 235 236 237 238
	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
239
.Lwaitforirq:
240
	bas	%r14,.Lirqwait		# wait for IO interrupt
H
Heiko Carstens 已提交
241
	c	%r1,0xb8		# compare subchannel number
242
	bne	.Lwaitforirq
H
Heiko Carstens 已提交
243 244
	la	%r5,.Lirb
	tsch	0(%r5)
L
Linus Torvalds 已提交
245
.Lnoreset:
H
Heiko Carstens 已提交
246
	b	.Lnoload
247

L
Linus Torvalds 已提交
248 249 250 251
#
# everything loaded, go for it
#
.Lnoload:
H
Heiko Carstens 已提交
252 253
	l	%r1,.Lstartup
	br	%r1
L
Linus Torvalds 已提交
254

255
.Linitrd:.long _end			# default address of initrd
L
Linus Torvalds 已提交
256 257
.Lparm:	.long  PARMAREA
.Lstartup: .long startup
H
Heiko Carstens 已提交
258 259 260 261 262
.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' */
263 264
	.align	8
.Lcpuid:.fill	8,1,0
L
Linus Torvalds 已提交
265

266 267 268 269 270 271
#
# 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
272
ENTRY(startup)
M
Michael Holzheu 已提交
273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289
	j	.Lep_startup_normal
	.org	0x10008
#
# This is a list of s390 kernel entry points. At address 0x1000f the number of
# valid entry points is stored.
#
# IMPORTANT: Do not change this table, it is s390 kernel ABI!
#
	.ascii	"S390EP"
	.byte	0x00,0x01
#
# kdump startup-code at 0x10010, running in 64 bit absolute addressing mode
#
	.org	0x10010
ENTRY(startup_kdump)
	j	.Lep_startup_kdump
.Lep_startup_normal:
290 291 292 293 294 295 296
	mvi	__LC_AR_MODE_ID,1	# set esame flag
	slr	%r0,%r0 		# set cpuid to zero
	lhi	%r1,2			# mode 2 = esame (dump)
	sigp	%r1,%r0,0x12		# switch to esame mode
	bras	%r13,0f
	.fill	16,4,0x0
0:	lmh	%r0,%r15,0(%r13)	# clear high-order half of gprs
297
	sam64				# switch to 64 bit addressing mode
298
	basr	%r13,0			# get base
299
.LPG0:
M
Martin Schwidefsky 已提交
300 301
	xc	0x200(256),0x200	# partially clear lowcore
	xc	0x300(256),0x300
M
Michael Holzheu 已提交
302
	xc	0xe00(256),0xe00
303
	lctlg	%c0,%c15,0x200(%r0)	# initialize control registers
304
	stck	__LC_LAST_UPDATE_CLOCK
305 306
	spt	6f-.LPG0(%r13)
	mvc	__LC_LAST_UPDATE_TIMER(8),6f-.LPG0(%r13)
307
	xc	__LC_STFL_FAC_LIST(8),__LC_STFL_FAC_LIST
308
	# check capabilities against MARCH_{G5,Z900,Z990,Z9_109,Z10}
309
	stfl	0(%r0)			# store facilities @ __LC_STFL_FAC_LIST
310 311
	tm	__LC_STFL_FAC_LIST,0x01	# stfle available ?
	jz	0f
312
	la	%r0,1
313
	.insn	s,0xb2b00000,__LC_STFL_FAC_LIST	# store facility list extended
314 315 316 317 318 319 320 321 322 323 324 325 326 327
	# verify if all required facilities are supported by the machine
0:	la	%r1,__LC_STFL_FAC_LIST
	la	%r2,3f+8-.LPG0(%r13)
	l	%r3,0(%r2)
1:	l	%r0,0(%r1)
	n	%r0,4(%r2)
	cl	%r0,4(%r2)
	jne	2f
	la	%r1,4(%r1)
	la	%r2,4(%r2)
	ahi	%r3,-1
	jnz	1b
	j	4f
2:	l	%r15,.Lstack-.LPG0(%r13)
328
	ahi	%r15,-STACK_FRAME_OVERHEAD
H
Heiko Carstens 已提交
329 330 331
	la	%r2,.Lals_string-.LPG0(%r13)
	l	%r3,.Lsclp_print-.LPG0(%r13)
	basr	%r14,%r3
332
	lpsw	3f-.LPG0(%r13)		# machine type not good enough, crash
H
Heiko Carstens 已提交
333 334 335 336 337
.Lals_string:
	.asciz	"The Linux kernel requires more recent processor hardware"
.Lsclp_print:
	.long	_sclp_print_early
.Lstack:
338
	.long	0x8000 + (1<<(PAGE_SHIFT+THREAD_ORDER))
339
	.align 16
340 341 342 343 344 345
3:	.long	0x000a0000,0x8badcccc

# List of facilities that are required. If not all facilities are present
# the kernel will crash. Format is number of facility words with bits set,
# followed by the facility words.

346
#if defined(CONFIG_MARCH_Z13)
347
	.long 2, 0xc100eff2, 0xf46cc800
348
#elif defined(CONFIG_MARCH_ZEC12)
349
	.long 2, 0xc100eff2, 0xf46cc800
350
#elif defined(CONFIG_MARCH_Z196)
351
	.long 2, 0xc100eff2, 0xf46c0000
352
#elif defined(CONFIG_MARCH_Z10)
353
	.long 2, 0xc100eff2, 0xf0680000
354
#elif defined(CONFIG_MARCH_Z9_109)
355
	.long 1, 0xc100efc2
356
#elif defined(CONFIG_MARCH_Z990)
357
	.long 1, 0xc0002000
358
#elif defined(CONFIG_MARCH_Z900)
359
	.long 1, 0xc0000000
360
#endif
361
4:
362
	/* Continue with startup code in head64.S */
363
	jg	startup_continue
364

365
	.align	8
366
6:	.long	0x7fffffff,0xffffffff
367

M
Michael Holzheu 已提交
368 369
#include "head_kdump.S"

370 371 372 373 374 375 376
#
# params at 10400 (setup.h)
#
	.org	PARMAREA
	.long	0,0			# IPL_DEVICE
	.long	0,0			# INITRD_START
	.long	0,0			# INITRD_SIZE
M
Michael Holzheu 已提交
377 378
	.long	0,0			# OLDMEM_BASE
	.long	0,0			# OLDMEM_SIZE
379 380 381 382 383

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

384
	.org	0x11000