1 /* multiboot2.h - Multiboot 2 header file. */ 2 /* Copyright (C) 1999,2003,2007,2008,2009,2010 Free Software Foundation, Inc. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a copy 5 * of this software and associated documentation files (the "Software"), to 6 * deal in the Software without restriction, including without limitation the 7 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 8 * sell copies of the Software, and to permit persons to whom the Software is 9 * furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice shall be included in 12 * all copies or substantial portions of the Software. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ANY 17 * DEVELOPER OR DISTRIBUTOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 18 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR 19 * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 20 */ 21 22 #ifndef MULTIBOOT_HEADER 23 #define MULTIBOOT_HEADER 1 24 25 /* How many bytes from the start of the file we search for the header. */ 26 #define MULTIBOOT_SEARCH 32768 27 #define MULTIBOOT_HEADER_ALIGN 8 28 29 /* The magic field should contain this. */ 30 #define MULTIBOOT2_HEADER_MAGIC 0xe85250d6 31 32 /* This should be in %eax. */ 33 #define MULTIBOOT2_BOOTLOADER_MAGIC 0x36d76289 34 35 /* Alignment of multiboot modules. */ 36 #define MULTIBOOT_MOD_ALIGN 0x00001000 37 38 /* Alignment of the multiboot info structure. */ 39 #define MULTIBOOT_INFO_ALIGN 0x00000008 40 41 /* Flags set in the 'flags' member of the multiboot header. */ 42 43 #define MULTIBOOT_TAG_ALIGN 8 44 #define MULTIBOOT_TAG_TYPE_END 0 45 #define MULTIBOOT_TAG_TYPE_CMDLINE 1 46 #define MULTIBOOT_TAG_TYPE_BOOT_LOADER_NAME 2 47 #define MULTIBOOT_TAG_TYPE_MODULE 3 48 #define MULTIBOOT_TAG_TYPE_BASIC_MEMINFO 4 49 #define MULTIBOOT_TAG_TYPE_BOOTDEV 5 50 #define MULTIBOOT_TAG_TYPE_MMAP 6 51 #define MULTIBOOT_TAG_TYPE_VBE 7 52 #define MULTIBOOT_TAG_TYPE_FRAMEBUFFER 8 53 #define MULTIBOOT_TAG_TYPE_ELF_SECTIONS 9 54 #define MULTIBOOT_TAG_TYPE_APM 10 55 #define MULTIBOOT_TAG_TYPE_EFI32 11 56 #define MULTIBOOT_TAG_TYPE_EFI64 12 57 #define MULTIBOOT_TAG_TYPE_SMBIOS 13 58 #define MULTIBOOT_TAG_TYPE_ACPI_OLD 14 59 #define MULTIBOOT_TAG_TYPE_ACPI_NEW 15 60 #define MULTIBOOT_TAG_TYPE_NETWORK 16 61 #define MULTIBOOT_TAG_TYPE_EFI_MMAP 17 62 #define MULTIBOOT_TAG_TYPE_EFI_BS 18 63 #define MULTIBOOT_TAG_TYPE_EFI32_IH 19 64 #define MULTIBOOT_TAG_TYPE_EFI64_IH 20 65 #define MULTIBOOT_TAG_TYPE_LOAD_BASE_ADDR 21 66 67 #define MULTIBOOT_HEADER_TAG_END 0 68 #define MULTIBOOT_HEADER_TAG_INFORMATION_REQUEST 1 69 #define MULTIBOOT_HEADER_TAG_ADDRESS 2 70 #define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS 3 71 #define MULTIBOOT_HEADER_TAG_CONSOLE_FLAGS 4 72 #define MULTIBOOT_HEADER_TAG_FRAMEBUFFER 5 73 #define MULTIBOOT_HEADER_TAG_MODULE_ALIGN 6 74 #define MULTIBOOT_HEADER_TAG_EFI_BS 7 75 #define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS_EFI32 8 76 #define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS_EFI64 9 77 #define MULTIBOOT_HEADER_TAG_RELOCATABLE 10 78 79 #define MULTIBOOT_ARCHITECTURE_I386 0 80 #define MULTIBOOT_ARCHITECTURE_MIPS32 4 81 #define MULTIBOOT_HEADER_TAG_OPTIONAL 1 82 83 #define MULTIBOOT_LOAD_PREFERENCE_NONE 0 84 #define MULTIBOOT_LOAD_PREFERENCE_LOW 1 85 #define MULTIBOOT_LOAD_PREFERENCE_HIGH 2 86 87 #define MULTIBOOT_CONSOLE_FLAGS_CONSOLE_REQUIRED 1 88 #define MULTIBOOT_CONSOLE_FLAGS_EGA_TEXT_SUPPORTED 2 89 90 #ifndef ASM_FILE 91 92 typedef unsigned char multiboot_uint8_t; 93 typedef unsigned short multiboot_uint16_t; 94 typedef unsigned int multiboot_uint32_t; 95 typedef unsigned long long multiboot_uint64_t; 96 97 struct multiboot_header 98 { 99 /* Must be MULTIBOOT_MAGIC - see above. */ 100 multiboot_uint32_t magic; 101 102 /* ISA */ 103 multiboot_uint32_t architecture; 104 105 /* Total header length. */ 106 multiboot_uint32_t header_length; 107 108 /* The above fields plus this one must equal 0 mod 2^32. */ 109 multiboot_uint32_t checksum; 110 }; 111 112 struct multiboot_header_tag 113 { 114 multiboot_uint16_t type; 115 multiboot_uint16_t flags; 116 multiboot_uint32_t size; 117 }; 118 119 struct multiboot_header_tag_information_request 120 { 121 multiboot_uint16_t type; 122 multiboot_uint16_t flags; 123 multiboot_uint32_t size; 124 multiboot_uint32_t requests[0]; 125 }; 126 127 struct multiboot_header_tag_address 128 { 129 multiboot_uint16_t type; 130 multiboot_uint16_t flags; 131 multiboot_uint32_t size; 132 multiboot_uint32_t header_addr; 133 multiboot_uint32_t load_addr; 134 multiboot_uint32_t load_end_addr; 135 multiboot_uint32_t bss_end_addr; 136 }; 137 138 struct multiboot_header_tag_entry_address 139 { 140 multiboot_uint16_t type; 141 multiboot_uint16_t flags; 142 multiboot_uint32_t size; 143 multiboot_uint32_t entry_addr; 144 }; 145 146 struct multiboot_header_tag_console_flags 147 { 148 multiboot_uint16_t type; 149 multiboot_uint16_t flags; 150 multiboot_uint32_t size; 151 multiboot_uint32_t console_flags; 152 }; 153 154 struct multiboot_header_tag_framebuffer 155 { 156 multiboot_uint16_t type; 157 multiboot_uint16_t flags; 158 multiboot_uint32_t size; 159 multiboot_uint32_t width; 160 multiboot_uint32_t height; 161 multiboot_uint32_t depth; 162 }; 163 164 struct multiboot_header_tag_module_align 165 { 166 multiboot_uint16_t type; 167 multiboot_uint16_t flags; 168 multiboot_uint32_t size; 169 }; 170 171 struct multiboot_header_tag_relocatable 172 { 173 multiboot_uint16_t type; 174 multiboot_uint16_t flags; 175 multiboot_uint32_t size; 176 multiboot_uint32_t min_addr; 177 multiboot_uint32_t max_addr; 178 multiboot_uint32_t align; 179 multiboot_uint32_t preference; 180 }; 181 182 struct multiboot_color 183 { 184 multiboot_uint8_t red; 185 multiboot_uint8_t green; 186 multiboot_uint8_t blue; 187 }; 188 189 struct multiboot_mmap_entry 190 { 191 multiboot_uint64_t addr; 192 multiboot_uint64_t len; 193 #define MULTIBOOT_MEMORY_AVAILABLE 1 194 #define MULTIBOOT_MEMORY_RESERVED 2 195 #define MULTIBOOT_MEMORY_ACPI_RECLAIMABLE 3 196 #define MULTIBOOT_MEMORY_NVS 4 197 #define MULTIBOOT_MEMORY_BADRAM 5 198 multiboot_uint32_t type; 199 multiboot_uint32_t zero; 200 }; 201 typedef struct multiboot_mmap_entry multiboot_memory_map_t; 202 203 struct multiboot_tag 204 { 205 multiboot_uint32_t type; 206 multiboot_uint32_t size; 207 }; 208 209 struct multiboot_tag_string 210 { 211 multiboot_uint32_t type; 212 multiboot_uint32_t size; 213 char string[0]; 214 }; 215 216 struct multiboot_tag_module 217 { 218 multiboot_uint32_t type; 219 multiboot_uint32_t size; 220 multiboot_uint32_t mod_start; 221 multiboot_uint32_t mod_end; 222 char cmdline[0]; 223 }; 224 225 struct multiboot_tag_basic_meminfo 226 { 227 multiboot_uint32_t type; 228 multiboot_uint32_t size; 229 multiboot_uint32_t mem_lower; 230 multiboot_uint32_t mem_upper; 231 }; 232 233 struct multiboot_tag_bootdev 234 { 235 multiboot_uint32_t type; 236 multiboot_uint32_t size; 237 multiboot_uint32_t biosdev; 238 multiboot_uint32_t slice; 239 multiboot_uint32_t part; 240 }; 241 242 struct multiboot_tag_mmap 243 { 244 multiboot_uint32_t type; 245 multiboot_uint32_t size; 246 multiboot_uint32_t entry_size; 247 multiboot_uint32_t entry_version; 248 struct multiboot_mmap_entry entries[0]; 249 }; 250 251 struct multiboot_vbe_info_block 252 { 253 multiboot_uint8_t external_specification[512]; 254 }; 255 256 struct multiboot_vbe_mode_info_block 257 { 258 multiboot_uint8_t external_specification[256]; 259 }; 260 261 struct multiboot_tag_vbe 262 { 263 multiboot_uint32_t type; 264 multiboot_uint32_t size; 265 266 multiboot_uint16_t vbe_mode; 267 multiboot_uint16_t vbe_interface_seg; 268 multiboot_uint16_t vbe_interface_off; 269 multiboot_uint16_t vbe_interface_len; 270 271 struct multiboot_vbe_info_block vbe_control_info; 272 struct multiboot_vbe_mode_info_block vbe_mode_info; 273 }; 274 275 struct multiboot_tag_framebuffer_common 276 { 277 multiboot_uint32_t type; 278 multiboot_uint32_t size; 279 280 multiboot_uint64_t framebuffer_addr; 281 multiboot_uint32_t framebuffer_pitch; 282 multiboot_uint32_t framebuffer_width; 283 multiboot_uint32_t framebuffer_height; 284 multiboot_uint8_t framebuffer_bpp; 285 #define MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED 0 286 #define MULTIBOOT_FRAMEBUFFER_TYPE_RGB 1 287 #define MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT 2 288 multiboot_uint8_t framebuffer_type; 289 multiboot_uint16_t reserved; 290 }; 291 292 struct multiboot_tag_framebuffer 293 { 294 struct multiboot_tag_framebuffer_common common; 295 296 union 297 { 298 struct 299 { 300 multiboot_uint16_t framebuffer_palette_num_colors; 301 struct multiboot_color framebuffer_palette[0]; 302 }; 303 struct 304 { 305 multiboot_uint8_t framebuffer_red_field_position; 306 multiboot_uint8_t framebuffer_red_mask_size; 307 multiboot_uint8_t framebuffer_green_field_position; 308 multiboot_uint8_t framebuffer_green_mask_size; 309 multiboot_uint8_t framebuffer_blue_field_position; 310 multiboot_uint8_t framebuffer_blue_mask_size; 311 }; 312 }; 313 }; 314 315 struct multiboot_tag_elf_sections 316 { 317 multiboot_uint32_t type; 318 multiboot_uint32_t size; 319 multiboot_uint32_t num; 320 multiboot_uint32_t entsize; 321 multiboot_uint32_t shndx; 322 char sections[0]; 323 }; 324 325 struct multiboot_tag_apm 326 { 327 multiboot_uint32_t type; 328 multiboot_uint32_t size; 329 multiboot_uint16_t version; 330 multiboot_uint16_t cseg; 331 multiboot_uint32_t offset; 332 multiboot_uint16_t cseg_16; 333 multiboot_uint16_t dseg; 334 multiboot_uint16_t flags; 335 multiboot_uint16_t cseg_len; 336 multiboot_uint16_t cseg_16_len; 337 multiboot_uint16_t dseg_len; 338 }; 339 340 struct multiboot_tag_efi32 341 { 342 multiboot_uint32_t type; 343 multiboot_uint32_t size; 344 multiboot_uint32_t pointer; 345 }; 346 347 struct multiboot_tag_efi64 348 { 349 multiboot_uint32_t type; 350 multiboot_uint32_t size; 351 multiboot_uint64_t pointer; 352 }; 353 354 struct multiboot_tag_smbios 355 { 356 multiboot_uint32_t type; 357 multiboot_uint32_t size; 358 multiboot_uint8_t major; 359 multiboot_uint8_t minor; 360 multiboot_uint8_t reserved[6]; 361 multiboot_uint8_t tables[0]; 362 }; 363 364 struct multiboot_tag_old_acpi 365 { 366 multiboot_uint32_t type; 367 multiboot_uint32_t size; 368 multiboot_uint8_t rsdp[0]; 369 }; 370 371 struct multiboot_tag_new_acpi 372 { 373 multiboot_uint32_t type; 374 multiboot_uint32_t size; 375 multiboot_uint8_t rsdp[0]; 376 }; 377 378 struct multiboot_tag_network 379 { 380 multiboot_uint32_t type; 381 multiboot_uint32_t size; 382 multiboot_uint8_t dhcpack[0]; 383 }; 384 385 struct multiboot_tag_efi_mmap 386 { 387 multiboot_uint32_t type; 388 multiboot_uint32_t size; 389 multiboot_uint32_t descr_size; 390 multiboot_uint32_t descr_vers; 391 multiboot_uint8_t efi_mmap[0]; 392 }; 393 394 struct multiboot_tag_efi32_ih 395 { 396 multiboot_uint32_t type; 397 multiboot_uint32_t size; 398 multiboot_uint32_t pointer; 399 }; 400 401 struct multiboot_tag_efi64_ih 402 { 403 multiboot_uint32_t type; 404 multiboot_uint32_t size; 405 multiboot_uint64_t pointer; 406 }; 407 408 struct multiboot_tag_load_base_addr 409 { 410 multiboot_uint32_t type; 411 multiboot_uint32_t size; 412 multiboot_uint32_t load_base_addr; 413 }; 414 415 #endif /* ! ASM_FILE */ 416 417 #endif /* ! MULTIBOOT_HEADER */ 418