head.S 12 KB

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