OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [arch/] [s390/] [boot/] [ipldump.S] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
/*
2
 *  arch/s390/boot/ipldump.S
3
 *
4
 *  S390 version
5
 *    Copyright (C) 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
6
 *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
7
 *
8
 *  Tape dump ipl record. Put it on a tape and ipl from it and it will
9
 *  write a dump of the real storage after the ipl record on that tape.
10
 */
11
 
12
#include 
13
#include 
14
 
15
#define IPL_BS 1024
16
        .org   0
17
        .long  0x00080000,0x80000000+_start    # The first 24 bytes are loaded
18
        .long  0x07000000,0x60000001           # by ipl to addresses 0-23.
19
        .long  0x02000000,0x20000000+IPL_BS    # (a PSW and two CCWs).
20
        .long  0x00000000,0x00000000
21
        .long  0x00000000,0x00000000           # svc old psw
22
        .long  0x00000000,0x00000000           # program check old psw
23
        .long  0x00000000,0x00000000           # machine check old psw
24
        .long  0x00000000,0x00000000           # io old psw
25
        .long  0x00000000,0x00000000
26
        .long  0x00000000,0x00000000
27
        .long  0x00000000,0x00000000
28
        .long  0x000a0000,0x00000058           # external new psw
29
        .long  0x000a0000,0x00000060           # svc new psw
30
        .long  0x000a0000,0x00000068           # program check new psw
31
        .long  0x000a0000,0x00000070           # machine check new psw
32
        .long  0x00080000,0x80000000+.Lioint   # io new psw
33
 
34
        .org   0x100
35
        .globl _start
36
_start:
37
        l     %r1,0xb8                         # load ipl subchannel number
38
#
39
# find out memory size
40
#
41
        mvc   104(8),.Lpcmem0          # setup program check handler
42
        slr   %r3,%r3
43
        lhi   %r2,1
44
        sll   %r2,20
45
.Lloop0:
46
        l     %r0,0(%r3)                 # test page
47
        ar    %r3,%r2                    # add 1M
48
        jnm   .Lloop0                    # r1 < 0x80000000 -> loop
49
.Lchkmem0:
50
        n     %r3,.L4malign0             # align to multiples of 4M
51
        st    %r3,.Lmemsize              # store memory size
52
.Lmemok:
53
 
54
#
55
# first write a tape mark
56
#
57
        bras  %r14,.Ltapemark
58
#
59
# write real storage to tape
60
#
61
        slr   %r2,%r2                          # start at address 0
62
        bras  %r14,.Lwriter                    # load ramdisk
63
#
64
# write another tape mark
65
#
66
        bras  %r14,.Ltapemark
67
#
68
# everything written, stop processor
69
#
70
        lpsw  .Lstopped
71
#
72
# subroutine for writing to tape
73
# Paramters:
74
#  R1 = device number
75
#  R2 = start address
76
#  R3 = length
77
.Lwriter:
78
        st    %r14,.Lldret
79
        la    %r12,.Lorbread                   # r12 = address of orb
80
        la    %r5,.Lirb                        # r5 = address of irb
81
        st    %r2,.Lccwwrite+4                 # initialize CCW data addresses
82
        lctl  %c6,%c6,.Lcr6
83
        slr   %r2,%r2
84
.Lldlp:
85
        lhi   %r6,3                            # 3 retries
86
.Lssch:
87
        ssch  0(%r12)                          # write chunk of IPL_BS bytes
88
        jnz   .Llderr
89
.Lw4end:
90
        bras  %r14,.Lwait4io
91
        tm    8(%r5),0x82                      # do we have a problem ?
92
        jnz   .Lrecov
93
        l     %r0,.Lccwwrite+4                 # update CCW data addresses
94
        ahi   %r0,IPL_BS
95
        st    %r0,.Lccwwrite+4
96
        clr   %r0,%r3                          # enough ?
97
        jl    .Lldlp
98
.Ldone:
99
        l     %r14,.Lldret
100
        br    %r14                             # r2 contains the total size
101
.Lrecov:
102
        bras  %r14,.Lsense                     # do the sensing
103
        brct  %r6,.Lssch                       # dec. retry count & branch
104
        j     .Llderr
105
.Ltapemark:
106
        st    %r14,.Lldret
107
        la    %r12,.Lorbmark                   # r12 = address of orb
108
        la    %r5,.Lirb                        # r5 = address of irb
109
        lctl  %c6,%c6,.Lcr6
110
        ssch  0(%r12)                          # write a tape mark
111
        jnz   .Llderr
112
        bras  %r14,.Lwait4io
113
        l     %r14,.Lldret
114
        br    %r14
115
#
116
# Sense subroutine
117
#
118
.Lsense:
119
        st    %r14,.Lsnsret
120
        la    %r7,.Lorbsense
121
        ssch  0(%r7)                           # start sense command
122
        jnz   .Llderr
123
        bras  %r14,.Lwait4io
124
        l     %r14,.Lsnsret
125
        tm    8(%r5),0x82                      # do we have a problem ?
126
        jnz   .Llderr
127
        br    %r14
128
#
129
# Wait for interrupt subroutine
130
#
131
.Lwait4io:
132
        lpsw  .Lwaitpsw
133
.Lioint:
134
        c     %r1,0xb8                         # compare subchannel number
135
        jne   .Lwait4io
136
        tsch  0(%r5)
137
        slr   %r0,%r0
138
        tm    8(%r5),0x82                      # do we have a problem ?
139
        jnz   .Lwtexit
140
        tm    8(%r5),0x04                      # got device end ?
141
        jz    .Lwait4io
142
.Lwtexit:
143
        br    %r14
144
.Llderr:
145
        lpsw  .Lcrash
146
 
147
        .align 8
148
.Lorbread:
149
        .long  0x00000000,0x0080ff00,.Lccwwrite
150
        .align 8
151
.Lorbsense:
152
        .long  0x00000000,0x0080ff00,.Lccwsense
153
        .align 8
154
.Lorbmark:
155
        .long  0x00000000,0x0080ff00,.Lccwmark
156
        .align 8
157
.Lccwwrite:
158
        .long  0x01200000+IPL_BS,0x00000000
159
.Lccwsense:
160
        .long  0x04200001,0x00000000
161
.Lccwmark:
162
        .long  0x1f200001,0x00000000
163
.Lwaitpsw:
164
        .long  0x020a0000,0x80000000+.Lioint
165
 
166
.Lirb:  .long  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
167
.Lcr6:  .long  0xff000000
168
        .align 8
169
.Lcrash:.long  0x000a0000,0x00000000
170
.Lstopped: .long 0x000a0000,0x00001234
171
.Lpcmem0:.long  0x00080000,0x80000000 + .Lchkmem0
172
.L4malign0:.long 0xffc00000
173
.Lmemsize:.long 0
174
.Lldret:.long  0
175
.Lsnsret: .long 0
176
 
177
         .org IPL_BS
178
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.