#include "mboot.h" #include "serial.h" #include "shim.h" #include enum mboot_tag_type { MBOOT_CMDLINE = 0, MBOOT_MEMORYMAP = 6, MBOOT_SYMBOLS = 9, MBOOT_XSDP = 14 }; static void read_cmdline(struct boot_info *shim_info, char *data, uint8_t len) { if (len >= CMDLINE_MAX) len = CMDLINE_MAX; // truncate :( memcpy(shim_info->cmdline, data, len); shim_info->cmdline[len] = '\0'; } static void read_memorymap(struct boot_info *shim_info, uint64_t size, uint32_t *data) { shim_info->map = (struct memory_map *) data; shim_info->map->size = size; } static void read_xsdp(struct boot_info *shim_info, char *data) { shim_info->acpi_table = (void *) data; } static uint32_t *read_tag(uint32_t *data, struct boot_info *shim_info) { uint16_t type = *((uint16_t *)data); uint32_t size = data[1]; uint8_t data_len = size - 2 * sizeof(uint32_t); switch (type) { case MBOOT_CMDLINE: read_cmdline(shim_info, (char *)(data + 2), data_len); break; case MBOOT_MEMORYMAP: read_memorymap(shim_info, size, data + 2); break; case MBOOT_SYMBOLS: // TODO: break; case MBOOT_XSDP: read_xsdp(shim_info, (char *) (data + 2)); break; default: break; } if(size % 8 != 0) { size += 8 - (size % 8); } return data + size / sizeof(uint32_t); } void mboot_load_info( const void *mboot_info, struct boot_info *shim_info ) { uint32_t* data = (uint32_t*) mboot_info; uint32_t total_size = *data++; data++; //reserved while((uint8_t*) data < (uint8_t*) mboot_info + total_size) { data = read_tag(data, shim_info); } }