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

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)