From 79ca4681ff51094ad17e67c90b73282774ae23dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Thu, 15 Feb 2018 09:20:29 +0100 Subject: [PATCH] Make tests independent of structures in header files --- src/kernel/boot/kmain.c | 3 +- src/kernel/boot/multiboot.c | 2 +- src/kernel/boot/multiboot.tt | 62 ++++++++++++++++++++-------------- src/kernel/include/multiboot.h | 2 +- 4 files changed, 39 insertions(+), 30 deletions(-) diff --git a/src/kernel/boot/kmain.c b/src/kernel/boot/kmain.c index fad0a55..3c0657e 100644 --- a/src/kernel/boot/kmain.c +++ b/src/kernel/boot/kmain.c @@ -10,8 +10,7 @@ void kmain(uint64_t multiboot_magic, void *multiboot_data) vga_init(); debug_info("kernel loaded\n"); - - parse_multiboot(multiboot_magic, P2V(multiboot_data)); + multiboot_init(multiboot_magic, P2V(multiboot_data)); debug_info("Kernel was loaded with command line \"%s\", by <%s>\n", kernel_boot_data.commandline, kernel_boot_data.bootloader); diff --git a/src/kernel/boot/multiboot.c b/src/kernel/boot/multiboot.c index e523b85..2c85bce 100644 --- a/src/kernel/boot/multiboot.c +++ b/src/kernel/boot/multiboot.c @@ -28,7 +28,7 @@ int parse_multiboot2(struct mboot2_taglist *tags) return 0; } -int parse_multiboot(uint64_t magic, void *mboot_info) +int multiboot_init(uint64_t magic, void *mboot_info) { if(magic == MBOOT_REPLY) { diff --git a/src/kernel/boot/multiboot.tt b/src/kernel/boot/multiboot.tt index 6f3acf9..47c9574 100644 --- a/src/kernel/boot/multiboot.tt +++ b/src/kernel/boot/multiboot.tt @@ -2,11 +2,8 @@ #include #include -#include #undef debug #define debug(...) -#undef P2V -#define P2V(addr) (void *)((uintptr_t)(addr)) #include "multiboot.c" #include @@ -14,11 +11,24 @@ #define MAGIC 0x36D76289 -struct mboot2_tag *generate_tag(uint32_t type, void *data, uint32_t data_size) +struct tag_st { - struct mboot2_tag *tag = calloc(1, sizeof(struct mboot2_tag) + data_size); + uint32_t type; + uint32_t size; + uint8_t data[]; +}__attribute__((packed)); +struct header +{ + uint32_t size; + uint32_t _; +}__attribute__((packed)); + + +struct tag_st *generate_tag(uint32_t type, void *data, uint32_t data_size) +{ + struct tag_st *tag = calloc(1, sizeof(struct tag_st) + data_size); tag->type = type; - tag->size = sizeof(struct mboot2_tag) + data_size; + tag->size = sizeof(struct tag_st) + data_size; if(data_size) memcpy(tag->data, data, data_size); return tag; @@ -26,20 +36,20 @@ struct mboot2_tag *generate_tag(uint32_t type, void *data, uint32_t data_size) #define padded_size(tag) (tag->size + ((tag->size%8)?(8-(tag->size%8)):0)) -struct mboot2_taglist *generate_taglist(int num, ...) +struct header *generate_taglist(int num, ...) { va_list args; va_start(args, num); - uint32_t total_size = sizeof(struct mboot2_taglist); - struct mboot2_tag **tags = calloc(num, sizeof(struct mboot2_tag *)); + uint32_t total_size = sizeof(struct header); + struct tag_st **tags = calloc(num, sizeof(struct tag_st *)); for(int i = 0; i < num; i++) { - tags[i] = va_arg(args, struct mboot2_tag *); + tags[i] = va_arg(args, struct tag_st *); total_size += padded_size(tags[i]); } - struct mboot2_taglist *taglist = calloc(1, total_size); - taglist->total_size = total_size; + struct header *taglist = calloc(1, total_size); + taglist->size = total_size; int pos = 8; uint8_t *p = (uint8_t *)taglist; @@ -57,46 +67,46 @@ struct mboot2_taglist *generate_taglist(int num, ...) TEST(correctly_identifies_multiboot2_magic) { uint32_t tags[] = {16, 0, 0, 8}; - parse_multiboot(MAGIC, tags); + multiboot_init(MAGIC, tags); ASSERT_EQ_INT(kernel_boot_data.multiboot_version, 2); } TEST(reads_boot_loader_name) { char *name = "ttest"; - struct mboot2_taglist *tags = generate_taglist(2, + void *tags = generate_taglist(2, generate_tag(2, name, strlen(name) + 1), generate_tag(0,0,0)); - parse_multiboot(MAGIC, tags); + multiboot_init(MAGIC, tags); ASSERT_EQ_STR(kernel_boot_data.bootloader, name, strlen(name)); free(tags); } TEST(reads_kernel_commandline) { char *cmd = "mittos64-kern boot"; - struct mboot2_taglist *tags = generate_taglist(2, + void *tags = generate_taglist(2, generate_tag(1, cmd, strlen(cmd) + 1), generate_tag(0,0,0)); - parse_multiboot(MAGIC, tags); + multiboot_init(MAGIC, tags); ASSERT_EQ_STR(kernel_boot_data.commandline, cmd, strlen(cmd)); free(tags); } -// Here are four very simmilar tests +// Here are four very similar tests // The difference is what values are checked and the order of the tags // Their existence is based on experience - helped me actually find a bug TEST(reads_multiple_tags_1) { char *cmd = "mittos64-kern boot"; char *name = "ttest"; - struct mboot2_taglist *tags = generate_taglist(3, + void *tags = generate_taglist(3, generate_tag(1, cmd, strlen(cmd) + 1), generate_tag(2, name, strlen(name) + 1), generate_tag(0,0,0) ); - parse_multiboot(MAGIC, tags); + multiboot_init(MAGIC, tags); ASSERT_EQ_STR(kernel_boot_data.commandline, cmd, strlen(cmd)); free(tags); } @@ -104,13 +114,13 @@ TEST(reads_multiple_tags_2) { char *cmd = "mittos64-kern boot"; char *name = "ttest"; - struct mboot2_taglist *tags = generate_taglist(3, + void *tags = generate_taglist(3, generate_tag(1, cmd, strlen(cmd) + 1), generate_tag(2, name, strlen(name) + 1), generate_tag(0,0,0) ); - parse_multiboot(MAGIC, tags); + multiboot_init(MAGIC, tags); ASSERT_EQ_STR(kernel_boot_data.bootloader, name, strlen(name)); free(tags); } @@ -118,13 +128,13 @@ TEST(reads_multiple_tags_3) { char *cmd = "mittos64-kern boot"; char *name = "ttest"; - struct mboot2_taglist *tags = generate_taglist(3, + void *tags = generate_taglist(3, generate_tag(2, name, strlen(name) + 1), generate_tag(1, cmd, strlen(cmd) + 1), generate_tag(0,0,0) ); - parse_multiboot(MAGIC, tags); + multiboot_init(MAGIC, tags); ASSERT_EQ_STR(kernel_boot_data.commandline, cmd, strlen(cmd)); free(tags); } @@ -132,13 +142,13 @@ TEST(reads_multiple_tags_4) { char *cmd = "mittos64-kern boot"; char *name = "ttest"; - struct mboot2_taglist *tags = generate_taglist(3, + void *tags = generate_taglist(3, generate_tag(2, name, strlen(name) + 1), generate_tag(1, cmd, strlen(cmd) + 1), generate_tag(0,0,0) ); - parse_multiboot(MAGIC, tags); + multiboot_init(MAGIC, tags); ASSERT_EQ_STR(kernel_boot_data.bootloader, name, strlen(name)); free(tags); } diff --git a/src/kernel/include/multiboot.h b/src/kernel/include/multiboot.h index 0b5a353..39a93c5 100644 --- a/src/kernel/include/multiboot.h +++ b/src/kernel/include/multiboot.h @@ -22,4 +22,4 @@ struct mboot2_tag { #define MBOOT2_COMMANDLINE 1 #define MBOOT2_BOOTLOADER 2 -int parse_multiboot(uint64_t magic, void *mboot_info); +int multiboot_init(uint64_t magic, void *mboot_info);