162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 262306a36Sopenharmony_ci#ifndef _ASM_X86_BOOTPARAM_H 362306a36Sopenharmony_ci#define _ASM_X86_BOOTPARAM_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci/* setup_data/setup_indirect types */ 662306a36Sopenharmony_ci#define SETUP_NONE 0 762306a36Sopenharmony_ci#define SETUP_E820_EXT 1 862306a36Sopenharmony_ci#define SETUP_DTB 2 962306a36Sopenharmony_ci#define SETUP_PCI 3 1062306a36Sopenharmony_ci#define SETUP_EFI 4 1162306a36Sopenharmony_ci#define SETUP_APPLE_PROPERTIES 5 1262306a36Sopenharmony_ci#define SETUP_JAILHOUSE 6 1362306a36Sopenharmony_ci#define SETUP_CC_BLOB 7 1462306a36Sopenharmony_ci#define SETUP_IMA 8 1562306a36Sopenharmony_ci#define SETUP_RNG_SEED 9 1662306a36Sopenharmony_ci#define SETUP_ENUM_MAX SETUP_RNG_SEED 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#define SETUP_INDIRECT (1<<31) 1962306a36Sopenharmony_ci#define SETUP_TYPE_MAX (SETUP_ENUM_MAX | SETUP_INDIRECT) 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci/* ram_size flags */ 2262306a36Sopenharmony_ci#define RAMDISK_IMAGE_START_MASK 0x07FF 2362306a36Sopenharmony_ci#define RAMDISK_PROMPT_FLAG 0x8000 2462306a36Sopenharmony_ci#define RAMDISK_LOAD_FLAG 0x4000 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci/* loadflags */ 2762306a36Sopenharmony_ci#define LOADED_HIGH (1<<0) 2862306a36Sopenharmony_ci#define KASLR_FLAG (1<<1) 2962306a36Sopenharmony_ci#define QUIET_FLAG (1<<5) 3062306a36Sopenharmony_ci#define KEEP_SEGMENTS (1<<6) 3162306a36Sopenharmony_ci#define CAN_USE_HEAP (1<<7) 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci/* xloadflags */ 3462306a36Sopenharmony_ci#define XLF_KERNEL_64 (1<<0) 3562306a36Sopenharmony_ci#define XLF_CAN_BE_LOADED_ABOVE_4G (1<<1) 3662306a36Sopenharmony_ci#define XLF_EFI_HANDOVER_32 (1<<2) 3762306a36Sopenharmony_ci#define XLF_EFI_HANDOVER_64 (1<<3) 3862306a36Sopenharmony_ci#define XLF_EFI_KEXEC (1<<4) 3962306a36Sopenharmony_ci#define XLF_5LEVEL (1<<5) 4062306a36Sopenharmony_ci#define XLF_5LEVEL_ENABLED (1<<6) 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci#ifndef __ASSEMBLY__ 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci#include <linux/types.h> 4562306a36Sopenharmony_ci#include <linux/screen_info.h> 4662306a36Sopenharmony_ci#include <linux/apm_bios.h> 4762306a36Sopenharmony_ci#include <linux/edd.h> 4862306a36Sopenharmony_ci#include <asm/ist.h> 4962306a36Sopenharmony_ci#include <video/edid.h> 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci/* extensible setup data list node */ 5262306a36Sopenharmony_cistruct setup_data { 5362306a36Sopenharmony_ci __u64 next; 5462306a36Sopenharmony_ci __u32 type; 5562306a36Sopenharmony_ci __u32 len; 5662306a36Sopenharmony_ci __u8 data[]; 5762306a36Sopenharmony_ci}; 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci/* extensible setup indirect data node */ 6062306a36Sopenharmony_cistruct setup_indirect { 6162306a36Sopenharmony_ci __u32 type; 6262306a36Sopenharmony_ci __u32 reserved; /* Reserved, must be set to zero. */ 6362306a36Sopenharmony_ci __u64 len; 6462306a36Sopenharmony_ci __u64 addr; 6562306a36Sopenharmony_ci}; 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_cistruct setup_header { 6862306a36Sopenharmony_ci __u8 setup_sects; 6962306a36Sopenharmony_ci __u16 root_flags; 7062306a36Sopenharmony_ci __u32 syssize; 7162306a36Sopenharmony_ci __u16 ram_size; 7262306a36Sopenharmony_ci __u16 vid_mode; 7362306a36Sopenharmony_ci __u16 root_dev; 7462306a36Sopenharmony_ci __u16 boot_flag; 7562306a36Sopenharmony_ci __u16 jump; 7662306a36Sopenharmony_ci __u32 header; 7762306a36Sopenharmony_ci __u16 version; 7862306a36Sopenharmony_ci __u32 realmode_swtch; 7962306a36Sopenharmony_ci __u16 start_sys_seg; 8062306a36Sopenharmony_ci __u16 kernel_version; 8162306a36Sopenharmony_ci __u8 type_of_loader; 8262306a36Sopenharmony_ci __u8 loadflags; 8362306a36Sopenharmony_ci __u16 setup_move_size; 8462306a36Sopenharmony_ci __u32 code32_start; 8562306a36Sopenharmony_ci __u32 ramdisk_image; 8662306a36Sopenharmony_ci __u32 ramdisk_size; 8762306a36Sopenharmony_ci __u32 bootsect_kludge; 8862306a36Sopenharmony_ci __u16 heap_end_ptr; 8962306a36Sopenharmony_ci __u8 ext_loader_ver; 9062306a36Sopenharmony_ci __u8 ext_loader_type; 9162306a36Sopenharmony_ci __u32 cmd_line_ptr; 9262306a36Sopenharmony_ci __u32 initrd_addr_max; 9362306a36Sopenharmony_ci __u32 kernel_alignment; 9462306a36Sopenharmony_ci __u8 relocatable_kernel; 9562306a36Sopenharmony_ci __u8 min_alignment; 9662306a36Sopenharmony_ci __u16 xloadflags; 9762306a36Sopenharmony_ci __u32 cmdline_size; 9862306a36Sopenharmony_ci __u32 hardware_subarch; 9962306a36Sopenharmony_ci __u64 hardware_subarch_data; 10062306a36Sopenharmony_ci __u32 payload_offset; 10162306a36Sopenharmony_ci __u32 payload_length; 10262306a36Sopenharmony_ci __u64 setup_data; 10362306a36Sopenharmony_ci __u64 pref_address; 10462306a36Sopenharmony_ci __u32 init_size; 10562306a36Sopenharmony_ci __u32 handover_offset; 10662306a36Sopenharmony_ci __u32 kernel_info_offset; 10762306a36Sopenharmony_ci} __attribute__((packed)); 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_cistruct sys_desc_table { 11062306a36Sopenharmony_ci __u16 length; 11162306a36Sopenharmony_ci __u8 table[14]; 11262306a36Sopenharmony_ci}; 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci/* Gleaned from OFW's set-parameters in cpu/x86/pc/linux.fth */ 11562306a36Sopenharmony_cistruct olpc_ofw_header { 11662306a36Sopenharmony_ci __u32 ofw_magic; /* OFW signature */ 11762306a36Sopenharmony_ci __u32 ofw_version; 11862306a36Sopenharmony_ci __u32 cif_handler; /* callback into OFW */ 11962306a36Sopenharmony_ci __u32 irq_desc_table; 12062306a36Sopenharmony_ci} __attribute__((packed)); 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_cistruct efi_info { 12362306a36Sopenharmony_ci __u32 efi_loader_signature; 12462306a36Sopenharmony_ci __u32 efi_systab; 12562306a36Sopenharmony_ci __u32 efi_memdesc_size; 12662306a36Sopenharmony_ci __u32 efi_memdesc_version; 12762306a36Sopenharmony_ci __u32 efi_memmap; 12862306a36Sopenharmony_ci __u32 efi_memmap_size; 12962306a36Sopenharmony_ci __u32 efi_systab_hi; 13062306a36Sopenharmony_ci __u32 efi_memmap_hi; 13162306a36Sopenharmony_ci}; 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci/* 13462306a36Sopenharmony_ci * This is the maximum number of entries in struct boot_params::e820_table 13562306a36Sopenharmony_ci * (the zeropage), which is part of the x86 boot protocol ABI: 13662306a36Sopenharmony_ci */ 13762306a36Sopenharmony_ci#define E820_MAX_ENTRIES_ZEROPAGE 128 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci/* 14062306a36Sopenharmony_ci * The E820 memory region entry of the boot protocol ABI: 14162306a36Sopenharmony_ci */ 14262306a36Sopenharmony_cistruct boot_e820_entry { 14362306a36Sopenharmony_ci __u64 addr; 14462306a36Sopenharmony_ci __u64 size; 14562306a36Sopenharmony_ci __u32 type; 14662306a36Sopenharmony_ci} __attribute__((packed)); 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci/* 14962306a36Sopenharmony_ci * Smallest compatible version of jailhouse_setup_data required by this kernel. 15062306a36Sopenharmony_ci */ 15162306a36Sopenharmony_ci#define JAILHOUSE_SETUP_REQUIRED_VERSION 1 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci/* 15462306a36Sopenharmony_ci * The boot loader is passing platform information via this Jailhouse-specific 15562306a36Sopenharmony_ci * setup data structure. 15662306a36Sopenharmony_ci */ 15762306a36Sopenharmony_cistruct jailhouse_setup_data { 15862306a36Sopenharmony_ci struct { 15962306a36Sopenharmony_ci __u16 version; 16062306a36Sopenharmony_ci __u16 compatible_version; 16162306a36Sopenharmony_ci } __attribute__((packed)) hdr; 16262306a36Sopenharmony_ci struct { 16362306a36Sopenharmony_ci __u16 pm_timer_address; 16462306a36Sopenharmony_ci __u16 num_cpus; 16562306a36Sopenharmony_ci __u64 pci_mmconfig_base; 16662306a36Sopenharmony_ci __u32 tsc_khz; 16762306a36Sopenharmony_ci __u32 apic_khz; 16862306a36Sopenharmony_ci __u8 standard_ioapic; 16962306a36Sopenharmony_ci __u8 cpu_ids[255]; 17062306a36Sopenharmony_ci } __attribute__((packed)) v1; 17162306a36Sopenharmony_ci struct { 17262306a36Sopenharmony_ci __u32 flags; 17362306a36Sopenharmony_ci } __attribute__((packed)) v2; 17462306a36Sopenharmony_ci} __attribute__((packed)); 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci/* 17762306a36Sopenharmony_ci * IMA buffer setup data information from the previous kernel during kexec 17862306a36Sopenharmony_ci */ 17962306a36Sopenharmony_cistruct ima_setup_data { 18062306a36Sopenharmony_ci __u64 addr; 18162306a36Sopenharmony_ci __u64 size; 18262306a36Sopenharmony_ci} __attribute__((packed)); 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci/* The so-called "zeropage" */ 18562306a36Sopenharmony_cistruct boot_params { 18662306a36Sopenharmony_ci struct screen_info screen_info; /* 0x000 */ 18762306a36Sopenharmony_ci struct apm_bios_info apm_bios_info; /* 0x040 */ 18862306a36Sopenharmony_ci __u8 _pad2[4]; /* 0x054 */ 18962306a36Sopenharmony_ci __u64 tboot_addr; /* 0x058 */ 19062306a36Sopenharmony_ci struct ist_info ist_info; /* 0x060 */ 19162306a36Sopenharmony_ci __u64 acpi_rsdp_addr; /* 0x070 */ 19262306a36Sopenharmony_ci __u8 _pad3[8]; /* 0x078 */ 19362306a36Sopenharmony_ci __u8 hd0_info[16]; /* obsolete! */ /* 0x080 */ 19462306a36Sopenharmony_ci __u8 hd1_info[16]; /* obsolete! */ /* 0x090 */ 19562306a36Sopenharmony_ci struct sys_desc_table sys_desc_table; /* obsolete! */ /* 0x0a0 */ 19662306a36Sopenharmony_ci struct olpc_ofw_header olpc_ofw_header; /* 0x0b0 */ 19762306a36Sopenharmony_ci __u32 ext_ramdisk_image; /* 0x0c0 */ 19862306a36Sopenharmony_ci __u32 ext_ramdisk_size; /* 0x0c4 */ 19962306a36Sopenharmony_ci __u32 ext_cmd_line_ptr; /* 0x0c8 */ 20062306a36Sopenharmony_ci __u8 _pad4[112]; /* 0x0cc */ 20162306a36Sopenharmony_ci __u32 cc_blob_address; /* 0x13c */ 20262306a36Sopenharmony_ci struct edid_info edid_info; /* 0x140 */ 20362306a36Sopenharmony_ci struct efi_info efi_info; /* 0x1c0 */ 20462306a36Sopenharmony_ci __u32 alt_mem_k; /* 0x1e0 */ 20562306a36Sopenharmony_ci __u32 scratch; /* Scratch field! */ /* 0x1e4 */ 20662306a36Sopenharmony_ci __u8 e820_entries; /* 0x1e8 */ 20762306a36Sopenharmony_ci __u8 eddbuf_entries; /* 0x1e9 */ 20862306a36Sopenharmony_ci __u8 edd_mbr_sig_buf_entries; /* 0x1ea */ 20962306a36Sopenharmony_ci __u8 kbd_status; /* 0x1eb */ 21062306a36Sopenharmony_ci __u8 secure_boot; /* 0x1ec */ 21162306a36Sopenharmony_ci __u8 _pad5[2]; /* 0x1ed */ 21262306a36Sopenharmony_ci /* 21362306a36Sopenharmony_ci * The sentinel is set to a nonzero value (0xff) in header.S. 21462306a36Sopenharmony_ci * 21562306a36Sopenharmony_ci * A bootloader is supposed to only take setup_header and put 21662306a36Sopenharmony_ci * it into a clean boot_params buffer. If it turns out that 21762306a36Sopenharmony_ci * it is clumsy or too generous with the buffer, it most 21862306a36Sopenharmony_ci * probably will pick up the sentinel variable too. The fact 21962306a36Sopenharmony_ci * that this variable then is still 0xff will let kernel 22062306a36Sopenharmony_ci * know that some variables in boot_params are invalid and 22162306a36Sopenharmony_ci * kernel should zero out certain portions of boot_params. 22262306a36Sopenharmony_ci */ 22362306a36Sopenharmony_ci __u8 sentinel; /* 0x1ef */ 22462306a36Sopenharmony_ci __u8 _pad6[1]; /* 0x1f0 */ 22562306a36Sopenharmony_ci struct setup_header hdr; /* setup header */ /* 0x1f1 */ 22662306a36Sopenharmony_ci __u8 _pad7[0x290-0x1f1-sizeof(struct setup_header)]; 22762306a36Sopenharmony_ci __u32 edd_mbr_sig_buffer[EDD_MBR_SIG_MAX]; /* 0x290 */ 22862306a36Sopenharmony_ci struct boot_e820_entry e820_table[E820_MAX_ENTRIES_ZEROPAGE]; /* 0x2d0 */ 22962306a36Sopenharmony_ci __u8 _pad8[48]; /* 0xcd0 */ 23062306a36Sopenharmony_ci struct edd_info eddbuf[EDDMAXNR]; /* 0xd00 */ 23162306a36Sopenharmony_ci __u8 _pad9[276]; /* 0xeec */ 23262306a36Sopenharmony_ci} __attribute__((packed)); 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_ci/** 23562306a36Sopenharmony_ci * enum x86_hardware_subarch - x86 hardware subarchitecture 23662306a36Sopenharmony_ci * 23762306a36Sopenharmony_ci * The x86 hardware_subarch and hardware_subarch_data were added as of the x86 23862306a36Sopenharmony_ci * boot protocol 2.07 to help distinguish and support custom x86 boot 23962306a36Sopenharmony_ci * sequences. This enum represents accepted values for the x86 24062306a36Sopenharmony_ci * hardware_subarch. Custom x86 boot sequences (not X86_SUBARCH_PC) do not 24162306a36Sopenharmony_ci * have or simply *cannot* make use of natural stubs like BIOS or EFI, the 24262306a36Sopenharmony_ci * hardware_subarch can be used on the Linux entry path to revector to a 24362306a36Sopenharmony_ci * subarchitecture stub when needed. This subarchitecture stub can be used to 24462306a36Sopenharmony_ci * set up Linux boot parameters or for special care to account for nonstandard 24562306a36Sopenharmony_ci * handling of page tables. 24662306a36Sopenharmony_ci * 24762306a36Sopenharmony_ci * These enums should only ever be used by x86 code, and the code that uses 24862306a36Sopenharmony_ci * it should be well contained and compartmentalized. 24962306a36Sopenharmony_ci * 25062306a36Sopenharmony_ci * KVM and Xen HVM do not have a subarch as these are expected to follow 25162306a36Sopenharmony_ci * standard x86 boot entries. If there is a genuine need for "hypervisor" type 25262306a36Sopenharmony_ci * that should be considered separately in the future. Future guest types 25362306a36Sopenharmony_ci * should seriously consider working with standard x86 boot stubs such as 25462306a36Sopenharmony_ci * the BIOS or EFI boot stubs. 25562306a36Sopenharmony_ci * 25662306a36Sopenharmony_ci * WARNING: this enum is only used for legacy hacks, for platform features that 25762306a36Sopenharmony_ci * are not easily enumerated or discoverable. You should not ever use 25862306a36Sopenharmony_ci * this for new features. 25962306a36Sopenharmony_ci * 26062306a36Sopenharmony_ci * @X86_SUBARCH_PC: Should be used if the hardware is enumerable using standard 26162306a36Sopenharmony_ci * PC mechanisms (PCI, ACPI) and doesn't need a special boot flow. 26262306a36Sopenharmony_ci * @X86_SUBARCH_LGUEST: Used for x86 hypervisor demo, lguest, deprecated 26362306a36Sopenharmony_ci * @X86_SUBARCH_XEN: Used for Xen guest types which follow the PV boot path, 26462306a36Sopenharmony_ci * which start at asm startup_xen() entry point and later jump to the C 26562306a36Sopenharmony_ci * xen_start_kernel() entry point. Both domU and dom0 type of guests are 26662306a36Sopenharmony_ci * currently supported through this PV boot path. 26762306a36Sopenharmony_ci * @X86_SUBARCH_INTEL_MID: Used for Intel MID (Mobile Internet Device) platform 26862306a36Sopenharmony_ci * systems which do not have the PCI legacy interfaces. 26962306a36Sopenharmony_ci * @X86_SUBARCH_CE4100: Used for Intel CE media processor (CE4100) SoC 27062306a36Sopenharmony_ci * for settop boxes and media devices, the use of a subarch for CE4100 27162306a36Sopenharmony_ci * is more of a hack... 27262306a36Sopenharmony_ci */ 27362306a36Sopenharmony_cienum x86_hardware_subarch { 27462306a36Sopenharmony_ci X86_SUBARCH_PC = 0, 27562306a36Sopenharmony_ci X86_SUBARCH_LGUEST, 27662306a36Sopenharmony_ci X86_SUBARCH_XEN, 27762306a36Sopenharmony_ci X86_SUBARCH_INTEL_MID, 27862306a36Sopenharmony_ci X86_SUBARCH_CE4100, 27962306a36Sopenharmony_ci X86_NR_SUBARCHS, 28062306a36Sopenharmony_ci}; 28162306a36Sopenharmony_ci 28262306a36Sopenharmony_ci#endif /* __ASSEMBLY__ */ 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_ci#endif /* _ASM_X86_BOOTPARAM_H */ 285