6247c33614
The current implementation copied the *complete* header to boot_params, thus making the kernel ignore many of the fields. As mentioned in the code comment for the sentinel variable in bootparam.h a bootloader should only copy the setup_header, set some fields in boot_params and zero out anything else. This change makes systemd-boot (mostly) compliant with the Linux Boot Protocol and the EFI Handover Protocol described in bootparam.h and Documentation/boot.txt to fix various issues: - Secure boot not being detected corretly by Linux (#11717) - tboot error message / warning on boot (#11717) - Strange purple text color when booting in qemu with OVMF - Hopefully even more ...
88 lines
2.9 KiB
C
88 lines
2.9 KiB
C
/* SPDX-License-Identifier: LGPL-2.1+ */
|
|
#pragma once
|
|
|
|
#define SETUP_MAGIC 0x53726448 /* "HdrS" */
|
|
|
|
struct setup_header {
|
|
UINT8 setup_sects;
|
|
UINT16 root_flags;
|
|
UINT32 syssize;
|
|
UINT16 ram_size;
|
|
UINT16 vid_mode;
|
|
UINT16 root_dev;
|
|
UINT16 boot_flag;
|
|
UINT16 jump;
|
|
UINT32 header;
|
|
UINT16 version;
|
|
UINT32 realmode_swtch;
|
|
UINT16 start_sys_seg;
|
|
UINT16 kernel_version;
|
|
UINT8 type_of_loader;
|
|
UINT8 loadflags;
|
|
UINT16 setup_move_size;
|
|
UINT32 code32_start;
|
|
UINT32 ramdisk_image;
|
|
UINT32 ramdisk_size;
|
|
UINT32 bootsect_kludge;
|
|
UINT16 heap_end_ptr;
|
|
UINT8 ext_loader_ver;
|
|
UINT8 ext_loader_type;
|
|
UINT32 cmd_line_ptr;
|
|
UINT32 initrd_addr_max;
|
|
UINT32 kernel_alignment;
|
|
UINT8 relocatable_kernel;
|
|
UINT8 min_alignment;
|
|
UINT16 xloadflags;
|
|
UINT32 cmdline_size;
|
|
UINT32 hardware_subarch;
|
|
UINT64 hardware_subarch_data;
|
|
UINT32 payload_offset;
|
|
UINT32 payload_length;
|
|
UINT64 setup_data;
|
|
UINT64 pref_address;
|
|
UINT32 init_size;
|
|
UINT32 handover_offset;
|
|
} __attribute__((packed));
|
|
|
|
/* adapted from linux' bootparam.h */
|
|
struct boot_params {
|
|
UINT8 screen_info[64]; // was: struct screen_info
|
|
UINT8 apm_bios_info[20]; // was: struct apm_bios_info
|
|
UINT8 _pad2[4];
|
|
UINT64 tboot_addr;
|
|
UINT8 ist_info[16]; // was: struct ist_info
|
|
UINT8 _pad3[16];
|
|
UINT8 hd0_info[16];
|
|
UINT8 hd1_info[16];
|
|
UINT8 sys_desc_table[16]; // was: struct sys_desc_table
|
|
UINT8 olpc_ofw_header[16]; // was: struct olpc_ofw_header
|
|
UINT32 ext_ramdisk_image;
|
|
UINT32 ext_ramdisk_size;
|
|
UINT32 ext_cmd_line_ptr;
|
|
UINT8 _pad4[116];
|
|
UINT8 edid_info[128]; // was: struct edid_info
|
|
UINT8 efi_info[32]; // was: struct efi_info
|
|
UINT32 alt_mem_k;
|
|
UINT32 scratch;
|
|
UINT8 e820_entries;
|
|
UINT8 eddbuf_entries;
|
|
UINT8 edd_mbr_sig_buf_entries;
|
|
UINT8 kbd_status;
|
|
UINT8 secure_boot;
|
|
UINT8 _pad5[2];
|
|
UINT8 sentinel;
|
|
UINT8 _pad6[1];
|
|
struct setup_header hdr;
|
|
UINT8 _pad7[0x290-0x1f1-sizeof(struct setup_header)];
|
|
UINT32 edd_mbr_sig_buffer[16]; // was: edd_mbr_sig_buffer[EDD_MBR_SIG_MAX]
|
|
UINT8 e820_table[20*128]; // was: struct boot_e820_entry e820_table[E820_MAX_ENTRIES_ZEROPAGE]
|
|
UINT8 _pad8[48];
|
|
UINT8 eddbuf[6*82]; // was: struct edd_info eddbuf[EDDMAXNR]
|
|
UINT8 _pad9[276];
|
|
} __attribute__((packed));
|
|
|
|
EFI_STATUS linux_exec(EFI_HANDLE *image,
|
|
CHAR8 *cmdline, UINTN cmdline_size,
|
|
UINTN linux_addr,
|
|
UINTN initrd_addr, UINTN initrd_size);
|