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 30#ifdef CONFIG_64BIT 31#define ARCH_OFFSET 4 32#else 33#define ARCH_OFFSET 0 34#endif 35 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 60 61 .org 0x100 62# 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 101# 102# Sense subroutine 103# 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 114# 115# Wait for interrupt subroutine 116# 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 132 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 146 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 */ 154 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 182 183 .org 0xf0 184# 185# subroutine for loading cards from the reader 186# 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 197 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) 210 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 217 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 224 225 br %r14 # r2 contains the total size 226 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 237 238 b .Lldlp 239.Llderr: 240 lpsw .Lcrash 241 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 253 254 .align 8 255.Lccws: .rept 19 256 .long 0x02600050,0x00000000 257 .endr 258 .long 0x02200050,0x00000000 259#endif /* CONFIG_IPL_VM */ 260 261iplstart: 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 269 270# 271# load parameter file from ipl device 272# 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: 308 309# 310# load ramdisk from ipl device 311# 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 322 323 clc 0(3,%r2),.L_hdr # skip HDRx and EOFx 324 bz .Lagain2 325 clc 0(3,%r2),.L_eof 326 bz .Lagain2 327 328#ifdef CONFIG_IPL_VM 329# 330# reset files in VM reader 331# 332 stidp __LC_SAVE_AREA_SYNC # store cpuid 333 tm __LC_SAVE_AREA_SYNC,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 355 356 .align 8 357.Lrdrnewpsw: 358 .long 0x00080000,0x80000000+.Lrdrint 359.Lrdrwaitpsw: 360 .long 0x020a0000,0x80000000+.Lrdrint 361#endif 362 363# 364# everything loaded, go for it 365# 366.Lnoload: 367 l %r1,.Lstartup 368 br %r1 369 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' */ 378 379#endif /* CONFIG_IPL */ 380 381# 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. 385# 386 .org 0x800 387ENTRY(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 393 394 ltr %r9,%r9 # do we have SALIPL parameters? 395 bp .sk8x8 396 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 427 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 444 445# 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 449# 450 .org 0x10000 451ENTRY(startup) 452 j .Lep_startup_normal 453 .org 0x10008 454# 455# This is a list of s390 kernel entry points. At address 0x1000f the number of 456# valid entry points is stored. 457# 458# IMPORTANT: Do not change this table, it is s390 kernel ABI! 459# 460 .ascii "S390EP" 461 .byte 0x00,0x01 462# 463# kdump startup-code at 0x10010, running in 64 bit absolute addressing mode 464# 465 .org 0x10010 466ENTRY(startup_kdump) 467 j .Lep_startup_kdump 468.Lep_startup_normal: 469 basr %r13,0 # get base 470.LPG0: 471 xc 0x200(256),0x200 # partially clear lowcore 472 xc 0x300(256),0x300 473 xc 0xe00(256),0xe00 474 stck __LC_LAST_UPDATE_CLOCK 475 spt 5f-.LPG0(%r13) 476 mvc __LC_LAST_UPDATE_TIMER(8),5f-.LPG0(%r13) 477 xc __LC_STFL_FAC_LIST(8),__LC_STFL_FAC_LIST 478#ifndef CONFIG_MARCH_G5 479 # check capabilities against MARCH_{G5,Z900,Z990,Z9_109,Z10} 480 .insn s,0xb2b10000,__LC_STFL_FAC_LIST # store facility list 481 tm __LC_STFL_FAC_LIST,0x01 # stfle available ? 482 jz 0f 483 la %r0,0 484 .insn s,0xb2b00000,__LC_STFL_FAC_LIST # store facility list extended 4850: l %r0,__LC_STFL_FAC_LIST 486 n %r0,2f+8-.LPG0(%r13) 487 cl %r0,2f+8-.LPG0(%r13) 488 jne 1f 489 l %r0,__LC_STFL_FAC_LIST+4 490 n %r0,2f+12-.LPG0(%r13) 491 cl %r0,2f+12-.LPG0(%r13) 492 je 3f 4931: l %r15,.Lstack-.LPG0(%r13) 494 ahi %r15,-96 495 la %r2,.Lals_string-.LPG0(%r13) 496 l %r3,.Lsclp_print-.LPG0(%r13) 497 basr %r14,%r3 498 lpsw 2f-.LPG0(%r13) # machine type not good enough, crash 499.Lals_string: 500 .asciz "The Linux kernel requires more recent processor hardware" 501.Lsclp_print: 502 .long _sclp_print_early 503.Lstack: 504 .long 0x8000 + (1<<(PAGE_SHIFT+THREAD_ORDER)) 505 .align 16 5062: .long 0x000a0000,0x8badcccc 507#if defined(CONFIG_64BIT) 508#if defined(CONFIG_MARCH_Z196) 509 .long 0xc100efe3, 0xf46c0000 510#elif defined(CONFIG_MARCH_Z10) 511 .long 0xc100efe3, 0xf0680000 512#elif defined(CONFIG_MARCH_Z9_109) 513 .long 0xc100efc3, 0x00000000 514#elif defined(CONFIG_MARCH_Z990) 515 .long 0xc0002000, 0x00000000 516#elif defined(CONFIG_MARCH_Z900) 517 .long 0xc0000000, 0x00000000 518#endif 519#else 520#if defined(CONFIG_MARCH_Z196) 521 .long 0x8100c880, 0x00000000 522#elif defined(CONFIG_MARCH_Z10) 523 .long 0x8100c880, 0x00000000 524#elif defined(CONFIG_MARCH_Z9_109) 525 .long 0x8100c880, 0x00000000 526#elif defined(CONFIG_MARCH_Z990) 527 .long 0x80002000, 0x00000000 528#elif defined(CONFIG_MARCH_Z900) 529 .long 0x80000000, 0x00000000 530#endif 531#endif 5323: 533#endif 534 535#ifdef CONFIG_64BIT 536 mvi __LC_AR_MODE_ID,1 # set esame flag 537 slr %r0,%r0 # set cpuid to zero 538 lhi %r1,2 # mode 2 = esame (dump) 539 sigp %r1,%r0,0x12 # switch to esame mode 540 sam64 # switch to 64 bit mode 541 larl %r13,4f 542 lmh %r0,%r15,0(%r13) # clear high-order half 543 jg startup_continue 5444: .fill 16,4,0x0 545#else 546 mvi __LC_AR_MODE_ID,0 # set ESA flag (mode 0) 547 l %r13,4f-.LPG0(%r13) 548 b 0(%r13) 549 .align 8 5504: .long startup_continue 551#endif 552 .align 8 5535: .long 0x7fffffff,0xffffffff 554 555#include "head_kdump.S" 556 557# 558# params at 10400 (setup.h) 559# 560 .org PARMAREA 561 .long 0,0 # IPL_DEVICE 562 .long 0,0 # INITRD_START 563 .long 0,0 # INITRD_SIZE 564 .long 0,0 # OLDMEM_BASE 565 .long 0,0 # OLDMEM_SIZE 566 567 .org COMMAND_LINE 568 .byte "root=/dev/ram0 ro" 569 .byte 0 570 571 .org 0x11000 572