From e5f850ec40d350605f7e2acdb76746a37d285e40 Mon Sep 17 00:00:00 2001 From: Alex Kotov Date: Fri, 14 Jan 2022 10:40:51 +0500 Subject: [PATCH] Generate Multiboot 2 headers --- examples/kernel-multiboot2-grub/Makefile | 2 +- examples/kernel-multiboot2-grub/expected.txt | Bin 1963 -> 2144 bytes examples/kernel-multiboot2-grub/main.c | 12 ++++++++- examples/kernel-multiboot2-grub/multiboot2.c | 25 ++++++++++++++++++ examples/kernel-multiboot2-grub/start.S | 18 ------------- examples/kernel-multiboot2-limine/Makefile | 2 +- .../kernel-multiboot2-limine/expected.txt | Bin 1342 -> 1523 bytes examples/kernel-multiboot2-limine/main.c | 12 ++++++++- .../kernel-multiboot2-limine/multiboot2.c | 25 ++++++++++++++++++ examples/kernel-multiboot2-limine/start.S | 18 ------------- include/kernaux/multiboot2.h | 14 +++++----- src/multiboot2/header_is_valid.c | 9 ++++--- tests/multiboot2_header_example2.h | 4 +-- tests/test_multiboot2_header_print.c | 4 +-- 14 files changed, 92 insertions(+), 53 deletions(-) create mode 100644 examples/kernel-multiboot2-grub/multiboot2.c create mode 100644 examples/kernel-multiboot2-limine/multiboot2.c diff --git a/examples/kernel-multiboot2-grub/Makefile b/examples/kernel-multiboot2-grub/Makefile index 73bd6a8..3a642ee 100644 --- a/examples/kernel-multiboot2-grub/Makefile +++ b/examples/kernel-multiboot2-grub/Makefile @@ -30,7 +30,7 @@ CFLAGS = \ -fno-stack-protector \ -I../../include -OBJS = main.c.o start.S.o +OBJS = main.c.o multiboot2.c.o start.S.o test: run $(DIFF) -a -Z $(EXPECTED) $(OUTPUT) diff --git a/examples/kernel-multiboot2-grub/expected.txt b/examples/kernel-multiboot2-grub/expected.txt index 816ddf96674fa80072697287dd35933c5a340854..91e53e631d5704280518080c07787d012662a4c6 100644 GIT binary patch delta 190 zcmZ3@|3IMLw=}0DGbum6M8QZQBQ-H4wMZeeSfMO2Co_eM0aKETK|vumF+DTcN + +__attribute__((section(".multiboot"), used)) +__attribute__((aligned(4))) +const struct { + struct KernAux_Multiboot2_Header multiboot2_header; + struct KernAux_Multiboot2_HTag_None tag_none; +} multiboot2_header = { + .multiboot2_header = { + .magic = KERNAUX_MULTIBOOT2_HEADER_MAGIC, + .arch = KERNAUX_MULTIBOOT2_ARCH_NONE, + .total_size = sizeof(multiboot2_header), + .checksum = KERNAUX_MULTIBOOT2_HEADER_CHECKSUM( + KERNAUX_MULTIBOOT2_ARCH_NONE, + sizeof(multiboot2_header) + ), + }, + .tag_none = { + .base = { + .type = KERNAUX_MULTIBOOT2_HTAG_NONE, + .flags = 0, + .size = sizeof(multiboot2_header.tag_none), + }, + }, +}; diff --git a/examples/kernel-multiboot2-grub/start.S b/examples/kernel-multiboot2-grub/start.S index 3c668a3..5c6a4f1 100644 --- a/examples/kernel-multiboot2-grub/start.S +++ b/examples/kernel-multiboot2-grub/start.S @@ -1,21 +1,3 @@ -.set MULTIBOOT_MAGIC, 0xE85250D6 -.set MULTIBOOT_ARCH, 0 -.set MULTIBOOT_LENGTH, 16 + 8 -.set MULTIBOOT_CHECKSUM, -(MULTIBOOT_MAGIC + MULTIBOOT_ARCH + MULTIBOOT_LENGTH) - - - -.section .multiboot -.align 4 -.long MULTIBOOT_MAGIC -.long MULTIBOOT_ARCH -.long MULTIBOOT_LENGTH -.long MULTIBOOT_CHECKSUM -.long 0 -.long 8 - - - .section .bss .global _kernel_stack_start diff --git a/examples/kernel-multiboot2-limine/Makefile b/examples/kernel-multiboot2-limine/Makefile index 56d1fc8..4e296b1 100644 --- a/examples/kernel-multiboot2-limine/Makefile +++ b/examples/kernel-multiboot2-limine/Makefile @@ -45,7 +45,7 @@ CFLAGS = \ -fno-stack-protector \ -I../../include -OBJS = main.c.o start.S.o +OBJS = main.c.o multiboot2.c.o start.S.o test: run $(DIFF) -a -Z $(EXPECTED) $(OUTPUT) diff --git a/examples/kernel-multiboot2-limine/expected.txt b/examples/kernel-multiboot2-limine/expected.txt index c754385e5e1bd4c81b3d37486b144ea665ebbbed..263ddaed94486e16fffaf5aec4ae846d89f7694d 100644 GIT binary patch delta 169 zcmdnT^_jcgw=}0DGbum6M8QZQBQ-H4wMZeeSfMO2Co_eM0aKETK|vumF+DTcN3lVOfN<;1ZeaIJ5~S`!!RWP delta 8 Pcmey&y^m|-Ry$Sz5%&Xd diff --git a/examples/kernel-multiboot2-limine/main.c b/examples/kernel-multiboot2-limine/main.c index e658d1f..2d8d903 100644 --- a/examples/kernel-multiboot2-limine/main.c +++ b/examples/kernel-multiboot2-limine/main.c @@ -7,13 +7,23 @@ void poweroff(); +extern const struct KernAux_Multiboot2_Header multiboot2_header; + static void panic(const char *str); void main( const uint32_t multiboot2_magic, const struct KernAux_Multiboot2_Info *const multiboot2_info ) { - if (multiboot2_magic != KERNAUX_MULTIBOOT2_MAGIC) { + if (!KernAux_Multiboot2_Header_is_valid(&multiboot2_header)) { + panic("Multiboot 2 header is invalid"); + } else { + kernaux_console_printf("Multiboot 2 header is valid\n"); + } + + KernAux_Multiboot2_Header_print(&multiboot2_header, kernaux_console_printf); + + if (multiboot2_magic != KERNAUX_MULTIBOOT2_INFO_MAGIC) { panic("Multiboot 2 magic number is invalid"); } else { kernaux_console_printf("Multiboot 2 magic number is valid\n"); diff --git a/examples/kernel-multiboot2-limine/multiboot2.c b/examples/kernel-multiboot2-limine/multiboot2.c new file mode 100644 index 0000000..4c2f87a --- /dev/null +++ b/examples/kernel-multiboot2-limine/multiboot2.c @@ -0,0 +1,25 @@ +#include + +__attribute__((section(".multiboot"), used)) +__attribute__((aligned(4))) +const struct { + struct KernAux_Multiboot2_Header multiboot2_header; + struct KernAux_Multiboot2_HTag_None tag_none; +} multiboot2_header = { + .multiboot2_header = { + .magic = KERNAUX_MULTIBOOT2_HEADER_MAGIC, + .arch = KERNAUX_MULTIBOOT2_ARCH_NONE, + .total_size = sizeof(multiboot2_header), + .checksum = KERNAUX_MULTIBOOT2_HEADER_CHECKSUM( + KERNAUX_MULTIBOOT2_ARCH_NONE, + sizeof(multiboot2_header) + ), + }, + .tag_none = { + .base = { + .type = KERNAUX_MULTIBOOT2_HTAG_NONE, + .flags = 0, + .size = sizeof(multiboot2_header.tag_none), + }, + }, +}; diff --git a/examples/kernel-multiboot2-limine/start.S b/examples/kernel-multiboot2-limine/start.S index 3c668a3..5c6a4f1 100644 --- a/examples/kernel-multiboot2-limine/start.S +++ b/examples/kernel-multiboot2-limine/start.S @@ -1,21 +1,3 @@ -.set MULTIBOOT_MAGIC, 0xE85250D6 -.set MULTIBOOT_ARCH, 0 -.set MULTIBOOT_LENGTH, 16 + 8 -.set MULTIBOOT_CHECKSUM, -(MULTIBOOT_MAGIC + MULTIBOOT_ARCH + MULTIBOOT_LENGTH) - - - -.section .multiboot -.align 4 -.long MULTIBOOT_MAGIC -.long MULTIBOOT_ARCH -.long MULTIBOOT_LENGTH -.long MULTIBOOT_CHECKSUM -.long 0 -.long 8 - - - .section .bss .global _kernel_stack_start diff --git a/include/kernaux/multiboot2.h b/include/kernaux/multiboot2.h index edc915b..b84c5ea 100644 --- a/include/kernaux/multiboot2.h +++ b/include/kernaux/multiboot2.h @@ -8,13 +8,14 @@ extern "C" { #include #include -#define KERNAUX_MULTIBOOT2_MAGIC 0x36d76289 +#define KERNAUX_MULTIBOOT2_HEADER_MAGIC 0xE85250D6 +#define KERNAUX_MULTIBOOT2_INFO_MAGIC 0x36D76289 -#define KERNAUX_MULTIBOOT2_CHECKSUM(arch, total_size) \ - ((uint32_t)(-( \ - ((uint32_t)KERNAUX_MULTIBOOT2_MAGIC) + \ - ((uint32_t)(arch)) + \ - ((uint32_t)(total_size)) \ +#define KERNAUX_MULTIBOOT2_HEADER_CHECKSUM(arch, total_size) \ + ((uint32_t)(-( \ + ((uint32_t)KERNAUX_MULTIBOOT2_HEADER_MAGIC) + \ + ((uint32_t)(arch)) + \ + ((uint32_t)(total_size)) \ ))) #define KERNAUX_MULTIBOOT2_DATA(ptr) (((uint8_t*)(ptr)) + sizeof(*(ptr))) @@ -46,6 +47,7 @@ enum KernAux_Multiboot2_HTag_RelocatableHeader_Preference { ****************/ enum KernAux_Multiboot2_Arch { + KERNAUX_MULTIBOOT2_ARCH_NONE = 0, KERNAUX_MULTIBOOT2_ARCH_I386 = 1, KERNAUX_MULTIBOOT2_ARCH_MIPS32 = 4, }; diff --git a/src/multiboot2/header_is_valid.c b/src/multiboot2/header_is_valid.c index 0e0d924..39a54f8 100644 --- a/src/multiboot2/header_is_valid.c +++ b/src/multiboot2/header_is_valid.c @@ -11,9 +11,12 @@ bool KernAux_Multiboot2_Header_is_valid( const struct KernAux_Multiboot2_Header *const multiboot2_header ) { - if (multiboot2_header->magic != KERNAUX_MULTIBOOT2_MAGIC) return false; + if (multiboot2_header->magic != KERNAUX_MULTIBOOT2_HEADER_MAGIC) { + return false; + } - if (multiboot2_header->arch != KERNAUX_MULTIBOOT2_ARCH_I386 && + if (multiboot2_header->arch != KERNAUX_MULTIBOOT2_ARCH_NONE && + multiboot2_header->arch != KERNAUX_MULTIBOOT2_ARCH_I386 && multiboot2_header->arch != KERNAUX_MULTIBOOT2_ARCH_MIPS32) { return false; @@ -31,7 +34,7 @@ bool KernAux_Multiboot2_Header_is_valid( } if (multiboot2_header->checksum != - KERNAUX_MULTIBOOT2_CHECKSUM( + KERNAUX_MULTIBOOT2_HEADER_CHECKSUM( multiboot2_header->arch, multiboot2_header->total_size ) diff --git a/tests/multiboot2_header_example2.h b/tests/multiboot2_header_example2.h index 6df15b8..42f328b 100644 --- a/tests/multiboot2_header_example2.h +++ b/tests/multiboot2_header_example2.h @@ -32,10 +32,10 @@ static const struct { struct KernAux_Multiboot2_HTag_None tag_none; } multiboot2_header_example2 = { .multiboot2_header = { - .magic = KERNAUX_MULTIBOOT2_MAGIC, + .magic = KERNAUX_MULTIBOOT2_HEADER_MAGIC, .arch = KERNAUX_MULTIBOOT2_ARCH_I386, .total_size = sizeof(multiboot2_header_example2), - .checksum = KERNAUX_MULTIBOOT2_CHECKSUM( + .checksum = KERNAUX_MULTIBOOT2_HEADER_CHECKSUM( KERNAUX_MULTIBOOT2_ARCH_I386, sizeof(multiboot2_header_example2) ), diff --git a/tests/test_multiboot2_header_print.c b/tests/test_multiboot2_header_print.c index 16a075b..eff576a 100644 --- a/tests/test_multiboot2_header_print.c +++ b/tests/test_multiboot2_header_print.c @@ -12,10 +12,10 @@ // TODO: add more tags static const char output2[] = "Multiboot 2 header\n" - " magic: 920085129\n" + " magic: 3897708758\n" " arch: 1\n" " size: 272\n" - " checksum: 3374881894\n" + " checksum: 397258265\n" "Multiboot 2 header tag\n" " type: 1 (information request)\n" " flags: 0\n"