[go: up one dir, main page]

File: stage3.S

package info (click to toggle)
s390-tools 1.6.2-1
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 2,160 kB
  • ctags: 3,968
  • sloc: ansic: 26,413; asm: 5,072; sh: 4,042; cpp: 1,518; perl: 1,299; makefile: 587
file content (182 lines) | stat: -rw-r--r-- 6,865 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
#
#  Third stage boot loader
#    Copyright IBM Corp. 2003, 2006.
#    Author(s):	Heiko Carstens (heiko.carstens@de.ibm.com)
#              	Peter Oberparleiter (peter.oberparleiter@de.ibm.com)
#

# some definitions from kernel land
__LC_CPUID		= 0xC60
__LC_IPLDEV		= 0xC6C
IPL_DEVICE		= 0x10404
INITRD_START		= 0x10408
INITRD_SIZE		= 0x10410
COMMAND_LINE		= 0x10480
COMMAND_LINE_SIZE	= 896		# max command line length
COMMAND_LINE_EXTRA	= 0xA000-0x400	# address of extra command line

_parm_addr:				#
	.quad  0			# address of parmline
_initrd_addr:				#
	.quad  0			# address of initrd
_initrd_len:				#
	.quad  0			# length of initrd
_load_psw:				#
	.quad  0			# load psw of kernel
_extra_parm:				#
	.quad  0			# use extra parm line mechanism?

#
# Program execution of the third stage boot loader starts at 0xA028
#
        .globl _start
_start: basr   %r13,0                   # base register
0:	l      %r2,0xb8			# subchannel id of ipl device
	st     %r2,__LC_IPLDEV          # old ipl device storage location
	l      %r3,1f-0b(%r13)          # load address of IPL_DEVICE
	st     %r2,0(%r3)               # new ipl device storage location

	l      %r1,2f-0b(%r13)		# load address of parmfile parameter
	l      %r1,4(%r1)		# load address of parmfile
	l      %r2,3f-0b(%r13)          # load address of kernel command line
	mvc    0x0(256,%r2),0(%r1)      # move command line to 0x10480
	mvc    0x100(256,%r2),0x100(%r1)
	mvc    0x200(256,%r2),0x200(%r1)
	mvc    0x300(127,%r2),0x300(%r1)
	xc     0x37f(1,%r2),0x37f(%r2)

	l      %r1,11f-0b(%r13)		# check for extra parm flag
	l      %r1,4(%r1)
	ltr    %r1,%r1
	jz     .Lnoextra		# skip if zero

	l      %r1,9f-0b(%r13)		# check for extra command line
	sr     %r0,%r0
	ic     %r0,0(%r1)
	ltr    %r0,%r0
	jz     .Lnoextra		# skip if no extra command line present

	la     %r3,10f-0b(%r13)		# convert to ascii
	stidp  __LC_CPUID		# use different code page on LPAR
	tm     __LC_CPUID,0xff
	jo     .Lnolpar
	la     %r3,12f-0b(%r13)
.Lnolpar:
	tr     0x0(256,%r1),0(%r3)
	tr     0x100(256,%r1),0(%r3)
	tr     0x200(256,%r1),0(%r3)
	tr     0x300(127,%r1),0(%r3)

	lhi    %r4,COMMAND_LINE_SIZE
.Lfindend:
	ic     %r0,0(%r2)		# find end of current parameter string
	ltr    %r0,%r0
	jz     .Lappend			# got it
	ahi    %r2,1
	brct   %r4,.Lfindend
	j      .Lnoextra		# none found

.Lappend:
	ic     %r0,0(%r1)		# append extra parameters
	stc    %r0,0(%r2)
	ahi    %r1,1
	ahi    %r2,1
	ltr    %r0,%r0			# at end of string?
	jz     .Lnoextra		# yes, continue with ipl
	brct   %r4,.Lappend		# no, loop

	xc     0x37f(1,%r2),0x37f(%r2)	# nil-terminate string

.Lnoextra:
	l      %r1,4f-0b(%r13)		# load address of initrd parameter
	l      %r2,5f-0b(%r13)		# load address of INITRD_START
	mvc    0(8,%r2),0(%r1)		# copy INITRD_START address

	l      %r1,6f-0b(%r13)		# load address of initrd length parmeter
	l      %r2,7f-0b(%r13)		# load address of INITRD_SIZE
	mvc    0(8,%r2),0(%r1)		# copy INITRD_SIZE length

	l      %r1,8f-0b(%r13)
	mvc    0(8,%r0),0(%r1)		# copy load psw to 0

	lm     %r0,%r15,0x180		# load saved registers
	lpsw   0			# start kernel
	
1:	.long  IPL_DEVICE
2:	.long  _parm_addr
3:	.long  COMMAND_LINE
4:	.long  _initrd_addr
5:	.long  INITRD_START
6:	.long  _initrd_len
7:	.long  INITRD_SIZE
8:	.long  _load_psw
9:	.long  COMMAND_LINE_EXTRA
11:	.long  _extra_parm

