HelenOS sources
This source file includes following definitions.
- multiboot_extract_command
- multiboot_extract_argument
- multiboot_modules
- multiboot_memmap
- multiboot_info_parse
#include <typedefs.h>
#include <genarch/multiboot/multiboot.h>
#include <config.h>
#include <stddef.h>
#include <str.h>
void multiboot_extract_command(char *buf, size_t size, const char *cmd_line)
{
const char *end = str_chr(cmd_line, ' ');
if (end == NULL)
end = cmd_line + str_size(cmd_line);
const char *cp = end;
const char *start = cmd_line;
while (cp != start) {
if (*cp == '/') {
start = cp + 1;
break;
}
cp--;
}
str_ncpy(buf, size, start, (size_t) (end - start));
}
void multiboot_extract_argument(char *buf, size_t size, const char *cmd_line)
{
const char *start = str_chr(cmd_line, ' ');
if (start == NULL) {
str_cpy(buf, size, "");
return;
}
const char *end = cmd_line + str_size(cmd_line);
while (start != end) {
if (start[0] == ' ')
start++;
else
break;
}
str_ncpy(buf, size, start, (size_t) (end - start));
}
static void multiboot_modules(uint32_t count, multiboot_module_t *mods)
{
for (uint32_t i = 0; i < count; i++) {
if (init.cnt >= CONFIG_INIT_TASKS)
break;
init.tasks[init.cnt].paddr = mods[i].start;
init.tasks[init.cnt].size = mods[i].end - mods[i].start;
if (mods[i].string) {
multiboot_extract_command(init.tasks[init.cnt].name,
CONFIG_TASK_NAME_BUFLEN, MULTIBOOT_PTR(mods[i].string));
multiboot_extract_argument(init.tasks[init.cnt].arguments,
CONFIG_TASK_ARGUMENTS_BUFLEN, MULTIBOOT_PTR(mods[i].string));
} else {
init.tasks[init.cnt].name[0] = 0;
init.tasks[init.cnt].arguments[0] = 0;
}
init.cnt++;
}
}
static void multiboot_memmap(uint32_t length, multiboot_memmap_t *memmap)
{
uint32_t pos = 0;
while ((pos < length) && (e820counter < MEMMAP_E820_MAX_RECORDS)) {
e820table[e820counter] = memmap->mm_info;
uint32_t size = sizeof(memmap->size) + memmap->size;
memmap = (multiboot_memmap_t *) ((uintptr_t) memmap + size);
pos += size;
e820counter++;
}
}
void multiboot_info_parse(uint32_t signature, const multiboot_info_t *info)
{
if (signature != MULTIBOOT_LOADER_MAGIC)
return;
if ((info->flags & MULTIBOOT_INFO_FLAGS_CMDLINE) != 0)
multiboot_cmdline((char *) MULTIBOOT_PTR(info->cmd_line));
if ((info->flags & MULTIBOOT_INFO_FLAGS_MODS) != 0)
multiboot_modules(info->mods_count,
(multiboot_module_t *) MULTIBOOT_PTR(info->mods_addr));
if ((info->flags & MULTIBOOT_INFO_FLAGS_MMAP) != 0)
multiboot_memmap(info->mmap_length,
(multiboot_memmap_t *) MULTIBOOT_PTR(info->mmap_addr));
}
HelenOS homepage, sources at GitHub