From 6ffd42548bf10cda13a01555ff4fa56d4213cdf2 Mon Sep 17 00:00:00 2001 From: Aidan MacDonald Date: Thu, 22 Dec 2022 19:23:29 +0000 Subject: multiboot: Refactor boot data validation, add version numbers Instead of verifying the CRC before every access of the boot data, verify the CRC once at startup and set a flag to indicate the boot data is valid. Also add a framework to support multiple boot protocol versions. Firmware declares the maximum supported protocol version using a version byte in the boot data header. The bootloader chooses the highest version supported by it and the firmware when deciding what boot protocol to use. Change-Id: I810194625dc0833f026d2a23b8d64ed467fa6aca --- apps/debug_menu.c | 39 ++++++++++++++++----------------------- 1 file changed, 16 insertions(+), 23 deletions(-) (limited to 'apps/debug_menu.c') diff --git a/apps/debug_menu.c b/apps/debug_menu.c index 5b73f8badd..5e2451e41b 100644 --- a/apps/debug_menu.c +++ b/apps/debug_menu.c @@ -2530,38 +2530,31 @@ static bool dbg_pic(void) #if defined(HAVE_BOOTDATA) && !defined(SIMULATOR) static bool dbg_boot_data(void) { - unsigned int crc = crc_32(boot_data.payload, boot_data.length, 0xffffffff); struct simplelist_info info; info.scroll_all = true; simplelist_info_init(&info, "Boot data", 1, NULL); simplelist_set_line_count(0); -#if defined(HAVE_MULTIBOOT) - char rootpath[MAX_PATH / 2] = RB_ROOT_CONTENTS_DIR; - int boot_volume = 0; - if(crc == boot_data.crc) + if (!boot_data_valid) { - boot_volume = boot_data.boot_volume; /* boot volume contained in uint8_t payload */ - int rtlen = get_redirect_dir(rootpath, sizeof(rootpath), boot_volume, "", ""); - while (rtlen > 0 && rootpath[--rtlen] == PATH_SEPCH) /* remove extra separators */ - rootpath[rtlen] = '\0'; + simplelist_addline("Boot data invalid"); + simplelist_addline("Magic[0]: %08lx", boot_data.magic[0]); + simplelist_addline("Magic[1]: %08lx", boot_data.magic[1]); + simplelist_addline("Length: %lu", boot_data.length); } - simplelist_addline("Boot Volume: <%lu>", boot_volume); - simplelist_addline("Root:"); - simplelist_addline("%s", rootpath); - simplelist_addline(""); -#endif + else + { + simplelist_addline("Boot data valid"); + simplelist_addline("Version: %d", (int)boot_data.version); + simplelist_addline("Boot volume: %d", (int)boot_data.boot_volume); + } + simplelist_addline("Bootdata RAW:"); - if (crc != boot_data.crc) - simplelist_addline("Magic: %.8s", boot_data.magic); - simplelist_addline("Length: %lu", boot_data.length); - simplelist_addline("CRC: %lx", boot_data.crc); - (crc == boot_data.crc) ? simplelist_addline("CRC: OK!") : - simplelist_addline("CRC: BAD"); - for (unsigned i = 0; i < boot_data.length; i += 4) + for (size_t i = 0; i < boot_data.length; i += 4) { - simplelist_addline("%02x: %02x %02x %02x %02x", i, boot_data.payload[i], - boot_data.payload[i+1], boot_data.payload[i+2], boot_data.payload[i+3]); + simplelist_addline("%02x: %02x %02x %02x %02x", i, + boot_data.payload[i + 0], boot_data.payload[i + 1], + boot_data.payload[i + 2], boot_data.payload[i + 3]); } return simplelist_show_list(&info); -- cgit v1.2.3