/* Copyright (C) 1999,2003,2007,2008,2009,2010 Free Software Foundation, Inc. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ANY * DEVELOPER OR DISTRIBUTOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include #include "util.h" #define MULTIBOOT_TAG_TYPE_END 0 #define MULTIBOOT_TAG_TYPE_CMDLINE 1 #define MULTIBOOT_TAG_TYPE_BOOT_LOADER_NAME 2 #define MULTIBOOT_TAG_TYPE_MODULE 3 #define MULTIBOOT_TAG_TYPE_BASIC_MEMINFO 4 #define MULTIBOOT_TAG_TYPE_BOOTDEV 5 #define MULTIBOOT_TAG_TYPE_MMAP 6 #define MULTIBOOT_TAG_TYPE_VBE 7 #define MULTIBOOT_TAG_TYPE_FRAMEBUFFER 8 #define MULTIBOOT_TAG_TYPE_ELF_SECTIONS 9 #define MULTIBOOT_TAG_TYPE_APM 10 #define MULTIBOOT_TAG_TYPE_EFI32 11 #define MULTIBOOT_TAG_TYPE_EFI64 12 #define MULTIBOOT_TAG_TYPE_SMBIOS 13 #define MULTIBOOT_TAG_TYPE_ACPI_OLD 14 #define MULTIBOOT_TAG_TYPE_ACPI_NEW 15 #define MULTIBOOT_TAG_TYPE_NETWORK 16 #define MULTIBOOT_TAG_TYPE_EFI_MMAP 17 #define MULTIBOOT_TAG_TYPE_EFI_BS 18 #define MULTIBOOT_TAG_TYPE_EFI32_IH 19 #define MULTIBOOT_TAG_TYPE_EFI64_IH 20 #define MULTIBOOT_TAG_TYPE_LOAD_BASE_ADDR 21 typedef struct { u32 type; u32 size; char cmdline[0]; } multiboot_tag_cmdline; typedef struct { u32 type; u32 size; char bootloader_name[0]; } multiboot_tag_bootloader_name; typedef struct { u32 type; u32 size; u32 mod_start; u32 mod_end; char cmdline[0]; } multiboot_tag_module; typedef struct { u32 type; u32 size; u32 mem_lower; u32 mem_upper; } multiboot_tag_basic_meminfo; typedef struct { u32 type; u32 size; u32 biosdev; u32 partition; u32 sub_partition; } multiboot_tag_bootdev; #define MULTIBOOT_MEMORY_AVAILABLE 1 #define MULTIBOOT_MEMORY_RESERVED 2 #define MULTIBOOT_MEMORY_ACPI_RECLAIMABLE 3 #define MULTIBOOT_MEMORY_NVS 4 #define MULTIBOOT_MEMORY_BADRAM 5 typedef struct { u64 base_addr; u64 length; u32 type; u32 reserved; } multiboot_mmap_entry; typedef struct { u32 type; u32 size; u32 entry_size; u32 entry_version; multiboot_mmap_entry entries[0]; } multiboot_tag_mmap; typedef struct { u32 type; u32 size; u16 vbe_mode; u16 vbe_interface_seg; u16 vbe_interface_off; u16 vbe_interface_len; u8 vbe_control_info[512]; u8 vbe_mode_info[256]; } multiboot_tag_vbe; #define MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED 0 #define MULTIBOOT_FRAMEBUFFER_TYPE_RGB 1 #define MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT 2 typedef struct { u8 red; u8 green; u8 blue; } multiboot_color; typedef struct { u32 type; u32 size; u64 framebuffer_addr; u32 framebuffer_pitch; u32 framebuffer_width; u32 framebuffer_height; u8 framebuffer_bpp; u8 framebuffer_type; u16 reserved; union { struct { u16 framebuffer_palette_num_colors; multiboot_color framebuffer_palette[0]; }; struct { u8 framebuffer_red_field_position; u8 framebuffer_red_mask_size; u8 framebuffer_green_field_position; u8 framebuffer_green_mask_size; u8 framebuffer_blue_field_position; u8 framebuffer_blue_mask_size; }; }; } multiboot_tag_framebuffer; typedef struct { u32 type; u32 size; u32 num; u32 entsize; u32 shndx; char sections[0]; } multiboot_tag_elf_sections; typedef struct { u32 type; u32 size; u16 version; u16 cseg; u32 offset; u16 cseg_16; u16 dseg; u16 flags; u16 cseg_len; u16 cseg_16_len; u16 dseg_len; } multiboot_tag_apm; typedef struct { u32 type; u32 size; u32 pointer; } multiboot_tag_efi32; typedef struct { u32 type; u32 size; u64 pointer; } multiboot_tag_efi64; typedef struct { u32 type; u32 size; u8 major; u8 minor; u8 reserved[6]; u8 tables[0]; } multiboot_tag_smbios; typedef struct { u32 type; u32 size; u8 rsdp[0]; } multiboot_tag_acpi_old; typedef struct { u32 type; u32 size; u8 rsdp[0]; } multiboot_tag_acpi_new; typedef struct { u32 type; u32 size; u8 dhcpack[0]; } multiboot_tag_network; typedef struct { u32 type; u32 size; u32 descr_size; u32 descr_vers; u8 efi_mmap[0]; } multiboot_tag_efi_mmap; typedef struct { u32 type; u32 size; u32 pointer; } multiboot_tag_efi32_ih; typedef struct { u32 type; u32 size; u64 pointer; } multiboot_tag_efi64_ih; typedef struct { u32 type; u32 size; u32 load_base_addr; } multiboot_tag_load_base_addr; void *multiboot_get_tag(u32 type); static inline multiboot_tag_cmdline *multiboot_get_cmdline() { return multiboot_get_tag(MULTIBOOT_TAG_TYPE_CMDLINE); } static inline multiboot_tag_bootloader_name *multiboot_get_bootloader_name() { return multiboot_get_tag(MULTIBOOT_TAG_TYPE_BOOT_LOADER_NAME); } static inline multiboot_tag_module *multiboot_get_module() { return multiboot_get_tag(MULTIBOOT_TAG_TYPE_MODULE); } static inline multiboot_tag_basic_meminfo *multiboot_get_basic_meminfo() { return multiboot_get_tag(MULTIBOOT_TAG_TYPE_BASIC_MEMINFO); } static inline multiboot_tag_bootdev *multiboot_get_bootdev() { return multiboot_get_tag(MULTIBOOT_TAG_TYPE_BOOTDEV); } static inline multiboot_tag_mmap *multiboot_get_mmap() { return multiboot_get_tag(MULTIBOOT_TAG_TYPE_MMAP); } static inline size_t get_mmap_entry_count(multiboot_tag_mmap *mmap) { return (mmap->size - 16) / mmap->entry_size; } static inline multiboot_tag_vbe *multiboot_get_vbe() { return multiboot_get_tag(MULTIBOOT_TAG_TYPE_VBE); } static inline multiboot_tag_framebuffer *multiboot_get_framebuffer() { return multiboot_get_tag(MULTIBOOT_TAG_TYPE_FRAMEBUFFER); } static inline multiboot_tag_elf_sections *multiboot_get_elf_sections() { return multiboot_get_tag(MULTIBOOT_TAG_TYPE_ELF_SECTIONS); } static inline multiboot_tag_apm *multiboot_get_apm() { return multiboot_get_tag(MULTIBOOT_TAG_TYPE_APM); } static inline multiboot_tag_efi32 *multiboot_get_efi32() { return multiboot_get_tag(MULTIBOOT_TAG_TYPE_EFI32); } static inline multiboot_tag_efi64 *multiboot_get_efi64() { return multiboot_get_tag(MULTIBOOT_TAG_TYPE_EFI64); } static inline multiboot_tag_smbios *multiboot_get_smbios() { return multiboot_get_tag(MULTIBOOT_TAG_TYPE_SMBIOS); } static inline multiboot_tag_acpi_old *multiboot_get_acpi_old() { return multiboot_get_tag(MULTIBOOT_TAG_TYPE_ACPI_OLD); } static inline multiboot_tag_acpi_new *multiboot_get_acpi_new() { return multiboot_get_tag(MULTIBOOT_TAG_TYPE_ACPI_NEW); } static inline multiboot_tag_network *multiboot_get_network() { return multiboot_get_tag(MULTIBOOT_TAG_TYPE_NETWORK); } static inline multiboot_tag_efi_mmap *multiboot_get_efi_mmap() { return multiboot_get_tag(MULTIBOOT_TAG_TYPE_EFI_MMAP); } static inline bool multiboot_get_efi_bs() { return multiboot_get_tag(MULTIBOOT_TAG_TYPE_EFI_BS) != NULL; } static inline multiboot_tag_efi32_ih *multiboot_get_efi32_ih() { return multiboot_get_tag(MULTIBOOT_TAG_TYPE_EFI32_IH); } static inline multiboot_tag_efi64_ih *multiboot_get_efi64_ih() { return multiboot_get_tag(MULTIBOOT_TAG_TYPE_EFI64_IH); } static inline multiboot_tag_load_base_addr *multiboot_get_load_base_addr() { return multiboot_get_tag(MULTIBOOT_TAG_TYPE_LOAD_BASE_ADDR); }