patch-2.3.99-pre8 linux/arch/s390/boot/iplfba.S
Next file: linux/arch/s390/config.in
Previous file: linux/arch/s390/boot/ipleckd.S
Back to the patch index
Back to the overall index
- Lines: 132
- Date:
Fri May 12 11:41:44 2000
- Orig file:
v2.3.99-pre7/linux/arch/s390/boot/iplfba.S
- Orig date:
Wed Dec 31 16:00:00 1969
diff -u --recursive --new-file v2.3.99-pre7/linux/arch/s390/boot/iplfba.S linux/arch/s390/boot/iplfba.S
@@ -0,0 +1,131 @@
+#
+# Ipl block for fba devices
+# Copyright (C) 1998 IBM Corporation
+# Author(s): Martin Schwidefsky
+#
+# startup for ipl at address 0
+# start with restart
+
+# The first 24 byes are loaded by ipl to addresses 0-23 (a PSW and two CCWs).
+# The CCWs on 8-23 are used as a continuation of the implicit ipl channel
+# program. The fba ipl loader only uses the CCW on 8-15 to load the first 512
+# byte block to location 0-511 (the reading starts again at block 0, byte 0).
+# The second CCW is used to store the location of the load list.
+ .org 0
+ .long 0x00080000,0x80000000+_start # The first 24 byte are loaded
+ .long 0x02000000,0x20000200 # by ipl to addresses 0-23.
+ .long 0x00000001,0x00000001 # (PSW, one CCW & loadlist info).
+
+ .globl _start
+_start:
+ basr %r13,0
+.LPG0:
+ l %r1,0xb8 # load ipl subchannel number
+ lhi %r2,0x200 # location for the loadlist
+ lm %r3,%r4,0x10 # blocknr and length of loadlist
+ bras %r14,.Lloader # load loadlist
+
+ lhi %r11,0x400
+ lhi %r12,0x200 # load address of loadlist
+ l %r3,0(%r12) # get first block number
+ l %r4,4(%r12) # get first block count
+ la %r12,8(%r12)
+ j .Llistloop
+ .org 0x50
+.Llistloop:
+ lr %r2,%r11 # load address
+ lr %r5,%r4 # block count
+ mhi %r5,512
+ la %r11,0(%r5,%r11) # update load address
+ bras %r14,.Lloader # load chunk of the image
+ l %r3,0(%r12) # get next block number
+ icm %r4,15,4(%r12) # get next block count
+ la %r12,8(%r12)
+ jnz .Llistloop
+
+#
+# everything loaded, go for it
+#
+ l %r1,.Lstart-.LPG0(%r13)
+ br %r1
+
+#
+# subroutine for loading a sequence of block from fba
+# %r2: load address (24 bit address)
+# %r3: number of first block (unsigned long)
+# %r4: number of blocks to load (unsigned short)
+#
+ .org 0xC0
+.Lloader:
+ la %r5,.Llo-.LPG0(%r13)
+ sth %r4,2(%r5) # initialize block count
+ st %r3,4(%r5) # initialize block number
+ la %r5,.Lccws-.LPG0(%r13)
+ mhi %r4,512
+ sth %r4,22(%r5) # initialize byte count
+ icm %r2,8,16(%r5)
+ st %r2,16(%r5) # initialize CCW data address
+
+ slr %r2,%r2
+ la %r3,.Lorb-.LPG0(%r13) # r2 = address of orb into r2
+ la %r4,.Ltinfo-.LPG0(%r13) # r3 = address of tpi info block
+ la %r5,.Lirb-.LPG0(%r13) # r4 = address of irb
+
+ lctl %c6,%c6,.Lc6-.LPG0(%r13)
+.Lldlp:
+ ssch 0(%r3) # read blocks
+.Ltpi:
+ tpi 0(%r4) # test pending interrupt
+ jz .Ltpi
+ c %r1,0(%r4) # compare subchannel number
+ jne .Ltpi
+ tsch 0(%r5)
+ slr %r0,%r0
+ tm 8(%r5),0x82 # do we have a problem ?
+ jnz .Ldwpsw
+ tm 8(%r5),0x04 # got device end ?
+ jz .Ltpi
+.Lexit:
+ br %r14
+
+ .align 8
+.Ldwpsw:.long 0x000a0000,0x00000000
+.Lorb: .long 0x00000000,0x0000ff00,.Lccws
+.Ltinfo:.long 0
+.Lirb: .long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+.Lc6: .long 0xff000000
+.Lloadp:.long 0,0
+.Lparm: .long 0x10400
+.Lstart:.long 0x10000
+ .align 8
+.Lccws: .long 0x63000000+.Lde,0x60000010 # define extent
+ .long 0x43000000+.Llo,0x60000008 # locate
+# offset 1 in read CCW: data address (24 bit)
+# offset 6 in read CCW: number of bytes (16 bit)
+ .long 0x42000000,0x20000000 # read
+.Lde: .long 0x40000200,0x00000000
+ .long 0x00000000,0x00001000
+# offset 2 in .Llo: block count (unsigned short)
+# offset 4 in .Llo: block number (unsigned long)
+.Llo: .long 0x06000000,0x00000000
+
+ .org 0x200
+ .long 0x00000002,0x0000007f
+ .long 0x00000081,0x0000007f
+ .long 0x00000100,0x0000007f
+ .long 0x0000017f,0x0000007f
+ .long 0x000001fe,0x0000007f
+ .long 0x0000027d,0x0000007f
+ .long 0x000002fc,0x0000007f
+ .long 0x0000037b,0x0000007f
+ .long 0x000003fa,0x0000007f
+ .long 0x00000479,0x0000007f
+ .long 0x000004f8,0x0000007f
+ .long 0x00000577,0x0000007f
+ .long 0x000005f6,0x0000007f
+ .long 0x00000675,0x0000007f
+ .long 0x000006f4,0x0000007f
+ .long 0x00000773,0x0000003f
+ .long 0x00000000,0x00000000
+ .org 0x400
+
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)