176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef _MULTIBOOT_H
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define _MULTIBOOT_H
376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @file
676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Multiboot operating systems
876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanFILE_LICENCE ( GPL2_OR_LATER );
1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdint.h>
1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** The magic number for the Multiboot header */
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define MULTIBOOT_HEADER_MAGIC 0x1BADB002
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Boot modules must be page aligned */
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define MB_FLAG_PGALIGN 0x00000001
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Memory map must be provided */
2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define MB_FLAG_MEMMAP 0x00000002
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Video mode information must be provided */
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define MB_FLAG_VIDMODE 0x00000004
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Image is a raw multiboot image (not ELF) */
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define MB_FLAG_RAW 0x00010000
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * The magic number passed by a Multiboot-compliant boot loader
3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Must be passed in register %eax when jumping to the Multiboot OS
3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * image.
3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define MULTIBOOT_BOOTLOADER_MAGIC 0x2BADB002
3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Multiboot information structure mem_* fields are valid */
3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define MBI_FLAG_MEM 0x00000001
4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Multiboot information structure boot_device field is valid */
4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define MBI_FLAG_BOOTDEV 0x00000002
4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Multiboot information structure cmdline field is valid */
4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define MBI_FLAG_CMDLINE 0x00000004
4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Multiboot information structure module fields are valid */
4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define MBI_FLAG_MODS 0x00000008
4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Multiboot information structure a.out symbol table is valid */
5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define MBI_FLAG_AOUT 0x00000010
5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Multiboot information struture ELF section header table is valid */
5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define MBI_FLAG_ELF 0x00000020
5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Multiboot information structure memory map is valid */
5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define MBI_FLAG_MMAP 0x00000040
5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Multiboot information structure drive list is valid */
6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define MBI_FLAG_DRIVES 0x00000080
6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Multiboot information structure ROM configuration field is valid */
6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define MBI_FLAG_CFGTBL 0x00000100
6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Multiboot information structure boot loader name field is valid */
6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define MBI_FLAG_LOADER 0x00000200
6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Multiboot information structure APM table is valid */
6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define MBI_FLAG_APM 0x00000400
7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Multiboot information structure video information is valid */
7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define MBI_FLAG_VBE 0x00000800
7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** A multiboot header */
7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct multiboot_header {
7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t magic;
7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t flags;
7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t checksum;
7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t header_addr;
8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t load_addr;
8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t load_end_addr;
8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t bss_end_addr;
8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t entry_addr;
8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed, may_alias ));
8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** A multiboot a.out symbol table */
8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct multiboot_aout_symbol_table {
8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t tabsize;
8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t strsize;
9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t addr;
9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t reserved;
9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed, may_alias ));
9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** A multiboot ELF section header table */
9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct multiboot_elf_section_header_table {
9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t num;
9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t size;
9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t addr;
9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t shndx;
10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed, may_alias ));
10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** A multiboot information structure */
10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct multiboot_info {
10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t flags;
10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t mem_lower;
10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t mem_upper;
10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t boot_device;
10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t cmdline;
10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t mods_count;
11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t mods_addr;
11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	union {
11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		struct multiboot_aout_symbol_table aout_syms;
11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		struct multiboot_elf_section_header_table elf_sections;
11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	} syms;
11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t mmap_length;
11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t mmap_addr;
11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t drives_length;
11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t drives_addr;
11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t config_table;
12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t boot_loader_name;
12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t apm_table;
12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t vbe_control_info;
12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t vbe_mode_info;
12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint16_t vbe_mode;
12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint16_t vbe_interface_seg;
12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint16_t vbe_interface_off;
12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint16_t vbe_interface_len;
12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed, may_alias ));
12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** A multiboot module structure */
13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct multiboot_module {
13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t mod_start;
13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t mod_end;
13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t string;
13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t reserved;
13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed, may_alias ));
13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** A multiboot memory map entry */
13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct multiboot_memory_map {
14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t size;
14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint64_t base_addr;
14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint64_t length;
14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	uint32_t type;
14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed, may_alias ));
14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Usable RAM */
14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define MBMEM_RAM 1
14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif /* _MULTIBOOT_H */
150