2020-11-27 20:02:43 +00:00
|
|
|
#ifndef KERNAUX_INCLUDED_MULTIBOOT2
|
2021-12-20 06:17:53 +00:00
|
|
|
#define KERNAUX_INCLUDED_MULTIBOOT2
|
2020-11-27 20:02:43 +00:00
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
2022-06-24 23:07:10 +00:00
|
|
|
#include <kernaux/macro.h>
|
2022-12-09 02:59:54 +00:00
|
|
|
#include <kernaux/generic/display.h>
|
2022-11-30 23:49:16 +00:00
|
|
|
#include <kernaux/multiboot2/header_macro.h>
|
2022-06-15 11:02:33 +00:00
|
|
|
|
2022-01-11 09:10:16 +00:00
|
|
|
#include <stdint.h>
|
2021-12-13 20:46:58 +00:00
|
|
|
#include <stdbool.h>
|
|
|
|
|
2022-01-24 02:50:16 +00:00
|
|
|
#define KERNAUX_MULTIBOOT2_HEADER_MAGIC 0xe85250d6
|
|
|
|
#define KERNAUX_MULTIBOOT2_INFO_MAGIC 0x36d76289
|
2021-12-13 20:46:58 +00:00
|
|
|
|
2022-12-01 19:42:43 +00:00
|
|
|
// @see https://www.gnu.org/software/grub/manual/multiboot2/multiboot.html#OS-image-format
|
|
|
|
#define KERNAUX_MULTIBOOT2_HEADER_ALIGN 8
|
|
|
|
// @see https://www.gnu.org/software/grub/manual/multiboot2/multiboot.html#Basic-tags-structure
|
|
|
|
#define KERNAUX_MULTIBOOT2_INFO_ALIGN 8
|
|
|
|
// @see https://www.gnu.org/software/grub/manual/multiboot2/multiboot.html#Header-tags
|
|
|
|
// @see https://www.gnu.org/software/grub/manual/multiboot2/multiboot.html#Basic-tags-structure
|
|
|
|
#define KERNAUX_MULTIBOOT2_TAG_ALIGN 8
|
2022-01-14 05:44:44 +00:00
|
|
|
|
2022-01-11 09:29:56 +00:00
|
|
|
#define KERNAUX_MULTIBOOT2_DATA(ptr) (((uint8_t*)(ptr)) + sizeof(*(ptr)))
|
2022-01-13 12:53:22 +00:00
|
|
|
|
2022-01-13 12:55:59 +00:00
|
|
|
#define KERNAUX_MULTIBOOT2_HTAG_NEXT(tag_base) \
|
|
|
|
((struct KernAux_Multiboot2_HTagBase*)KERNAUX_MULTIBOOT2_TAG_NEXT(tag_base))
|
|
|
|
#define KERNAUX_MULTIBOOT2_ITAG_NEXT(tag_base) \
|
|
|
|
((struct KernAux_Multiboot2_ITagBase*)KERNAUX_MULTIBOOT2_TAG_NEXT(tag_base))
|
2022-01-13 12:53:22 +00:00
|
|
|
#define KERNAUX_MULTIBOOT2_TAG_NEXT(tag_base) \
|
|
|
|
((uint8_t*)tag_base + KERNAUX_MULTIBOOT2_TAG_SIZE_ALIGN(tag_base))
|
2022-01-13 12:46:05 +00:00
|
|
|
#define KERNAUX_MULTIBOOT2_TAG_SIZE_ALIGN(tag_base) \
|
|
|
|
(((tag_base)->size + 7) & ~7)
|
2022-01-11 09:10:16 +00:00
|
|
|
|
2022-01-14 04:27:55 +00:00
|
|
|
#define KERNAUX_MULTIBOOT2_HTAG_BASE_FLAG_OPTIONAL 1
|
|
|
|
|
2022-06-30 15:39:50 +00:00
|
|
|
#define KERNAUX_MULTIBOOT2_HTAG_FLAGS_REQUIRE_CONSOLE KERNAUX_BITS(0)
|
|
|
|
#define KERNAUX_MULTIBOOT2_HTAG_FLAGS_EGA_SUPPORT KERNAUX_BITS(1)
|
2022-01-14 04:01:01 +00:00
|
|
|
|
2022-06-24 23:07:10 +00:00
|
|
|
#include <kernaux/macro/packing_start.run>
|
2022-06-12 10:25:10 +00:00
|
|
|
|
2022-12-17 02:31:09 +00:00
|
|
|
/**********************
|
|
|
|
* Header basic types *
|
|
|
|
**********************/
|
2022-01-14 06:11:18 +00:00
|
|
|
|
2022-01-13 13:04:34 +00:00
|
|
|
struct KernAux_Multiboot2_Header {
|
2022-12-07 23:13:27 +00:00
|
|
|
uint32_t magic;
|
2022-12-17 02:31:09 +00:00
|
|
|
uint32_t arch;
|
2022-12-07 23:13:27 +00:00
|
|
|
uint32_t total_size;
|
|
|
|
uint32_t checksum;
|
2022-01-13 13:04:34 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_Header, 16);
|
2022-01-13 13:04:34 +00:00
|
|
|
|
2022-01-13 02:56:08 +00:00
|
|
|
struct KernAux_Multiboot2_HTagBase {
|
2022-12-17 02:31:09 +00:00
|
|
|
uint16_t type;
|
2022-12-07 23:13:27 +00:00
|
|
|
uint16_t flags;
|
|
|
|
uint32_t size;
|
2022-01-13 02:56:08 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_HTagBase, 8);
|
2022-01-13 02:56:08 +00:00
|
|
|
|
2022-12-17 02:31:09 +00:00
|
|
|
/***************************
|
|
|
|
* Information basic types *
|
|
|
|
***************************/
|
2022-01-13 02:56:08 +00:00
|
|
|
|
2022-01-13 13:04:34 +00:00
|
|
|
struct KernAux_Multiboot2_Info {
|
2022-12-07 23:13:27 +00:00
|
|
|
uint32_t total_size;
|
2022-12-16 08:28:58 +00:00
|
|
|
uint32_t reserved;
|
2022-01-13 13:04:34 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_Info, 8);
|
2022-01-13 13:04:34 +00:00
|
|
|
|
2022-01-13 03:03:15 +00:00
|
|
|
struct KernAux_Multiboot2_ITagBase {
|
2022-12-17 02:31:09 +00:00
|
|
|
uint32_t type;
|
2022-12-07 23:13:27 +00:00
|
|
|
uint32_t size;
|
2020-11-27 20:10:21 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_ITagBase, 8);
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-01-14 06:07:46 +00:00
|
|
|
/********************************
|
|
|
|
* Information additional types *
|
|
|
|
********************************/
|
|
|
|
|
|
|
|
struct KernAux_Multiboot2_ITag_MemoryMap_EntryBase {
|
2022-12-07 23:13:27 +00:00
|
|
|
uint64_t base_addr;
|
|
|
|
uint64_t length;
|
|
|
|
uint32_t type;
|
2022-12-16 08:28:58 +00:00
|
|
|
uint32_t reserved;
|
2022-01-14 06:07:46 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_ITag_MemoryMap_EntryBase, 24);
|
2022-01-14 06:07:46 +00:00
|
|
|
|
2022-01-13 11:46:40 +00:00
|
|
|
/*************************
|
|
|
|
* Header tag structures *
|
|
|
|
*************************/
|
|
|
|
|
|
|
|
struct KernAux_Multiboot2_HTag_None {
|
|
|
|
// type = 0
|
|
|
|
// size = 8
|
|
|
|
struct KernAux_Multiboot2_HTagBase base;
|
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_HTag_None, 8);
|
2022-01-13 11:46:40 +00:00
|
|
|
|
|
|
|
struct KernAux_Multiboot2_HTag_InfoReq {
|
|
|
|
// type = 1
|
|
|
|
// size > 8
|
|
|
|
struct KernAux_Multiboot2_HTagBase base;
|
2022-12-16 08:28:58 +00:00
|
|
|
|
|
|
|
// DATA: uint32_t mbi_tag_types[]
|
2022-01-13 11:46:40 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_HTag_InfoReq, 8);
|
2022-01-13 11:46:40 +00:00
|
|
|
|
|
|
|
struct KernAux_Multiboot2_HTag_Addr {
|
|
|
|
// type = 2
|
|
|
|
// size = 24
|
|
|
|
struct KernAux_Multiboot2_HTagBase base;
|
|
|
|
|
2022-12-07 23:13:27 +00:00
|
|
|
uint32_t header_addr;
|
|
|
|
uint32_t load_addr;
|
|
|
|
uint32_t load_end_addr;
|
|
|
|
uint32_t bss_end_addr;
|
2022-01-13 11:46:40 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_HTag_Addr, 24);
|
2022-01-13 11:46:40 +00:00
|
|
|
|
|
|
|
struct KernAux_Multiboot2_HTag_EntryAddr {
|
|
|
|
// type = 3
|
|
|
|
// size = 12
|
|
|
|
struct KernAux_Multiboot2_HTagBase base;
|
|
|
|
|
2022-12-07 23:13:27 +00:00
|
|
|
uint32_t entry_addr;
|
2022-01-13 11:46:40 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_HTag_EntryAddr, 12);
|
2022-01-13 11:46:40 +00:00
|
|
|
|
|
|
|
struct KernAux_Multiboot2_HTag_Flags {
|
|
|
|
// type = 4
|
|
|
|
// size = 12
|
|
|
|
struct KernAux_Multiboot2_HTagBase base;
|
|
|
|
|
2022-12-07 23:13:27 +00:00
|
|
|
uint32_t console_flags;
|
2022-01-13 11:46:40 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_HTag_Flags, 12);
|
2022-01-13 11:46:40 +00:00
|
|
|
|
|
|
|
struct KernAux_Multiboot2_HTag_Framebuffer {
|
|
|
|
// type = 5
|
|
|
|
// size = 20
|
|
|
|
struct KernAux_Multiboot2_HTagBase base;
|
|
|
|
|
2022-12-07 23:13:27 +00:00
|
|
|
uint32_t width;
|
|
|
|
uint32_t height;
|
|
|
|
uint32_t depth;
|
2022-01-13 11:46:40 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_HTag_Framebuffer, 20);
|
2022-01-13 11:46:40 +00:00
|
|
|
|
|
|
|
struct KernAux_Multiboot2_HTag_ModuleAlign {
|
|
|
|
// type = 6
|
|
|
|
// size = 8
|
|
|
|
struct KernAux_Multiboot2_HTagBase base;
|
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_HTag_ModuleAlign, 8);
|
2022-01-13 11:46:40 +00:00
|
|
|
|
|
|
|
struct KernAux_Multiboot2_HTag_EFIBootServices {
|
|
|
|
// type = 7
|
|
|
|
// size = 8
|
|
|
|
struct KernAux_Multiboot2_HTagBase base;
|
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_HTag_EFIBootServices, 8);
|
2022-01-13 11:46:40 +00:00
|
|
|
|
|
|
|
struct KernAux_Multiboot2_HTag_EFII386EntryAddr {
|
|
|
|
// type = 8
|
|
|
|
// size = 12
|
|
|
|
struct KernAux_Multiboot2_HTagBase base;
|
|
|
|
|
2022-12-07 23:13:27 +00:00
|
|
|
uint32_t entry_addr;
|
2022-01-13 11:46:40 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_HTag_EFII386EntryAddr, 12);
|
2022-01-13 11:46:40 +00:00
|
|
|
|
|
|
|
struct KernAux_Multiboot2_HTag_EFIAmd64EntryAddr {
|
|
|
|
// type = 9
|
|
|
|
// size = 12
|
|
|
|
struct KernAux_Multiboot2_HTagBase base;
|
|
|
|
|
2022-12-07 23:13:27 +00:00
|
|
|
uint32_t entry_addr;
|
2022-01-13 11:46:40 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_HTag_EFIAmd64EntryAddr, 12);
|
2022-01-13 11:46:40 +00:00
|
|
|
|
|
|
|
struct KernAux_Multiboot2_HTag_RelocatableHeader {
|
|
|
|
// type = 10
|
|
|
|
// size = 24
|
|
|
|
struct KernAux_Multiboot2_HTagBase base;
|
|
|
|
|
2022-12-07 23:13:27 +00:00
|
|
|
uint32_t min_addr;
|
|
|
|
uint32_t max_addr;
|
|
|
|
uint32_t align;
|
2022-12-17 02:31:09 +00:00
|
|
|
uint32_t preference;
|
2022-01-13 11:46:40 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_HTag_RelocatableHeader, 24);
|
2022-01-13 11:46:40 +00:00
|
|
|
|
2022-01-13 03:38:51 +00:00
|
|
|
/******************************
|
|
|
|
* Information tag structures *
|
|
|
|
******************************/
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-01-13 03:38:51 +00:00
|
|
|
struct KernAux_Multiboot2_ITag_None {
|
2020-11-27 21:24:12 +00:00
|
|
|
// type = 0
|
|
|
|
// size = 8
|
2022-01-13 03:03:15 +00:00
|
|
|
struct KernAux_Multiboot2_ITagBase base;
|
2020-11-27 21:24:12 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_ITag_None, 8);
|
2020-11-27 21:24:12 +00:00
|
|
|
|
2022-01-13 03:38:51 +00:00
|
|
|
struct KernAux_Multiboot2_ITag_BootCmdLine {
|
2020-11-27 20:02:43 +00:00
|
|
|
// type = 1
|
2022-06-12 10:25:10 +00:00
|
|
|
// size > 8
|
2022-01-13 03:03:15 +00:00
|
|
|
struct KernAux_Multiboot2_ITagBase base;
|
2022-12-16 08:28:58 +00:00
|
|
|
|
|
|
|
// DATA: char cmdline[]
|
2020-11-27 20:10:21 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_ITag_BootCmdLine, 8);
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-01-13 03:38:51 +00:00
|
|
|
struct KernAux_Multiboot2_ITag_BootLoaderName {
|
2020-11-27 20:02:43 +00:00
|
|
|
// type = 2
|
2022-06-12 10:25:10 +00:00
|
|
|
// size > 8
|
2022-01-13 03:03:15 +00:00
|
|
|
struct KernAux_Multiboot2_ITagBase base;
|
2022-12-16 08:28:58 +00:00
|
|
|
|
|
|
|
// DATA: char name[]
|
2020-11-27 20:10:21 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_ITag_BootLoaderName, 8);
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-01-13 03:38:51 +00:00
|
|
|
struct KernAux_Multiboot2_ITag_Module {
|
2020-11-27 20:02:43 +00:00
|
|
|
// type = 3
|
2022-06-12 10:25:10 +00:00
|
|
|
// size > 16
|
2022-01-13 03:03:15 +00:00
|
|
|
struct KernAux_Multiboot2_ITagBase base;
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-12-07 23:13:27 +00:00
|
|
|
uint32_t mod_start;
|
|
|
|
uint32_t mod_end;
|
2022-12-16 08:28:58 +00:00
|
|
|
|
|
|
|
// DATA: char cmdline[]
|
2020-11-27 20:10:21 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_ITag_Module, 16);
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-01-13 03:38:51 +00:00
|
|
|
struct KernAux_Multiboot2_ITag_BasicMemoryInfo {
|
2020-11-27 20:02:43 +00:00
|
|
|
// type = 4
|
|
|
|
// size = 16
|
2022-01-13 03:03:15 +00:00
|
|
|
struct KernAux_Multiboot2_ITagBase base;
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-12-07 23:13:27 +00:00
|
|
|
uint32_t mem_lower;
|
|
|
|
uint32_t mem_upper;
|
2020-11-27 20:10:21 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_ITag_BasicMemoryInfo, 16);
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-01-13 03:38:51 +00:00
|
|
|
struct KernAux_Multiboot2_ITag_BIOSBootDevice {
|
2020-11-27 20:02:43 +00:00
|
|
|
// type = 5
|
|
|
|
// size = 20
|
2022-01-13 03:03:15 +00:00
|
|
|
struct KernAux_Multiboot2_ITagBase base;
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-12-16 08:28:58 +00:00
|
|
|
uint32_t biosdev;
|
2022-12-07 23:13:27 +00:00
|
|
|
uint32_t partition;
|
|
|
|
uint32_t sub_partition;
|
2020-11-27 20:10:21 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_ITag_BIOSBootDevice, 20);
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-01-13 03:38:51 +00:00
|
|
|
struct KernAux_Multiboot2_ITag_MemoryMap {
|
2020-11-27 20:14:18 +00:00
|
|
|
// type = 6
|
2022-06-12 10:25:10 +00:00
|
|
|
// size > 16
|
2022-01-13 03:03:15 +00:00
|
|
|
struct KernAux_Multiboot2_ITagBase base;
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-12-07 23:13:27 +00:00
|
|
|
uint32_t entry_size;
|
|
|
|
uint32_t entry_version;
|
2022-12-16 08:28:58 +00:00
|
|
|
|
|
|
|
// DATA: varies(entry_size) KernAux_Multiboot2_ITag_MemoryMap_EntryBase entries[]
|
2020-11-27 20:10:21 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_ITag_MemoryMap, 16);
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-01-13 03:38:51 +00:00
|
|
|
struct KernAux_Multiboot2_ITag_VBEInfo {
|
2020-11-27 20:02:43 +00:00
|
|
|
// type = 7
|
|
|
|
// size = 784
|
2022-01-13 03:03:15 +00:00
|
|
|
struct KernAux_Multiboot2_ITagBase base;
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-12-07 23:13:27 +00:00
|
|
|
uint16_t vbe_mode;
|
|
|
|
uint16_t vbe_interface_seg;
|
|
|
|
uint16_t vbe_interface_off;
|
|
|
|
uint16_t vbe_interface_len;
|
|
|
|
uint8_t vbe_control_info[512];
|
|
|
|
uint8_t vbe_mode_info[256];
|
2020-11-27 20:10:21 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_ITag_VBEInfo, 784);
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-01-13 03:38:51 +00:00
|
|
|
struct KernAux_Multiboot2_ITag_FramebufferInfo {
|
2020-11-27 20:02:43 +00:00
|
|
|
// type = 8
|
2022-12-16 08:28:58 +00:00
|
|
|
// size > 32
|
2022-01-13 03:03:15 +00:00
|
|
|
struct KernAux_Multiboot2_ITagBase base;
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-12-07 23:13:27 +00:00
|
|
|
uint64_t framebuffer_addr;
|
|
|
|
uint32_t framebuffer_pitch;
|
|
|
|
uint32_t framebuffer_width;
|
|
|
|
uint32_t framebuffer_height;
|
|
|
|
uint8_t framebuffer_bpp;
|
|
|
|
uint8_t framebuffer_type;
|
2022-12-16 08:28:58 +00:00
|
|
|
|
|
|
|
// WARNING: GRUB 2 and Limine don't follow the spec, so we do not too!
|
|
|
|
// Multiboot 2: https://www.gnu.org/software/grub/manual/multiboot2/multiboot.html#Framebuffer-info
|
|
|
|
// GRUB 2: https://github.com/rhboot/grub2/blob/7259d55ffcf124e32eafb61aa381f9856e98a708/include/multiboot2.h#L288
|
|
|
|
// Limine: https://github.com/limine-bootloader/limine/blob/1aba6b3aeb72ac55b177132ca75ea8adfbcb78aa/common/protos/multiboot2.h#L292
|
|
|
|
uint16_t reserved;
|
|
|
|
|
|
|
|
// DATA: varies color_info[]
|
2020-11-27 20:10:21 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
2022-12-16 08:28:58 +00:00
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_ITag_FramebufferInfo, 32);
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-12-16 08:28:58 +00:00
|
|
|
// WARNING: GRUB 2 and Limine don't follow the spec, so we do not too!
|
|
|
|
// Multiboot 2: https://www.gnu.org/software/grub/manual/multiboot2/multiboot.html#ELF_002dSymbols
|
|
|
|
// GRUB 2: https://github.com/rhboot/grub2/blob/7259d55ffcf124e32eafb61aa381f9856e98a708/include/multiboot2.h#L314-L322
|
|
|
|
// Limine: https://github.com/limine-bootloader/limine/blob/1aba6b3aeb72ac55b177132ca75ea8adfbcb78aa/common/protos/multiboot2.h#L318-L326
|
2022-01-13 03:38:51 +00:00
|
|
|
struct KernAux_Multiboot2_ITag_ELFSymbols {
|
2020-11-27 20:02:43 +00:00
|
|
|
// type = 9
|
2022-12-16 08:28:58 +00:00
|
|
|
// size > 20
|
2022-01-13 03:03:15 +00:00
|
|
|
struct KernAux_Multiboot2_ITagBase base;
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-12-16 08:28:58 +00:00
|
|
|
uint32_t num;
|
|
|
|
uint32_t entsize;
|
|
|
|
uint32_t shndx;
|
|
|
|
|
2022-12-19 11:59:08 +00:00
|
|
|
// DATA: varies(entsize) section_headers[]
|
2020-11-27 20:10:21 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
2022-12-16 08:28:58 +00:00
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_ITag_ELFSymbols, 20);
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-01-13 03:38:51 +00:00
|
|
|
struct KernAux_Multiboot2_ITag_APMTable {
|
2020-11-27 20:02:43 +00:00
|
|
|
// type = 10
|
2020-11-27 20:14:18 +00:00
|
|
|
// size = 28
|
2022-01-13 03:03:15 +00:00
|
|
|
struct KernAux_Multiboot2_ITagBase base;
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-12-07 23:13:27 +00:00
|
|
|
uint16_t version;
|
|
|
|
uint16_t cseg;
|
|
|
|
uint32_t offset;
|
|
|
|
uint16_t cseg_16;
|
|
|
|
uint16_t dseg;
|
|
|
|
uint16_t flags;
|
|
|
|
uint16_t cseg_len;
|
|
|
|
uint16_t cseg_16_len;
|
|
|
|
uint16_t dseg_len;
|
2020-11-27 20:10:21 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_ITag_APMTable, 28);
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-01-13 03:38:51 +00:00
|
|
|
struct KernAux_Multiboot2_ITag_EFI32bitSystemTablePtr {
|
2020-11-27 20:02:43 +00:00
|
|
|
// type = 11
|
|
|
|
// size = 12
|
2022-01-13 03:03:15 +00:00
|
|
|
struct KernAux_Multiboot2_ITagBase base;
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-12-07 23:13:27 +00:00
|
|
|
uint32_t pointer;
|
2020-11-27 20:10:21 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_ITag_EFI32bitSystemTablePtr, 12);
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-01-13 03:38:51 +00:00
|
|
|
struct KernAux_Multiboot2_ITag_EFI64bitSystemTablePtr {
|
2020-11-27 20:02:43 +00:00
|
|
|
// type = 12
|
|
|
|
// size = 16
|
2022-01-13 03:03:15 +00:00
|
|
|
struct KernAux_Multiboot2_ITagBase base;
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-12-07 23:13:27 +00:00
|
|
|
uint64_t pointer;
|
2020-11-27 20:10:21 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_ITag_EFI64bitSystemTablePtr, 16);
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-01-13 03:38:51 +00:00
|
|
|
struct KernAux_Multiboot2_ITag_SMBIOSTables {
|
2020-11-27 20:02:43 +00:00
|
|
|
// type = 13
|
2022-06-12 10:25:10 +00:00
|
|
|
// size > 16
|
2022-01-13 03:03:15 +00:00
|
|
|
struct KernAux_Multiboot2_ITagBase base;
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-12-07 23:13:27 +00:00
|
|
|
uint8_t major;
|
|
|
|
uint8_t minor;
|
2022-12-16 08:28:58 +00:00
|
|
|
uint8_t reserved[6];
|
|
|
|
|
|
|
|
// TODO: DATA?
|
2020-11-27 20:10:21 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_ITag_SMBIOSTables, 16);
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-01-13 03:38:51 +00:00
|
|
|
struct KernAux_Multiboot2_ITag_ACPIOldRSDP {
|
2020-11-27 20:02:43 +00:00
|
|
|
// type = 14
|
2022-06-12 10:25:10 +00:00
|
|
|
// size > 8
|
2022-01-13 03:03:15 +00:00
|
|
|
struct KernAux_Multiboot2_ITagBase base;
|
2022-12-16 08:28:58 +00:00
|
|
|
|
|
|
|
// TODO: DATA?
|
2020-11-27 20:10:21 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_ITag_ACPIOldRSDP, 8);
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-01-13 03:38:51 +00:00
|
|
|
struct KernAux_Multiboot2_ITag_ACPINewRSDP {
|
2020-11-27 20:02:43 +00:00
|
|
|
// type = 15
|
2022-06-12 10:25:10 +00:00
|
|
|
// size > 8
|
2022-01-13 03:03:15 +00:00
|
|
|
struct KernAux_Multiboot2_ITagBase base;
|
2022-12-16 08:28:58 +00:00
|
|
|
|
|
|
|
// TODO: DATA?
|
2020-11-27 20:10:21 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_ITag_ACPINewRSDP, 8);
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-01-13 03:38:51 +00:00
|
|
|
struct KernAux_Multiboot2_ITag_NetworkingInfo {
|
2020-11-27 20:02:43 +00:00
|
|
|
// type = 16
|
2022-06-12 10:25:10 +00:00
|
|
|
// size > 8
|
2022-01-13 03:03:15 +00:00
|
|
|
struct KernAux_Multiboot2_ITagBase base;
|
2022-12-16 08:28:58 +00:00
|
|
|
|
|
|
|
// TODO: DATA?
|
2020-11-27 20:10:21 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_ITag_NetworkingInfo, 8);
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-01-13 03:38:51 +00:00
|
|
|
struct KernAux_Multiboot2_ITag_EFIMemoryMap {
|
2020-11-27 20:02:43 +00:00
|
|
|
// type = 17
|
2022-06-12 10:25:10 +00:00
|
|
|
// size > 16
|
2022-01-13 03:03:15 +00:00
|
|
|
struct KernAux_Multiboot2_ITagBase base;
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-12-07 23:13:27 +00:00
|
|
|
uint32_t descriptor_size;
|
|
|
|
uint32_t descriptor_version;
|
2022-12-16 08:28:58 +00:00
|
|
|
|
|
|
|
// TODO: DATA?
|
2020-11-27 20:10:21 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_ITag_EFIMemoryMap, 16);
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-01-13 03:38:51 +00:00
|
|
|
struct KernAux_Multiboot2_ITag_EFIBootServicesNotTerminated {
|
2020-11-27 20:02:43 +00:00
|
|
|
// type = 18
|
|
|
|
// size = 8
|
2022-01-13 03:03:15 +00:00
|
|
|
struct KernAux_Multiboot2_ITagBase base;
|
2020-11-27 20:10:21 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(
|
|
|
|
KernAux_Multiboot2_ITag_EFIBootServicesNotTerminated,
|
|
|
|
8
|
|
|
|
);
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-01-13 03:38:51 +00:00
|
|
|
struct KernAux_Multiboot2_ITag_EFI32bitImageHandlePtr {
|
2020-11-27 20:02:43 +00:00
|
|
|
// type = 19
|
|
|
|
// size = 12
|
2022-01-13 03:03:15 +00:00
|
|
|
struct KernAux_Multiboot2_ITagBase base;
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-12-07 23:13:27 +00:00
|
|
|
uint32_t pointer;
|
2020-11-27 20:10:21 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(
|
|
|
|
KernAux_Multiboot2_ITag_EFI32bitImageHandlePtr,
|
|
|
|
12
|
|
|
|
);
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-01-13 03:38:51 +00:00
|
|
|
struct KernAux_Multiboot2_ITag_EFI64bitImageHandlePtr {
|
2020-11-27 20:02:43 +00:00
|
|
|
// type = 20
|
|
|
|
// size = 16
|
2022-01-13 03:03:15 +00:00
|
|
|
struct KernAux_Multiboot2_ITagBase base;
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-12-07 23:13:27 +00:00
|
|
|
uint64_t pointer;
|
2020-11-27 20:10:21 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2022-06-24 23:07:10 +00:00
|
|
|
|
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(
|
|
|
|
KernAux_Multiboot2_ITag_EFI64bitImageHandlePtr,
|
|
|
|
16
|
|
|
|
);
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-01-13 03:38:51 +00:00
|
|
|
struct KernAux_Multiboot2_ITag_ImageLoadBasePhysAddr {
|
2020-11-27 20:02:43 +00:00
|
|
|
// type = 21
|
|
|
|
// size = 12
|
2022-01-13 03:03:15 +00:00
|
|
|
struct KernAux_Multiboot2_ITagBase base;
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-12-07 23:13:27 +00:00
|
|
|
uint32_t load_base_addr;
|
2020-11-27 20:10:21 +00:00
|
|
|
}
|
2022-11-29 01:19:35 +00:00
|
|
|
KERNAUX_PACKED;
|
2020-11-27 20:02:43 +00:00
|
|
|
|
2022-06-24 23:07:10 +00:00
|
|
|
KERNAUX_STATIC_TEST_STRUCT_SIZE(
|
|
|
|
KernAux_Multiboot2_ITag_ImageLoadBasePhysAddr,
|
|
|
|
12
|
|
|
|
);
|
|
|
|
|
|
|
|
#include <kernaux/macro/packing_end.run>
|
2022-06-12 10:25:10 +00:00
|
|
|
|
2022-12-17 02:31:09 +00:00
|
|
|
/*********
|
|
|
|
* Enums *
|
|
|
|
*********/
|
2022-01-13 14:07:13 +00:00
|
|
|
|
2022-12-17 02:31:09 +00:00
|
|
|
#include <kernaux/multiboot2/header_enums.h>
|
|
|
|
#include <kernaux/multiboot2/info_enums.h>
|
2022-01-14 06:20:16 +00:00
|
|
|
|
2022-12-16 08:28:58 +00:00
|
|
|
/********************
|
|
|
|
* Helper functions *
|
|
|
|
********************/
|
2022-01-15 06:40:02 +00:00
|
|
|
|
2022-12-16 08:28:58 +00:00
|
|
|
#include <kernaux/multiboot2/header_helpers.h>
|
|
|
|
#include <kernaux/multiboot2/info_helpers.h>
|
2022-01-15 06:40:02 +00:00
|
|
|
|
2022-12-16 08:28:58 +00:00
|
|
|
/************************
|
|
|
|
* Validation functions *
|
|
|
|
************************/
|
2022-01-15 06:40:02 +00:00
|
|
|
|
2022-12-16 08:28:58 +00:00
|
|
|
#include <kernaux/multiboot2/header_is_valid.h>
|
|
|
|
#include <kernaux/multiboot2/info_is_valid.h>
|
2022-01-15 06:40:02 +00:00
|
|
|
|
2022-12-16 08:28:58 +00:00
|
|
|
/*******************
|
|
|
|
* Print functions *
|
|
|
|
*******************/
|
2022-01-15 06:40:02 +00:00
|
|
|
|
2022-12-16 08:28:58 +00:00
|
|
|
#include <kernaux/multiboot2/header_print.h>
|
|
|
|
#include <kernaux/multiboot2/info_print.h>
|
2022-01-15 06:40:02 +00:00
|
|
|
|
2020-11-27 20:02:43 +00:00
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif
|