1 // Copyright 2016 The Fuchsia Authors 2 // Copyright (c) 2009 Corey Tabaka 3 // 4 // Use of this source code is governed by a MIT-style 5 // license that can be found in the LICENSE file or at 6 // https://opensource.org/licenses/MIT 7 8 #ifndef __PLATFORM_MULTIBOOT_H 9 #define __PLATFORM_MULTIBOOT_H 10 11 /* magic number for multiboot header */ 12 #define MULTIBOOT_HEADER_MAGIC 0x1BADB002 13 14 // Flags for multiboot header: 15 // 0x00000002: Boot loader should provide memory map. 16 // 0x00010000: *_addr fields in multiboot_header_t are used. 17 #define MULTIBOOT_HEADER_FLAGS 0x00010002 18 19 /* magic number passed by multiboot-compliant boot loaders */ 20 #define MULTIBOOT_BOOTLOADER_MAGIC 0x2BADB002 21 22 #ifndef __ASSEMBLER__ 23 24 #include <stdint.h> 25 26 /* multiboot header */ 27 typedef struct multiboot_header { 28 uint32_t magic; 29 uint32_t flags; 30 uint32_t checksum; 31 uint32_t header_addr; 32 uint32_t load_addr; 33 uint32_t load_end_addr; 34 uint32_t bss_end_addr; 35 uint32_t entry_addr; 36 } multiboot_header_t; 37 38 /* symbol table for a.out */ 39 typedef struct aout_symbol_table { 40 uint32_t tabsize; 41 uint32_t strsize; 42 uint32_t addr; 43 uint32_t reserved; 44 } aout_symbol_table_t; 45 46 /* section header table for ELF */ 47 typedef struct elf_section_header_table { 48 uint32_t num; 49 uint32_t size; 50 uint32_t addr; 51 uint32_t shndx; 52 } elf_section_header_table_t; 53 54 /* multiboot info */ 55 typedef struct multiboot_info { 56 uint32_t flags; 57 uint32_t mem_lower; 58 uint32_t mem_upper; 59 uint32_t boot_device; 60 uint32_t cmdline; 61 uint32_t mods_count; 62 uint32_t mods_addr; 63 union { 64 aout_symbol_table_t aout_sym; 65 elf_section_header_table_t elf_sec; 66 } u; 67 uint32_t mmap_length; 68 uint32_t mmap_addr; 69 uint32_t drives_length; 70 uint32_t drives_addr; 71 uint32_t config_table; 72 uint32_t boot_loader_name; 73 uint32_t apm_table; 74 } multiboot_info_t; 75 76 #define MB_INFO_MEM_SIZE 0x001 77 #define MB_INFO_BOOT_DEV 0x002 78 #define MB_INFO_CMD_LINE 0x004 79 #define MB_INFO_MODS 0x008 80 #define MB_INFO_SYMS 0x010 81 #define MB_INFO_SHDR 0x020 82 #define MB_INFO_MMAP 0x040 83 #define MB_INFO_DRIVES 0x080 84 #define MB_INFO_CONFIG 0x100 85 #define MB_INFO_BOOT_LOADER 0x200 86 #define MB_INFO_APM_TABLE 0x400 87 #define MB_INFO_VBE 0x800 88 89 /* module structure */ 90 typedef struct module { 91 uint32_t mod_start; 92 uint32_t mod_end; 93 uint32_t string; 94 uint32_t reserved; 95 } module_t; 96 97 /* memory map - be careful that the offset 0 is base_addr_low without size */ 98 typedef struct memory_map { 99 uint32_t size; 100 uint32_t base_addr_low; 101 uint32_t base_addr_high; 102 uint32_t length_low; 103 uint32_t length_high; 104 uint32_t type; 105 } memory_map_t; 106 107 /* memory map entry types */ 108 #define MB_MMAP_TYPE_AVAILABLE 0x01 109 #define MB_MMAP_TYPE_RESERVED 0x02 110 #define MB_MMAP_TYPE_ACPI_RECLAIM 0x03 111 #define MB_MMAP_TYPE_ACPI_NVS 0x04 112 113 #endif 114 115 #endif 116