root/arch/x86/boot/header.S

/* [<][>][^][v][top][bottom][index][help] */
   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 /*
   3  *      header.S
   4  *
   5  *      Copyright (C) 1991, 1992 Linus Torvalds
   6  *
   7  *      Based on bootsect.S and setup.S
   8  *      modified by more people than can be counted
   9  *
  10  *      Rewritten as a common file by H. Peter Anvin (Apr 2007)
  11  *
  12  * BIG FAT NOTE: We're in real mode using 64k segments.  Therefore segment
  13  * addresses must be multiplied by 16 to obtain their respective linear
  14  * addresses. To avoid confusion, linear addresses are written using leading
  15  * hex while segment addresses are written as segment:offset.
  16  *
  17  */
  18 
  19 #include <asm/segment.h>
  20 #include <asm/boot.h>
  21 #include <asm/page_types.h>
  22 #include <asm/setup.h>
  23 #include <asm/bootparam.h>
  24 #include "boot.h"
  25 #include "voffset.h"
  26 #include "zoffset.h"
  27 
  28 BOOTSEG         = 0x07C0                /* original address of boot-sector */
  29 SYSSEG          = 0x1000                /* historical load address >> 4 */
  30 
  31 #ifndef SVGA_MODE
  32 #define SVGA_MODE ASK_VGA
  33 #endif
  34 
  35 #ifndef ROOT_RDONLY
  36 #define ROOT_RDONLY 1
  37 #endif
  38 
  39         .code16
  40         .section ".bstext", "ax"
  41 
  42         .global bootsect_start
  43 bootsect_start:
  44 #ifdef CONFIG_EFI_STUB
  45         # "MZ", MS-DOS header
  46         .byte 0x4d
  47         .byte 0x5a
  48 #endif
  49 
  50         # Normalize the start address
  51         ljmp    $BOOTSEG, $start2
  52 
  53 start2:
  54         movw    %cs, %ax
  55         movw    %ax, %ds
  56         movw    %ax, %es
  57         movw    %ax, %ss
  58         xorw    %sp, %sp
  59         sti
  60         cld
  61 
  62         movw    $bugger_off_msg, %si
  63 
  64 msg_loop:
  65         lodsb
  66         andb    %al, %al
  67         jz      bs_die
  68         movb    $0xe, %ah
  69         movw    $7, %bx
  70         int     $0x10
  71         jmp     msg_loop
  72 
  73 bs_die:
  74         # Allow the user to press a key, then reboot
  75         xorw    %ax, %ax
  76         int     $0x16
  77         int     $0x19
  78 
  79         # int 0x19 should never return.  In case it does anyway,
  80         # invoke the BIOS reset code...
  81         ljmp    $0xf000,$0xfff0
  82 
  83 #ifdef CONFIG_EFI_STUB
  84         .org    0x3c
  85         #
  86         # Offset to the PE header.
  87         #
  88         .long   pe_header
  89 #endif /* CONFIG_EFI_STUB */
  90 
  91         .section ".bsdata", "a"
  92 bugger_off_msg:
  93         .ascii  "Use a boot loader.\r\n"
  94         .ascii  "\n"
  95         .ascii  "Remove disk and press any key to reboot...\r\n"
  96         .byte   0
  97 
  98 #ifdef CONFIG_EFI_STUB
  99 pe_header:
 100         .ascii  "PE"
 101         .word   0
 102 
 103 coff_header:
 104 #ifdef CONFIG_X86_32
 105         .word   0x14c                           # i386
 106 #else
 107         .word   0x8664                          # x86-64
 108 #endif
 109         .word   4                               # nr_sections
 110         .long   0                               # TimeDateStamp
 111         .long   0                               # PointerToSymbolTable
 112         .long   1                               # NumberOfSymbols
 113         .word   section_table - optional_header # SizeOfOptionalHeader
 114 #ifdef CONFIG_X86_32
 115         .word   0x306                           # Characteristics.
 116                                                 # IMAGE_FILE_32BIT_MACHINE |
 117                                                 # IMAGE_FILE_DEBUG_STRIPPED |
 118                                                 # IMAGE_FILE_EXECUTABLE_IMAGE |
 119                                                 # IMAGE_FILE_LINE_NUMS_STRIPPED
 120 #else
 121         .word   0x206                           # Characteristics
 122                                                 # IMAGE_FILE_DEBUG_STRIPPED |
 123                                                 # IMAGE_FILE_EXECUTABLE_IMAGE |
 124                                                 # IMAGE_FILE_LINE_NUMS_STRIPPED
 125 #endif
 126 
 127 optional_header:
 128 #ifdef CONFIG_X86_32
 129         .word   0x10b                           # PE32 format
 130 #else
 131         .word   0x20b                           # PE32+ format
 132 #endif
 133         .byte   0x02                            # MajorLinkerVersion
 134         .byte   0x14                            # MinorLinkerVersion
 135 
 136         # Filled in by build.c
 137         .long   0                               # SizeOfCode
 138 
 139         .long   0                               # SizeOfInitializedData
 140         .long   0                               # SizeOfUninitializedData
 141 
 142         # Filled in by build.c
 143         .long   0x0000                          # AddressOfEntryPoint
 144 
 145         .long   0x0200                          # BaseOfCode
 146 #ifdef CONFIG_X86_32
 147         .long   0                               # data
 148 #endif
 149 
 150 extra_header_fields:
 151 #ifdef CONFIG_X86_32
 152         .long   0                               # ImageBase
 153 #else
 154         .quad   0                               # ImageBase
 155 #endif
 156         .long   0x20                            # SectionAlignment
 157         .long   0x20                            # FileAlignment
 158         .word   0                               # MajorOperatingSystemVersion
 159         .word   0                               # MinorOperatingSystemVersion
 160         .word   0                               # MajorImageVersion
 161         .word   0                               # MinorImageVersion
 162         .word   0                               # MajorSubsystemVersion
 163         .word   0                               # MinorSubsystemVersion
 164         .long   0                               # Win32VersionValue
 165 
 166         #
 167         # The size of the bzImage is written in tools/build.c
 168         #
 169         .long   0                               # SizeOfImage
 170 
 171         .long   0x200                           # SizeOfHeaders
 172         .long   0                               # CheckSum
 173         .word   0xa                             # Subsystem (EFI application)
 174         .word   0                               # DllCharacteristics
 175 #ifdef CONFIG_X86_32
 176         .long   0                               # SizeOfStackReserve
 177         .long   0                               # SizeOfStackCommit
 178         .long   0                               # SizeOfHeapReserve
 179         .long   0                               # SizeOfHeapCommit
 180 #else
 181         .quad   0                               # SizeOfStackReserve
 182         .quad   0                               # SizeOfStackCommit
 183         .quad   0                               # SizeOfHeapReserve
 184         .quad   0                               # SizeOfHeapCommit
 185 #endif
 186         .long   0                               # LoaderFlags
 187         .long   0x6                             # NumberOfRvaAndSizes
 188 
 189         .quad   0                               # ExportTable
 190         .quad   0                               # ImportTable
 191         .quad   0                               # ResourceTable
 192         .quad   0                               # ExceptionTable
 193         .quad   0                               # CertificationTable
 194         .quad   0                               # BaseRelocationTable
 195 
 196         # Section table
 197 section_table:
 198         #
 199         # The offset & size fields are filled in by build.c.
 200         #
 201         .ascii  ".setup"
 202         .byte   0
 203         .byte   0
 204         .long   0
 205         .long   0x0                             # startup_{32,64}
 206         .long   0                               # Size of initialized data
 207                                                 # on disk
 208         .long   0x0                             # startup_{32,64}
 209         .long   0                               # PointerToRelocations
 210         .long   0                               # PointerToLineNumbers
 211         .word   0                               # NumberOfRelocations
 212         .word   0                               # NumberOfLineNumbers
 213         .long   0x60500020                      # Characteristics (section flags)
 214 
 215         #
 216         # The EFI application loader requires a relocation section
 217         # because EFI applications must be relocatable. The .reloc
 218         # offset & size fields are filled in by build.c.
 219         #
 220         .ascii  ".reloc"
 221         .byte   0
 222         .byte   0
 223         .long   0
 224         .long   0
 225         .long   0                               # SizeOfRawData
 226         .long   0                               # PointerToRawData
 227         .long   0                               # PointerToRelocations
 228         .long   0                               # PointerToLineNumbers
 229         .word   0                               # NumberOfRelocations
 230         .word   0                               # NumberOfLineNumbers
 231         .long   0x42100040                      # Characteristics (section flags)
 232 
 233         #
 234         # The offset & size fields are filled in by build.c.
 235         #
 236         .ascii  ".text"
 237         .byte   0
 238         .byte   0
 239         .byte   0
 240         .long   0
 241         .long   0x0                             # startup_{32,64}
 242         .long   0                               # Size of initialized data
 243                                                 # on disk
 244         .long   0x0                             # startup_{32,64}
 245         .long   0                               # PointerToRelocations
 246         .long   0                               # PointerToLineNumbers
 247         .word   0                               # NumberOfRelocations
 248         .word   0                               # NumberOfLineNumbers
 249         .long   0x60500020                      # Characteristics (section flags)
 250 
 251         #
 252         # The offset & size fields are filled in by build.c.
 253         #
 254         .ascii  ".bss"
 255         .byte   0
 256         .byte   0
 257         .byte   0
 258         .byte   0
 259         .long   0
 260         .long   0x0
 261         .long   0                               # Size of initialized data
 262                                                 # on disk
 263         .long   0x0
 264         .long   0                               # PointerToRelocations
 265         .long   0                               # PointerToLineNumbers
 266         .word   0                               # NumberOfRelocations
 267         .word   0                               # NumberOfLineNumbers
 268         .long   0xc8000080                      # Characteristics (section flags)
 269 
 270 #endif /* CONFIG_EFI_STUB */
 271 
 272         # Kernel attributes; used by setup.  This is part 1 of the
 273         # header, from the old boot sector.
 274 
 275         .section ".header", "a"
 276         .globl  sentinel
 277 sentinel:       .byte 0xff, 0xff        /* Used to detect broken loaders */
 278 
 279         .globl  hdr
 280 hdr:
 281 setup_sects:    .byte 0                 /* Filled in by build.c */
 282 root_flags:     .word ROOT_RDONLY
 283 syssize:        .long 0                 /* Filled in by build.c */
 284 ram_size:       .word 0                 /* Obsolete */
 285 vid_mode:       .word SVGA_MODE
 286 root_dev:       .word 0                 /* Filled in by build.c */
 287 boot_flag:      .word 0xAA55
 288 
 289         # offset 512, entry point
 290 
 291         .globl  _start
 292 _start:
 293                 # Explicitly enter this as bytes, or the assembler
 294                 # tries to generate a 3-byte jump here, which causes
 295                 # everything else to push off to the wrong offset.
 296                 .byte   0xeb            # short (2-byte) jump
 297                 .byte   start_of_setup-1f
 298 1:
 299 
 300         # Part 2 of the header, from the old setup.S
 301 
 302                 .ascii  "HdrS"          # header signature
 303                 .word   0x020d          # header version number (>= 0x0105)
 304                                         # or else old loadlin-1.5 will fail)
 305                 .globl realmode_swtch
 306 realmode_swtch: .word   0, 0            # default_switch, SETUPSEG
 307 start_sys_seg:  .word   SYSSEG          # obsolete and meaningless, but just
 308                                         # in case something decided to "use" it
 309                 .word   kernel_version-512 # pointing to kernel version string
 310                                         # above section of header is compatible
 311                                         # with loadlin-1.5 (header v1.5). Don't
 312                                         # change it.
 313 
 314 type_of_loader: .byte   0               # 0 means ancient bootloader, newer
 315                                         # bootloaders know to change this.
 316                                         # See Documentation/x86/boot.rst for
 317                                         # assigned ids
 318 
 319 # flags, unused bits must be zero (RFU) bit within loadflags
 320 loadflags:
 321                 .byte   LOADED_HIGH     # The kernel is to be loaded high
 322 
 323 setup_move_size: .word  0x8000          # size to move, when setup is not
 324                                         # loaded at 0x90000. We will move setup
 325                                         # to 0x90000 then just before jumping
 326                                         # into the kernel. However, only the
 327                                         # loader knows how much data behind
 328                                         # us also needs to be loaded.
 329 
 330 code32_start:                           # here loaders can put a different
 331                                         # start address for 32-bit code.
 332                 .long   0x100000        # 0x100000 = default for big kernel
 333 
 334 ramdisk_image:  .long   0               # address of loaded ramdisk image
 335                                         # Here the loader puts the 32-bit
 336                                         # address where it loaded the image.
 337                                         # This only will be read by the kernel.
 338 
 339 ramdisk_size:   .long   0               # its size in bytes
 340 
 341 bootsect_kludge:
 342                 .long   0               # obsolete
 343 
 344 heap_end_ptr:   .word   _end+STACK_SIZE-512
 345                                         # (Header version 0x0201 or later)
 346                                         # space from here (exclusive) down to
 347                                         # end of setup code can be used by setup
 348                                         # for local heap purposes.
 349 
 350 ext_loader_ver:
 351                 .byte   0               # Extended boot loader version
 352 ext_loader_type:
 353                 .byte   0               # Extended boot loader type
 354 
 355 cmd_line_ptr:   .long   0               # (Header version 0x0202 or later)
 356                                         # If nonzero, a 32-bit pointer
 357                                         # to the kernel command line.
 358                                         # The command line should be
 359                                         # located between the start of
 360                                         # setup and the end of low
 361                                         # memory (0xa0000), or it may
 362                                         # get overwritten before it
 363                                         # gets read.  If this field is
 364                                         # used, there is no longer
 365                                         # anything magical about the
 366                                         # 0x90000 segment; the setup
 367                                         # can be located anywhere in
 368                                         # low memory 0x10000 or higher.
 369 
 370 initrd_addr_max: .long 0x7fffffff
 371                                         # (Header version 0x0203 or later)
 372                                         # The highest safe address for
 373                                         # the contents of an initrd
 374                                         # The current kernel allows up to 4 GB,
 375                                         # but leave it at 2 GB to avoid
 376                                         # possible bootloader bugs.
 377 
 378 kernel_alignment:  .long CONFIG_PHYSICAL_ALIGN  #physical addr alignment
 379                                                 #required for protected mode
 380                                                 #kernel
 381 #ifdef CONFIG_RELOCATABLE
 382 relocatable_kernel:    .byte 1
 383 #else
 384 relocatable_kernel:    .byte 0
 385 #endif
 386 min_alignment:          .byte MIN_KERNEL_ALIGN_LG2      # minimum alignment
 387 
 388 xloadflags:
 389 #ifdef CONFIG_X86_64
 390 # define XLF0 XLF_KERNEL_64                     /* 64-bit kernel */
 391 #else
 392 # define XLF0 0
 393 #endif
 394 
 395 #if defined(CONFIG_RELOCATABLE) && defined(CONFIG_X86_64)
 396    /* kernel/boot_param/ramdisk could be loaded above 4g */
 397 # define XLF1 XLF_CAN_BE_LOADED_ABOVE_4G
 398 #else
 399 # define XLF1 0
 400 #endif
 401 
 402 #ifdef CONFIG_EFI_STUB
 403 # ifdef CONFIG_EFI_MIXED
 404 #  define XLF23 (XLF_EFI_HANDOVER_32|XLF_EFI_HANDOVER_64)
 405 # else
 406 #  ifdef CONFIG_X86_64
 407 #   define XLF23 XLF_EFI_HANDOVER_64            /* 64-bit EFI handover ok */
 408 #  else
 409 #   define XLF23 XLF_EFI_HANDOVER_32            /* 32-bit EFI handover ok */
 410 #  endif
 411 # endif
 412 #else
 413 # define XLF23 0
 414 #endif
 415 
 416 #if defined(CONFIG_X86_64) && defined(CONFIG_EFI) && defined(CONFIG_KEXEC_CORE)
 417 # define XLF4 XLF_EFI_KEXEC
 418 #else
 419 # define XLF4 0
 420 #endif
 421 
 422 #ifdef CONFIG_X86_64
 423 #ifdef CONFIG_X86_5LEVEL
 424 #define XLF56 (XLF_5LEVEL|XLF_5LEVEL_ENABLED)
 425 #else
 426 #define XLF56 XLF_5LEVEL
 427 #endif
 428 #else
 429 #define XLF56 0
 430 #endif
 431 
 432                         .word XLF0 | XLF1 | XLF23 | XLF4 | XLF56
 433 
 434 cmdline_size:   .long   COMMAND_LINE_SIZE-1     #length of the command line,
 435                                                 #added with boot protocol
 436                                                 #version 2.06
 437 
 438 hardware_subarch:       .long 0                 # subarchitecture, added with 2.07
 439                                                 # default to 0 for normal x86 PC
 440 
 441 hardware_subarch_data:  .quad 0
 442 
 443 payload_offset:         .long ZO_input_data
 444 payload_length:         .long ZO_z_input_len
 445 
 446 setup_data:             .quad 0                 # 64-bit physical pointer to
 447                                                 # single linked list of
 448                                                 # struct setup_data
 449 
 450 pref_address:           .quad LOAD_PHYSICAL_ADDR        # preferred load addr
 451 
 452 #
 453 # Getting to provably safe in-place decompression is hard. Worst case
 454 # behaviours need to be analyzed. Here let's take the decompression of
 455 # a gzip-compressed kernel as example, to illustrate it:
 456 #
 457 # The file layout of gzip compressed kernel is:
 458 #
 459 #    magic[2]
 460 #    method[1]
 461 #    flags[1]
 462 #    timestamp[4]
 463 #    extraflags[1]
 464 #    os[1]
 465 #    compressed data blocks[N]
 466 #    crc[4] orig_len[4]
 467 #
 468 # ... resulting in +18 bytes overhead of uncompressed data.
 469 #
 470 # (For more information, please refer to RFC 1951 and RFC 1952.)
 471 #
 472 # Files divided into blocks
 473 # 1 bit (last block flag)
 474 # 2 bits (block type)
 475 #
 476 # 1 block occurs every 32K -1 bytes or when there 50% compression
 477 # has been achieved. The smallest block type encoding is always used.
 478 #
 479 # stored:
 480 #    32 bits length in bytes.
 481 #
 482 # fixed:
 483 #    magic fixed tree.
 484 #    symbols.
 485 #
 486 # dynamic:
 487 #    dynamic tree encoding.
 488 #    symbols.
 489 #
 490 #
 491 # The buffer for decompression in place is the length of the uncompressed
 492 # data, plus a small amount extra to keep the algorithm safe. The
 493 # compressed data is placed at the end of the buffer.  The output pointer
 494 # is placed at the start of the buffer and the input pointer is placed
 495 # where the compressed data starts. Problems will occur when the output
 496 # pointer overruns the input pointer.
 497 #
 498 # The output pointer can only overrun the input pointer if the input
 499 # pointer is moving faster than the output pointer.  A condition only
 500 # triggered by data whose compressed form is larger than the uncompressed
 501 # form.
 502 #
 503 # The worst case at the block level is a growth of the compressed data
 504 # of 5 bytes per 32767 bytes.
 505 #
 506 # The worst case internal to a compressed block is very hard to figure.
 507 # The worst case can at least be bounded by having one bit that represents
 508 # 32764 bytes and then all of the rest of the bytes representing the very
 509 # very last byte.
 510 #
 511 # All of which is enough to compute an amount of extra data that is required
 512 # to be safe.  To avoid problems at the block level allocating 5 extra bytes
 513 # per 32767 bytes of data is sufficient.  To avoid problems internal to a
 514 # block adding an extra 32767 bytes (the worst case uncompressed block size)
 515 # is sufficient, to ensure that in the worst case the decompressed data for
 516 # block will stop the byte before the compressed data for a block begins.
 517 # To avoid problems with the compressed data's meta information an extra 18
 518 # bytes are needed.  Leading to the formula:
 519 #
 520 # extra_bytes = (uncompressed_size >> 12) + 32768 + 18
 521 #
 522 # Adding 8 bytes per 32K is a bit excessive but much easier to calculate.
 523 # Adding 32768 instead of 32767 just makes for round numbers.
 524 #
 525 # Above analysis is for decompressing gzip compressed kernel only. Up to
 526 # now 6 different decompressor are supported all together. And among them
 527 # xz stores data in chunks and has maximum chunk of 64K. Hence safety
 528 # margin should be updated to cover all decompressors so that we don't
 529 # need to deal with each of them separately. Please check
 530 # the description in lib/decompressor_xxx.c for specific information.
 531 #
 532 # extra_bytes = (uncompressed_size >> 12) + 65536 + 128
 533 #
 534 # LZ4 is even worse: data that cannot be further compressed grows by 0.4%,
 535 # or one byte per 256 bytes. OTOH, we can safely get rid of the +128 as
 536 # the size-dependent part now grows so fast.
 537 #
 538 # extra_bytes = (uncompressed_size >> 8) + 65536
 539 
 540 #define ZO_z_extra_bytes        ((ZO_z_output_len >> 8) + 65536)
 541 #if ZO_z_output_len > ZO_z_input_len
 542 # define ZO_z_extract_offset    (ZO_z_output_len + ZO_z_extra_bytes - \
 543                                  ZO_z_input_len)
 544 #else
 545 # define ZO_z_extract_offset    ZO_z_extra_bytes
 546 #endif
 547 
 548 /*
 549  * The extract_offset has to be bigger than ZO head section. Otherwise when
 550  * the head code is running to move ZO to the end of the buffer, it will
 551  * overwrite the head code itself.
 552  */
 553 #if (ZO__ehead - ZO_startup_32) > ZO_z_extract_offset
 554 # define ZO_z_min_extract_offset ((ZO__ehead - ZO_startup_32 + 4095) & ~4095)
 555 #else
 556 # define ZO_z_min_extract_offset ((ZO_z_extract_offset + 4095) & ~4095)
 557 #endif
 558 
 559 #define ZO_INIT_SIZE    (ZO__end - ZO_startup_32 + ZO_z_min_extract_offset)
 560 
 561 #define VO_INIT_SIZE    (VO__end - VO__text)
 562 #if ZO_INIT_SIZE > VO_INIT_SIZE
 563 # define INIT_SIZE ZO_INIT_SIZE
 564 #else
 565 # define INIT_SIZE VO_INIT_SIZE
 566 #endif
 567 
 568 init_size:              .long INIT_SIZE         # kernel initialization size
 569 handover_offset:        .long 0                 # Filled in by build.c
 570 
 571 # End of setup header #####################################################
 572 
 573         .section ".entrytext", "ax"
 574 start_of_setup:
 575 # Force %es = %ds
 576         movw    %ds, %ax
 577         movw    %ax, %es
 578         cld
 579 
 580 # Apparently some ancient versions of LILO invoked the kernel with %ss != %ds,
 581 # which happened to work by accident for the old code.  Recalculate the stack
 582 # pointer if %ss is invalid.  Otherwise leave it alone, LOADLIN sets up the
 583 # stack behind its own code, so we can't blindly put it directly past the heap.
 584 
 585         movw    %ss, %dx
 586         cmpw    %ax, %dx        # %ds == %ss?
 587         movw    %sp, %dx
 588         je      2f              # -> assume %sp is reasonably set
 589 
 590         # Invalid %ss, make up a new stack
 591         movw    $_end, %dx
 592         testb   $CAN_USE_HEAP, loadflags
 593         jz      1f
 594         movw    heap_end_ptr, %dx
 595 1:      addw    $STACK_SIZE, %dx
 596         jnc     2f
 597         xorw    %dx, %dx        # Prevent wraparound
 598 
 599 2:      # Now %dx should point to the end of our stack space
 600         andw    $~3, %dx        # dword align (might as well...)
 601         jnz     3f
 602         movw    $0xfffc, %dx    # Make sure we're not zero
 603 3:      movw    %ax, %ss
 604         movzwl  %dx, %esp       # Clear upper half of %esp
 605         sti                     # Now we should have a working stack
 606 
 607 # We will have entered with %cs = %ds+0x20, normalize %cs so
 608 # it is on par with the other segments.
 609         pushw   %ds
 610         pushw   $6f
 611         lretw
 612 6:
 613 
 614 # Check signature at end of setup
 615         cmpl    $0x5a5aaa55, setup_sig
 616         jne     setup_bad
 617 
 618 # Zero the bss
 619         movw    $__bss_start, %di
 620         movw    $_end+3, %cx
 621         xorl    %eax, %eax
 622         subw    %di, %cx
 623         shrw    $2, %cx
 624         rep; stosl
 625 
 626 # Jump to C code (should not return)
 627         calll   main
 628 
 629 # Setup corrupt somehow...
 630 setup_bad:
 631         movl    $setup_corrupt, %eax
 632         calll   puts
 633         # Fall through...
 634 
 635         .globl  die
 636         .type   die, @function
 637 die:
 638         hlt
 639         jmp     die
 640 
 641         .size   die, .-die
 642 
 643         .section ".initdata", "a"
 644 setup_corrupt:
 645         .byte   7
 646         .string "No setup signature found...\n"

/* [<][>][^][v][top][bottom][index][help] */