trios/kernel/bootinfo.c

47 lines
896 B
C

#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include "panic.h"
#include "term.h"
#include "bootinfo.h"
#define CMDLINE_MAX 128
static char boot_cmdline[CMDLINE_MAX];
static uint32_t *read_tag(uint32_t *tag) {
uint32_t type = tag[0];
size_t size = tag[1];
switch(type) {
case 0: return NULL;
case 1: {
size_t cmdline_len = size - 2 * sizeof(uint32_t);
if(cmdline_len > CMDLINE_MAX) {
panic("Command line argument length %d exceeds maximum length %d", cmdline_len, CMDLINE_MAX);
}
char* cmdline = (char*)(tag + 2);
memcpy(boot_cmdline, cmdline, cmdline_len);
break;
}
default: break;
}
if(size % 8 != 0) {
size += 8 - (size % 8);
}
return tag + size / sizeof(uint32_t);
}
void bootinfo_load(void *ptr) {
uint32_t *p = ptr;
p += 2;
while(p != NULL) {
p = read_tag(p);
}
}
char* bootinfo_get_cmdline(void) {
return boot_cmdline;
}