1253789Srpaulo// Copyright 2016 The Fuchsia Authors
2253789Srpaulo// Copyright (c) 2009 Corey Tabaka
3253789Srpaulo//
4253789Srpaulo// Use of this source code is governed by a MIT-style
5253789Srpaulo// license that can be found in the LICENSE file or at
6253789Srpaulo// https://opensource.org/licenses/MIT
7253789Srpaulo
8253789Srpaulo#ifndef __PLATFORM_MULTIBOOT_H
9253789Srpaulo#define __PLATFORM_MULTIBOOT_H
10253789Srpaulo
11253789Srpaulo/* magic number for multiboot header */
12253789Srpaulo#define MULTIBOOT_HEADER_MAGIC      0x1BADB002
13253789Srpaulo
14253789Srpaulo// Flags for multiboot header:
15253789Srpaulo//   0x00000002: Boot loader should provide memory map.
16253789Srpaulo//   0x00010000: *_addr fields in multiboot_header_t are used.
17253789Srpaulo#define MULTIBOOT_HEADER_FLAGS      0x00010002
18253789Srpaulo
19253789Srpaulo/* magic number passed by multiboot-compliant boot loaders */
20253789Srpaulo#define MULTIBOOT_BOOTLOADER_MAGIC  0x2BADB002
21253789Srpaulo
22253789Srpaulo#ifndef __ASSEMBLER__
23253789Srpaulo
24253789Srpaulo#include <stdint.h>
25253789Srpaulo
26253789Srpaulo/* multiboot header */
27253789Srpaulotypedef struct multiboot_header {
28253789Srpaulo    uint32_t magic;
29287727Sadrian    uint32_t flags;
30253789Srpaulo    uint32_t checksum;
31253789Srpaulo    uint32_t header_addr;
32253789Srpaulo    uint32_t load_addr;
33253789Srpaulo    uint32_t load_end_addr;
34253789Srpaulo    uint32_t bss_end_addr;
35253789Srpaulo    uint32_t entry_addr;
36253789Srpaulo} multiboot_header_t;
37253789Srpaulo
38253789Srpaulo/* symbol table for a.out */
39253789Srpaulotypedef struct aout_symbol_table {
40253789Srpaulo    uint32_t tabsize;
41253789Srpaulo    uint32_t strsize;
42253789Srpaulo    uint32_t addr;
43253789Srpaulo    uint32_t reserved;
44253789Srpaulo} aout_symbol_table_t;
45253789Srpaulo
46253789Srpaulo/* section header table for ELF */
47253789Srpaulotypedef struct elf_section_header_table {
48257176Sglebius    uint32_t num;
49253789Srpaulo    uint32_t size;
50253789Srpaulo    uint32_t addr;
51253789Srpaulo    uint32_t shndx;
52253789Srpaulo} elf_section_header_table_t;
53253789Srpaulo
54253789Srpaulo/* multiboot info */
55253789Srpaulotypedef struct multiboot_info {
56253789Srpaulo    uint32_t flags;
57253789Srpaulo    uint32_t mem_lower;
58253789Srpaulo    uint32_t mem_upper;
59253789Srpaulo    uint32_t boot_device;
60253789Srpaulo    uint32_t cmdline;
61253789Srpaulo    uint32_t mods_count;
62253789Srpaulo    uint32_t mods_addr;
63253789Srpaulo    union {
64253789Srpaulo        aout_symbol_table_t aout_sym;
65253789Srpaulo        elf_section_header_table_t elf_sec;
66253789Srpaulo    } u;
67253789Srpaulo    uint32_t mmap_length;
68253789Srpaulo    uint32_t mmap_addr;
69253789Srpaulo    uint32_t drives_length;
70253789Srpaulo    uint32_t drives_addr;
71253789Srpaulo    uint32_t config_table;
72253789Srpaulo    uint32_t boot_loader_name;
73253789Srpaulo    uint32_t apm_table;
74253789Srpaulo} multiboot_info_t;
75253789Srpaulo
76276701Shselaskyenum {
77253789Srpaulo    MB_INFO_MEM_SIZE    = 0x001,
78287727Sadrian    MB_INFO_BOOT_DEV    = 0x002,
79287727Sadrian    MB_INFO_CMD_LINE    = 0x004,
80287727Sadrian    MB_INFO_MODS        = 0x008,
81287727Sadrian    MB_INFO_SYMS        = 0x010,
82287727Sadrian    MB_INFO_SHDR        = 0x020,
83287727Sadrian    MB_INFO_MMAP        = 0x040,
84287727Sadrian    MB_INFO_DRIVES      = 0x080,
85253789Srpaulo    MB_INFO_CONFIG      = 0x100,
86253789Srpaulo    MB_INFO_BOOT_LOADER = 0x200,
87287947Sadrian    MB_INFO_APM_TABLE   = 0x400,
88287947Sadrian    MB_INFO_VBE         = 0x800,
89287947Sadrian};
90287727Sadrian
91287727Sadrian/* module structure */
92287727Sadriantypedef struct module {
93287727Sadrian    uint32_t mod_start;
94287727Sadrian    uint32_t mod_end;
95287727Sadrian    uint32_t string;
96287727Sadrian    uint32_t reserved;
97287727Sadrian} module_t;
98287727Sadrian
99287727Sadrian/* memory map - be careful that the offset 0 is base_addr_low without size */
100287727Sadriantypedef struct memory_map {
101287727Sadrian    uint32_t size;
102253789Srpaulo    uint32_t base_addr_low;
103253789Srpaulo    uint32_t base_addr_high;
104253789Srpaulo    uint32_t length_low;
105253789Srpaulo    uint32_t length_high;
106253789Srpaulo    uint32_t type;
107253789Srpaulo} memory_map_t;
108253789Srpaulo
109253789Srpaulo/* memory map entry types */
110253789Srpauloenum {
111253789Srpaulo    MB_MMAP_TYPE_AVAILABLE      = 0x01,
112253789Srpaulo    MB_MMAP_TYPE_RESERVED       = 0x02,
113253789Srpaulo    MB_MMAP_TYPE_ACPI_RECLAIM   = 0x03,
114253789Srpaulo    MB_MMAP_TYPE_ACPI_NVS       = 0x04,
115253789Srpaulo};
116253789Srpaulo
117253789Srpaulo#endif
118253789Srpaulo
119253789Srpaulo#endif
120253789Srpaulo