diff --git a/src/multiboot2/print.c b/src/multiboot2/print.c index 3d428bb..bdc68e1 100644 --- a/src/multiboot2/print.c +++ b/src/multiboot2/print.c @@ -4,6 +4,12 @@ static const char *KernAux_Multiboot2_TagType_to_str( enum KernAux_Multiboot2_TagType tag_type ); +static void KernAux_Multiboot2_Tag_MemoryMap_print( + const struct KernAux_Multiboot2_Tag_MemoryMap *tag, + void (*print)(const char *format, ...) +) +__attribute__((nonnull)); + const char *KernAux_Multiboot2_TagType_to_str( enum KernAux_Multiboot2_TagType tag_type ) { @@ -148,9 +154,10 @@ void KernAux_Multiboot2_TagBase_print( } break; case KERNAUX_MULTIBOOT2_TAGTYPE_MEMORY_MAP: - { - // TODO: print - } + KernAux_Multiboot2_Tag_MemoryMap_print( + (struct KernAux_Multiboot2_Tag_MemoryMap*)tag_base, + print + ); break; case KERNAUX_MULTIBOOT2_TAGTYPE_VBE_INFO: { @@ -254,3 +261,33 @@ void KernAux_Multiboot2_TagBase_print( break; } } + +void KernAux_Multiboot2_Tag_MemoryMap_print( + const struct KernAux_Multiboot2_Tag_MemoryMap *const tag, + void (*print)(const char *format, ...) +) { + if (!KernAux_Multiboot2_Tag_MemoryMap_is_valid(tag)) { + print(" invalid!\n"); + return; + } + + print(" entry size: %u\n", tag->entry_size); + print(" entry version: %u\n", tag->entry_version); + + print(" entries:\n"); + + const struct KernAux_Multiboot2_Tag_MemoryMap_EntryBase *const entries = + (struct KernAux_Multiboot2_Tag_MemoryMap_EntryBase*)tag->data; + + for ( + unsigned int index = 0; + index < (tag->base.size - sizeof(*tag)) / tag->entry_size; + ++index + ) { + print(" entry %u\n", index); + print(" base addr: %llu\n", entries[index].base_addr); + print(" length: %llu\n", entries[index].length); + print(" type: %u\n", entries[index].type); + print(" reserved1: %u\n", entries[index].reserved1); + } +} diff --git a/tests/test_multiboot2_print.c b/tests/test_multiboot2_print.c index cf62036..fce03a5 100644 --- a/tests/test_multiboot2_print.c +++ b/tests/test_multiboot2_print.c @@ -46,6 +46,39 @@ static const char output[] = "Multiboot 2 tag\n" " type: 6 (memory map)\n" " size: 160\n" + " entry size: 24\n" + " entry version: 0\n" + " entries:\n" + " entry 0\n" + " base addr: 0\n" + " length: 654336\n" + " type: 1\n" + " reserved1: 0\n" + " entry 1\n" + " base addr: 654336\n" + " length: 1024\n" + " type: 2\n" + " reserved1: 0\n" + " entry 2\n" + " base addr: 983040\n" + " length: 65536\n" + " type: 2\n" + " reserved1: 0\n" + " entry 3\n" + " base addr: 1048576\n" + " length: 133038080\n" + " type: 1\n" + " reserved1: 0\n" + " entry 4\n" + " base addr: 134086656\n" + " length: 131072\n" + " type: 2\n" + " reserved1: 0\n" + " entry 5\n" + " base addr: 4294705152\n" + " length: 262144\n" + " type: 2\n" + " reserved1: 0\n" "Multiboot 2 tag\n" " type: 9 (ELF symbols)\n" " size: 420\n"