1 | /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ |
2 | #ifndef _ASM_X86_BOOTPARAM_H |
3 | #define _ASM_X86_BOOTPARAM_H |
4 | |
5 | /* setup_data/setup_indirect types */ |
6 | #define SETUP_NONE 0 |
7 | #define SETUP_E820_EXT 1 |
8 | #define SETUP_DTB 2 |
9 | #define SETUP_PCI 3 |
10 | #define SETUP_EFI 4 |
11 | #define SETUP_APPLE_PROPERTIES 5 |
12 | #define SETUP_JAILHOUSE 6 |
13 | #define SETUP_CC_BLOB 7 |
14 | #define SETUP_IMA 8 |
15 | #define SETUP_RNG_SEED 9 |
16 | #define SETUP_ENUM_MAX SETUP_RNG_SEED |
17 | |
18 | #define SETUP_INDIRECT (1<<31) |
19 | #define SETUP_TYPE_MAX (SETUP_ENUM_MAX | SETUP_INDIRECT) |
20 | |
21 | /* ram_size flags */ |
22 | #define RAMDISK_IMAGE_START_MASK 0x07FF |
23 | #define RAMDISK_PROMPT_FLAG 0x8000 |
24 | #define RAMDISK_LOAD_FLAG 0x4000 |
25 | |
26 | /* loadflags */ |
27 | #define LOADED_HIGH (1<<0) |
28 | #define KASLR_FLAG (1<<1) |
29 | #define QUIET_FLAG (1<<5) |
30 | #define KEEP_SEGMENTS (1<<6) |
31 | #define CAN_USE_HEAP (1<<7) |
32 | |
33 | /* xloadflags */ |
34 | #define XLF_KERNEL_64 (1<<0) |
35 | #define XLF_CAN_BE_LOADED_ABOVE_4G (1<<1) |
36 | #define XLF_EFI_HANDOVER_32 (1<<2) |
37 | #define XLF_EFI_HANDOVER_64 (1<<3) |
38 | #define XLF_EFI_KEXEC (1<<4) |
39 | #define XLF_5LEVEL (1<<5) |
40 | #define XLF_5LEVEL_ENABLED (1<<6) |
41 | |
42 | #ifndef __ASSEMBLY__ |
43 | |
44 | #include <linux/types.h> |
45 | #include <linux/screen_info.h> |
46 | #include <linux/apm_bios.h> |
47 | #include <linux/edd.h> |
48 | #include <asm/ist.h> |
49 | #include <video/edid.h> |
50 | |
51 | /* extensible setup data list node */ |
52 | struct setup_data { |
53 | __u64 next; |
54 | __u32 type; |
55 | __u32 len; |
56 | __u8 data[]; |
57 | }; |
58 | |
59 | /* extensible setup indirect data node */ |
60 | struct setup_indirect { |
61 | __u32 type; |
62 | __u32 reserved; /* Reserved, must be set to zero. */ |
63 | __u64 len; |
64 | __u64 addr; |
65 | }; |
66 | |
67 | struct { |
68 | __u8 ; |
69 | __u16 ; |
70 | __u32 ; |
71 | __u16 ; |
72 | __u16 ; |
73 | __u16 ; |
74 | __u16 ; |
75 | __u16 ; |
76 | __u32 ; |
77 | __u16 ; |
78 | __u32 ; |
79 | __u16 ; |
80 | __u16 ; |
81 | __u8 ; |
82 | __u8 ; |
83 | __u16 ; |
84 | __u32 ; |
85 | __u32 ; |
86 | __u32 ; |
87 | __u32 ; |
88 | __u16 ; |
89 | __u8 ; |
90 | __u8 ; |
91 | __u32 ; |
92 | __u32 ; |
93 | __u32 ; |
94 | __u8 ; |
95 | __u8 ; |
96 | __u16 ; |
97 | __u32 ; |
98 | __u32 ; |
99 | __u64 ; |
100 | __u32 ; |
101 | __u32 ; |
102 | __u64 ; |
103 | __u64 ; |
104 | __u32 ; |
105 | __u32 handover_offset; |
106 | __u32 ; |
107 | } __attribute__((packed)); |
108 | |
109 | struct sys_desc_table { |
110 | __u16 length; |
111 | __u8 table[14]; |
112 | }; |
113 | |
114 | /* Gleaned from OFW's set-parameters in cpu/x86/pc/linux.fth */ |
115 | struct { |
116 | __u32 ; /* OFW signature */ |
117 | __u32 ; |
118 | __u32 cif_handler; /* callback into OFW */ |
119 | __u32 ; |
120 | } __attribute__((packed)); |
121 | |
122 | struct efi_info { |
123 | __u32 efi_loader_signature; |
124 | __u32 efi_systab; |
125 | __u32 efi_memdesc_size; |
126 | __u32 efi_memdesc_version; |
127 | __u32 efi_memmap; |
128 | __u32 efi_memmap_size; |
129 | __u32 efi_systab_hi; |
130 | __u32 efi_memmap_hi; |
131 | }; |
132 | |
133 | /* |
134 | * This is the maximum number of entries in struct boot_params::e820_table |
135 | * (the zeropage), which is part of the x86 boot protocol ABI: |
136 | */ |
137 | #define E820_MAX_ENTRIES_ZEROPAGE 128 |
138 | |
139 | /* |
140 | * The E820 memory region entry of the boot protocol ABI: |
141 | */ |
142 | struct boot_e820_entry { |
143 | __u64 addr; |
144 | __u64 size; |
145 | __u32 type; |
146 | } __attribute__((packed)); |
147 | |
148 | /* |
149 | * Smallest compatible version of jailhouse_setup_data required by this kernel. |
150 | */ |
151 | #define JAILHOUSE_SETUP_REQUIRED_VERSION 1 |
152 | |
153 | /* |
154 | * The boot loader is passing platform information via this Jailhouse-specific |
155 | * setup data structure. |
156 | */ |
157 | struct jailhouse_setup_data { |
158 | struct { |
159 | __u16 version; |
160 | __u16 compatible_version; |
161 | } __attribute__((packed)) hdr; |
162 | struct { |
163 | __u16 pm_timer_address; |
164 | __u16 num_cpus; |
165 | __u64 pci_mmconfig_base; |
166 | __u32 tsc_khz; |
167 | __u32 apic_khz; |
168 | __u8 standard_ioapic; |
169 | __u8 cpu_ids[255]; |
170 | } __attribute__((packed)) v1; |
171 | struct { |
172 | __u32 flags; |
173 | } __attribute__((packed)) v2; |
174 | } __attribute__((packed)); |
175 | |
176 | /* |
177 | * IMA buffer setup data information from the previous kernel during kexec |
178 | */ |
179 | struct ima_setup_data { |
180 | __u64 addr; |
181 | __u64 size; |
182 | } __attribute__((packed)); |
183 | |
184 | /* The so-called "zeropage" */ |
185 | struct boot_params { |
186 | struct screen_info screen_info; /* 0x000 */ |
187 | struct apm_bios_info apm_bios_info; /* 0x040 */ |
188 | __u8 _pad2[4]; /* 0x054 */ |
189 | __u64 tboot_addr; /* 0x058 */ |
190 | struct ist_info ist_info; /* 0x060 */ |
191 | __u64 acpi_rsdp_addr; /* 0x070 */ |
192 | __u8 _pad3[8]; /* 0x078 */ |
193 | __u8 hd0_info[16]; /* obsolete! */ /* 0x080 */ |
194 | __u8 hd1_info[16]; /* obsolete! */ /* 0x090 */ |
195 | struct sys_desc_table sys_desc_table; /* obsolete! */ /* 0x0a0 */ |
196 | struct olpc_ofw_header ; /* 0x0b0 */ |
197 | __u32 ext_ramdisk_image; /* 0x0c0 */ |
198 | __u32 ext_ramdisk_size; /* 0x0c4 */ |
199 | __u32 ext_cmd_line_ptr; /* 0x0c8 */ |
200 | __u8 _pad4[112]; /* 0x0cc */ |
201 | __u32 cc_blob_address; /* 0x13c */ |
202 | struct edid_info edid_info; /* 0x140 */ |
203 | struct efi_info efi_info; /* 0x1c0 */ |
204 | __u32 alt_mem_k; /* 0x1e0 */ |
205 | __u32 scratch; /* Scratch field! */ /* 0x1e4 */ |
206 | __u8 e820_entries; /* 0x1e8 */ |
207 | __u8 eddbuf_entries; /* 0x1e9 */ |
208 | __u8 edd_mbr_sig_buf_entries; /* 0x1ea */ |
209 | __u8 kbd_status; /* 0x1eb */ |
210 | __u8 secure_boot; /* 0x1ec */ |
211 | __u8 _pad5[2]; /* 0x1ed */ |
212 | /* |
213 | * The sentinel is set to a nonzero value (0xff) in header.S. |
214 | * |
215 | * A bootloader is supposed to only take setup_header and put |
216 | * it into a clean boot_params buffer. If it turns out that |
217 | * it is clumsy or too generous with the buffer, it most |
218 | * probably will pick up the sentinel variable too. The fact |
219 | * that this variable then is still 0xff will let kernel |
220 | * know that some variables in boot_params are invalid and |
221 | * kernel should zero out certain portions of boot_params. |
222 | */ |
223 | __u8 sentinel; /* 0x1ef */ |
224 | __u8 _pad6[1]; /* 0x1f0 */ |
225 | struct setup_header hdr; /* setup header */ /* 0x1f1 */ |
226 | __u8 _pad7[0x290-0x1f1-sizeof(struct setup_header)]; |
227 | __u32 edd_mbr_sig_buffer[EDD_MBR_SIG_MAX]; /* 0x290 */ |
228 | struct boot_e820_entry e820_table[E820_MAX_ENTRIES_ZEROPAGE]; /* 0x2d0 */ |
229 | __u8 _pad8[48]; /* 0xcd0 */ |
230 | struct edd_info eddbuf[EDDMAXNR]; /* 0xd00 */ |
231 | __u8 _pad9[276]; /* 0xeec */ |
232 | } __attribute__((packed)); |
233 | |
234 | /** |
235 | * enum x86_hardware_subarch - x86 hardware subarchitecture |
236 | * |
237 | * The x86 hardware_subarch and hardware_subarch_data were added as of the x86 |
238 | * boot protocol 2.07 to help distinguish and support custom x86 boot |
239 | * sequences. This enum represents accepted values for the x86 |
240 | * hardware_subarch. Custom x86 boot sequences (not X86_SUBARCH_PC) do not |
241 | * have or simply *cannot* make use of natural stubs like BIOS or EFI, the |
242 | * hardware_subarch can be used on the Linux entry path to revector to a |
243 | * subarchitecture stub when needed. This subarchitecture stub can be used to |
244 | * set up Linux boot parameters or for special care to account for nonstandard |
245 | * handling of page tables. |
246 | * |
247 | * These enums should only ever be used by x86 code, and the code that uses |
248 | * it should be well contained and compartmentalized. |
249 | * |
250 | * KVM and Xen HVM do not have a subarch as these are expected to follow |
251 | * standard x86 boot entries. If there is a genuine need for "hypervisor" type |
252 | * that should be considered separately in the future. Future guest types |
253 | * should seriously consider working with standard x86 boot stubs such as |
254 | * the BIOS or EFI boot stubs. |
255 | * |
256 | * WARNING: this enum is only used for legacy hacks, for platform features that |
257 | * are not easily enumerated or discoverable. You should not ever use |
258 | * this for new features. |
259 | * |
260 | * @X86_SUBARCH_PC: Should be used if the hardware is enumerable using standard |
261 | * PC mechanisms (PCI, ACPI) and doesn't need a special boot flow. |
262 | * @X86_SUBARCH_LGUEST: Used for x86 hypervisor demo, lguest, deprecated |
263 | * @X86_SUBARCH_XEN: Used for Xen guest types which follow the PV boot path, |
264 | * which start at asm startup_xen() entry point and later jump to the C |
265 | * xen_start_kernel() entry point. Both domU and dom0 type of guests are |
266 | * currently supported through this PV boot path. |
267 | * @X86_SUBARCH_INTEL_MID: Used for Intel MID (Mobile Internet Device) platform |
268 | * systems which do not have the PCI legacy interfaces. |
269 | * @X86_SUBARCH_CE4100: Used for Intel CE media processor (CE4100) SoC |
270 | * for settop boxes and media devices, the use of a subarch for CE4100 |
271 | * is more of a hack... |
272 | */ |
273 | enum x86_hardware_subarch { |
274 | X86_SUBARCH_PC = 0, |
275 | X86_SUBARCH_LGUEST, |
276 | X86_SUBARCH_XEN, |
277 | X86_SUBARCH_INTEL_MID, |
278 | X86_SUBARCH_CE4100, |
279 | X86_NR_SUBARCHS, |
280 | }; |
281 | |
282 | #endif /* __ASSEMBLY__ */ |
283 | |
284 | #endif /* _ASM_X86_BOOTPARAM_H */ |
285 | |