From 22ec69dfcafdc7341470ac60982769a1d5f50b66 Mon Sep 17 00:00:00 2001 From: Alex Kotov Date: Sat, 17 Dec 2022 06:31:09 +0400 Subject: [PATCH] Improve Multiboot 2 API (#148) --- Makefile.am | 3 +- include/Makefile.am | 2 + include/kernaux/multiboot2.h | 97 +++---------------- include/kernaux/multiboot2/header_enums.h | 40 ++++++++ include/kernaux/multiboot2/header_helpers.h | 4 +- include/kernaux/multiboot2/info_enums.h | 41 ++++++++ include/kernaux/multiboot2/info_helpers.h | 4 +- src/multiboot2/header_enums.c | 65 +++++++++++++ src/multiboot2/header_helpers.c | 4 +- src/multiboot2/header_is_valid.c | 2 +- src/multiboot2/header_print.c | 25 +++-- .../{enums_to_str.c => info_enums.c} | 65 +------------ src/multiboot2/info_helpers.c | 4 +- src/multiboot2/info_print.c | 5 +- tests/multiboot2_header_example2.h | 2 +- tests/test_multiboot2_header_print.c | 1 + 16 files changed, 199 insertions(+), 165 deletions(-) create mode 100644 include/kernaux/multiboot2/header_enums.h create mode 100644 include/kernaux/multiboot2/info_enums.h create mode 100644 src/multiboot2/header_enums.c rename src/multiboot2/{enums_to_str.c => info_enums.c} (51%) diff --git a/Makefile.am b/Makefile.am index 15886e3..cb51c70 100644 --- a/Makefile.am +++ b/Makefile.am @@ -89,10 +89,11 @@ libkernaux_la_SOURCES += src/memmap.c endif if WITH_MULTIBOOT2 libkernaux_la_SOURCES += \ - src/multiboot2/enums_to_str.c \ + src/multiboot2/header_enums.c \ src/multiboot2/header_helpers.c \ src/multiboot2/header_is_valid.c \ src/multiboot2/header_print.c \ + src/multiboot2/info_enums.c \ src/multiboot2/info_helpers.c \ src/multiboot2/info_is_valid.c \ src/multiboot2/info_print.c diff --git a/include/Makefile.am b/include/Makefile.am index 5c55567..f58d01d 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -22,10 +22,12 @@ nobase_include_HEADERS = \ kernaux/mbr.h \ kernaux/memmap.h \ kernaux/multiboot2.h \ + kernaux/multiboot2/header_enums.h \ kernaux/multiboot2/header_helpers.h \ kernaux/multiboot2/header_is_valid.h \ kernaux/multiboot2/header_macro.h \ kernaux/multiboot2/header_print.h \ + kernaux/multiboot2/info_enums.h \ kernaux/multiboot2/info_helpers.h \ kernaux/multiboot2/info_is_valid.h \ kernaux/multiboot2/info_print.h \ diff --git a/include/kernaux/multiboot2.h b/include/kernaux/multiboot2.h index 8120ac4..63d740f 100644 --- a/include/kernaux/multiboot2.h +++ b/include/kernaux/multiboot2.h @@ -41,18 +41,13 @@ extern "C" { #include -/*********************** - * Header common types * - ***********************/ - -enum KernAux_Multiboot2_Header_Arch { - KERNAUX_MULTIBOOT2_HEADER_ARCH_I386 = 0, - KERNAUX_MULTIBOOT2_HEADER_ARCH_MIPS32 = 4, -}; +/********************** + * Header basic types * + **********************/ struct KernAux_Multiboot2_Header { uint32_t magic; - enum KernAux_Multiboot2_Header_Arch arch : 32; + uint32_t arch; uint32_t total_size; uint32_t checksum; } @@ -60,22 +55,8 @@ KERNAUX_PACKED; KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_Header, 16); -enum KernAux_Multiboot2_HTag { - KERNAUX_MULTIBOOT2_HTAG_NONE = 0, - KERNAUX_MULTIBOOT2_HTAG_INFO_REQ = 1, - KERNAUX_MULTIBOOT2_HTAG_ADDR = 2, - KERNAUX_MULTIBOOT2_HTAG_ENTRY_ADDR = 3, - KERNAUX_MULTIBOOT2_HTAG_FLAGS = 4, - KERNAUX_MULTIBOOT2_HTAG_FRAMEBUFFER = 5, - KERNAUX_MULTIBOOT2_HTAG_MODULE_ALIGN = 6, - KERNAUX_MULTIBOOT2_HTAG_EFI_BOOT_SERVICES = 7, - KERNAUX_MULTIBOOT2_HTAG_EFI_I386_ENTRY_ADDR = 8, - KERNAUX_MULTIBOOT2_HTAG_EFI_AMD64_ENTRY_ADDR = 9, - KERNAUX_MULTIBOOT2_HTAG_RELOCATABLE_HEADER = 10, -}; - struct KernAux_Multiboot2_HTagBase { - enum KernAux_Multiboot2_HTag type : 16; + uint16_t type; uint16_t flags; uint32_t size; } @@ -83,9 +64,9 @@ KERNAUX_PACKED; KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_HTagBase, 8); -/**************************** - * Information common types * - ****************************/ +/*************************** + * Information basic types * + ***************************/ struct KernAux_Multiboot2_Info { uint32_t total_size; @@ -95,49 +76,14 @@ KERNAUX_PACKED; KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_Info, 8); -enum KernAux_Multiboot2_ITag { - KERNAUX_MULTIBOOT2_ITAG_NONE = 0, - KERNAUX_MULTIBOOT2_ITAG_BOOT_CMD_LINE = 1, - KERNAUX_MULTIBOOT2_ITAG_BOOT_LOADER_NAME = 2, - KERNAUX_MULTIBOOT2_ITAG_MODULE = 3, - KERNAUX_MULTIBOOT2_ITAG_BASIC_MEMORY_INFO = 4, - KERNAUX_MULTIBOOT2_ITAG_BIOS_BOOT_DEVICE = 5, - KERNAUX_MULTIBOOT2_ITAG_MEMORY_MAP = 6, - KERNAUX_MULTIBOOT2_ITAG_VBE_INFO = 7, - KERNAUX_MULTIBOOT2_ITAG_FRAMEBUFFER_INFO = 8, - KERNAUX_MULTIBOOT2_ITAG_ELF_SYMBOLS = 9, - KERNAUX_MULTIBOOT2_ITAG_APM_TABLE = 10, - KERNAUX_MULTIBOOT2_ITAG_EFI_32BIT_SYSTEM_TABLE_PTR = 11, - KERNAUX_MULTIBOOT2_ITAG_EFI_64BIT_SYSTEM_TABLE_PTR = 12, - KERNAUX_MULTIBOOT2_ITAG_SMBIOS_TABLES = 13, - KERNAUX_MULTIBOOT2_ITAG_ACPI_OLD_RSDP = 14, - KERNAUX_MULTIBOOT2_ITAG_ACPI_NEW_RSDP = 15, - KERNAUX_MULTIBOOT2_ITAG_NETWORKING_INFO = 16, - KERNAUX_MULTIBOOT2_ITAG_EFI_MEMORY_MAP = 17, - KERNAUX_MULTIBOOT2_ITAG_EFI_BOOT_SERVICES_NOT_TERMINATED = 18, - KERNAUX_MULTIBOOT2_ITAG_EFI_32BIT_IMAGE_HANDLE_PTR = 19, - KERNAUX_MULTIBOOT2_ITAG_EFI_64BIT_IMAGE_HANDLE_PTR = 20, - KERNAUX_MULTIBOOT2_ITAG_IMAGE_LOAD_BASE_PHYS_ADDR = 21, -}; - struct KernAux_Multiboot2_ITagBase { - enum KernAux_Multiboot2_ITag type : 32; + uint32_t type; uint32_t size; } KERNAUX_PACKED; KERNAUX_STATIC_TEST_STRUCT_SIZE(KernAux_Multiboot2_ITagBase, 8); -/*************************** - * Header additional types * - ***************************/ - -enum KernAux_Multiboot2_HTag_RelocatableHeader_Preference { - KERNAUX_MULTIBOOT2_HTAG_RELOCATABLE_HEADER_PREFERENCE_NONE = 0, - KERNAUX_MULTIBOOT2_HTAG_RELOCATABLE_HEADER_PREFERENCE_LOWEST = 1, - KERNAUX_MULTIBOOT2_HTAG_RELOCATABLE_HEADER_PREFERENCE_HIGHEST = 2, -}; - /******************************** * Information additional types * ********************************/ @@ -273,7 +219,7 @@ struct KernAux_Multiboot2_HTag_RelocatableHeader { uint32_t min_addr; uint32_t max_addr; uint32_t align; - enum KernAux_Multiboot2_HTag_RelocatableHeader_Preference preferences : 32; + uint32_t preference; } KERNAUX_PACKED; @@ -585,25 +531,12 @@ KERNAUX_STATIC_TEST_STRUCT_SIZE( #include -/******************** - * String functions * - ********************/ +/********* + * Enums * + *********/ -const char *KernAux_Multiboot2_Header_Arch_to_str( - enum KernAux_Multiboot2_Header_Arch arch -); - -const char *KernAux_Multiboot2_HTag_to_str( - enum KernAux_Multiboot2_HTag tag_type -); - -const char *KernAux_Multiboot2_ITag_to_str( - enum KernAux_Multiboot2_ITag tag_type -); - -const char *KernAux_Multiboot2_HTag_RelocatableHeader_Preference_to_str( - enum KernAux_Multiboot2_HTag_RelocatableHeader_Preference pref -); +#include +#include /******************** * Helper functions * diff --git a/include/kernaux/multiboot2/header_enums.h b/include/kernaux/multiboot2/header_enums.h new file mode 100644 index 0000000..526926f --- /dev/null +++ b/include/kernaux/multiboot2/header_enums.h @@ -0,0 +1,40 @@ +#ifndef KERNAUX_INCLUDED_MULTIBOOT2_HEADER_ENUMS +#define KERNAUX_INCLUDED_MULTIBOOT2_HEADER_ENUMS + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#include + +#define KERNAUX_MULTIBOOT2_HEADER_ARCH_I386 0 +#define KERNAUX_MULTIBOOT2_HEADER_ARCH_MIPS32 4 + +#define KERNAUX_MULTIBOOT2_HTAG_NONE 0 +#define KERNAUX_MULTIBOOT2_HTAG_INFO_REQ 1 +#define KERNAUX_MULTIBOOT2_HTAG_ADDR 2 +#define KERNAUX_MULTIBOOT2_HTAG_ENTRY_ADDR 3 +#define KERNAUX_MULTIBOOT2_HTAG_FLAGS 4 +#define KERNAUX_MULTIBOOT2_HTAG_FRAMEBUFFER 5 +#define KERNAUX_MULTIBOOT2_HTAG_MODULE_ALIGN 6 +#define KERNAUX_MULTIBOOT2_HTAG_EFI_BOOT_SERVICES 7 +#define KERNAUX_MULTIBOOT2_HTAG_EFI_I386_ENTRY_ADDR 8 +#define KERNAUX_MULTIBOOT2_HTAG_EFI_AMD64_ENTRY_ADDR 9 +#define KERNAUX_MULTIBOOT2_HTAG_RELOCATABLE_HEADER 10 + +#define KERNAUX_MULTIBOOT2_HTAG_RELOCATABLE_HEADER_PREFERENCE_NONE 0 +#define KERNAUX_MULTIBOOT2_HTAG_RELOCATABLE_HEADER_PREFERENCE_LOWEST 1 +#define KERNAUX_MULTIBOOT2_HTAG_RELOCATABLE_HEADER_PREFERENCE_HIGHEST 2 + +const char *KernAux_Multiboot2_Header_Arch_to_str(uint32_t arch); +const char *KernAux_Multiboot2_HTag_to_str(uint16_t tag_type); +const char* +KernAux_Multiboot2_HTag_RelocatableHeader_Preference_to_str(uint32_t pref); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/kernaux/multiboot2/header_helpers.h b/include/kernaux/multiboot2/header_helpers.h index a9d3be6..154a396 100644 --- a/include/kernaux/multiboot2/header_helpers.h +++ b/include/kernaux/multiboot2/header_helpers.h @@ -10,13 +10,13 @@ extern "C" { const struct KernAux_Multiboot2_HTagBase *KernAux_Multiboot2_Header_first_tag_with_type( const struct KernAux_Multiboot2_Header *multiboot2_header, - enum KernAux_Multiboot2_HTag tag_type + uint16_t tag_type ); const struct KernAux_Multiboot2_HTagBase *KernAux_Multiboot2_Header_tag_with_type_after( const struct KernAux_Multiboot2_Header *multiboot2_header, - enum KernAux_Multiboot2_HTag tag_type, + uint16_t tag_type, const struct KernAux_Multiboot2_HTagBase *after_tag ); diff --git a/include/kernaux/multiboot2/info_enums.h b/include/kernaux/multiboot2/info_enums.h new file mode 100644 index 0000000..b2f93de --- /dev/null +++ b/include/kernaux/multiboot2/info_enums.h @@ -0,0 +1,41 @@ +#ifndef KERNAUX_INCLUDED_MULTIBOOT2_INFO_ENUMS +#define KERNAUX_INCLUDED_MULTIBOOT2_INFO_ENUMS + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#include + +#define KERNAUX_MULTIBOOT2_ITAG_NONE 0 +#define KERNAUX_MULTIBOOT2_ITAG_BOOT_CMD_LINE 1 +#define KERNAUX_MULTIBOOT2_ITAG_BOOT_LOADER_NAME 2 +#define KERNAUX_MULTIBOOT2_ITAG_MODULE 3 +#define KERNAUX_MULTIBOOT2_ITAG_BASIC_MEMORY_INFO 4 +#define KERNAUX_MULTIBOOT2_ITAG_BIOS_BOOT_DEVICE 5 +#define KERNAUX_MULTIBOOT2_ITAG_MEMORY_MAP 6 +#define KERNAUX_MULTIBOOT2_ITAG_VBE_INFO 7 +#define KERNAUX_MULTIBOOT2_ITAG_FRAMEBUFFER_INFO 8 +#define KERNAUX_MULTIBOOT2_ITAG_ELF_SYMBOLS 9 +#define KERNAUX_MULTIBOOT2_ITAG_APM_TABLE 10 +#define KERNAUX_MULTIBOOT2_ITAG_EFI_32BIT_SYSTEM_TABLE_PTR 11 +#define KERNAUX_MULTIBOOT2_ITAG_EFI_64BIT_SYSTEM_TABLE_PTR 12 +#define KERNAUX_MULTIBOOT2_ITAG_SMBIOS_TABLES 13 +#define KERNAUX_MULTIBOOT2_ITAG_ACPI_OLD_RSDP 14 +#define KERNAUX_MULTIBOOT2_ITAG_ACPI_NEW_RSDP 15 +#define KERNAUX_MULTIBOOT2_ITAG_NETWORKING_INFO 16 +#define KERNAUX_MULTIBOOT2_ITAG_EFI_MEMORY_MAP 17 +#define KERNAUX_MULTIBOOT2_ITAG_EFI_BOOT_SERVICES_NOT_TERMINATED 18 +#define KERNAUX_MULTIBOOT2_ITAG_EFI_32BIT_IMAGE_HANDLE_PTR 19 +#define KERNAUX_MULTIBOOT2_ITAG_EFI_64BIT_IMAGE_HANDLE_PTR 20 +#define KERNAUX_MULTIBOOT2_ITAG_IMAGE_LOAD_BASE_PHYS_ADDR 21 + +const char *KernAux_Multiboot2_ITag_to_str(uint32_t tag_type); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/kernaux/multiboot2/info_helpers.h b/include/kernaux/multiboot2/info_helpers.h index 315c025..3abb505 100644 --- a/include/kernaux/multiboot2/info_helpers.h +++ b/include/kernaux/multiboot2/info_helpers.h @@ -10,13 +10,13 @@ extern "C" { const struct KernAux_Multiboot2_ITagBase *KernAux_Multiboot2_Info_first_tag_with_type( const struct KernAux_Multiboot2_Info *multiboot2_info, - enum KernAux_Multiboot2_ITag tag_type + uint32_t tag_type ); const struct KernAux_Multiboot2_ITagBase *KernAux_Multiboot2_Info_tag_with_type_after( const struct KernAux_Multiboot2_Info *multiboot2_info, - enum KernAux_Multiboot2_ITag tag_type, + uint32_t tag_type, const struct KernAux_Multiboot2_ITagBase *after_tag ); diff --git a/src/multiboot2/header_enums.c b/src/multiboot2/header_enums.c new file mode 100644 index 0000000..e0f1326 --- /dev/null +++ b/src/multiboot2/header_enums.c @@ -0,0 +1,65 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include +#include + +const char *KernAux_Multiboot2_Header_Arch_to_str(const uint32_t arch) +{ + switch (arch) { + case KERNAUX_MULTIBOOT2_HEADER_ARCH_I386: + return "i386"; + case KERNAUX_MULTIBOOT2_HEADER_ARCH_MIPS32: + return "MIPS32"; + default: + return NULL; + } +} + +const char *KernAux_Multiboot2_HTag_to_str(const uint16_t tag_type) +{ + switch (tag_type) { + case KERNAUX_MULTIBOOT2_HTAG_NONE: + return "none"; + case KERNAUX_MULTIBOOT2_HTAG_INFO_REQ: + return "information request"; + case KERNAUX_MULTIBOOT2_HTAG_ADDR: + return "address"; + case KERNAUX_MULTIBOOT2_HTAG_ENTRY_ADDR: + return "entry address"; + case KERNAUX_MULTIBOOT2_HTAG_FLAGS: + return "flags"; + case KERNAUX_MULTIBOOT2_HTAG_FRAMEBUFFER: + return "framebuffer"; + case KERNAUX_MULTIBOOT2_HTAG_MODULE_ALIGN: + return "module alignment"; + case KERNAUX_MULTIBOOT2_HTAG_EFI_BOOT_SERVICES: + return "EFI boot services"; + case KERNAUX_MULTIBOOT2_HTAG_EFI_I386_ENTRY_ADDR: + return "EFI i386 entry address"; + case KERNAUX_MULTIBOOT2_HTAG_EFI_AMD64_ENTRY_ADDR: + return "EFI amd64 entry address"; + case KERNAUX_MULTIBOOT2_HTAG_RELOCATABLE_HEADER: + return "relocatable header"; + default: + return NULL; + } +} + +const char* +KernAux_Multiboot2_HTag_RelocatableHeader_Preference_to_str(uint32_t pref) +{ + switch (pref) { + case KERNAUX_MULTIBOOT2_HTAG_RELOCATABLE_HEADER_PREFERENCE_NONE: + return "none"; + case KERNAUX_MULTIBOOT2_HTAG_RELOCATABLE_HEADER_PREFERENCE_LOWEST: + return "lowest"; + case KERNAUX_MULTIBOOT2_HTAG_RELOCATABLE_HEADER_PREFERENCE_HIGHEST: + return "highest"; + default: + return NULL; + } +} diff --git a/src/multiboot2/header_helpers.c b/src/multiboot2/header_helpers.c index c19559f..1eff980 100644 --- a/src/multiboot2/header_helpers.c +++ b/src/multiboot2/header_helpers.c @@ -11,7 +11,7 @@ const struct KernAux_Multiboot2_HTagBase *KernAux_Multiboot2_Header_first_tag_with_type( const struct KernAux_Multiboot2_Header *const multiboot2_header, - const enum KernAux_Multiboot2_HTag tag_type + const uint16_t tag_type ) { KERNAUX_ASSERT(multiboot2_header); @@ -35,7 +35,7 @@ const struct KernAux_Multiboot2_HTagBase const struct KernAux_Multiboot2_HTagBase *KernAux_Multiboot2_Header_tag_with_type_after( const struct KernAux_Multiboot2_Header *const multiboot2_header, - const enum KernAux_Multiboot2_HTag tag_type, + const uint16_t tag_type, const struct KernAux_Multiboot2_HTagBase *const after_tag ) { KERNAUX_ASSERT(multiboot2_header); diff --git a/src/multiboot2/header_is_valid.c b/src/multiboot2/header_is_valid.c index f01f85f..1409bd1 100644 --- a/src/multiboot2/header_is_valid.c +++ b/src/multiboot2/header_is_valid.c @@ -252,7 +252,7 @@ bool KernAux_Multiboot2_HTag_RelocatableHeader_is_valid( return false; } - switch (tag->preferences) { + switch (tag->preference) { case KERNAUX_MULTIBOOT2_HTAG_RELOCATABLE_HEADER_PREFERENCE_NONE: break; case KERNAUX_MULTIBOOT2_HTAG_RELOCATABLE_HEADER_PREFERENCE_LOWEST: break; case KERNAUX_MULTIBOOT2_HTAG_RELOCATABLE_HEADER_PREFERENCE_HIGHEST: break; diff --git a/src/multiboot2/header_print.c b/src/multiboot2/header_print.c index 8950475..bffe35f 100644 --- a/src/multiboot2/header_print.c +++ b/src/multiboot2/header_print.c @@ -27,11 +27,12 @@ PRINTLN("Multiboot 2 header tag // invalid!"); \ } \ \ - KERNAUX_CAST_CONST(unsigned long, size, tag->base.size); \ + KERNAUX_CAST_CONST(unsigned long, type, tag->base.type); \ + KERNAUX_CAST_CONST(unsigned long, size, tag->base.size); \ \ PRINTLN ("Multiboot 2 header tag {"); \ - PRINTLNF(" u16 type: %u (%s)", \ - tag->base.type, \ + PRINTLNF(" u16 type: %lu (%s)", \ + type, \ KernAux_Multiboot2_HTag_to_str(tag->base.type) \ ); \ PRINT (" u16 flags: "); \ @@ -103,13 +104,14 @@ void KernAux_Multiboot2_Header_print( KERNAUX_ASSERT(display); KERNAUX_CAST_CONST(unsigned long, magic, multiboot2_header->magic); + KERNAUX_CAST_CONST(unsigned long, arch, multiboot2_header->arch); KERNAUX_CAST_CONST(unsigned long, total_size, multiboot2_header->total_size); KERNAUX_CAST_CONST(unsigned long, checksum, multiboot2_header->checksum); PRINTLN("Multiboot 2 header {"); PRINTLNF(" u32 magic: 0x%lx", magic); - PRINTLNF(" u32 arch: %u (%s)", - multiboot2_header->arch, + PRINTLNF(" u32 arch: %lu (%s)", + arch, KernAux_Multiboot2_Header_Arch_to_str(multiboot2_header->arch) ); PRINTLNF(" u32 size: %lu", total_size); @@ -363,13 +365,20 @@ void KernAux_Multiboot2_HTag_RelocatableHeader_print( ) { HEADER(RelocatableHeader); - KERNAUX_CAST_CONST(unsigned long, min_addr, tag->min_addr); - KERNAUX_CAST_CONST(unsigned long, max_addr, tag->max_addr); - KERNAUX_CAST_CONST(unsigned long, align, tag->align); + KERNAUX_CAST_CONST(unsigned long, min_addr, tag->min_addr); + KERNAUX_CAST_CONST(unsigned long, max_addr, tag->max_addr); + KERNAUX_CAST_CONST(unsigned long, align, tag->align); + KERNAUX_CAST_CONST(unsigned long, preference, tag->preference); PRINTLNF(" u32 min_addr: 0x%lx", min_addr); PRINTLNF(" u32 max_addr: 0x%lx", max_addr); PRINTLNF(" u32 align: %lu", align); + PRINTLNF(" u32 preference: %lu (%s)", + preference, + KernAux_Multiboot2_HTag_RelocatableHeader_Preference_to_str( + tag->preference + ) + ); FOOTER; } diff --git a/src/multiboot2/enums_to_str.c b/src/multiboot2/info_enums.c similarity index 51% rename from src/multiboot2/enums_to_str.c rename to src/multiboot2/info_enums.c index 67dc4a4..4abbcf1 100644 --- a/src/multiboot2/enums_to_str.c +++ b/src/multiboot2/info_enums.c @@ -5,54 +5,10 @@ #include #include +#include -const char *KernAux_Multiboot2_Header_Arch_to_str( - const enum KernAux_Multiboot2_Header_Arch arch -) { - switch (arch) { - case KERNAUX_MULTIBOOT2_HEADER_ARCH_I386: - return "i386"; - case KERNAUX_MULTIBOOT2_HEADER_ARCH_MIPS32: - return "MIPS32"; - default: - return NULL; - } -} - -const char *KernAux_Multiboot2_HTag_to_str( - const enum KernAux_Multiboot2_HTag tag_type -) { - switch (tag_type) { - case KERNAUX_MULTIBOOT2_HTAG_NONE: - return "none"; - case KERNAUX_MULTIBOOT2_HTAG_INFO_REQ: - return "information request"; - case KERNAUX_MULTIBOOT2_HTAG_ADDR: - return "address"; - case KERNAUX_MULTIBOOT2_HTAG_ENTRY_ADDR: - return "entry address"; - case KERNAUX_MULTIBOOT2_HTAG_FLAGS: - return "flags"; - case KERNAUX_MULTIBOOT2_HTAG_FRAMEBUFFER: - return "framebuffer"; - case KERNAUX_MULTIBOOT2_HTAG_MODULE_ALIGN: - return "module alignment"; - case KERNAUX_MULTIBOOT2_HTAG_EFI_BOOT_SERVICES: - return "EFI boot services"; - case KERNAUX_MULTIBOOT2_HTAG_EFI_I386_ENTRY_ADDR: - return "EFI i386 entry address"; - case KERNAUX_MULTIBOOT2_HTAG_EFI_AMD64_ENTRY_ADDR: - return "EFI amd64 entry address"; - case KERNAUX_MULTIBOOT2_HTAG_RELOCATABLE_HEADER: - return "relocatable header"; - default: - return NULL; - } -} - -const char *KernAux_Multiboot2_ITag_to_str( - const enum KernAux_Multiboot2_ITag tag_type -) { +const char *KernAux_Multiboot2_ITag_to_str(const uint32_t tag_type) +{ switch (tag_type) { case KERNAUX_MULTIBOOT2_ITAG_NONE: return "none"; @@ -102,18 +58,3 @@ const char *KernAux_Multiboot2_ITag_to_str( return NULL; } } - -const char *KernAux_Multiboot2_HTag_RelocatableHeader_Preference_to_str( - const enum KernAux_Multiboot2_HTag_RelocatableHeader_Preference pref -) { - switch (pref) { - case KERNAUX_MULTIBOOT2_HTAG_RELOCATABLE_HEADER_PREFERENCE_NONE: - return "none"; - case KERNAUX_MULTIBOOT2_HTAG_RELOCATABLE_HEADER_PREFERENCE_LOWEST: - return "lowest"; - case KERNAUX_MULTIBOOT2_HTAG_RELOCATABLE_HEADER_PREFERENCE_HIGHEST: - return "highest"; - default: - return NULL; - } -} diff --git a/src/multiboot2/info_helpers.c b/src/multiboot2/info_helpers.c index a6e0b8b..3eeba2d 100644 --- a/src/multiboot2/info_helpers.c +++ b/src/multiboot2/info_helpers.c @@ -11,7 +11,7 @@ const struct KernAux_Multiboot2_ITagBase *KernAux_Multiboot2_Info_first_tag_with_type( const struct KernAux_Multiboot2_Info *const multiboot2_info, - const enum KernAux_Multiboot2_ITag tag_type + const uint32_t tag_type ) { KERNAUX_ASSERT(multiboot2_info); @@ -35,7 +35,7 @@ const struct KernAux_Multiboot2_ITagBase const struct KernAux_Multiboot2_ITagBase *KernAux_Multiboot2_Info_tag_with_type_after( const struct KernAux_Multiboot2_Info *const multiboot2_info, - const enum KernAux_Multiboot2_ITag tag_type, + const uint32_t tag_type, const struct KernAux_Multiboot2_ITagBase *const after_tag ) { KERNAUX_ASSERT(multiboot2_info); diff --git a/src/multiboot2/info_print.c b/src/multiboot2/info_print.c index 011a42d..81b1877 100644 --- a/src/multiboot2/info_print.c +++ b/src/multiboot2/info_print.c @@ -26,11 +26,12 @@ PRINTLN("Multiboot 2 info tag // invalid!"); \ } \ \ + KERNAUX_CAST_CONST(unsigned long, type, tag->base.type); \ KERNAUX_CAST_CONST(unsigned long, size, tag->base.size); \ \ PRINTLN("Multiboot 2 info tag {"); \ - PRINTLNF(" u32 type: %u (%s)", \ - tag->base.type, \ + PRINTLNF(" u32 type: %lu (%s)", \ + type, \ KernAux_Multiboot2_ITag_to_str(tag->base.type) \ ); \ PRINTLNF(" u32 size: %lu", size); \ diff --git a/tests/multiboot2_header_example2.h b/tests/multiboot2_header_example2.h index a37e00a..704458d 100644 --- a/tests/multiboot2_header_example2.h +++ b/tests/multiboot2_header_example2.h @@ -157,7 +157,7 @@ multiboot2_header_example2 = { .min_addr = 0xcafebabe, .max_addr = 0xdeadbeaf, .align = 8, - .preferences = + .preference = KERNAUX_MULTIBOOT2_HTAG_RELOCATABLE_HEADER_PREFERENCE_LOWEST, }, .tag_none = { diff --git a/tests/test_multiboot2_header_print.c b/tests/test_multiboot2_header_print.c index e73fe25..9d4e87f 100644 --- a/tests/test_multiboot2_header_print.c +++ b/tests/test_multiboot2_header_print.c @@ -170,6 +170,7 @@ static const char output2[] = " u32 min_addr: 0xcafebabe\n" " u32 max_addr: 0xdeadbeaf\n" " u32 align: 8\n" + " u32 preference: 1 (lowest)\n" "}\n" "Multiboot 2 header tag {\n" " u16 type: 0 (none)\n"