|
29 | 29 | #include <asm/sclp.h> |
30 | 30 | #include "boot.h" |
31 | 31 |
|
32 | | -#define ARCH_OFFSET 4 |
33 | | - |
34 | 32 | #define EP_OFFSET 0x10008 |
35 | 33 | #define EP_STRING "S390EP" |
36 | 34 | #define IPL_BS 0x730 |
37 | 35 |
|
38 | 36 | __HEAD |
39 | 37 | ipl_start: |
40 | | - j .Liplcont |
41 | | -# |
42 | | -# subroutine to wait for end I/O |
43 | | -# |
44 | | -.Lirqwait: |
45 | | - larl %r13,.Lnewpsw # set up IO interrupt psw |
46 | | - mvc __LC_IO_NEW_PSW(16),0(%r13) |
47 | | - lpsw .Lwaitpsw |
48 | | -.Lioint: |
49 | | - br %r14 |
50 | | - .align 8 |
51 | | -.Lnewpsw: |
52 | | - .quad 0x0000000080000000,.Lioint |
53 | | -.Lwaitpsw: |
54 | | - .long 0x020a0000,0x80000000+.Lioint |
55 | | - |
56 | | -# |
57 | | -# subroutine for loading cards from the reader |
58 | | -# |
59 | | -.Lloader: |
60 | | - la %r4,0(%r14) |
61 | | - la %r3,.Lorb # r2 = address of orb into r2 |
62 | | - la %r5,.Lirb # r4 = address of irb |
63 | | - la %r6,.Lccws |
64 | | - la %r7,20 |
65 | | -.Linit: |
66 | | - st %r2,4(%r6) # initialize CCW data addresses |
67 | | - la %r2,0x50(%r2) |
68 | | - la %r6,8(%r6) |
69 | | - bct 7,.Linit |
70 | | - |
71 | | - lctl %c6,%c6,.Lcr6 # set IO subclass mask |
72 | | - slr %r2,%r2 |
73 | | -.Lldlp: |
74 | | - ssch 0(%r3) # load chunk of 1600 bytes |
75 | | - bnz .Llderr |
76 | | -.Lwait4irq: |
77 | | - bas %r14,.Lirqwait |
78 | | - c %r1,__LC_SUBCHANNEL_ID # compare subchannel number |
79 | | - bne .Lwait4irq |
80 | | - tsch 0(%r5) |
81 | | - |
82 | | - slr %r0,%r0 |
83 | | - ic %r0,8(%r5) # get device status |
84 | | - chi %r0,8 # channel end ? |
85 | | - be .Lcont |
86 | | - chi %r0,12 # channel end + device end ? |
87 | | - be .Lcont |
88 | | - |
89 | | - l %r0,4(%r5) |
90 | | - s %r0,8(%r3) # r0/8 = number of ccws executed |
91 | | - mhi %r0,10 # *10 = number of bytes in ccws |
92 | | - lh %r3,10(%r5) # get residual count |
93 | | - sr %r0,%r3 # #ccws*80-residual=#bytes read |
94 | | - ar %r2,%r0 |
95 | | - |
96 | | - br %r4 # r2 contains the total size |
97 | | - |
98 | | -.Lcont: |
99 | | - ahi %r2,0x640 # add 0x640 to total size |
100 | | - la %r6,.Lccws |
101 | | - la %r7,20 |
102 | | -.Lincr: |
103 | | - l %r0,4(%r6) # update CCW data addresses |
104 | | - ahi %r0,0x640 |
105 | | - st %r0,4(%r6) |
106 | | - ahi %r6,8 |
107 | | - bct 7,.Lincr |
108 | | - |
109 | | - b .Lldlp |
110 | | -.Llderr: |
111 | | - lpsw .Lcrash |
112 | | - |
113 | | - .align 8 |
114 | | -.Lorb: .long 0x00000000,0x0080ff00,.Lccws |
115 | | -.Lirb: .long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
116 | | -.Lcr6: .long 0xff000000 |
117 | | -.Lloadp:.long 0,0 |
118 | | - .align 8 |
119 | | -.Lcrash:.long 0x000a0000,0x00000000 |
120 | | - |
121 | | - .align 8 |
122 | | -.Lccws: .rept 19 |
123 | | - .long 0x02600050,0x00000000 |
124 | | - .endr |
125 | | - .long 0x02200050,0x00000000 |
126 | | - |
127 | | -.Liplcont: |
128 | 38 | mvi __LC_AR_MODE_ID,1 # set esame flag |
129 | 39 | slr %r0,%r0 # set cpuid to zero |
130 | 40 | lhi %r1,2 # mode 2 = esame (dump) |
131 | 41 | sigp %r1,%r0,0x12 # switch to esame mode |
132 | | - bras %r13,0f |
133 | | - .fill 16,4,0x0 |
134 | | -0: lmh %r0,%r15,0(%r13) # clear high-order half of gprs |
135 | | - sam31 # switch to 31 bit addressing mode |
136 | | - lh %r1,__LC_SUBCHANNEL_ID # test if subchannel number |
137 | | - bct %r1,.Lnoload # is valid |
138 | | - l %r1,__LC_SUBCHANNEL_ID # load ipl subchannel number |
139 | | - la %r2,IPL_BS # load start address |
140 | | - bas %r14,.Lloader # load rest of ipl image |
141 | | - l %r12,.Lparm # pointer to parameter area |
142 | | - st %r1,IPL_DEVICE+ARCH_OFFSET-PARMAREA(%r12) # save ipl device number |
143 | | - |
| 42 | + sam64 # switch to 64 bit addressing mode |
| 43 | + lgh %r1,__LC_SUBCHANNEL_ID # test if subchannel number |
| 44 | + brctg %r1,.Lnoload # is valid |
| 45 | + llgf %r1,__LC_SUBCHANNEL_ID # load ipl subchannel number |
| 46 | + lghi %r2,IPL_BS # load start address |
| 47 | + bras %r14,.Lloader # load rest of ipl image |
| 48 | + larl %r12,parmarea # pointer to parameter area |
| 49 | + stg %r1,IPL_DEVICE-PARMAREA(%r12) # save ipl device number |
144 | 50 | # |
145 | 51 | # load parameter file from ipl device |
146 | 52 | # |
147 | 53 | .Lagain1: |
148 | | - l %r2,.Linitrd # ramdisk loc. is temp |
149 | | - bas %r14,.Lloader # load parameter file |
150 | | - ltr %r2,%r2 # got anything ? |
151 | | - bz .Lnopf |
152 | | - l %r3,MAX_COMMAND_LINE_SIZE+ARCH_OFFSET-PARMAREA(%r12) |
153 | | - ahi %r3,-1 |
154 | | - clr %r2,%r3 |
155 | | - bl .Lnotrunc |
156 | | - lr %r2,%r3 |
| 54 | + larl %r2,_end # ramdisk loc. is temp |
| 55 | + bras %r14,.Lloader # load parameter file |
| 56 | + ltgr %r2,%r2 # got anything ? |
| 57 | + jz .Lnopf |
| 58 | + lg %r3,MAX_COMMAND_LINE_SIZE-PARMAREA(%r12) |
| 59 | + aghi %r3,-1 |
| 60 | + clgr %r2,%r3 |
| 61 | + jl .Lnotrunc |
| 62 | + lgr %r2,%r3 |
157 | 63 | .Lnotrunc: |
158 | | - l %r4,.Linitrd |
| 64 | + larl %r4,_end |
159 | 65 | larl %r13,.L_hdr |
160 | 66 | clc 0(3,%r4),0(%r13) # if it is HDRx |
161 | | - bz .Lagain1 # skip dataset header |
| 67 | + jz .Lagain1 # skip dataset header |
162 | 68 | larl %r13,.L_eof |
163 | 69 | clc 0(3,%r4),0(%r13) # if it is EOFx |
164 | | - bz .Lagain1 # skip dateset trailer |
165 | | - |
166 | | - lr %r5,%r2 |
| 70 | + jz .Lagain1 # skip dateset trailer |
| 71 | + lgr %r5,%r2 |
167 | 72 | la %r6,COMMAND_LINE-PARMAREA(%r12) |
168 | | - lr %r7,%r2 |
169 | | - ahi %r7,1 |
| 73 | + lgr %r7,%r2 |
| 74 | + aghi %r7,1 |
170 | 75 | mvcl %r6,%r4 |
171 | 76 | .Lnopf: |
172 | | - |
173 | 77 | # |
174 | 78 | # load ramdisk from ipl device |
175 | 79 | # |
176 | 80 | .Lagain2: |
177 | | - l %r2,.Linitrd # addr of ramdisk |
178 | | - st %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12) |
179 | | - bas %r14,.Lloader # load ramdisk |
180 | | - st %r2,INITRD_SIZE+ARCH_OFFSET-PARMAREA(%r12) # store size of rd |
181 | | - ltr %r2,%r2 |
182 | | - bnz .Lrdcont |
183 | | - st %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12) # no ramdisk found |
| 81 | + larl %r2,_end # addr of ramdisk |
| 82 | + stg %r2,INITRD_START-PARMAREA(%r12) |
| 83 | + bras %r14,.Lloader # load ramdisk |
| 84 | + stg %r2,INITRD_SIZE-PARMAREA(%r12) # store size of rd |
| 85 | + ltgr %r2,%r2 |
| 86 | + jnz .Lrdcont |
| 87 | + stg %r2,INITRD_START-PARMAREA(%r12) # no ramdisk found |
184 | 88 | .Lrdcont: |
185 | | - l %r2,.Linitrd |
186 | | - |
| 89 | + larl %r2,_end |
187 | 90 | larl %r13,.L_hdr # skip HDRx and EOFx |
188 | 91 | clc 0(3,%r2),0(%r13) |
189 | | - bz .Lagain2 |
| 92 | + jz .Lagain2 |
190 | 93 | larl %r13,.L_eof |
191 | 94 | clc 0(3,%r2),0(%r13) |
192 | | - bz .Lagain2 |
193 | | - |
| 95 | + jz .Lagain2 |
194 | 96 | # |
195 | 97 | # reset files in VM reader |
196 | 98 | # |
197 | | - stidp .Lcpuid # store cpuid |
198 | | - tm .Lcpuid,0xff # running VM ? |
199 | | - bno .Lnoreset |
200 | | - la %r2,.Lreset |
201 | | - lhi %r3,26 |
| 99 | + larl %r13,.Lcpuid |
| 100 | + stidp 0(%r13) # store cpuid |
| 101 | + tm 0(%r13),0xff # running VM ? |
| 102 | + jno .Lnoreset |
| 103 | + larl %r2,.Lreset |
| 104 | + lghi %r3,26 |
202 | 105 | diag %r2,%r3,8 |
203 | | - la %r5,.Lirb |
| 106 | + larl %r5,.Lirb |
204 | 107 | stsch 0(%r5) # check if irq is pending |
205 | 108 | tm 30(%r5),0x0f # by verifying if any of the |
206 | | - bnz .Lwaitforirq # activity or status control |
| 109 | + jnz .Lwaitforirq # activity or status control |
207 | 110 | tm 31(%r5),0xff # bits is set in the schib |
208 | | - bz .Lnoreset |
| 111 | + jz .Lnoreset |
209 | 112 | .Lwaitforirq: |
210 | | - bas %r14,.Lirqwait # wait for IO interrupt |
| 113 | + bras %r14,.Lirqwait # wait for IO interrupt |
211 | 114 | c %r1,__LC_SUBCHANNEL_ID # compare subchannel number |
212 | | - bne .Lwaitforirq |
213 | | - la %r5,.Lirb |
| 115 | + jne .Lwaitforirq |
| 116 | + larl %r5,.Lirb |
214 | 117 | tsch 0(%r5) |
215 | 118 | .Lnoreset: |
216 | | - b .Lnoload |
217 | | - |
| 119 | + j .Lnoload |
218 | 120 | # |
219 | 121 | # everything loaded, go for it |
220 | 122 | # |
221 | 123 | .Lnoload: |
222 | | - l %r1,.Lstartup |
223 | | - br %r1 |
| 124 | + jg startup |
| 125 | +# |
| 126 | +# subroutine to wait for end I/O |
| 127 | +# |
| 128 | +.Lirqwait: |
| 129 | + larl %r13,.Lnewpswmask # set up IO interrupt psw |
| 130 | + mvc __LC_IO_NEW_PSW(8),0(%r13) |
| 131 | + stg %r14,__LC_IO_NEW_PSW+8 |
| 132 | + larl %r13,.Lwaitpsw |
| 133 | + lpswe 0(%r13) |
| 134 | +.Lioint: |
| 135 | +# |
| 136 | +# subroutine for loading cards from the reader |
| 137 | +# |
| 138 | +.Lloader: |
| 139 | + lgr %r4,%r14 |
| 140 | + larl %r3,.Lorb # r2 = address of orb into r2 |
| 141 | + larl %r5,.Lirb # r4 = address of irb |
| 142 | + larl %r6,.Lccws |
| 143 | + lghi %r7,20 |
| 144 | +.Linit: |
| 145 | + st %r2,4(%r6) # initialize CCW data addresses |
| 146 | + la %r2,0x50(%r2) |
| 147 | + la %r6,8(%r6) |
| 148 | + brctg %r7,.Linit |
| 149 | + larl %r13,.Lcr6 |
| 150 | + lctlg %c6,%c6,0(%r13) |
| 151 | + xgr %r2,%r2 |
| 152 | +.Lldlp: |
| 153 | + ssch 0(%r3) # load chunk of 1600 bytes |
| 154 | + jnz .Llderr |
| 155 | +.Lwait4irq: |
| 156 | + bras %r14,.Lirqwait |
| 157 | + c %r1,__LC_SUBCHANNEL_ID # compare subchannel number |
| 158 | + jne .Lwait4irq |
| 159 | + tsch 0(%r5) |
| 160 | + xgr %r0,%r0 |
| 161 | + ic %r0,8(%r5) # get device status |
| 162 | + cghi %r0,8 # channel end ? |
| 163 | + je .Lcont |
| 164 | + cghi %r0,12 # channel end + device end ? |
| 165 | + je .Lcont |
| 166 | + llgf %r0,4(%r5) |
| 167 | + sgf %r0,8(%r3) # r0/8 = number of ccws executed |
| 168 | + mghi %r0,10 # *10 = number of bytes in ccws |
| 169 | + llgh %r3,10(%r5) # get residual count |
| 170 | + sgr %r0,%r3 # #ccws*80-residual=#bytes read |
| 171 | + agr %r2,%r0 |
| 172 | + br %r4 # r2 contains the total size |
| 173 | +.Lcont: |
| 174 | + aghi %r2,0x640 # add 0x640 to total size |
| 175 | + larl %r6,.Lccws |
| 176 | + lghi %r7,20 |
| 177 | +.Lincr: |
| 178 | + l %r0,4(%r6) # update CCW data addresses |
| 179 | + aghi %r0,0x640 |
| 180 | + st %r0,4(%r6) |
| 181 | + aghi %r6,8 |
| 182 | + brctg %r7,.Lincr |
| 183 | + j .Lldlp |
| 184 | +.Llderr: |
| 185 | + larl %r13,.Lcrash |
| 186 | + lpsw 0(%r13) |
224 | 187 |
|
225 | | -.Linitrd:.long _end # default address of initrd |
226 | | -.Lparm: .long PARMAREA |
227 | | -.Lstartup: .long startup |
| 188 | + .align 8 |
| 189 | +.Lwaitpsw: |
| 190 | + .quad 0x0202000180000000,.Lioint |
| 191 | +.Lnewpswmask: |
| 192 | + .quad 0x0000000180000000 |
| 193 | + .align 8 |
| 194 | +.Lorb: .long 0x00000000,0x0080ff00,.Lccws |
| 195 | +.Lirb: .long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
| 196 | + .align 8 |
| 197 | +.Lcr6: .quad 0x00000000ff000000 |
| 198 | + .align 8 |
| 199 | +.Lcrash:.long 0x000a0000,0x00000000 |
| 200 | + .align 8 |
| 201 | +.Lccws: .rept 19 |
| 202 | + .long 0x02600050,0x00000000 |
| 203 | + .endr |
| 204 | + .long 0x02200050,0x00000000 |
228 | 205 | .Lreset:.byte 0xc3,0xc8,0xc1,0xd5,0xc7,0xc5,0x40,0xd9,0xc4,0xd9,0x40 |
229 | 206 | .byte 0xc1,0xd3,0xd3,0x40,0xd2,0xc5,0xc5,0xd7,0x40,0xd5,0xd6 |
230 | 207 | .byte 0xc8,0xd6,0xd3,0xc4 # "change rdr all keep nohold" |
|
0 commit comments