47 lines
896 B
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;
|
|
}
|