/* * VAS_EBOOT -- GRand Unified Bootloader * Copyright (C) 1999,2000,2001,2002,2003,2004,2007,2008,2009 Free Software Foundation, Inc. * * VAS_EBOOT 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. * * VAS_EBOOT 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 VAS_EBOOT. If not, see . */ #ifndef VAS_EBOOT_I386_LINUX_HEADER #define VAS_EBOOT_I386_LINUX_HEADER 1 #include #define VAS_EBOOT_LINUX_I386_MAGIC_SIGNATURE 0x53726448 /* "HdrS" */ #define VAS_EBOOT_LINUX_DEFAULT_SETUP_SECTS 4 #define VAS_EBOOT_LINUX_INITRD_MAX_ADDRESS 0x37FFFFFF #define VAS_EBOOT_LINUX_MAX_SETUP_SECTS 64 #define VAS_EBOOT_LINUX_BOOT_LOADER_TYPE 0x72 #define VAS_EBOOT_LINUX_HEAP_END_OFFSET (0x9000 - 0x200) #define VAS_EBOOT_LINUX_BZIMAGE_ADDR 0x100000 #define VAS_EBOOT_LINUX_ZIMAGE_ADDR 0x10000 #define VAS_EBOOT_LINUX_OLD_REAL_MODE_ADDR 0x90000 #define VAS_EBOOT_LINUX_SETUP_STACK 0x9000 #define VAS_EBOOT_LINUX_FLAG_BIG_KERNEL 0x1 #define VAS_EBOOT_LINUX_FLAG_QUIET 0x20 #define VAS_EBOOT_LINUX_FLAG_CAN_USE_HEAP 0x80 /* Linux's video mode selection support. Actually I hate it! */ #define VAS_EBOOT_LINUX_VID_MODE_NORMAL 0xFFFF #define VAS_EBOOT_LINUX_VID_MODE_EXTENDED 0xFFFE #define VAS_EBOOT_LINUX_VID_MODE_ASK 0xFFFD #define VAS_EBOOT_LINUX_VID_MODE_VESA_START 0x0300 #define VAS_EBOOT_LINUX_CL_MAGIC 0xA33F #define VIDEO_CAPABILITY_SKIP_QUIRKS (1 << 0) #define VIDEO_CAPABILITY_64BIT_BASE (1 << 1) /* Frame buffer base is 64-bit. */ /* Maximum number of MBR signatures to store. */ #define EDD_MBR_SIG_MAX 16 /* Number of edd_info structs starting at EDDBUF. */ #define EDDMAXNR 6 #ifdef __x86_64__ #define VAS_EBOOT_LINUX_EFI_SIGNATURE \ ('4' << 24 | '6' << 16 | 'L' << 8 | 'E') #else #define VAS_EBOOT_LINUX_EFI_SIGNATURE \ ('2' << 24 | '3' << 16 | 'L' << 8 | 'E') #endif #define VAS_EBOOT_LINUX_EFI_SIGNATURE_0204 \ ('L' << 24 | 'I' << 16 | 'F' << 8 | 'E') #define VAS_EBOOT_LINUX_OFW_SIGNATURE \ (' ' << 24 | 'W' << 16 | 'F' << 8 | 'O') #define LINUX_X86_XLF_KERNEL_64 (1<<0) #define LINUX_X86_XLF_CAN_BE_LOADED_ABOVE_4G (1<<1) #define LINUX_X86_XLF_EFI_HANDOVER_32 (1<<2) #define LINUX_X86_XLF_EFI_HANDOVER_64 (1<<3) #define LINUX_X86_XLF_EFI_KEXEC (1<<4) #define LINUX_X86_XLF_5LEVEL (1<<5) #define LINUX_X86_XLF_5LEVEL_ENABLED (1<<6) #define LINUX_X86_STARTUP64_OFFSET 0x200 #ifndef ASM_FILE #define VAS_EBOOT_E820_RAM 1 #define VAS_EBOOT_E820_RESERVED 2 #define VAS_EBOOT_E820_ACPI 3 #define VAS_EBOOT_E820_NVS 4 #define VAS_EBOOT_E820_BADRAM 5 #define VAS_EBOOT_E820_MAX_ENTRIES_ZEROPAGE 128 struct VasEBoot_screen_info { VasEBoot_uint8_t orig_x; /* 0x00 */ VasEBoot_uint8_t orig_y; /* 0x01 */ VasEBoot_uint16_t ext_mem_k; /* 0x02 */ VasEBoot_uint16_t orig_video_page; /* 0x04 */ VasEBoot_uint8_t orig_video_mode; /* 0x06 */ VasEBoot_uint8_t orig_video_cols; /* 0x07 */ VasEBoot_uint8_t flags; /* 0x08 */ VasEBoot_uint8_t unused2; /* 0x09 */ VasEBoot_uint16_t orig_video_ega_bx; /* 0x0a */ VasEBoot_uint16_t unused3; /* 0x0c */ VasEBoot_uint8_t orig_video_lines; /* 0x0e */ VasEBoot_uint8_t orig_video_isVGA; /* 0x0f */ VasEBoot_uint16_t orig_video_points; /* 0x10 */ /* VESA graphic mode -- linear frame buffer */ VasEBoot_uint16_t lfb_width; /* 0x12 */ VasEBoot_uint16_t lfb_height; /* 0x14 */ VasEBoot_uint16_t lfb_depth; /* 0x16 */ VasEBoot_uint32_t lfb_base; /* 0x18 */ VasEBoot_uint32_t lfb_size; /* 0x1c */ VasEBoot_uint16_t cl_magic, cl_offset; /* 0x20 */ VasEBoot_uint16_t lfb_linelength; /* 0x24 */ VasEBoot_uint8_t red_size; /* 0x26 */ VasEBoot_uint8_t red_pos; /* 0x27 */ VasEBoot_uint8_t green_size; /* 0x28 */ VasEBoot_uint8_t green_pos; /* 0x29 */ VasEBoot_uint8_t blue_size; /* 0x2a */ VasEBoot_uint8_t blue_pos; /* 0x2b */ VasEBoot_uint8_t rsvd_size; /* 0x2c */ VasEBoot_uint8_t rsvd_pos; /* 0x2d */ VasEBoot_uint16_t vesapm_seg; /* 0x2e */ VasEBoot_uint16_t vesapm_off; /* 0x30 */ VasEBoot_uint16_t pages; /* 0x32 */ VasEBoot_uint16_t vesa_attributes; /* 0x34 */ VasEBoot_uint32_t capabilities; /* 0x36 */ VasEBoot_uint32_t ext_lfb_base; /* 0x3a */ VasEBoot_uint8_t _reserved[2]; /* 0x3e */ } VAS_EBOOT_PACKED; struct VasEBoot_apm_bios_info { VasEBoot_uint16_t version; VasEBoot_uint16_t cseg; VasEBoot_uint32_t offset; VasEBoot_uint16_t cseg_16; VasEBoot_uint16_t dseg; VasEBoot_uint16_t flags; VasEBoot_uint16_t cseg_len; VasEBoot_uint16_t cseg_16_len; VasEBoot_uint16_t dseg_len; }; struct VasEBoot_ist_info { VasEBoot_uint32_t signature; VasEBoot_uint32_t command; VasEBoot_uint32_t event; VasEBoot_uint32_t perf_level; }; struct VasEBoot_sys_desc_table { VasEBoot_uint16_t length; VasEBoot_uint8_t table[14]; }; struct VasEBoot_olpc_ofw_header { VasEBoot_uint32_t ofw_magic; /* OFW signature */ VasEBoot_uint32_t ofw_version; VasEBoot_uint32_t cif_handler; /* callback into OFW */ VasEBoot_uint32_t irq_desc_table; } VAS_EBOOT_PACKED; struct VasEBoot_setup_header { VasEBoot_uint8_t setup_sects; /* The size of the setup in sectors */ VasEBoot_uint16_t root_flags; /* If the root is mounted readonly */ VasEBoot_uint32_t syssize; /* obsolete */ VasEBoot_uint16_t ram_size; /* obsolete */ VasEBoot_uint16_t vid_mode; /* Video mode control */ VasEBoot_uint16_t root_dev; /* Default root device number */ VasEBoot_uint16_t boot_flag; /* 1fe */ VasEBoot_uint16_t jump; /* Jump instruction */ VasEBoot_uint32_t header; /* Magic signature "HdrS" */ VasEBoot_uint16_t version; /* Boot protocol version supported */ VasEBoot_uint32_t realmode_swtch; /* Boot loader hook */ VasEBoot_uint16_t start_sys; /* The load-low segment (obsolete) */ VasEBoot_uint16_t kernel_version; /* Points to kernel version string */ VasEBoot_uint8_t type_of_loader; /* Boot loader identifier */ VasEBoot_uint8_t loadflags; /* Boot protocol option flags */ VasEBoot_uint16_t setup_move_size; /* Move to high memory size */ VasEBoot_uint32_t code32_start; /* Boot loader hook */ VasEBoot_uint32_t ramdisk_image; /* initrd load address */ VasEBoot_uint32_t ramdisk_size; /* initrd size */ VasEBoot_uint32_t bootsect_kludge; /* obsolete */ VasEBoot_uint16_t heap_end_ptr; /* Free memory after setup end */ VasEBoot_uint8_t ext_loader_ver; /* Extended loader version */ VasEBoot_uint8_t ext_loader_type; /* Extended loader type */ VasEBoot_uint32_t cmd_line_ptr; /* Points to the kernel command line */ VasEBoot_uint32_t initrd_addr_max; /* Maximum initrd address */ VasEBoot_uint32_t kernel_alignment; /* Alignment of the kernel */ VasEBoot_uint8_t relocatable_kernel; /* Is the kernel relocatable */ VasEBoot_uint8_t min_alignment; VasEBoot_uint16_t xloadflags; VasEBoot_uint32_t cmdline_size; /* Size of the kernel command line */ VasEBoot_uint32_t hardware_subarch; VasEBoot_uint64_t hardware_subarch_data; VasEBoot_uint32_t payload_offset; VasEBoot_uint32_t payload_length; VasEBoot_uint64_t setup_data; VasEBoot_uint64_t pref_address; VasEBoot_uint32_t init_size; VasEBoot_uint32_t handover_offset; VasEBoot_uint32_t kernel_info_offset; } VAS_EBOOT_PACKED; struct VasEBoot_boot_e820_entry { VasEBoot_uint64_t addr; VasEBoot_uint64_t size; VasEBoot_uint32_t type; } VAS_EBOOT_PACKED; struct VasEBoot_edd_device_params { VasEBoot_uint16_t length; VasEBoot_uint16_t info_flags; VasEBoot_uint32_t num_default_cylinders; VasEBoot_uint32_t num_default_heads; VasEBoot_uint32_t sectors_per_track; VasEBoot_uint64_t number_of_sectors; VasEBoot_uint16_t bytes_per_sector; VasEBoot_uint32_t dpte_ptr; /* 0xFFFFFFFF for our purposes */ VasEBoot_uint16_t key; /* = 0xBEDD */ VasEBoot_uint8_t device_path_info_length; /* = 44 */ VasEBoot_uint8_t reserved2; VasEBoot_uint16_t reserved3; VasEBoot_uint8_t host_bus_type[4]; VasEBoot_uint8_t interface_type[8]; union { struct { VasEBoot_uint16_t base_address; VasEBoot_uint16_t reserved1; VasEBoot_uint32_t reserved2; } isa; struct { VasEBoot_uint8_t bus; VasEBoot_uint8_t slot; VasEBoot_uint8_t function; VasEBoot_uint8_t channel; VasEBoot_uint32_t reserved; } pci; /* pcix is same as pci */ struct { VasEBoot_uint64_t reserved; } ibnd; struct { VasEBoot_uint64_t reserved; } xprs; struct { VasEBoot_uint64_t reserved; } htpt; struct { VasEBoot_uint64_t reserved; } unknown; } interface_path; union { struct { VasEBoot_uint8_t device; VasEBoot_uint8_t reserved1; VasEBoot_uint16_t reserved2; VasEBoot_uint32_t reserved3; VasEBoot_uint64_t reserved4; } ata; struct { VasEBoot_uint8_t device; VasEBoot_uint8_t lun; VasEBoot_uint8_t reserved1; VasEBoot_uint8_t reserved2; VasEBoot_uint32_t reserved3; VasEBoot_uint64_t reserved4; } atapi; struct { VasEBoot_uint16_t id; VasEBoot_uint64_t lun; VasEBoot_uint16_t reserved1; VasEBoot_uint32_t reserved2; } scsi; struct { VasEBoot_uint64_t serial_number; VasEBoot_uint64_t reserved; } usb; struct { VasEBoot_uint64_t eui; VasEBoot_uint64_t reserved; } i1394; struct { VasEBoot_uint64_t wwid; VasEBoot_uint64_t lun; } fibre; struct { VasEBoot_uint64_t identity_tag; VasEBoot_uint64_t reserved; } i2o; struct { VasEBoot_uint32_t array_number; VasEBoot_uint32_t reserved1; VasEBoot_uint64_t reserved2; } raid; struct { VasEBoot_uint8_t device; VasEBoot_uint8_t reserved1; VasEBoot_uint16_t reserved2; VasEBoot_uint32_t reserved3; VasEBoot_uint64_t reserved4; } sata; struct { VasEBoot_uint64_t reserved1; VasEBoot_uint64_t reserved2; } unknown; } device_path; VasEBoot_uint8_t reserved4; VasEBoot_uint8_t checksum; } VAS_EBOOT_PACKED; struct VasEBoot_edd_info { VasEBoot_uint8_t device; VasEBoot_uint8_t version; VasEBoot_uint16_t interface_support; VasEBoot_uint16_t legacy_max_cylinder; VasEBoot_uint8_t legacy_max_head; VasEBoot_uint8_t legacy_sectors_per_track; struct VasEBoot_edd_device_params params; } VAS_EBOOT_PACKED; enum { VAS_EBOOT_VIDEO_LINUX_TYPE_TEXT = 0x01, VAS_EBOOT_VIDEO_LINUX_TYPE_VESA = 0x23, /* VESA VGA in graphic mode. */ VAS_EBOOT_VIDEO_LINUX_TYPE_EFIFB = 0x70, /* EFI Framebuffer. */ VAS_EBOOT_VIDEO_LINUX_TYPE_SIMPLE = 0x70 /* Linear framebuffer without any additional functions. */ }; /* For the Linux/i386 boot protocol version 2.10. */ struct linux_i386_kernel_header { VasEBoot_uint8_t code1[0x0020]; VasEBoot_uint16_t cl_magic; /* Magic number 0xA33F */ VasEBoot_uint16_t cl_offset; /* The offset of command line */ VasEBoot_uint8_t code2[0x01F1 - 0x0020 - 2 - 2]; VasEBoot_uint8_t setup_sects; /* The size of the setup in sectors */ VasEBoot_uint16_t root_flags; /* If the root is mounted readonly */ VasEBoot_uint16_t syssize; /* obsolete */ VasEBoot_uint16_t swap_dev; /* obsolete */ VasEBoot_uint16_t ram_size; /* obsolete */ VasEBoot_uint16_t vid_mode; /* Video mode control */ VasEBoot_uint16_t root_dev; /* Default root device number */ VasEBoot_uint16_t boot_flag; /* 0xAA55 magic number */ VasEBoot_uint16_t jump; /* Jump instruction */ VasEBoot_uint32_t header; /* Magic signature "HdrS" */ VasEBoot_uint16_t version; /* Boot protocol version supported */ VasEBoot_uint32_t realmode_swtch; /* Boot loader hook */ VasEBoot_uint16_t start_sys; /* The load-low segment (obsolete) */ VasEBoot_uint16_t kernel_version; /* Points to kernel version string */ VasEBoot_uint8_t type_of_loader; /* Boot loader identifier */ #define LINUX_LOADER_ID_LILO 0x0 #define LINUX_LOADER_ID_LOADLIN 0x1 #define LINUX_LOADER_ID_BOOTSECT 0x2 #define LINUX_LOADER_ID_SYSLINUX 0x3 #define LINUX_LOADER_ID_ETHERBOOT 0x4 #define LINUX_LOADER_ID_ELILO 0x5 #define LINUX_LOADER_ID_VAS_EBOOT 0x7 #define LINUX_LOADER_ID_UBOOT 0x8 #define LINUX_LOADER_ID_XEN 0x9 #define LINUX_LOADER_ID_GUJIN 0xa #define LINUX_LOADER_ID_QEMU 0xb VasEBoot_uint8_t loadflags; /* Boot protocol option flags */ VasEBoot_uint16_t setup_move_size; /* Move to high memory size */ VasEBoot_uint32_t code32_start; /* Boot loader hook */ VasEBoot_uint32_t ramdisk_image; /* initrd load address */ VasEBoot_uint32_t ramdisk_size; /* initrd size */ VasEBoot_uint32_t bootsect_kludge; /* obsolete */ VasEBoot_uint16_t heap_end_ptr; /* Free memory after setup end */ VasEBoot_uint16_t pad1; /* Unused */ VasEBoot_uint32_t cmd_line_ptr; /* Points to the kernel command line */ VasEBoot_uint32_t initrd_addr_max; /* Highest address for initrd */ VasEBoot_uint32_t kernel_alignment; VasEBoot_uint8_t relocatable; VasEBoot_uint8_t min_alignment; VasEBoot_uint16_t xloadflags; VasEBoot_uint32_t cmdline_size; VasEBoot_uint32_t hardware_subarch; VasEBoot_uint64_t hardware_subarch_data; VasEBoot_uint32_t payload_offset; VasEBoot_uint32_t payload_length; VasEBoot_uint64_t setup_data; VasEBoot_uint64_t pref_address; VasEBoot_uint32_t init_size; VasEBoot_uint32_t handover_offset; } VAS_EBOOT_PACKED; /* * Boot parameters for Linux based on 6.13.7 stable. This is used * by the setup sectors of Linux, and must be simulated by VAS_EBOOT * on EFI, because the setup sectors depend on BIOS. */ struct linux_kernel_params { struct VasEBoot_screen_info screen_info; /* 0 */ struct VasEBoot_apm_bios_info apm_bios_info; /* 40 */ VasEBoot_uint8_t _pad2[4]; /* 54 */ VasEBoot_uint64_t tboot_addr; /* 58 */ struct VasEBoot_ist_info ist_info; /* 60 */ VasEBoot_uint64_t acpi_rsdp_addr; /* 70 */ VasEBoot_uint8_t _pad3[8]; /* 78 */ VasEBoot_uint8_t hd0_info[16]; /* 80 */ VasEBoot_uint8_t hd1_info[16]; /* 90 */ struct VasEBoot_sys_desc_table sys_desc_table; /* a0 */ struct VasEBoot_olpc_ofw_header olpc_ofw_header; /* b0 */ VasEBoot_uint32_t ext_ramdisk_image; /* c0 */ VasEBoot_uint32_t ext_ramdisk_size; /* c4 */ VasEBoot_uint32_t ext_cmd_line_ptr; /* c8 */ VasEBoot_uint8_t _pad4[112]; /* cc */ VasEBoot_uint32_t cc_blob_address; /* 13c */ /* * edid_info should be a struct with "unsigned char dummy[128]" and * efi_info should be a struct as well, starting at 0x1c0. However, * for backwards compatibility, VAS_EBOOT can have efi_systab at 0x1b8 and * padding at 0x1bc (or padding at both spots). This cuts into the end * of edid_info. Make edid_info inline and only make it go up to 0x1b8. */ VasEBoot_uint8_t edid_info[0x1b8 - 0x140]; /* 140 */ union { struct { VasEBoot_uint32_t efi_systab; /* 1b8 */ VasEBoot_uint32_t padding7_2; /* 1bc */ VasEBoot_uint32_t efi_loader_signature; /* 1c0 */ VasEBoot_uint32_t efi_memdesc_size; /* 1c4 */ VasEBoot_uint32_t efi_memdesc_version; /* 1c8 */ VasEBoot_uint32_t efi_memmap_size; /* 1cc */ VasEBoot_uint32_t efi_memmap; /* 1d0 */ } v0204; struct { VasEBoot_uint32_t padding7_1; /* 1b8 */ VasEBoot_uint32_t padding7_2; /* 1bc */ VasEBoot_uint32_t efi_loader_signature; /* 1c0 */ VasEBoot_uint32_t efi_systab; /* 1c4 */ VasEBoot_uint32_t efi_memdesc_size; /* 1c8 */ VasEBoot_uint32_t efi_memdesc_version; /* 1cc */ VasEBoot_uint32_t efi_memmap; /* 1d0 */ VasEBoot_uint32_t efi_memmap_size; /* 1d4 */ } v0206; struct { VasEBoot_uint32_t padding7_1; /* 1b8 */ VasEBoot_uint32_t padding7_2; /* 1bc */ VasEBoot_uint32_t efi_loader_signature; /* 1c0 */ VasEBoot_uint32_t efi_systab; /* 1c4 */ VasEBoot_uint32_t efi_memdesc_size; /* 1c8 */ VasEBoot_uint32_t efi_memdesc_version; /* 1cc */ VasEBoot_uint32_t efi_memmap; /* 1d0 */ VasEBoot_uint32_t efi_memmap_size; /* 1d4 */ VasEBoot_uint32_t efi_systab_hi; /* 1d8 */ VasEBoot_uint32_t efi_memmap_hi; /* 1dc */ } v0208; } efi_info; VasEBoot_uint32_t alt_mem_k; /* 1e0 */ VasEBoot_uint32_t scratch; /* 1e4 */ VasEBoot_uint8_t e820_entries; /* 1e8 */ VasEBoot_uint8_t eddbuf_entries; /* 1e9 */ VasEBoot_uint8_t edd_mbr_sig_buf_entries; /* 1ea */ VasEBoot_uint8_t kbd_status; /* 1eb */ VasEBoot_uint8_t secure_boot; /* 1ec */ VasEBoot_uint8_t _pad5[2]; /* 1ed */ VasEBoot_uint8_t sentinel; /* 1ef */ VasEBoot_uint8_t _pad6[1]; /* 1f0 */ struct VasEBoot_setup_header hdr; /* 1f1 */ VasEBoot_uint8_t _pad7[0x290 - 0x1f1 - sizeof(struct VasEBoot_setup_header)]; VasEBoot_uint32_t edd_mbr_sig_buffer[EDD_MBR_SIG_MAX]; /* 290 */ struct VasEBoot_boot_e820_entry e820_table[VAS_EBOOT_E820_MAX_ENTRIES_ZEROPAGE]; /* 2d0 */ VasEBoot_uint8_t _pad8[48]; /* cd0 */ struct VasEBoot_edd_info eddbuf[EDDMAXNR]; /* d00 */ VasEBoot_uint8_t _pad9[276]; /* eec */ } VAS_EBOOT_PACKED; #endif /* ! ASM_FILE */ #endif /* ! VAS_EBOOT_I386_LINUX_HEADER */