Parse multiboot information
This commit is contained in:
144
src/kernel/boot/multiboot.tt
Normal file
144
src/kernel/boot/multiboot.tt
Normal file
@@ -0,0 +1,144 @@
|
||||
// vim: ft=c
|
||||
#include <ttest.h>
|
||||
|
||||
#include <debug.h>
|
||||
#include <memory.h>
|
||||
#undef debug
|
||||
#define debug(...)
|
||||
#undef P2V
|
||||
#define P2V(addr) (void *)((uintptr_t)(addr))
|
||||
#include "multiboot.c"
|
||||
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#define MAGIC 0x36D76289
|
||||
|
||||
struct mboot2_tag *generate_tag(uint32_t type, void *data, uint32_t data_size)
|
||||
{
|
||||
struct mboot2_tag *tag = calloc(1, sizeof(struct mboot2_tag) + data_size);
|
||||
tag->type = type;
|
||||
tag->size = sizeof(struct mboot2_tag) + data_size;
|
||||
if(data_size)
|
||||
memcpy(tag->data, data, data_size);
|
||||
return tag;
|
||||
}
|
||||
|
||||
#define padded_size(tag) (tag->size + ((tag->size%8)?(8-(tag->size%8)):0))
|
||||
|
||||
struct mboot2_taglist *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 *));
|
||||
for(int i = 0; i < num; i++)
|
||||
{
|
||||
tags[i] = va_arg(args, struct mboot2_tag *);
|
||||
total_size += padded_size(tags[i]);
|
||||
}
|
||||
|
||||
struct mboot2_taglist *taglist = calloc(1, total_size);
|
||||
taglist->total_size = total_size;
|
||||
|
||||
int pos = 8;
|
||||
uint8_t *p = (uint8_t *)taglist;
|
||||
for(int i = 0; i < num; i++)
|
||||
{
|
||||
memcpy(&p[pos], tags[i], tags[i]->size);
|
||||
pos += padded_size(tags[i]);
|
||||
free(tags[i]);
|
||||
}
|
||||
va_end(args);
|
||||
|
||||
return taglist;
|
||||
}
|
||||
|
||||
TEST(correctly_identifies_multiboot2_magic)
|
||||
{
|
||||
uint32_t tags[] = {16, 0, 0, 8};
|
||||
parse_multiboot(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,
|
||||
generate_tag(2, name, strlen(name) + 1),
|
||||
generate_tag(0,0,0));
|
||||
|
||||
parse_multiboot(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,
|
||||
generate_tag(1, cmd, strlen(cmd) + 1),
|
||||
generate_tag(0,0,0));
|
||||
|
||||
parse_multiboot(MAGIC, tags);
|
||||
ASSERT_EQ_STR(kernel_boot_data.commandline, cmd, strlen(cmd));
|
||||
free(tags);
|
||||
}
|
||||
// Here are four very simmilar 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,
|
||||
generate_tag(1, cmd, strlen(cmd) + 1),
|
||||
generate_tag(2, name, strlen(name) + 1),
|
||||
generate_tag(0,0,0)
|
||||
);
|
||||
|
||||
parse_multiboot(MAGIC, tags);
|
||||
ASSERT_EQ_STR(kernel_boot_data.commandline, cmd, strlen(cmd));
|
||||
free(tags);
|
||||
}
|
||||
TEST(reads_multiple_tags_2)
|
||||
{
|
||||
char *cmd = "mittos64-kern boot";
|
||||
char *name = "ttest";
|
||||
struct mboot2_taglist *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);
|
||||
ASSERT_EQ_STR(kernel_boot_data.bootloader, name, strlen(name));
|
||||
free(tags);
|
||||
}
|
||||
TEST(reads_multiple_tags_3)
|
||||
{
|
||||
char *cmd = "mittos64-kern boot";
|
||||
char *name = "ttest";
|
||||
struct mboot2_taglist *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);
|
||||
ASSERT_EQ_STR(kernel_boot_data.commandline, cmd, strlen(cmd));
|
||||
free(tags);
|
||||
}
|
||||
TEST(reads_multiple_tags_4)
|
||||
{
|
||||
char *cmd = "mittos64-kern boot";
|
||||
char *name = "ttest";
|
||||
struct mboot2_taglist *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);
|
||||
ASSERT_EQ_STR(kernel_boot_data.bootloader, name, strlen(name));
|
||||
free(tags);
|
||||
}
|
||||
Reference in New Issue
Block a user