wolfBoot/include/x86/linux_loader.h

126 lines
3.4 KiB
C

/* linux_loader.h
*
* Headers for linux boot parameters
*
* Copyright (C) 2023 wolfSSL Inc.
*
* This file is part of wolfBoot.
*
* wolfBoot is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* wolfBoot is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
*/
#ifndef LINUX_LOADER_H
#define LINUX_LOADER_H
#include <stdint.h>
#define E820_MAX_ENTRIES_ZEROPAGE 128
struct boot_e820_entry {
uint64_t addr;
uint64_t size;
uint32_t type;
} __attribute__((packed));
enum e820_type {
E820_TYPE_RAM = 1,
E820_TYPE_RESERVED = 2,
};
struct setup_header {
uint8_t setup_sects;
uint16_t root_flags;
uint32_t syssize;
uint16_t ram_size;
uint16_t vid_mode;
uint16_t root_dev;
uint16_t boot_flag;
uint16_t jump;
uint32_t header;
uint16_t version;
uint32_t realmode_swtch;
uint16_t start_sys_seg;
uint16_t kernel_version;
uint8_t type_of_loader;
uint8_t loadflags;
uint16_t setup_move_size;
uint32_t code32_start;
uint32_t ramdisk_image;
uint32_t ramdisk_size;
uint32_t bootsect_kludge;
uint16_t heap_end_ptr;
uint8_t ext_loader_ver;
uint8_t ext_loader_type;
uint32_t cmd_line_ptr;
uint32_t initrd_addr_max;
uint32_t kernel_alignment;
uint8_t relocatable_kernel;
uint8_t min_alignment;
uint16_t xloadflags;
uint32_t cmdline_size;
uint32_t hardware_subarch;
uint64_t hardware_subarch_data;
uint32_t payload_offset;
uint32_t payload_length;
uint64_t setup_data;
uint64_t pref_address;
uint32_t init_size;
uint32_t handover_offset;
uint32_t kernel_info_offset;
} __attribute__((packed));
/* size and layout taken from https://docs.kernel.org/x86/zero-page.html */
struct boot_params {
uint8_t screen_info[0x40];
uint8_t apm_bios_info[0x14];
uint8_t _pad2[4];
uint64_t tboot_addr;
uint8_t ist_info[0x10];
uint64_t acpi_rsdp_addr;
uint8_t _pad3[8];
uint8_t hd0_info[16];
uint8_t hd1_info[16];
uint8_t sys_desc_table[0x10];
uint8_t olpc_ofw_header[0x10];
uint32_t ext_ramdisk_image;
uint32_t ext_ramdisk_size;
uint32_t ext_cmd_line_ptr;
uint8_t _pad4[112];
uint32_t cc_blob_address;
uint8_t edid_info[0x80];
uint8_t efi_info[0x20];
uint32_t alt_mem_k;
uint32_t scratch;
uint8_t e820_entries;
uint8_t eddbuf_entries;
uint8_t edd_mbr_sig_buf_entries;
uint8_t kbd_status;
uint8_t secure_boot;
uint8_t _pad5[2];
uint8_t sentinel;
uint8_t _pad6[1];
struct setup_header hdr;
uint8_t _pad7[0x290 - 0x1f1 - sizeof(struct setup_header)];
uint8_t edd_mbr_sig_buffer[0x40];
struct boot_e820_entry e820_table[E820_MAX_ENTRIES_ZEROPAGE];
uint8_t _pad8[48];
uint8_t eddbuf[0x1ec];
uint8_t _pad9[276];
} __attribute__((packed));
void load_linux(uint8_t *linux_image, void *params, const char *cmd_line);
#endif /* LINUX_LOADER_H */