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