| // Copyright 2016 The Fuchsia Authors |
| // Copyright (c) 2009 Corey Tabaka |
| // |
| // Use of this source code is governed by a MIT-style |
| // license that can be found in the LICENSE file or at |
| // https://opensource.org/licenses/MIT |
| |
| #ifndef SYSROOT_ZIRCON_MULTIBOOT_H_ |
| #define SYSROOT_ZIRCON_MULTIBOOT_H_ |
| |
| /* magic number for multiboot header */ |
| #define MULTIBOOT_HEADER_MAGIC 0x1BADB002 |
| |
| // Flags for multiboot header: |
| // 0x00000002: Boot loader should provide memory map. |
| // 0x00010000: *_addr fields in multiboot_header_t are used. |
| #define MULTIBOOT_HEADER_FLAGS 0x00010002 |
| |
| /* magic number passed by multiboot-compliant boot loaders */ |
| #define MULTIBOOT_BOOTLOADER_MAGIC 0x2BADB002 |
| |
| #ifndef __ASSEMBLER__ |
| |
| #include <stdint.h> |
| |
| /* multiboot header */ |
| typedef struct multiboot_header { |
| uint32_t magic; |
| uint32_t flags; |
| uint32_t checksum; |
| uint32_t header_addr; |
| uint32_t load_addr; |
| uint32_t load_end_addr; |
| uint32_t bss_end_addr; |
| uint32_t entry_addr; |
| } multiboot_header_t; |
| |
| /* symbol table for a.out */ |
| typedef struct aout_symbol_table { |
| uint32_t tabsize; |
| uint32_t strsize; |
| uint32_t addr; |
| uint32_t reserved; |
| } aout_symbol_table_t; |
| |
| /* section header table for ELF */ |
| typedef struct elf_section_header_table { |
| uint32_t num; |
| uint32_t size; |
| uint32_t addr; |
| uint32_t shndx; |
| } elf_section_header_table_t; |
| |
| /* multiboot info */ |
| typedef struct multiboot_info { |
| uint32_t flags; |
| uint32_t mem_lower; |
| uint32_t mem_upper; |
| uint32_t boot_device; |
| uint32_t cmdline; |
| uint32_t mods_count; |
| uint32_t mods_addr; |
| union { |
| aout_symbol_table_t aout_sym; |
| elf_section_header_table_t elf_sec; |
| } u; |
| uint32_t mmap_length; |
| uint32_t mmap_addr; |
| uint32_t drives_length; |
| uint32_t drives_addr; |
| uint32_t config_table; |
| uint32_t boot_loader_name; |
| uint32_t apm_table; |
| } multiboot_info_t; |
| |
| #define MB_INFO_MEM_SIZE 0x001 |
| #define MB_INFO_BOOT_DEV 0x002 |
| #define MB_INFO_CMD_LINE 0x004 |
| #define MB_INFO_MODS 0x008 |
| #define MB_INFO_SYMS 0x010 |
| #define MB_INFO_SHDR 0x020 |
| #define MB_INFO_MMAP 0x040 |
| #define MB_INFO_DRIVES 0x080 |
| #define MB_INFO_CONFIG 0x100 |
| #define MB_INFO_BOOT_LOADER 0x200 |
| #define MB_INFO_APM_TABLE 0x400 |
| #define MB_INFO_VBE 0x800 |
| |
| /* module structure */ |
| typedef struct module { |
| uint32_t mod_start; |
| uint32_t mod_end; |
| uint32_t string; |
| uint32_t reserved; |
| } module_t; |
| |
| /* memory map - be careful that the offset 0 is base_addr_low without size */ |
| typedef struct memory_map { |
| uint32_t size; |
| uint32_t base_addr_low; |
| uint32_t base_addr_high; |
| uint32_t length_low; |
| uint32_t length_high; |
| uint32_t type; |
| } memory_map_t; |
| |
| /* memory map entry types */ |
| #define MB_MMAP_TYPE_AVAILABLE 0x01 |
| #define MB_MMAP_TYPE_RESERVED 0x02 |
| #define MB_MMAP_TYPE_ACPI_RECLAIM 0x03 |
| #define MB_MMAP_TYPE_ACPI_NVS 0x04 |
| |
| #endif |
| |
| #endif // SYSROOT_ZIRCON_BOOT_MULTIBOOT_ |