1 /* SPDX-License-Identifier: GPL-2.0 */
5 * Copyright (C) 1991, 1992 Linus Torvalds
7 * Based on bootsect.S and setup.S
8 * modified by more people than can be counted
10 * Rewritten as a common file by H. Peter Anvin (Apr 2007)
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.
19 #include <asm/segment.h>
21 #include <asm/page_types.h>
22 #include <asm/setup.h>
23 #include <asm/bootparam.h>
28 BOOTSEG = 0x07C0 /* original address of boot-sector */
29 SYSSEG = 0x1000 /* historical load address >> 4 */
32 #define SVGA_MODE ASK_VGA
40 .section ".bstext", "ax"
42 .global bootsect_start
44 #ifdef CONFIG_EFI_STUB
50 # Normalize the start address
51 ljmp $BOOTSEG, $start2
62 movw $bugger_off_msg, %si
74 # Allow the user to press a key, then reboot
79 # int 0x19 should never return. In case it does anyway,
80 # invoke the BIOS reset code...
83 #ifdef CONFIG_EFI_STUB
86 # Offset to the PE header.
89 #endif /* CONFIG_EFI_STUB */
91 .section ".bsdata", "a"
93 .ascii "Use a boot loader.\r\n"
95 .ascii "Remove disk and press any key to reboot...\r\n"
98 #ifdef CONFIG_EFI_STUB
107 .word 0x8664 # x86-64
109 .word 4 # nr_sections
110 .long 0 # TimeDateStamp
111 .long 0 # PointerToSymbolTable
112 .long 1 # NumberOfSymbols
113 .word section_table - optional_header # SizeOfOptionalHeader
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
121 .word 0x206 # Characteristics
122 # IMAGE_FILE_DEBUG_STRIPPED |
123 # IMAGE_FILE_EXECUTABLE_IMAGE |
124 # IMAGE_FILE_LINE_NUMS_STRIPPED
129 .word 0x10b # PE32 format
131 .word 0x20b # PE32+ format
133 .byte 0x02 # MajorLinkerVersion
134 .byte 0x14 # MinorLinkerVersion
136 # Filled in by build.c
139 .long 0 # SizeOfInitializedData
140 .long 0 # SizeOfUninitializedData
142 # Filled in by build.c
143 .long 0x0000 # AddressOfEntryPoint
145 .long 0x0200 # BaseOfCode
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
167 # The size of the bzImage is written in tools/build.c
169 .long 0 # SizeOfImage
171 .long 0x200 # SizeOfHeaders
173 .word 0xa # Subsystem (EFI application)
174 .word 0 # DllCharacteristics
176 .long 0 # SizeOfStackReserve
177 .long 0 # SizeOfStackCommit
178 .long 0 # SizeOfHeapReserve
179 .long 0 # SizeOfHeapCommit
181 .quad 0 # SizeOfStackReserve
182 .quad 0 # SizeOfStackCommit
183 .quad 0 # SizeOfHeapReserve
184 .quad 0 # SizeOfHeapCommit
186 .long 0 # LoaderFlags
187 .long 0x6 # NumberOfRvaAndSizes
189 .quad 0 # ExportTable
190 .quad 0 # ImportTable
191 .quad 0 # ResourceTable
192 .quad 0 # ExceptionTable
193 .quad 0 # CertificationTable
194 .quad 0 # BaseRelocationTable
199 # The offset & size fields are filled in by build.c.
205 .long 0x0 # startup_{32,64}
206 .long 0 # Size of initialized data
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)
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.
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)
234 # The offset & size fields are filled in by build.c.
241 .long 0x0 # startup_{32,64}
242 .long 0 # Size of initialized data
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)
252 # The offset & size fields are filled in by build.c.
261 .long 0 # Size of initialized data
264 .long 0 # PointerToRelocations
265 .long 0 # PointerToLineNumbers
266 .word 0 # NumberOfRelocations
267 .word 0 # NumberOfLineNumbers
268 .long 0xc8000080 # Characteristics (section flags)
270 #endif /* CONFIG_EFI_STUB */
272 # Kernel attributes; used by setup. This is part 1 of the
273 # header, from the old boot sector.
275 .section ".header", "a"
277 sentinel: .byte 0xff, 0xff /* Used to detect broken loaders */
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
289 # offset 512, entry point
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
300 # Part 2 of the header, from the old setup.S
302 .ascii "HdrS" # header signature
303 .word 0x020e # 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
314 type_of_loader: .byte 0 # 0 means ancient bootloader, newer
315 # bootloaders know to change this.
316 # See Documentation/x86/boot.txt for
319 # flags, unused bits must be zero (RFU) bit within loadflags
321 .byte LOADED_HIGH # The kernel is to be loaded high
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.
330 code32_start: # here loaders can put a different
331 # start address for 32-bit code.
332 .long 0x100000 # 0x100000 = default for big kernel
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.
339 ramdisk_size: .long 0 # its size in bytes
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.
351 .byte 0 # Extended boot loader version
353 .byte 0 # Extended boot loader type
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.
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.
378 kernel_alignment: .long CONFIG_PHYSICAL_ALIGN #physical addr alignment
379 #required for protected mode
381 #ifdef CONFIG_RELOCATABLE
382 relocatable_kernel: .byte 1
384 relocatable_kernel: .byte 0
386 min_alignment: .byte MIN_KERNEL_ALIGN_LG2 # minimum alignment
390 # define XLF0 XLF_KERNEL_64 /* 64-bit kernel */
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
402 #ifdef CONFIG_EFI_STUB
403 # ifdef CONFIG_EFI_MIXED
404 # define XLF23 (XLF_EFI_HANDOVER_32|XLF_EFI_HANDOVER_64)
406 # ifdef CONFIG_X86_64
407 # define XLF23 XLF_EFI_HANDOVER_64 /* 64-bit EFI handover ok */
409 # define XLF23 XLF_EFI_HANDOVER_32 /* 32-bit EFI handover ok */
416 #if defined(CONFIG_X86_64) && defined(CONFIG_EFI) && defined(CONFIG_KEXEC_CORE)
417 # define XLF4 XLF_EFI_KEXEC
422 .word XLF0 | XLF1 | XLF23 | XLF4
424 cmdline_size: .long COMMAND_LINE_SIZE-1 #length of the command line,
425 #added with boot protocol
428 hardware_subarch: .long 0 # subarchitecture, added with 2.07
429 # default to 0 for normal x86 PC
431 hardware_subarch_data: .quad 0
433 payload_offset: .long ZO_input_data
434 payload_length: .long ZO_z_input_len
436 setup_data: .quad 0 # 64-bit physical pointer to
437 # single linked list of
440 pref_address: .quad LOAD_PHYSICAL_ADDR # preferred load addr
443 # Getting to provably safe in-place decompression is hard. Worst case
444 # behaviours need to be analyzed. Here let's take the decompression of
445 # a gzip-compressed kernel as example, to illustrate it:
447 # The file layout of gzip compressed kernel is:
455 # compressed data blocks[N]
458 # ... resulting in +18 bytes overhead of uncompressed data.
460 # (For more information, please refer to RFC 1951 and RFC 1952.)
462 # Files divided into blocks
463 # 1 bit (last block flag)
464 # 2 bits (block type)
466 # 1 block occurs every 32K -1 bytes or when there 50% compression
467 # has been achieved. The smallest block type encoding is always used.
470 # 32 bits length in bytes.
477 # dynamic tree encoding.
481 # The buffer for decompression in place is the length of the uncompressed
482 # data, plus a small amount extra to keep the algorithm safe. The
483 # compressed data is placed at the end of the buffer. The output pointer
484 # is placed at the start of the buffer and the input pointer is placed
485 # where the compressed data starts. Problems will occur when the output
486 # pointer overruns the input pointer.
488 # The output pointer can only overrun the input pointer if the input
489 # pointer is moving faster than the output pointer. A condition only
490 # triggered by data whose compressed form is larger than the uncompressed
493 # The worst case at the block level is a growth of the compressed data
494 # of 5 bytes per 32767 bytes.
496 # The worst case internal to a compressed block is very hard to figure.
497 # The worst case can at least be bounded by having one bit that represents
498 # 32764 bytes and then all of the rest of the bytes representing the very
501 # All of which is enough to compute an amount of extra data that is required
502 # to be safe. To avoid problems at the block level allocating 5 extra bytes
503 # per 32767 bytes of data is sufficient. To avoid problems internal to a
504 # block adding an extra 32767 bytes (the worst case uncompressed block size)
505 # is sufficient, to ensure that in the worst case the decompressed data for
506 # block will stop the byte before the compressed data for a block begins.
507 # To avoid problems with the compressed data's meta information an extra 18
508 # bytes are needed. Leading to the formula:
510 # extra_bytes = (uncompressed_size >> 12) + 32768 + 18
512 # Adding 8 bytes per 32K is a bit excessive but much easier to calculate.
513 # Adding 32768 instead of 32767 just makes for round numbers.
515 # Above analysis is for decompressing gzip compressed kernel only. Up to
516 # now 6 different decompressor are supported all together. And among them
517 # xz stores data in chunks and has maximum chunk of 64K. Hence safety
518 # margin should be updated to cover all decompressors so that we don't
519 # need to deal with each of them separately. Please check
520 # the description in lib/decompressor_xxx.c for specific information.
522 # extra_bytes = (uncompressed_size >> 12) + 65536 + 128
524 # LZ4 is even worse: data that cannot be further compressed grows by 0.4%,
525 # or one byte per 256 bytes. OTOH, we can safely get rid of the +128 as
526 # the size-dependent part now grows so fast.
528 # extra_bytes = (uncompressed_size >> 8) + 65536
530 #define ZO_z_extra_bytes ((ZO_z_output_len >> 8) + 65536)
531 #if ZO_z_output_len > ZO_z_input_len
532 # define ZO_z_extract_offset (ZO_z_output_len + ZO_z_extra_bytes - \
535 # define ZO_z_extract_offset ZO_z_extra_bytes
539 * The extract_offset has to be bigger than ZO head section. Otherwise when
540 * the head code is running to move ZO to the end of the buffer, it will
541 * overwrite the head code itself.
543 #if (ZO__ehead - ZO_startup_32) > ZO_z_extract_offset
544 # define ZO_z_min_extract_offset ((ZO__ehead - ZO_startup_32 + 4095) & ~4095)
546 # define ZO_z_min_extract_offset ((ZO_z_extract_offset + 4095) & ~4095)
549 #define ZO_INIT_SIZE (ZO__end - ZO_startup_32 + ZO_z_min_extract_offset)
551 #define VO_INIT_SIZE (VO__end - VO__text)
552 #if ZO_INIT_SIZE > VO_INIT_SIZE
553 # define INIT_SIZE ZO_INIT_SIZE
555 # define INIT_SIZE VO_INIT_SIZE
558 init_size: .long INIT_SIZE # kernel initialization size
559 handover_offset: .long 0 # Filled in by build.c
561 acpi_rsdp_addr: .quad 0 # 64-bit physical pointer to the
562 # ACPI RSDP table, added with
565 # End of setup header #####################################################
567 .section ".entrytext", "ax"
574 # Apparently some ancient versions of LILO invoked the kernel with %ss != %ds,
575 # which happened to work by accident for the old code. Recalculate the stack
576 # pointer if %ss is invalid. Otherwise leave it alone, LOADLIN sets up the
577 # stack behind its own code, so we can't blindly put it directly past the heap.
580 cmpw %ax, %dx # %ds == %ss?
582 je 2f # -> assume %sp is reasonably set
584 # Invalid %ss, make up a new stack
586 testb $CAN_USE_HEAP, loadflags
588 movw heap_end_ptr, %dx
589 1: addw $STACK_SIZE, %dx
591 xorw %dx, %dx # Prevent wraparound
593 2: # Now %dx should point to the end of our stack space
594 andw $~3, %dx # dword align (might as well...)
596 movw $0xfffc, %dx # Make sure we're not zero
598 movzwl %dx, %esp # Clear upper half of %esp
599 sti # Now we should have a working stack
601 # We will have entered with %cs = %ds+0x20, normalize %cs so
602 # it is on par with the other segments.
608 # Check signature at end of setup
609 cmpl $0x5a5aaa55, setup_sig
613 movw $__bss_start, %di
620 # Jump to C code (should not return)
623 # Setup corrupt somehow...
625 movl $setup_corrupt, %eax
637 .section ".initdata", "a"
640 .string "No setup signature found...\n"