efi/x86: Add true mixed mode entry point into .compat section
[linux-block.git] / arch / x86 / boot / header.S
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   section_count                   # 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 #ifdef CONFIG_EFI_MIXED
234         #
235         # The offset & size fields are filled in by build.c.
236         #
237         .asciz  ".compat"
238         .long   0
239         .long   0x0
240         .long   0                               # Size of initialized data
241                                                 # on disk
242         .long   0x0
243         .long   0                               # PointerToRelocations
244         .long   0                               # PointerToLineNumbers
245         .word   0                               # NumberOfRelocations
246         .word   0                               # NumberOfLineNumbers
247         .long   0x42100040                      # Characteristics (section flags)
248 #endif
249
250         #
251         # The offset & size fields are filled in by build.c.
252         #
253         .ascii  ".text"
254         .byte   0
255         .byte   0
256         .byte   0
257         .long   0
258         .long   0x0                             # startup_{32,64}
259         .long   0                               # Size of initialized data
260                                                 # on disk
261         .long   0x0                             # startup_{32,64}
262         .long   0                               # PointerToRelocations
263         .long   0                               # PointerToLineNumbers
264         .word   0                               # NumberOfRelocations
265         .word   0                               # NumberOfLineNumbers
266         .long   0x60500020                      # Characteristics (section flags)
267
268         .set    section_count, (. - section_table) / 40
269 #endif /* CONFIG_EFI_STUB */
270
271         # Kernel attributes; used by setup.  This is part 1 of the
272         # header, from the old boot sector.
273
274         .section ".header", "a"
275         .globl  sentinel
276 sentinel:       .byte 0xff, 0xff        /* Used to detect broken loaders */
277
278         .globl  hdr
279 hdr:
280 setup_sects:    .byte 0                 /* Filled in by build.c */
281 root_flags:     .word ROOT_RDONLY
282 syssize:        .long 0                 /* Filled in by build.c */
283 ram_size:       .word 0                 /* Obsolete */
284 vid_mode:       .word SVGA_MODE
285 root_dev:       .word 0                 /* Filled in by build.c */
286 boot_flag:      .word 0xAA55
287
288         # offset 512, entry point
289
290         .globl  _start
291 _start:
292                 # Explicitly enter this as bytes, or the assembler
293                 # tries to generate a 3-byte jump here, which causes
294                 # everything else to push off to the wrong offset.
295                 .byte   0xeb            # short (2-byte) jump
296                 .byte   start_of_setup-1f
297 1:
298
299         # Part 2 of the header, from the old setup.S
300
301                 .ascii  "HdrS"          # header signature
302                 .word   0x020f          # header version number (>= 0x0105)
303                                         # or else old loadlin-1.5 will fail)
304                 .globl realmode_swtch
305 realmode_swtch: .word   0, 0            # default_switch, SETUPSEG
306 start_sys_seg:  .word   SYSSEG          # obsolete and meaningless, but just
307                                         # in case something decided to "use" it
308                 .word   kernel_version-512 # pointing to kernel version string
309                                         # above section of header is compatible
310                                         # with loadlin-1.5 (header v1.5). Don't
311                                         # change it.
312
313 type_of_loader: .byte   0               # 0 means ancient bootloader, newer
314                                         # bootloaders know to change this.
315                                         # See Documentation/x86/boot.rst for
316                                         # assigned ids
317
318 # flags, unused bits must be zero (RFU) bit within loadflags
319 loadflags:
320                 .byte   LOADED_HIGH     # The kernel is to be loaded high
321
322 setup_move_size: .word  0x8000          # size to move, when setup is not
323                                         # loaded at 0x90000. We will move setup
324                                         # to 0x90000 then just before jumping
325                                         # into the kernel. However, only the
326                                         # loader knows how much data behind
327                                         # us also needs to be loaded.
328
329 code32_start:                           # here loaders can put a different
330                                         # start address for 32-bit code.
331                 .long   0x100000        # 0x100000 = default for big kernel
332
333 ramdisk_image:  .long   0               # address of loaded ramdisk image
334                                         # Here the loader puts the 32-bit
335                                         # address where it loaded the image.
336                                         # This only will be read by the kernel.
337
338 ramdisk_size:   .long   0               # its size in bytes
339
340 bootsect_kludge:
341                 .long   0               # obsolete
342
343 heap_end_ptr:   .word   _end+STACK_SIZE-512
344                                         # (Header version 0x0201 or later)
345                                         # space from here (exclusive) down to
346                                         # end of setup code can be used by setup
347                                         # for local heap purposes.
348
349 ext_loader_ver:
350                 .byte   0               # Extended boot loader version
351 ext_loader_type:
352                 .byte   0               # Extended boot loader type
353
354 cmd_line_ptr:   .long   0               # (Header version 0x0202 or later)
355                                         # If nonzero, a 32-bit pointer
356                                         # to the kernel command line.
357                                         # The command line should be
358                                         # located between the start of
359                                         # setup and the end of low
360                                         # memory (0xa0000), or it may
361                                         # get overwritten before it
362                                         # gets read.  If this field is
363                                         # used, there is no longer
364                                         # anything magical about the
365                                         # 0x90000 segment; the setup
366                                         # can be located anywhere in
367                                         # low memory 0x10000 or higher.
368
369 initrd_addr_max: .long 0x7fffffff
370                                         # (Header version 0x0203 or later)
371                                         # The highest safe address for
372                                         # the contents of an initrd
373                                         # The current kernel allows up to 4 GB,
374                                         # but leave it at 2 GB to avoid
375                                         # possible bootloader bugs.
376
377 kernel_alignment:  .long CONFIG_PHYSICAL_ALIGN  #physical addr alignment
378                                                 #required for protected mode
379                                                 #kernel
380 #ifdef CONFIG_RELOCATABLE
381 relocatable_kernel:    .byte 1
382 #else
383 relocatable_kernel:    .byte 0
384 #endif
385 min_alignment:          .byte MIN_KERNEL_ALIGN_LG2      # minimum alignment
386
387 xloadflags:
388 #ifdef CONFIG_X86_64
389 # define XLF0 XLF_KERNEL_64                     /* 64-bit kernel */
390 #else
391 # define XLF0 0
392 #endif
393
394 #if defined(CONFIG_RELOCATABLE) && defined(CONFIG_X86_64)
395    /* kernel/boot_param/ramdisk could be loaded above 4g */
396 # define XLF1 XLF_CAN_BE_LOADED_ABOVE_4G
397 #else
398 # define XLF1 0
399 #endif
400
401 #ifdef CONFIG_EFI_STUB
402 # ifdef CONFIG_EFI_MIXED
403 #  define XLF23 (XLF_EFI_HANDOVER_32|XLF_EFI_HANDOVER_64)
404 # else
405 #  ifdef CONFIG_X86_64
406 #   define XLF23 XLF_EFI_HANDOVER_64            /* 64-bit EFI handover ok */
407 #  else
408 #   define XLF23 XLF_EFI_HANDOVER_32            /* 32-bit EFI handover ok */
409 #  endif
410 # endif
411 #else
412 # define XLF23 0
413 #endif
414
415 #if defined(CONFIG_X86_64) && defined(CONFIG_EFI) && defined(CONFIG_KEXEC_CORE)
416 # define XLF4 XLF_EFI_KEXEC
417 #else
418 # define XLF4 0
419 #endif
420
421 #ifdef CONFIG_X86_64
422 #ifdef CONFIG_X86_5LEVEL
423 #define XLF56 (XLF_5LEVEL|XLF_5LEVEL_ENABLED)
424 #else
425 #define XLF56 XLF_5LEVEL
426 #endif
427 #else
428 #define XLF56 0
429 #endif
430
431                         .word XLF0 | XLF1 | XLF23 | XLF4 | XLF56
432
433 cmdline_size:   .long   COMMAND_LINE_SIZE-1     #length of the command line,
434                                                 #added with boot protocol
435                                                 #version 2.06
436
437 hardware_subarch:       .long 0                 # subarchitecture, added with 2.07
438                                                 # default to 0 for normal x86 PC
439
440 hardware_subarch_data:  .quad 0
441
442 payload_offset:         .long ZO_input_data
443 payload_length:         .long ZO_z_input_len
444
445 setup_data:             .quad 0                 # 64-bit physical pointer to
446                                                 # single linked list of
447                                                 # struct setup_data
448
449 pref_address:           .quad LOAD_PHYSICAL_ADDR        # preferred load addr
450
451 #
452 # Getting to provably safe in-place decompression is hard. Worst case
453 # behaviours need to be analyzed. Here let's take the decompression of
454 # a gzip-compressed kernel as example, to illustrate it:
455 #
456 # The file layout of gzip compressed kernel is:
457 #
458 #    magic[2]
459 #    method[1]
460 #    flags[1]
461 #    timestamp[4]
462 #    extraflags[1]
463 #    os[1]
464 #    compressed data blocks[N]
465 #    crc[4] orig_len[4]
466 #
467 # ... resulting in +18 bytes overhead of uncompressed data.
468 #
469 # (For more information, please refer to RFC 1951 and RFC 1952.)
470 #
471 # Files divided into blocks
472 # 1 bit (last block flag)
473 # 2 bits (block type)
474 #
475 # 1 block occurs every 32K -1 bytes or when there 50% compression
476 # has been achieved. The smallest block type encoding is always used.
477 #
478 # stored:
479 #    32 bits length in bytes.
480 #
481 # fixed:
482 #    magic fixed tree.
483 #    symbols.
484 #
485 # dynamic:
486 #    dynamic tree encoding.
487 #    symbols.
488 #
489 #
490 # The buffer for decompression in place is the length of the uncompressed
491 # data, plus a small amount extra to keep the algorithm safe. The
492 # compressed data is placed at the end of the buffer.  The output pointer
493 # is placed at the start of the buffer and the input pointer is placed
494 # where the compressed data starts. Problems will occur when the output
495 # pointer overruns the input pointer.
496 #
497 # The output pointer can only overrun the input pointer if the input
498 # pointer is moving faster than the output pointer.  A condition only
499 # triggered by data whose compressed form is larger than the uncompressed
500 # form.
501 #
502 # The worst case at the block level is a growth of the compressed data
503 # of 5 bytes per 32767 bytes.
504 #
505 # The worst case internal to a compressed block is very hard to figure.
506 # The worst case can at least be bounded by having one bit that represents
507 # 32764 bytes and then all of the rest of the bytes representing the very
508 # very last byte.
509 #
510 # All of which is enough to compute an amount of extra data that is required
511 # to be safe.  To avoid problems at the block level allocating 5 extra bytes
512 # per 32767 bytes of data is sufficient.  To avoid problems internal to a
513 # block adding an extra 32767 bytes (the worst case uncompressed block size)
514 # is sufficient, to ensure that in the worst case the decompressed data for
515 # block will stop the byte before the compressed data for a block begins.
516 # To avoid problems with the compressed data's meta information an extra 18
517 # bytes are needed.  Leading to the formula:
518 #
519 # extra_bytes = (uncompressed_size >> 12) + 32768 + 18
520 #
521 # Adding 8 bytes per 32K is a bit excessive but much easier to calculate.
522 # Adding 32768 instead of 32767 just makes for round numbers.
523 #
524 # Above analysis is for decompressing gzip compressed kernel only. Up to
525 # now 6 different decompressor are supported all together. And among them
526 # xz stores data in chunks and has maximum chunk of 64K. Hence safety
527 # margin should be updated to cover all decompressors so that we don't
528 # need to deal with each of them separately. Please check
529 # the description in lib/decompressor_xxx.c for specific information.
530 #
531 # extra_bytes = (uncompressed_size >> 12) + 65536 + 128
532 #
533 # LZ4 is even worse: data that cannot be further compressed grows by 0.4%,
534 # or one byte per 256 bytes. OTOH, we can safely get rid of the +128 as
535 # the size-dependent part now grows so fast.
536 #
537 # extra_bytes = (uncompressed_size >> 8) + 65536
538
539 #define ZO_z_extra_bytes        ((ZO_z_output_len >> 8) + 65536)
540 #if ZO_z_output_len > ZO_z_input_len
541 # define ZO_z_extract_offset    (ZO_z_output_len + ZO_z_extra_bytes - \
542                                  ZO_z_input_len)
543 #else
544 # define ZO_z_extract_offset    ZO_z_extra_bytes
545 #endif
546
547 /*
548  * The extract_offset has to be bigger than ZO head section. Otherwise when
549  * the head code is running to move ZO to the end of the buffer, it will
550  * overwrite the head code itself.
551  */
552 #if (ZO__ehead - ZO_startup_32) > ZO_z_extract_offset
553 # define ZO_z_min_extract_offset ((ZO__ehead - ZO_startup_32 + 4095) & ~4095)
554 #else
555 # define ZO_z_min_extract_offset ((ZO_z_extract_offset + 4095) & ~4095)
556 #endif
557
558 #define ZO_INIT_SIZE    (ZO__end - ZO_startup_32 + ZO_z_min_extract_offset)
559
560 #define VO_INIT_SIZE    (VO__end - VO__text)
561 #if ZO_INIT_SIZE > VO_INIT_SIZE
562 # define INIT_SIZE ZO_INIT_SIZE
563 #else
564 # define INIT_SIZE VO_INIT_SIZE
565 #endif
566
567 init_size:              .long INIT_SIZE         # kernel initialization size
568 handover_offset:        .long 0                 # Filled in by build.c
569 kernel_info_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"