Add linux-next specific files for 20110831
[linux-2.6/next.git] / arch / s390 / kernel / head.S
bloba6f0e466648dfa655048705e7e148b2dec3d1f73
1 /*
2  * Copyright IBM Corp. 1999,2010
3  *
4  *    Author(s): Hartmut Penner <hp@de.ibm.com>
5  *               Martin Schwidefsky <schwidefsky@de.ibm.com>
6  *               Rob van der Heij <rvdhei@iae.nl>
7  *               Heiko Carstens <heiko.carstens@de.ibm.com>
8  *
9  * There are 5 different IPL methods
10  *  1) load the image directly into ram at address 0 and do an PSW restart
11  *  2) linload will load the image from address 0x10000 to memory 0x10000
12  *     and start the code thru LPSW 0x0008000080010000 (VM only, deprecated)
13  *  3) generate the tape ipl header, store the generated image on a tape
14  *     and ipl from it
15  *     In case of SL tape you need to IPL 5 times to get past VOL1 etc
16  *  4) generate the vm reader ipl header, move the generated image to the
17  *     VM reader (use option NOH!) and do a ipl from reader (VM only)
18  *  5) direct call of start by the SALIPL loader
19  *  We use the cpuid to distinguish between VM and native ipl
20  *  params for kernel are pushed to 0x10400 (see setup.h)
21  *
22  */
24 #include <linux/init.h>
25 #include <linux/linkage.h>
26 #include <asm/asm-offsets.h>
27 #include <asm/thread_info.h>
28 #include <asm/page.h>
30 #ifdef CONFIG_64BIT
31 #define ARCH_OFFSET     4
32 #else
33 #define ARCH_OFFSET     0
34 #endif
36 __HEAD
37 #ifndef CONFIG_IPL
38         .org   0
39         .long  0x00080000,0x80000000+startup    # Just a restart PSW
40 #else
41 #ifdef CONFIG_IPL_TAPE
42 #define IPL_BS 1024
43         .org   0
44         .long  0x00080000,0x80000000+iplstart   # The first 24 bytes are loaded
45         .long  0x27000000,0x60000001            # by ipl to addresses 0-23.
46         .long  0x02000000,0x20000000+IPL_BS     # (a PSW and two CCWs).
47         .long  0x00000000,0x00000000            # external old psw
48         .long  0x00000000,0x00000000            # svc old psw
49         .long  0x00000000,0x00000000            # program check old psw
50         .long  0x00000000,0x00000000            # machine check old psw
51         .long  0x00000000,0x00000000            # io old psw
52         .long  0x00000000,0x00000000
53         .long  0x00000000,0x00000000
54         .long  0x00000000,0x00000000
55         .long  0x000a0000,0x00000058            # external new psw
56         .long  0x000a0000,0x00000060            # svc new psw
57         .long  0x000a0000,0x00000068            # program check new psw
58         .long  0x000a0000,0x00000070            # machine check new psw
59         .long  0x00080000,0x80000000+.Lioint    # io new psw
61         .org   0x100
63 # subroutine for loading from tape
64 # Parameters:
65 #  R1 = device number
66 #  R2 = load address
67 .Lloader:
68         st      %r14,.Lldret
69         la      %r3,.Lorbread           # r3 = address of orb
70         la      %r5,.Lirb               # r5 = address of irb
71         st      %r2,.Lccwread+4         # initialize CCW data addresses
72         lctl    %c6,%c6,.Lcr6
73         slr     %r2,%r2
74 .Lldlp:
75         la      %r6,3                   # 3 retries
76 .Lssch:
77         ssch    0(%r3)                  # load chunk of IPL_BS bytes
78         bnz     .Llderr
79 .Lw4end:
80         bas     %r14,.Lwait4io
81         tm      8(%r5),0x82             # do we have a problem ?
82         bnz     .Lrecov
83         slr     %r7,%r7
84         icm     %r7,3,10(%r5)           # get residual count
85         lcr     %r7,%r7
86         la      %r7,IPL_BS(%r7)         # IPL_BS-residual=#bytes read
87         ar      %r2,%r7                 # add to total size
88         tm      8(%r5),0x01             # found a tape mark ?
89         bnz     .Ldone
90         l       %r0,.Lccwread+4         # update CCW data addresses
91         ar      %r0,%r7
92         st      %r0,.Lccwread+4
93         b       .Lldlp
94 .Ldone:
95         l       %r14,.Lldret
96         br      %r14                    # r2 contains the total size
97 .Lrecov:
98         bas     %r14,.Lsense            # do the sensing
99         bct     %r6,.Lssch              # dec. retry count & branch
100         b       .Llderr
102 # Sense subroutine
104 .Lsense:
105         st      %r14,.Lsnsret
106         la      %r7,.Lorbsense
107         ssch    0(%r7)                  # start sense command
108         bnz     .Llderr
109         bas     %r14,.Lwait4io
110         l       %r14,.Lsnsret
111         tm      8(%r5),0x82             # do we have a problem ?
112         bnz     .Llderr
113         br      %r14
115 # Wait for interrupt subroutine
117 .Lwait4io:
118         lpsw    .Lwaitpsw
119 .Lioint:
120         c       %r1,0xb8                # compare subchannel number
121         bne     .Lwait4io
122         tsch    0(%r5)
123         slr     %r0,%r0
124         tm      8(%r5),0x82             # do we have a problem ?
125         bnz     .Lwtexit
126         tm      8(%r5),0x04             # got device end ?
127         bz      .Lwait4io
128 .Lwtexit:
129         br      %r14
130 .Llderr:
131         lpsw    .Lcrash
133         .align  8
134 .Lorbread:
135         .long   0x00000000,0x0080ff00,.Lccwread
136         .align  8
137 .Lorbsense:
138         .long   0x00000000,0x0080ff00,.Lccwsense
139         .align  8
140 .Lccwread:
141         .long   0x02200000+IPL_BS,0x00000000
142 .Lccwsense:
143         .long   0x04200001,0x00000000
144 .Lwaitpsw:
145         .long   0x020a0000,0x80000000+.Lioint
147 .Lirb:  .long   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
148 .Lcr6:  .long   0xff000000
149         .align  8
150 .Lcrash:.long   0x000a0000,0x00000000
151 .Lldret:.long   0
152 .Lsnsret: .long 0
153 #endif  /* CONFIG_IPL_TAPE */
155 #ifdef CONFIG_IPL_VM
156 #define IPL_BS  0x730
157         .org    0
158         .long   0x00080000,0x80000000+iplstart  # The first 24 bytes are loaded
159         .long   0x02000018,0x60000050           # by ipl to addresses 0-23.
160         .long   0x02000068,0x60000050           # (a PSW and two CCWs).
161         .fill   80-24,1,0x40                    # bytes 24-79 are discarded !!
162         .long   0x020000f0,0x60000050           # The next 160 byte are loaded
163         .long   0x02000140,0x60000050           # to addresses 0x18-0xb7
164         .long   0x02000190,0x60000050           # They form the continuation
165         .long   0x020001e0,0x60000050           # of the CCW program started
166         .long   0x02000230,0x60000050           # by ipl and load the range
167         .long   0x02000280,0x60000050           # 0x0f0-0x730 from the image
168         .long   0x020002d0,0x60000050           # to the range 0x0f0-0x730
169         .long   0x02000320,0x60000050           # in memory. At the end of
170         .long   0x02000370,0x60000050           # the channel program the PSW
171         .long   0x020003c0,0x60000050           # at location 0 is loaded.
172         .long   0x02000410,0x60000050           # Initial processing starts
173         .long   0x02000460,0x60000050           # at 0xf0 = iplstart.
174         .long   0x020004b0,0x60000050
175         .long   0x02000500,0x60000050
176         .long   0x02000550,0x60000050
177         .long   0x020005a0,0x60000050
178         .long   0x020005f0,0x60000050
179         .long   0x02000640,0x60000050
180         .long   0x02000690,0x60000050
181         .long   0x020006e0,0x20000050
183         .org    0xf0
185 # subroutine for loading cards from the reader
187 .Lloader:
188         la      %r3,.Lorb               # r2 = address of orb into r2
189         la      %r5,.Lirb               # r4 = address of irb
190         la      %r6,.Lccws
191         la      %r7,20
192 .Linit:
193         st      %r2,4(%r6)              # initialize CCW data addresses
194         la      %r2,0x50(%r2)
195         la      %r6,8(%r6)
196         bct     7,.Linit
198         lctl    %c6,%c6,.Lcr6           # set IO subclass mask
199         slr     %r2,%r2
200 .Lldlp:
201         ssch    0(%r3)                  # load chunk of 1600 bytes
202         bnz     .Llderr
203 .Lwait4irq:
204         mvc     0x78(8),.Lnewpsw        # set up IO interrupt psw
205         lpsw    .Lwaitpsw
206 .Lioint:
207         c       %r1,0xb8                # compare subchannel number
208         bne     .Lwait4irq
209         tsch    0(%r5)
211         slr     %r0,%r0
212         ic      %r0,8(%r5)              # get device status
213         chi     %r0,8                   # channel end ?
214         be      .Lcont
215         chi     %r0,12                  # channel end + device end ?
216         be      .Lcont
218         l       %r0,4(%r5)
219         s       %r0,8(%r3)              # r0/8 = number of ccws executed
220         mhi     %r0,10                  # *10 = number of bytes in ccws
221         lh      %r3,10(%r5)             # get residual count
222         sr      %r0,%r3                 # #ccws*80-residual=#bytes read
223         ar      %r2,%r0
225         br      %r14                    # r2 contains the total size
227 .Lcont:
228         ahi     %r2,0x640               # add 0x640 to total size
229         la      %r6,.Lccws
230         la      %r7,20
231 .Lincr:
232         l       %r0,4(%r6)              # update CCW data addresses
233         ahi     %r0,0x640
234         st      %r0,4(%r6)
235         ahi     %r6,8
236         bct     7,.Lincr
238         b       .Lldlp
239 .Llderr:
240         lpsw    .Lcrash
242         .align  8
243 .Lorb:  .long   0x00000000,0x0080ff00,.Lccws
244 .Lirb:  .long   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
245 .Lcr6:  .long   0xff000000
246 .Lloadp:.long   0,0
247         .align  8
248 .Lcrash:.long   0x000a0000,0x00000000
249 .Lnewpsw:
250         .long   0x00080000,0x80000000+.Lioint
251 .Lwaitpsw:
252         .long   0x020a0000,0x80000000+.Lioint
254         .align  8
255 .Lccws: .rept   19
256         .long   0x02600050,0x00000000
257         .endr
258         .long   0x02200050,0x00000000
259 #endif  /* CONFIG_IPL_VM */
261 iplstart:
262         lh      %r1,0xb8                # test if subchannel number
263         bct     %r1,.Lnoload            #  is valid
264         l       %r1,0xb8                # load ipl subchannel number
265         la      %r2,IPL_BS              # load start address
266         bas     %r14,.Lloader           # load rest of ipl image
267         l       %r12,.Lparm             # pointer to parameter area
268         st      %r1,IPL_DEVICE+ARCH_OFFSET-PARMAREA(%r12) # save ipl device number
271 # load parameter file from ipl device
273 .Lagain1:
274         l       %r2,.Linitrd            # ramdisk loc. is temp
275         bas     %r14,.Lloader           # load parameter file
276         ltr     %r2,%r2                 # got anything ?
277         bz      .Lnopf
278         chi     %r2,895
279         bnh     .Lnotrunc
280         la      %r2,895
281 .Lnotrunc:
282         l       %r4,.Linitrd
283         clc     0(3,%r4),.L_hdr         # if it is HDRx
284         bz      .Lagain1                # skip dataset header
285         clc     0(3,%r4),.L_eof         # if it is EOFx
286         bz      .Lagain1                # skip dateset trailer
287         la      %r5,0(%r4,%r2)
288         lr      %r3,%r2
289         la      %r3,COMMAND_LINE-PARMAREA(%r12) # load adr. of command line
290         mvc     0(256,%r3),0(%r4)
291         mvc     256(256,%r3),256(%r4)
292         mvc     512(256,%r3),512(%r4)
293         mvc     768(122,%r3),768(%r4)
294         slr     %r0,%r0
295         b       .Lcntlp
296 .Ldelspc:
297         ic      %r0,0(%r2,%r3)
298         chi     %r0,0x20                # is it a space ?
299         be      .Lcntlp
300         ahi     %r2,1
301         b       .Leolp
302 .Lcntlp:
303         brct    %r2,.Ldelspc
304 .Leolp:
305         slr     %r0,%r0
306         stc     %r0,0(%r2,%r3)          # terminate buffer
307 .Lnopf:
310 # load ramdisk from ipl device
312 .Lagain2:
313         l       %r2,.Linitrd            # addr of ramdisk
314         st      %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12)
315         bas     %r14,.Lloader           # load ramdisk
316         st      %r2,INITRD_SIZE+ARCH_OFFSET-PARMAREA(%r12) # store size of rd
317         ltr     %r2,%r2
318         bnz     .Lrdcont
319         st      %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12) # no ramdisk found
320 .Lrdcont:
321         l       %r2,.Linitrd
323         clc     0(3,%r2),.L_hdr         # skip HDRx and EOFx
324         bz      .Lagain2
325         clc     0(3,%r2),.L_eof
326         bz      .Lagain2
328 #ifdef CONFIG_IPL_VM
330 # reset files in VM reader
332         stidp   __LC_SAVE_AREA          # store cpuid
333         tm      __LC_SAVE_AREA,0xff     # running VM ?
334         bno     .Lnoreset
335         la      %r2,.Lreset
336         lhi     %r3,26
337         diag    %r2,%r3,8
338         la      %r5,.Lirb
339         stsch   0(%r5)                  # check if irq is pending
340         tm      30(%r5),0x0f            # by verifying if any of the
341         bnz     .Lwaitforirq            # activity or status control
342         tm      31(%r5),0xff            # bits is set in the schib
343         bz      .Lnoreset
344 .Lwaitforirq:
345         mvc     0x78(8),.Lrdrnewpsw     # set up IO interrupt psw
346 .Lwaitrdrirq:
347         lpsw    .Lrdrwaitpsw
348 .Lrdrint:
349         c       %r1,0xb8                # compare subchannel number
350         bne     .Lwaitrdrirq
351         la      %r5,.Lirb
352         tsch    0(%r5)
353 .Lnoreset:
354         b       .Lnoload
356         .align  8
357 .Lrdrnewpsw:
358         .long   0x00080000,0x80000000+.Lrdrint
359 .Lrdrwaitpsw:
360         .long   0x020a0000,0x80000000+.Lrdrint
361 #endif
364 # everything loaded, go for it
366 .Lnoload:
367         l       %r1,.Lstartup
368         br      %r1
370 .Linitrd:.long _end                     # default address of initrd
371 .Lparm: .long  PARMAREA
372 .Lstartup: .long startup
373 .Lreset:.byte   0xc3,0xc8,0xc1,0xd5,0xc7,0xc5,0x40,0xd9,0xc4,0xd9,0x40
374         .byte   0xc1,0xd3,0xd3,0x40,0xd2,0xc5,0xc5,0xd7,0x40,0xd5,0xd6
375         .byte   0xc8,0xd6,0xd3,0xc4     # "change rdr all keep nohold"
376 .L_eof: .long   0xc5d6c600       /* C'EOF' */
377 .L_hdr: .long   0xc8c4d900       /* C'HDR' */
379 #endif  /* CONFIG_IPL */
382 # SALIPL loader support. Based on a patch by Rob van der Heij.
383 # This entry point is called directly from the SALIPL loader and
384 # doesn't need a builtin ipl record.
386         .org    0x800
387 ENTRY(start)
388         stm     %r0,%r15,0x07b0         # store registers
389         basr    %r12,%r0
390 .base:
391         l       %r11,.parm
392         l       %r8,.cmd                # pointer to command buffer
394         ltr     %r9,%r9                 # do we have SALIPL parameters?
395         bp      .sk8x8
397         mvc     0(64,%r8),0x00b0        # copy saved registers
398         xc      64(240-64,%r8),0(%r8)   # remainder of buffer
399         tr      0(64,%r8),.lowcase
400         b       .gotr
401 .sk8x8:
402         mvc     0(240,%r8),0(%r9)       # copy iplparms into buffer
403 .gotr:
404         slr     %r0,%r0
405         st      %r0,INITRD_SIZE+ARCH_OFFSET-PARMAREA(%r11)
406         st      %r0,INITRD_START+ARCH_OFFSET-PARMAREA(%r11)
407         j       startup                 # continue with startup
408 .cmd:   .long   COMMAND_LINE            # address of command line buffer
409 .parm:  .long   PARMAREA
410 .lowcase:
411         .byte 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07
412         .byte 0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f
413         .byte 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17
414         .byte 0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f
415         .byte 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27
416         .byte 0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f
417         .byte 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37
418         .byte 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f
419         .byte 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47
420         .byte 0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f
421         .byte 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57
422         .byte 0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f
423         .byte 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67
424         .byte 0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f
425         .byte 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77
426         .byte 0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f
428         .byte 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87
429         .byte 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f
430         .byte 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97
431         .byte 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f
432         .byte 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7
433         .byte 0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf
434         .byte 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7
435         .byte 0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf
436         .byte 0xc0,0x81,0x82,0x83,0x84,0x85,0x86,0x87   # .abcdefg
437         .byte 0x88,0x89,0xca,0xcb,0xcc,0xcd,0xce,0xcf   # hi
438         .byte 0xd0,0x91,0x92,0x93,0x94,0x95,0x96,0x97   # .jklmnop
439         .byte 0x98,0x99,0xda,0xdb,0xdc,0xdd,0xde,0xdf   # qr
440         .byte 0xe0,0xe1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7   # ..stuvwx
441         .byte 0xa8,0xa9,0xea,0xeb,0xec,0xed,0xee,0xef   # yz
442         .byte 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7
443         .byte 0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff
446 # startup-code at 0x10000, running in absolute addressing mode
447 # this is called either by the ipl loader or directly by PSW restart
448 # or linload or SALIPL
450         .org    0x10000
451 ENTRY(startup)
452         j       .Lep_startup_normal
453         .org    0x10008
454         .ascii  "S390EP"
455         .byte   0x00,0x01
457 # kdump startup-code at 0x10010, running in 64 bit absolute addressing mode
459         .org    0x10010
460 ENTRY(startup_kdump)
461         j       .Lep_startup_kdump
462 .Lep_startup_normal:
463         basr    %r13,0                  # get base
464 .LPG0:
465         xc      0x200(256),0x200        # partially clear lowcore
466         xc      0x300(256),0x300
467         xc      0xe00(256),0xe00
468         stck    __LC_LAST_UPDATE_CLOCK
469         spt     5f-.LPG0(%r13)
470         mvc     __LC_LAST_UPDATE_TIMER(8),5f-.LPG0(%r13)
471 #ifndef CONFIG_MARCH_G5
472         # check capabilities against MARCH_{G5,Z900,Z990,Z9_109,Z10}
473         xc      __LC_STFL_FAC_LIST(8),__LC_STFL_FAC_LIST
474         .insn   s,0xb2b10000,__LC_STFL_FAC_LIST # store facility list
475         tm      __LC_STFL_FAC_LIST,0x01 # stfle available ?
476         jz      0f
477         la      %r0,0
478         .insn   s,0xb2b00000,__LC_STFL_FAC_LIST # store facility list extended
479 0:      l       %r0,__LC_STFL_FAC_LIST
480         n       %r0,2f+8-.LPG0(%r13)
481         cl      %r0,2f+8-.LPG0(%r13)
482         jne     1f
483         l       %r0,__LC_STFL_FAC_LIST+4
484         n       %r0,2f+12-.LPG0(%r13)
485         cl      %r0,2f+12-.LPG0(%r13)
486         je      3f
487 1:      l       %r15,.Lstack-.LPG0(%r13)
488         ahi     %r15,-96
489         la      %r2,.Lals_string-.LPG0(%r13)
490         l       %r3,.Lsclp_print-.LPG0(%r13)
491         basr    %r14,%r3
492         lpsw    2f-.LPG0(%r13)          # machine type not good enough, crash
493 .Lals_string:
494         .asciz  "The Linux kernel requires more recent processor hardware"
495 .Lsclp_print:
496         .long   _sclp_print_early
497 .Lstack:
498         .long   0x8000 + (1<<(PAGE_SHIFT+THREAD_ORDER))
499         .align 16
500 2:      .long   0x000a0000,0x8badcccc
501 #if defined(CONFIG_64BIT)
502 #if defined(CONFIG_MARCH_Z196)
503         .long 0xc100efe3, 0xf46c0000
504 #elif defined(CONFIG_MARCH_Z10)
505         .long 0xc100efe3, 0xf0680000
506 #elif defined(CONFIG_MARCH_Z9_109)
507         .long 0xc100efc3, 0x00000000
508 #elif defined(CONFIG_MARCH_Z990)
509         .long 0xc0002000, 0x00000000
510 #elif defined(CONFIG_MARCH_Z900)
511         .long 0xc0000000, 0x00000000
512 #endif
513 #else
514 #if defined(CONFIG_MARCH_Z196)
515         .long 0x8100c880, 0x00000000
516 #elif defined(CONFIG_MARCH_Z10)
517         .long 0x8100c880, 0x00000000
518 #elif defined(CONFIG_MARCH_Z9_109)
519         .long 0x8100c880, 0x00000000
520 #elif defined(CONFIG_MARCH_Z990)
521         .long 0x80002000, 0x00000000
522 #elif defined(CONFIG_MARCH_Z900)
523         .long 0x80000000, 0x00000000
524 #endif
525 #endif
527 #endif
529 #ifdef CONFIG_64BIT
530         mvi     __LC_AR_MODE_ID,1       # set esame flag
531         slr     %r0,%r0                 # set cpuid to zero
532         lhi     %r1,2                   # mode 2 = esame (dump)
533         sigp    %r1,%r0,0x12            # switch to esame mode
534         sam64                           # switch to 64 bit mode
535         larl    %r13,4f
536         lmh     %r0,%r15,0(%r13)        # clear high-order half
537         jg      startup_continue
538 4:      .fill   16,4,0x0
539 #else
540         mvi     __LC_AR_MODE_ID,0       # set ESA flag (mode 0)
541         l       %r13,4f-.LPG0(%r13)
542         b       0(%r13)
543         .align  8
544 4:      .long   startup_continue
545 #endif
546         .align  8
547 5:      .long   0x7fffffff,0xffffffff
549 #include "head_kdump.S"
552 # params at 10400 (setup.h)
554         .org    PARMAREA
555         .long   0,0                     # IPL_DEVICE
556         .long   0,0                     # INITRD_START
557         .long   0,0                     # INITRD_SIZE
558         .long   0,0                     # OLDMEM_BASE
559         .long   0,0                     # OLDMEM_SIZE
561         .org    COMMAND_LINE
562         .byte   "root=/dev/ram0 ro"
563         .byte   0
565         .org    0x11000