summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/sys/multiboot2.h
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/sys/multiboot2.h')
-rw-r--r--usr/src/uts/common/sys/multiboot2.h418
1 files changed, 418 insertions, 0 deletions
diff --git a/usr/src/uts/common/sys/multiboot2.h b/usr/src/uts/common/sys/multiboot2.h
new file mode 100644
index 0000000000..556b0217a3
--- /dev/null
+++ b/usr/src/uts/common/sys/multiboot2.h
@@ -0,0 +1,418 @@
+/*
+ * 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.
+ */
+
+/*
+ * Copyright 2016 Toomas Soome <tsoome@me.com>
+ */
+
+/*
+ * This header contains definitions for Multiboot 2 boot protocol, based on
+ * the reference implementation by grub 2.
+ *
+ * At the time this was written (Jan 2017), the Multiboot 2 documentation is in
+ * process of being rewritten and the information in the specification is not
+ * entirely correct. Instead, you must rely on grub 2 source code.
+ *
+ * This header provides essential support for the Multiboot 2 specification
+ * for illumos and makes it possible to pass the needed structures from the
+ * boot loader to the kernel.
+ */
+
+#ifndef _SYS_MULTIBOOT2_H
+#define _SYS_MULTIBOOT2_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* How many bytes from the start of the file we search for the header. */
+#define MULTIBOOT_SEARCH 32768
+#define MULTIBOOT_HEADER_ALIGN 8
+
+/* The magic field should contain this. */
+#define MULTIBOOT2_HEADER_MAGIC 0xe85250d6
+
+/* This should be in %eax. */
+#define MULTIBOOT2_BOOTLOADER_MAGIC 0x36d76289
+
+/* Alignment of multiboot modules. */
+#if defined(__i386) || defined(__amd64)
+#define MULTIBOOT_MOD_ALIGN 0x00001000
+#else
+#error No architecture defined
+#endif
+
+/* Alignment of the multiboot info structure. */
+#define MULTIBOOT_INFO_ALIGN 0x00000008
+
+/* Flags set in the 'flags' member of the multiboot header. */
+
+#define MULTIBOOT_TAG_ALIGN 8
+#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
+
+#define MULTIBOOT_HEADER_TAG_END 0
+#define MULTIBOOT_HEADER_TAG_INFORMATION_REQUEST 1
+#define MULTIBOOT_HEADER_TAG_ADDRESS 2
+#define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS 3
+#define MULTIBOOT_HEADER_TAG_CONSOLE_FLAGS 4
+#define MULTIBOOT_HEADER_TAG_FRAMEBUFFER 5
+#define MULTIBOOT_HEADER_TAG_MODULE_ALIGN 6
+#define MULTIBOOT_HEADER_TAG_EFI_BS 7
+#define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS_EFI32 8
+#define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS_EFI64 9
+#define MULTIBOOT_HEADER_TAG_RELOCATABLE 10
+
+#define MULTIBOOT_ARCHITECTURE_I386 0
+#define MULTIBOOT_ARCHITECTURE_MIPS32 4
+#define MULTIBOOT_HEADER_TAG_OPTIONAL 1
+
+/* Hints for relocatable kernel load preference */
+#define MULTIBOOT_LOAD_PREFERENCE_NONE 0
+#define MULTIBOOT_LOAD_PREFERENCE_LOW 1
+#define MULTIBOOT_LOAD_PREFERENCE_HIGH 2
+
+/* Values for console_flags field in tag multiboot_header_tag_console_flags. */
+#define MULTIBOOT_CONSOLE_FLAGS_CONSOLE_REQUIRED 1
+#define MULTIBOOT_CONSOLE_FLAGS_EGA_TEXT_SUPPORTED 2
+
+#ifndef _ASM
+
+#include <sys/stdint.h>
+
+#pragma pack(1)
+
+typedef struct multiboot_header_tag {
+ uint16_t mbh_type;
+ uint16_t mbh_flags;
+ uint32_t mbh_size;
+} multiboot_header_tag_t;
+
+typedef struct multiboot2_header {
+ /* Must be MULTIBOOT2_MAGIC - see above. */
+ uint32_t mb2_magic;
+
+ /* ISA */
+ uint32_t mb2_architecture;
+
+ /* Total header length. */
+ uint32_t mb2_header_length;
+
+ /* The above fields plus this one must equal 0 mod 2^32. */
+ uint32_t mb2_checksum;
+ multiboot_header_tag_t mb2_tags[];
+} multiboot2_header_t;
+
+typedef struct multiboot_header_tag_information_request {
+ uint16_t mbh_type;
+ uint16_t mbh_flags;
+ uint32_t mbh_size;
+ uint32_t mbh_requests[];
+} multiboot_header_tag_information_request_t;
+
+typedef struct multiboot_header_tag_address {
+ uint16_t mbh_type;
+ uint16_t mbh_flags;
+ uint32_t mbh_size;
+ uint32_t mbh_header_addr;
+ uint32_t mbh_load_addr;
+ uint32_t mbh_load_end_addr;
+ uint32_t mbh_bss_end_addr;
+} multiboot_header_tag_address_t;
+
+typedef struct multiboot_header_tag_entry_address {
+ uint16_t mbh_type;
+ uint16_t mbh_flags;
+ uint32_t mbh_size;
+ uint32_t mbh_entry_addr;
+} multiboot_header_tag_entry_address_t;
+
+typedef struct multiboot_header_tag_console_flags {
+ uint16_t mbh_type;
+ uint16_t mbh_flags;
+ uint32_t mbh_size;
+ uint32_t mbh_console_flags;
+} multiboot_header_tag_console_flags_t;
+
+typedef struct multiboot_header_tag_framebuffer {
+ uint16_t mbh_type;
+ uint16_t mbh_flags;
+ uint32_t mbh_size;
+ uint32_t mbh_width;
+ uint32_t mbh_height;
+ uint32_t mbh_depth;
+} multiboot_header_tag_framebuffer_t;
+
+typedef struct multiboot_header_tag_module_align {
+ uint16_t mbh_type;
+ uint16_t mbh_flags;
+ uint32_t mbh_size;
+} multiboot_header_tag_module_align_t;
+
+typedef struct multiboot_header_tag_relocatable {
+ uint16_t mbh_type;
+ uint16_t mbh_flags;
+ uint32_t mbh_size;
+ uint32_t mbh_min_addr;
+ uint32_t mbh_max_addr;
+ uint32_t mbh_align;
+ uint32_t mbh_preference;
+} multiboot_header_tag_relocatable_t;
+
+typedef struct multiboot_color {
+ uint8_t mb_red;
+ uint8_t mb_green;
+ uint8_t mb_blue;
+} multiboot_color_t;
+
+typedef struct multiboot_mmap_entry {
+ uint64_t mmap_addr;
+ uint64_t mmap_len;
+#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
+ uint32_t mmap_type;
+ uint32_t mmap_reserved;
+} multiboot_mmap_entry_t;
+
+typedef struct multiboot_tag {
+ uint32_t mb_type;
+ uint32_t mb_size;
+} multiboot_tag_t;
+
+typedef struct multiboot2_info_header {
+ uint32_t mbi_total_size;
+ uint32_t mbi_reserved;
+ multiboot_tag_t mbi_tags[];
+} multiboot2_info_header_t;
+
+typedef struct multiboot_tag_string {
+ uint32_t mb_type;
+ uint32_t mb_size;
+ char mb_string[];
+} multiboot_tag_string_t;
+
+typedef struct multiboot_tag_module {
+ uint32_t mb_type;
+ uint32_t mb_size;
+ uint32_t mb_mod_start;
+ uint32_t mb_mod_end;
+ char mb_cmdline[];
+} multiboot_tag_module_t;
+
+typedef struct multiboot_tag_basic_meminfo {
+ uint32_t mb_type;
+ uint32_t mb_size;
+ uint32_t mb_mem_lower;
+ uint32_t mb_mem_upper;
+} multiboot_tag_basic_meminfo_t;
+
+typedef struct multiboot_tag_bootdev {
+ uint32_t mb_type;
+ uint32_t mb_size;
+ uint32_t mb_biosdev;
+ uint32_t mb_slice;
+ uint32_t mb_part;
+} multiboot_tag_bootdev_t;
+
+typedef struct multiboot_tag_mmap {
+ uint32_t mb_type;
+ uint32_t mb_size;
+ uint32_t mb_entry_size;
+ uint32_t mb_entry_version;
+ uint8_t mb_entries[];
+} multiboot_tag_mmap_t;
+
+struct multiboot_vbe_info_block {
+ uint8_t vbe_external_specification[512];
+};
+
+struct multiboot_vbe_mode_info_block {
+ uint8_t vbe_external_specification[256];
+};
+
+typedef struct multiboot_tag_vbe {
+ uint32_t mb_type;
+ uint32_t mb_size;
+
+ uint16_t vbe_mode;
+ uint16_t vbe_interface_seg;
+ uint16_t vbe_interface_off;
+ uint16_t vbe_interface_len;
+
+ struct multiboot_vbe_info_block vbe_control_info;
+ struct multiboot_vbe_mode_info_block vbe_mode_info;
+} multiboot_tag_vbe_t;
+
+struct multiboot_tag_framebuffer_common {
+ uint32_t mb_type;
+ uint32_t mb_size;
+
+ uint64_t framebuffer_addr;
+ uint32_t framebuffer_pitch;
+ uint32_t framebuffer_width;
+ uint32_t framebuffer_height;
+ uint8_t framebuffer_bpp;
+#define MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED 0
+#define MULTIBOOT_FRAMEBUFFER_TYPE_RGB 1
+#define MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT 2
+ uint8_t framebuffer_type;
+ uint16_t mb_reserved;
+};
+
+typedef struct multiboot_tag_framebuffer {
+ struct multiboot_tag_framebuffer_common framebuffer_common;
+
+ union {
+ struct {
+ uint16_t framebuffer_palette_num_colors;
+ multiboot_color_t framebuffer_palette[];
+ } fb1;
+ struct {
+ uint8_t framebuffer_red_field_position;
+ uint8_t framebuffer_red_mask_size;
+ uint8_t framebuffer_green_field_position;
+ uint8_t framebuffer_green_mask_size;
+ uint8_t framebuffer_blue_field_position;
+ uint8_t framebuffer_blue_mask_size;
+ } fb2;
+ } u;
+} multiboot_tag_framebuffer_t;
+
+typedef struct multiboot_tag_elf_sections {
+ uint32_t mb_type;
+ uint32_t mb_size;
+ uint32_t mb_num;
+ uint32_t mb_entsize;
+ uint32_t mb_shndx;
+ char mb_sections[];
+} multiboot_tag_elf_sections_t;
+
+typedef struct multiboot_tag_apm {
+ uint32_t mb_type;
+ uint32_t mb_size;
+ uint16_t mb_version;
+ uint16_t mb_cseg;
+ uint32_t mb_offset;
+ uint16_t mb_cseg_16;
+ uint16_t mb_dseg;
+ uint16_t mb_flags;
+ uint16_t mb_cseg_len;
+ uint16_t mb_cseg_16_len;
+ uint16_t mb_dseg_len;
+} multiboot_tag_apm_t;
+
+typedef struct multiboot_tag_efi32 {
+ uint32_t mb_type;
+ uint32_t mb_size;
+ uint32_t mb_pointer;
+} multiboot_tag_efi32_t;
+
+typedef struct multiboot_tag_efi64 {
+ uint32_t mb_type;
+ uint32_t mb_size;
+ uint64_t mb_pointer;
+} multiboot_tag_efi64_t;
+
+typedef struct multiboot_tag_smbios {
+ uint32_t mb_type;
+ uint32_t mb_size;
+ uint8_t mb_major;
+ uint8_t mb_minor;
+ uint8_t mb_reserved[6];
+ uint8_t mb_tables[];
+} multiboot_tag_smbios_t;
+
+typedef struct multiboot_tag_old_acpi {
+ uint32_t mb_type;
+ uint32_t mb_size;
+ uint8_t mb_rsdp[];
+} multiboot_tag_old_acpi_t;
+
+typedef struct multiboot_tag_new_acpi {
+ uint32_t mb_type;
+ uint32_t mb_size;
+ uint8_t mb_rsdp[];
+} multiboot_tag_new_acpi_t;
+
+typedef struct multiboot_tag_network {
+ uint32_t mb_type;
+ uint32_t mb_size;
+ uint8_t mb_dhcpack[];
+} multiboot_tag_network_t;
+
+typedef struct multiboot_tag_efi_mmap {
+ uint32_t mb_type;
+ uint32_t mb_size;
+ uint32_t mb_descr_size;
+ uint32_t mb_descr_vers;
+ uint8_t mb_efi_mmap[];
+} multiboot_tag_efi_mmap_t;
+
+typedef struct multiboot_tag_efi32_ih {
+ uint32_t mb_type;
+ uint32_t mb_size;
+ uint32_t mb_pointer;
+} multiboot_tag_efi32_ih_t;
+
+typedef struct multiboot_tag_efi64_ih {
+ uint32_t mb_type;
+ uint32_t mb_size;
+ uint64_t mb_pointer;
+} multiboot_tag_efi64_ih_t;
+
+typedef struct multiboot_tag_load_base_addr {
+ uint32_t mb_type;
+ uint32_t mb_size;
+ uint32_t mb_load_base_addr;
+} multiboot_tag_load_base_addr_t;
+
+#pragma pack()
+
+#endif /* !_ASM */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !_SYS_MULTIBOOT2_H */