1/*
2 * Copyright 2014, General Dynamics C4 Systems
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 */
6
7#pragma once
8/* Adapted from the MultiBoot Specification:  */
9/* www.gnu.org/software/grub/manual/multiboot */
10
11#define MULTIBOOT_MAGIC 0x2BADB002
12
13#include <types.h>
14#include <sel4/arch/bootinfo_types.h>
15
16typedef struct multiboot_module {
17    uint32_t  start;
18    uint32_t  end;
19    uint32_t  name;
20    uint32_t reserved;
21} PACKED multiboot_module_t;
22
23typedef struct multiboot_mmap {
24    uint32_t size;
25    uint64_t base_addr;
26    uint64_t length;
27    uint32_t type;
28} PACKED multiboot_mmap_t;
29
30typedef struct multiboot_info {
31    /* struct split into multiple parts due to details of how C parser works */
32    struct multiboot_part1 {
33        uint32_t flags;
34        uint32_t mem_lower;
35        uint32_t mem_upper;
36        uint32_t boot_device;
37        uint32_t cmdline;
38        uint32_t mod_count;
39        uint32_t mod_list;
40    } part1;
41    /* The symbol table information in the multiboot header is comprised of a union
42     * as we neither a. support unions in the kernel or b. need the symbol information
43     * we will just skip the 4 words of this */
44    struct multiboot_part2 {
45        uint32_t syms[4];
46        uint32_t mmap_length;
47        uint32_t mmap_addr;
48        uint32_t drives_length;
49        uint32_t drives_addr;
50        uint32_t config_table;
51        uint32_t boot_loader_name;
52        uint32_t apm_table;
53        uint32_t vbe_control_info;
54        uint32_t vbe_mode_info;
55        uint16_t vbe_mode;
56        uint16_t vbe_interface_seg;
57        uint16_t vbe_interface_off;
58        uint16_t vbe_interface_len;
59    } part2;
60} PACKED multiboot_info_t;
61
62#define MULTIBOOT_INFO_MEM_FLAG     BIT(0)
63#define MULTIBOOT_INFO_CMDLINE_FLAG BIT(2)
64#define MULTIBOOT_INFO_MODS_FLAG    BIT(3)
65#define MULTIBOOT_INFO_MMAP_FLAG    BIT(6)
66#define MULTIBOOT_INFO_GRAPHICS_FLAG BIT(11)
67#define MULTIBOOT_MMAP_USEABLE_TYPE     1
68#define MULTIBOOT_MMAP_RESERVED_TYPE    2
69#define MULTIBOOT_MMAP_ACPI_TYPE        3
70#define MULTIBOOT_MMAP_ACPI_NVS_TYPE    4
71#define MULTIBOOT_MMAP_BAD_TYPE         5
72
73