# EBCDIC 037 to ASCII (z/VM default)
10:	.byte 0x00, 0x01, 0x02, 0x03, 0x07, 0x09, 0x07, 0x7F
	.byte 0x07, 0x07, 0x07, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
	.byte 0x10, 0x11, 0x12, 0x13, 0x07, 0x0A, 0x08, 0x07
	.byte 0x18, 0x19, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07
	.byte 0x07, 0x07, 0x1C, 0x07, 0x07, 0x0A, 0x17, 0x1B
	.byte 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x06, 0x07
	.byte 0x07, 0x07, 0x16, 0x07, 0x07, 0x07, 0x07, 0x04
	.byte 0x07, 0x07, 0x07, 0x07, 0x14, 0x15, 0x07, 0x1A
	.byte 0x20, 0xFF, 0x83, 0x84, 0x85, 0xA0, 0x07, 0x86
	.byte 0x87, 0xA4, 0x9B, 0x2E, 0x3C, 0x28, 0x2B, 0x7C
	.byte 0x26, 0x82, 0x88, 0x89, 0x8A, 0xA1, 0x8C, 0x07
	.byte 0x8D, 0xE1, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0xAA
	.byte 0x2D, 0x2F, 0x07, 0x8E, 0x07, 0x07, 0x07, 0x8F
	.byte 0x80, 0xA5, 0x07, 0x2C, 0x25, 0x5F, 0x3E, 0x3F
	.byte 0x07, 0x90, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07
	.byte 0x70, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22
	.byte 0x07, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67
	.byte 0x68, 0x69, 0xAE, 0xAF, 0x07, 0x07, 0x07, 0xF1
	.byte 0xF8, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70
	.byte 0x71, 0x72, 0xA6, 0xA7, 0x91, 0x07, 0x92, 0x07
	.byte 0xE6, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78
	.byte 0x79, 0x7A, 0xAD, 0xAB, 0x07, 0x07, 0x07, 0x07
	.byte 0x5E, 0x9C, 0x9D, 0xFA, 0x07, 0x07, 0x07, 0xAC
	.byte 0xAB, 0x07, 0x5B, 0x5D, 0x07, 0x07, 0x07, 0x07
	.byte 0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47
	.byte 0x48, 0x49, 0x07, 0x93, 0x94, 0x95, 0xA2, 0x07
	.byte 0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50
	.byte 0x51, 0x52, 0x07, 0x96, 0x81, 0x97, 0xA3, 0x98
	.byte 0x5C, 0xF6, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58
	.byte 0x59, 0x5A, 0xFD, 0x07, 0x99, 0x07, 0x07, 0x07
	.byte 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
	.byte 0x38, 0x39, 0x07, 0x07, 0x9A, 0x07, 0x07, 0x07

# EBCDIC 500 to ASCII (LPAR default)
12:	.byte 0x00, 0x01, 0x02, 0x03, 0x07, 0x09, 0x07, 0x7F
	.byte 0x07, 0x07, 0x07, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
	.byte 0x10, 0x11, 0x12, 0x13, 0x07, 0x0A, 0x08, 0x07
	.byte 0x18, 0x19, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07
	.byte 0x07, 0x07, 0x1C, 0x07, 0x07, 0x0A, 0x17, 0x1B
	.byte 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x06, 0x07
	.byte 0x07, 0x07, 0x16, 0x07, 0x07, 0x07, 0x07, 0x04
	.byte 0x07, 0x07, 0x07, 0x07, 0x14, 0x15, 0x07, 0x1A
	.byte 0x20, 0xFF, 0x83, 0x84, 0x85, 0xA0, 0x07, 0x86
	.byte 0x87, 0xA4, 0x5B, 0x2E, 0x3C, 0x28, 0x2B, 0x21
	.byte 0x26, 0x82, 0x88, 0x89, 0x8A, 0xA1, 0x8C, 0x07
	.byte 0x8D, 0xE1, 0x5D, 0x24, 0x2A, 0x29, 0x3B, 0x5E
	.byte 0x2D, 0x2F, 0x07, 0x8E, 0x07, 0x07, 0x07, 0x8F
	.byte 0x80, 0xA5, 0x07, 0x2C, 0x25, 0x5F, 0x3E, 0x3F
	.byte 0x07, 0x90, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07
	.byte 0x70, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22
	.byte 0x07, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67
	.byte 0x68, 0x69, 0xAE, 0xAF, 0x07, 0x07, 0x07, 0xF1
	.byte 0xF8, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70
	.byte 0x71, 0x72, 0xA6, 0xA7, 0x91, 0x07, 0x92, 0x07
	.byte 0xE6, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78
	.byte 0x79, 0x7A, 0xAD, 0xAB, 0x07, 0x07, 0x07, 0x07
	.byte 0x9B, 0x9C, 0x9D, 0xFA, 0x07, 0x07, 0x07, 0xAC
	.byte 0xAB, 0x07, 0xAA, 0x7C, 0x07, 0x07, 0x07, 0x07
	.byte 0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47
	.byte 0x48, 0x49, 0x07, 0x93, 0x94, 0x95, 0xA2, 0x07
	.byte 0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50
	.byte 0x51, 0x52, 0x07, 0x96, 0x81, 0x97, 0xA3, 0x98
	.byte 0x5C, 0xF6, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58
	.byte 0x59, 0x5A, 0xFD, 0x07, 0x99, 0x07, 0x07, 0x07
	.byte 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
	.byte 0x38, 0x39, 0x07, 0x07, 0x9A, 0x07, 0x07, 0x07