Add the remaining shared code to efi_app_common to complete the refactoring:
* efi_main() - common entry point; calls efi_app_init(), prints app_banner, calls command_loop(), then clears the screen on exit. * struct efi_app_cmd - table entry holding the keyword, help text, and a handler of type void (*fn)(u16 *args). * command_loop() - iterates app_cmds[], matches keywords with starts_with(), and falls back to efi_app_help() on no match. * efi_app_help() - prints each table entry's help line plus the built-in "exit" line. Each dump app is updated accordingly: * efi_main is removed; command_loop becomes non-static. * app_banner[] is defined at file scope with the application's title string. * Per-app duplicate state (bs, handle, systable) is removed; apps now use the common module's state. * do_help() and command_loop() are removed; each app instead provides a file-scope app_cmds[] dispatch table whose entries point directly to the do_* functions. dtbdump: the private printx(unsigned char) and print_hex_digit() are removed; call sites are updated to use the common printx(u64, u32) with a precision of 2. dbginfodump: the device-path-to-text protocol lookup is moved from efi_main into command_loop so the protocol handle is local to the function that uses it. Signed-off-by: Heinrich Schuchardt <[email protected]> --- v2: new patch --- lib/efi_loader/dbginfodump.c | 95 ++++-------------------- lib/efi_loader/dtbdump.c | 109 ++++++--------------------- lib/efi_loader/efi_app_common.c | 111 +++++++++++++++++++++++++++- lib/efi_loader/efi_app_common.h | 31 ++++---- lib/efi_loader/initrddump.c | 91 ++++------------------- lib/efi_loader/smbiosdump.c | 126 +++++++------------------------- 6 files changed, 205 insertions(+), 358 deletions(-) diff --git a/lib/efi_loader/dbginfodump.c b/lib/efi_loader/dbginfodump.c index b54c3830a66..0be41ed5fb5 100644 --- a/lib/efi_loader/dbginfodump.c +++ b/lib/efi_loader/dbginfodump.c @@ -5,26 +5,16 @@ * dbginfodump.efi prints out the content of the EFI_DEBUG_IMAGE_INFO_TABLE. */ -#include <efi_api.h> #include "efi_app_common.h" -/** - * BUFFER_SIZE - size of the command line input buffer - */ -#define BUFFER_SIZE 64 - -static struct efi_simple_text_output_protocol *cout; -static efi_handle_t handle; -static struct efi_system_table *systable; -static struct efi_boot_services *bs; +u16 app_banner[] = u"Debug Info Table Dump\r\n=====================\r\n\r\n"; static efi_guid_t guid_device_path_to_text_protocol = EFI_DEVICE_PATH_TO_TEXT_PROTOCOL_GUID; static struct efi_device_path_to_text_protocol *device_path_to_text; -static const efi_guid_t dbg_info_guid = - EFI_DEBUG_IMAGE_INFO_TABLE_GUID; +static const efi_guid_t dbg_info_guid = EFI_DEBUG_IMAGE_INFO_TABLE_GUID; /* EFI_DEBUG_IMAGE_INFO_NORMAL */ struct dbg_info { @@ -82,15 +72,6 @@ static void printp(void *p) print(str); } -/** - * do_help() - print help - */ -static void do_help(void) -{ - error(u"dump - print debug info table\r\n"); - error(u"exit - exit the shell\r\n"); -} - /** * print_info() - print loaded image protocol */ @@ -118,20 +99,27 @@ static void print_info(struct efi_loaded_image *info) /** * do_dump() - print debug info table + * + * @args: unused command arguments */ -static efi_status_t do_dump(void) +static void do_dump(u16 * __maybe_unused args) { struct dbg_info_header *dbg; + + if (!device_path_to_text) + bs->locate_protocol(&guid_device_path_to_text_protocol, NULL, + (void **)&device_path_to_text); + u32 count; dbg = get_config_table(&dbg_info_guid); if (!dbg) { error(u"Debug info table not found\r\n"); - return EFI_NOT_FOUND; + return; } if (dbg->status & 0x01) { error(u"Update in progress\r\n"); - return EFI_LOAD_ERROR; + return; } if (dbg->status & 0x02) print(u"Modified\r\n"); @@ -164,60 +152,9 @@ static efi_status_t do_dump(void) print(u"\r\n"); } - return EFI_SUCCESS; } -/** - * efi_main() - entry point of the EFI application. - * - * @handle: handle of the loaded image - * @systab: system table - * Return: status code - */ -efi_status_t EFIAPI efi_main(efi_handle_t image_handle, - struct efi_system_table *systab) -{ - efi_status_t ret; - - efi_app_init(systab, image_handle); - - handle = image_handle; - systable = systab; - cout = systable->con_out; - bs = systable->boottime; - - cout->set_attribute(cout, EFI_LIGHTBLUE | EFI_BACKGROUND_BLACK); - cout->clear_screen(cout); - cout->set_attribute(cout, EFI_WHITE | EFI_BACKGROUND_BLACK); - print(u"Debug Info Table Dump\r\n=====================\r\n\r\n"); - cout->set_attribute(cout, EFI_LIGHTBLUE | EFI_BACKGROUND_BLACK); - - ret = bs->locate_protocol(&guid_device_path_to_text_protocol, - NULL, (void **)&device_path_to_text); - if (ret != EFI_SUCCESS) { - error(u"No device path to text protocol\r\n"); - device_path_to_text = NULL; - } - - for (;;) { - u16 command[BUFFER_SIZE]; - u16 *pos; - efi_uintn_t ret; - - print(u"=> "); - ret = efi_input(command, sizeof(command)); - if (ret == EFI_ABORTED) - break; - pos = skip_whitespace(command); - if (starts_with(pos, u"exit")) - break; - else if (starts_with(pos, u"dump")) - do_dump(); - else - do_help(); - } - - cout->set_attribute(cout, EFI_LIGHTGRAY | EFI_BACKGROUND_BLACK); - cout->clear_screen(cout); - return EFI_SUCCESS; -} +struct efi_app_cmd app_cmds[] = { + { u"dump", u"dump - print debug info table\r\n", do_dump }, + { } +}; diff --git a/lib/efi_loader/dtbdump.c b/lib/efi_loader/dtbdump.c index 0d56a41ecf6..ba15c198b51 100644 --- a/lib/efi_loader/dtbdump.c +++ b/lib/efi_loader/dtbdump.c @@ -10,15 +10,13 @@ #include <linux/libfdt.h> #include "efi_app_common.h" -#define BUFFER_SIZE 64 #define ESC 0x17 #define efi_size_in_pages(size) ((size + EFI_PAGE_MASK) >> EFI_PAGE_SHIFT) -static struct efi_boot_services *bs; +u16 app_banner[] = u"DTB Dump\r\n========\r\n\r\n"; + static const efi_guid_t fdt_guid = EFI_FDT_GUID; -static efi_handle_t handle; -static struct efi_system_table *systable; static const efi_guid_t efi_dt_fixup_protocol_guid = EFI_DT_FIXUP_PROTOCOL_GUID; static const efi_guid_t efi_file_info_guid = EFI_FILE_INFO_GUID; @@ -61,24 +59,12 @@ static u32 f2h(fdt32_t val) return *(u32 *)buf; } -/** - * do_help() - print help - */ -static void do_help(void) -{ - error(u"dump - print device-tree\r\n"); - error(u"load <dtb> - load device-tree from file\r\n"); - error(u"save <dtb> - save device-tree to file\r\n"); - error(u"exit - exit the shell\r\n"); -} - /** * do_load() - load and install device-tree * * @filename: file name - * Return: status code */ -static efi_status_t do_load(u16 *filename) +static void do_load(u16 *filename) { struct efi_dt_fixup_protocol *dt_fixup_prot; struct efi_simple_file_system_protocol *file_system; @@ -94,11 +80,9 @@ static efi_status_t do_load(u16 *filename) (void **)&dt_fixup_prot); if (ret != EFI_SUCCESS) { error(u"Device-tree fix-up protocol not found\r\n"); - return ret; + return; } - filename = skip_whitespace(filename); - ret = open_file_system(&file_system); if (ret != EFI_SUCCESS) goto out; @@ -206,16 +190,14 @@ out: if (ret2 != EFI_SUCCESS) error(u"Can't close volume\r\n"); } - return ret; } /** * do_save() - save current device-tree * * @filename: file name - * Return: status code */ -static efi_status_t do_save(u16 *filename) +static void do_save(u16 *filename) { struct fdt_header *dtb; efi_uintn_t dtb_size; @@ -224,23 +206,19 @@ static efi_status_t do_save(u16 *filename) dtb = get_config_table(&fdt_guid); if (!dtb) { error(u"DTB not found\r\n"); - return EFI_NOT_FOUND; + return; } if (f2h(dtb->magic) != FDT_MAGIC) { error(u"Wrong device tree magic\r\n"); - return EFI_NOT_FOUND; + return; } dtb_size = f2h(dtb->totalsize); - filename = skip_whitespace(filename); - ret = save_file(filename, dtb, dtb_size); if (ret == EFI_SUCCESS) { print(filename); print(u" written\r\n"); } - - return ret; } /** @@ -357,8 +335,10 @@ static void print_mem_res_block(const struct fdt_reserve_entry *rsvblk) /** * do_dump() - print device-tree + * + * @args: unused command arguments */ -static efi_status_t do_dump(void) +static void do_dump(u16 * __maybe_unused args) { const unsigned char *fdt; struct fdt_header *header; @@ -370,14 +350,14 @@ static efi_status_t do_dump(void) fdt = get_config_table(&fdt_guid); if (!fdt) { error(u"DTB not found\r\n"); - return EFI_NOT_FOUND; + return; } header = (struct fdt_header *)fdt; if (f2h(header->magic) != FDT_MAGIC) { error(u"Wrong device tree magic\r\n"); error(u"Not a device-tree\r\n"); - return EFI_LOAD_ERROR; + return; } pos = (u32 *)(fdt + f2h(header->off_dt_struct)); @@ -430,7 +410,7 @@ static efi_status_t do_dump(void) case FDT_END_NODE: if (!level) { error(u"Extraneous end node\r\n"); - return EFI_LOAD_ERROR; + return; } --level; @@ -441,66 +421,21 @@ static efi_status_t do_dump(void) case FDT_END: if (level) { error(u"Missing end node\r\n"); - return EFI_LOAD_ERROR; + return; } print(u"\r\n"); - return EFI_SUCCESS; + return; default: error(u"Invalid device tree token\r\n"); - return EFI_LOAD_ERROR; + return; } } error(u"Overrun\r\n"); - - return EFI_LOAD_ERROR; } -/** - * efi_main() - entry point of the EFI application. - * - * @handle: handle of the loaded image - * @systab: system table - * Return: status code - */ -efi_status_t EFIAPI efi_main(efi_handle_t image_handle, - struct efi_system_table *systab) -{ - efi_app_init(systab, image_handle); - - handle = image_handle; - systable = systab; - bs = systable->boottime; - - color(EFI_LIGHTBLUE); - cls(); - color(EFI_WHITE); - print(u"DTB Dump\r\n========\r\n\r\n"); - color(EFI_LIGHTBLUE); - - for (;;) { - u16 command[BUFFER_SIZE]; - u16 *pos; - efi_uintn_t ret; - - efi_drain_input(); - print(u"=> "); - ret = efi_input(command, sizeof(command)); - if (ret == EFI_ABORTED) - break; - pos = skip_whitespace(command); - if (starts_with(pos, u"exit")) - break; - else if (starts_with(pos, u"dump")) - do_dump(); - else if (starts_with(pos, u"load ")) - do_load(pos + 5); - else if (starts_with(pos, u"save ")) - do_save(pos + 5); - else - do_help(); - } - - color(EFI_LIGHTGRAY); - cls(); - return EFI_SUCCESS; -} +struct efi_app_cmd app_cmds[] = { + { u"dump", u"dump - print device-tree\r\n", do_dump }, + { u"load ", u"load <dtb> - load device-tree from file\r\n", do_load }, + { u"save ", u"save <dtb> - save device-tree to file\r\n", do_save }, + { } +}; diff --git a/lib/efi_loader/efi_app_common.c b/lib/efi_loader/efi_app_common.c index af9799557fc..49a47c686d7 100644 --- a/lib/efi_loader/efi_app_common.c +++ b/lib/efi_loader/efi_app_common.c @@ -9,6 +9,8 @@ #include <part.h> #include "efi_app_common.h" +#define CMD_BUFFER_SIZE 64 + static efi_handle_t app_handle; static struct efi_simple_text_input_protocol *cin; static struct efi_simple_text_output_protocol *cout; @@ -39,7 +41,18 @@ static u16 *get_load_options(void) return loaded_image->load_options; } -void efi_app_init(struct efi_system_table *sys_table, efi_handle_t image_handle) +/** + * efi_app_init() - initialize the EFI application + * + * Sets up global pointers to the EFI system table, boot services, + * console I/O protocols, and the application handle. Processes + * load options (e.g. "nocolor"). + * + * @sys_table: EFI system table + * @image_handle: image handle of the application + */ +static void efi_app_init(struct efi_system_table *sys_table, + efi_handle_t image_handle) { u16 *load_options; @@ -304,3 +317,99 @@ efi_status_t save_file(u16 *filename, void *buf, efi_uintn_t size) return ret; } + +extern u16 app_banner[]; +extern struct efi_app_cmd app_cmds[]; + +/** + * efi_app_help() - print application command help + * + * Prints the help text for each entry in @cmds, then appends a fixed + * line for the built-in "exit" command. + * + * @cmds: null-fn-terminated application command table + */ +static void efi_app_help(const struct efi_app_cmd *cmds) +{ + const struct efi_app_cmd *cmd; + + for (cmd = cmds; cmd->fn; ++cmd) + error((u16 *)cmd->help); + error(u"exit - exit the shell\r\n"); +} + +/** + * command_loop() - read and dispatch application commands + * + * Reads commands from the console and dispatches them via the + * application's @app_cmds table. Exits when the user types "exit" + * or presses Escape. + */ +static void command_loop(void) +{ + for (;;) { + u16 command[CMD_BUFFER_SIZE]; + const struct efi_app_cmd *cmd; + u16 *pos; + bool found; + efi_uintn_t ret; + + efi_drain_input(); + print(u"=> "); + ret = efi_input(command, CMD_BUFFER_SIZE); + if (ret == EFI_ABORTED) + break; + pos = skip_whitespace(command); + if (starts_with(pos, u"exit")) + break; + found = false; + for (cmd = app_cmds; cmd->fn; ++cmd) { + if (starts_with(pos, (u16 *)cmd->cmd)) { + efi_uintn_t len; + + for (len = 0; cmd->cmd[len]; ++len) + ; + /* + * If the keyword ends with a space the + * command expects an argument. Show help + * when none is provided. + */ + if (cmd->cmd[len - 1] == ' ' && + !*skip_whitespace(pos + len)) { + efi_app_help(app_cmds); + } else { + cmd->fn(pos + len); + } + found = true; + break; + } + } + if (!found) + efi_app_help(app_cmds); + } +} + +/** + * efi_main() - entry point of the EFI application + * + * @image_handle: image handle + * @systab: EFI system table + * Return: status code + */ +efi_status_t EFIAPI efi_main(efi_handle_t image_handle, + struct efi_system_table *systab) +{ + efi_app_init(systab, image_handle); + + color(EFI_WHITE); + cls(); + print(app_banner); + color(EFI_LIGHTBLUE); + + command_loop(); + + color(EFI_LIGHTGRAY); + cls(); + + return EFI_SUCCESS; +} diff --git a/lib/efi_loader/efi_app_common.h b/lib/efi_loader/efi_app_common.h index 77fe100afd9..7d1754d4d2a 100644 --- a/lib/efi_loader/efi_app_common.h +++ b/lib/efi_loader/efi_app_common.h @@ -10,16 +10,7 @@ #include <efi_api.h> -/** - * efi_app_init() - initialize common EFI application state - * - * Must be called from efi_main() before any other common function. - * - * @sys_table: EFI system table - * @image_handle: image handle - */ -void efi_app_init(struct efi_system_table *sys_table, - efi_handle_t image_handle); +extern struct efi_boot_services *bs; /** * print() - print string @@ -95,8 +86,8 @@ efi_status_t efi_input_yn(void); /** * efi_input() - read string from console * - * @buffer: input buffer - * @buffer_size: buffer size + * @buffer: input buffer + * @buffer_size: buffer size * Return: status code */ efi_status_t efi_input(u16 *buffer, efi_uintn_t buffer_size); @@ -104,7 +95,7 @@ efi_status_t efi_input(u16 *buffer, efi_uintn_t buffer_size); /** * get_config_table() - get configuration table * - * @guid: GUID of the configuration table + * @guid: GUID of the configuration table * Return: pointer to configuration table or NULL */ void *get_config_table(const efi_guid_t *guid); @@ -128,4 +119,18 @@ open_file_system(struct efi_simple_file_system_protocol **file_system); */ efi_status_t save_file(u16 *filename, void *buf, efi_uintn_t size); +/** + * struct efi_app_cmd - entry in the application command table + * + * @cmd: keyword; a trailing space indicates the command takes an argument + * @help: help text line printed by the built-in help handler + * @fn: handler; called with a pointer past the keyword + * (may be an empty string for no-argument commands) + */ +struct efi_app_cmd { + const u16 *cmd; + const u16 *help; + void (*fn)(u16 *args); +}; + #endif /* _EFI_APP_COMMON_H */ diff --git a/lib/efi_loader/initrddump.c b/lib/efi_loader/initrddump.c index c3e6f2b683f..ee93d151e81 100644 --- a/lib/efi_loader/initrddump.c +++ b/lib/efi_loader/initrddump.c @@ -12,15 +12,11 @@ #include <efi_load_initrd.h> #include "efi_app_common.h" -#define BUFFER_SIZE 64 -#define ESC 0x17 - #define efi_size_in_pages(size) (((size) + EFI_PAGE_MASK) >> EFI_PAGE_SHIFT) -static struct efi_system_table *systable; -static struct efi_boot_services *bs; +u16 app_banner[] = u"INITRD Dump\r\n===========\r\n\r\n"; + static const efi_guid_t load_file2_guid = EFI_LOAD_FILE2_PROTOCOL_GUID; -static efi_handle_t handle; /* * Device path defined by Linux to identify the handle providing the @@ -42,16 +38,6 @@ static const struct efi_lo_dp_prefix initrd_dp = { } }; -/** - * do_help() - print help - */ -static void do_help(void) -{ - error(u"load - show length and CRC32 of initial RAM disk\r\n"); - error(u"save <initrd> - save initial RAM disk to file\r\n"); - error(u"exit - exit the shell\r\n"); -} - /** * get_initrd() - read initial RAM disk via EFI_LOAD_FILE2_PROTOCOL * @@ -103,19 +89,18 @@ static efi_status_t get_initrd(void **initrd, efi_uintn_t *initrd_size) /** * do_load() - load initial RAM disk and display CRC32 and length * - * @filename: file name - * Return: status code + * @args: unused command arguments */ -static efi_status_t do_load(void) +static void do_load(u16 * __maybe_unused args) { void *initrd; efi_uintn_t initrd_size; u32 crc32; efi_uintn_t ret; - ret = get_initrd(&initrd, &initrd_size); + ret = get_initrd(&initrd, &initrd_size); if (ret != EFI_SUCCESS) - return ret; + return; print(u"length: 0x"); printx(initrd_size, 1); print(u"\r\n"); @@ -123,22 +108,19 @@ static efi_status_t do_load(void) ret = bs->calculate_crc32(initrd, initrd_size, &crc32); if (ret != EFI_SUCCESS) { error(u"Calculating CRC32 failed\r\n"); - return EFI_LOAD_ERROR; + return; } print(u"crc32: 0x"); printx(crc32, 8); print(u"\r\n"); - - return EFI_SUCCESS; } /** * do_save() - save initial RAM disk * * @filename: file name - * Return: status code */ -static efi_status_t do_save(u16 *filename) +static void do_save(u16 *filename) { void *initrd; efi_uintn_t initrd_size; @@ -146,9 +128,7 @@ static efi_status_t do_save(u16 *filename) ret = get_initrd(&initrd, &initrd_size); if (ret != EFI_SUCCESS) - return ret; - - filename = skip_whitespace(filename); + return; ret = save_file(filename, initrd, initrd_size); if (ret == EFI_SUCCESS) { @@ -157,53 +137,10 @@ static efi_status_t do_save(u16 *filename) } bs->free_pages((uintptr_t)initrd, efi_size_in_pages(initrd_size)); - return ret; } -/** - * efi_main() - entry point of the EFI application. - * - * @handle: handle of the loaded image - * @systab: system table - * Return: status code - */ -efi_status_t EFIAPI efi_main(efi_handle_t image_handle, - struct efi_system_table *systab) -{ - efi_app_init(systab, image_handle); - - handle = image_handle; - systable = systab; - bs = systable->boottime; - - color(EFI_WHITE); - cls(); - print(u"INITRD Dump\r\n===========\r\n\r\n"); - color(EFI_LIGHTBLUE); - - for (;;) { - u16 command[BUFFER_SIZE]; - u16 *pos; - efi_uintn_t ret; - - efi_drain_input(); - print(u"=> "); - ret = efi_input(command, sizeof(command)); - if (ret == EFI_ABORTED) - break; - pos = skip_whitespace(command); - if (starts_with(pos, u"exit")) - break; - else if (starts_with(pos, u"load")) - do_load(); - else if (starts_with(pos, u"save ")) - do_save(pos + 5); - else - do_help(); - } - - color(EFI_LIGHTGRAY); - cls(); - - return EFI_SUCCESS; -} +struct efi_app_cmd app_cmds[] = { + { u"load", u"load - show length and CRC32 of initial RAM disk\r\n", do_load }, + { u"save ", u"save <initrd> - save initial RAM disk to file\r\n", do_save }, + { } +}; diff --git a/lib/efi_loader/smbiosdump.c b/lib/efi_loader/smbiosdump.c index 8aa6f594a07..d334c1fa7cc 100644 --- a/lib/efi_loader/smbiosdump.c +++ b/lib/efi_loader/smbiosdump.c @@ -12,24 +12,11 @@ #include <string.h> #include "efi_app_common.h" -#define BUFFER_SIZE 64 +u16 app_banner[] = u"SMBIOS Dump\r\n===========\r\n\r\n"; -static struct efi_boot_services *bs; -static efi_handle_t handle; -static struct efi_system_table *systable; static const efi_guid_t smbios_guid = SMBIOS_TABLE_GUID; static const efi_guid_t smbios3_guid = SMBIOS3_TABLE_GUID; -/** - * do_help() - print help - */ -static void do_help(void) -{ - error(u"check - check SMBIOS table\r\n"); - error(u"save <file> - save SMBIOS table to file\r\n"); - error(u"exit - exit the shell\r\n"); -} - /** * checksum() - calculate checksum * @@ -50,9 +37,9 @@ static u8 checksum(void *buf, int len) /** * do_check() - check SMBIOS table * - * Return: status code + * @args: unused command arguments */ -static efi_status_t do_check(void) +static void do_check(u16 * __maybe_unused args) { struct smbios3_entry *smbios3_anchor; void *table, *table_end; @@ -65,16 +52,16 @@ static efi_status_t do_check(void) r = memcmp(smbios3_anchor->anchor, "_SM3_", 5); if (r) { error(u"Invalid anchor string\n"); - return EFI_LOAD_ERROR; + return; } print(u"Found SMBIOS 3 entry point\n"); if (smbios3_anchor->length != 0x18) { error(u"Invalid anchor length\n"); - return EFI_LOAD_ERROR; + return; } if (checksum(smbios3_anchor, smbios3_anchor->length)) { error(u"Invalid anchor checksum\n"); - return EFI_LOAD_ERROR; + return; } table = (void *)(uintptr_t)smbios3_anchor->struct_table_address; len = smbios3_anchor->table_maximum_size; @@ -85,37 +72,37 @@ static efi_status_t do_check(void) smbios_anchor = get_config_table(&smbios_guid); if (!smbios_anchor) { error(u"No SMBIOS table\n"); - return EFI_NOT_FOUND; + return; } r = memcmp(smbios_anchor->anchor, "_SM_", 4); if (r) { error(u"Invalid anchor string\n"); - return EFI_LOAD_ERROR; + return; } print(u"Found SMBIOS 2.1 entry point\n"); if (smbios_anchor->length != 0x1f) { error(u"Invalid anchor length\n"); - return EFI_LOAD_ERROR; + return; } if (checksum(smbios_anchor, smbios_anchor->length)) { error(u"Invalid anchor checksum\n"); - return EFI_LOAD_ERROR; + return; } r = memcmp(smbios_anchor->intermediate_anchor, "_DMI_", 5); if (r) { error(u"Invalid intermediate anchor string\n"); - return EFI_LOAD_ERROR; + return; } if (checksum(&smbios_anchor->intermediate_anchor, 0xf)) { error(u"Invalid intermediate anchor checksum\n"); - return EFI_LOAD_ERROR; + return; } table = (void *)(uintptr_t)smbios_anchor->struct_table_address; len = smbios_anchor->struct_table_length; } table_end = (void *)((u8 *)table + len); - for (struct smbios_header *pos = table; ;) { + for (struct smbios_header *pos = table;;) { u8 *str = (u8 *)pos + pos->length; if (!*str) @@ -124,7 +111,7 @@ static efi_status_t do_check(void) for (; *str; ++str) { if ((void *)str >= table_end) { error(u"Structure table length exceeded\n"); - return EFI_LOAD_ERROR; + return; } } ++str; @@ -132,40 +119,35 @@ static efi_status_t do_check(void) ++str; if ((void *)str > table_end) { error(u"Structure table length exceeded\n"); - return EFI_LOAD_ERROR; + return; } if (pos->type == 0x7f) /* End of table */ break; pos = (struct smbios_header *)str; } - return EFI_SUCCESS; + print(u"OK\r\n"); } /** * do_save() - save SMBIOS table * * @filename: file name - * Return: status code */ -static efi_status_t do_save(u16 *filename) +static void do_save(u16 *filename) { struct smbios3_entry *smbios3_anchor; u8 *buf; efi_uintn_t size; efi_uintn_t ret; - ret = do_check(); - if (ret != EFI_SUCCESS) - return ret; - smbios3_anchor = get_config_table(&smbios3_guid); if (smbios3_anchor) { size = 0x20 + smbios3_anchor->table_maximum_size; ret = bs->allocate_pool(EFI_LOADER_DATA, size, (void **)&buf); if (ret != EFI_SUCCESS) { error(u"Out of memory\n"); - return ret; + return; } memset(buf, 0, size); @@ -183,9 +165,8 @@ static efi_status_t do_save(u16 *filename) smbios_anchor = get_config_table(&smbios_guid); if (!smbios_anchor) { - /* Should not be reached after successful do_check() */ error(u"No SMBIOS table\n"); - return EFI_NOT_FOUND; + return; } size = 0x20 + smbios_anchor->struct_table_length; @@ -193,7 +174,7 @@ static efi_status_t do_save(u16 *filename) ret = bs->allocate_pool(EFI_LOADER_DATA, size, (void **)&buf); if (ret != EFI_SUCCESS) { error(u"Out of memory\n"); - return ret; + return; } memset(buf, 0, size); @@ -210,8 +191,6 @@ static efi_status_t do_save(u16 *filename) checksum(smbios_anchor, smbios_anchor->length); } - filename = skip_whitespace(filename); - ret = save_file(filename, buf, size); if (ret == EFI_SUCCESS) { @@ -220,65 +199,10 @@ static efi_status_t do_save(u16 *filename) } bs->free_pool(buf); - - return ret; } -/** - * command_loop() - process user commands - */ -static void command_loop(void) -{ - for (;;) { - u16 command[BUFFER_SIZE]; - u16 *pos; - efi_uintn_t ret; - - efi_drain_input(); - print(u"=> "); - ret = efi_input(command, sizeof(command)); - if (ret == EFI_ABORTED) - break; - pos = skip_whitespace(command); - if (starts_with(pos, u"exit")) { - break; - } else if (starts_with(pos, u"check")) { - ret = do_check(); - if (ret == EFI_SUCCESS) - print(u"OK\n"); - } else if (starts_with(pos, u"save ")) { - do_save(pos + 5); - } else { - do_help(); - } - } -} - -/** - * efi_main() - entry point of the EFI application. - * - * @handle: handle of the loaded image - * @systab: system table - * Return: status code - */ -efi_status_t EFIAPI efi_main(efi_handle_t image_handle, - struct efi_system_table *systab) -{ - efi_app_init(systab, image_handle); - - handle = image_handle; - systable = systab; - bs = systable->boottime; - - color(EFI_WHITE); - cls(); - print(u"SMBIOS Dump\r\n===========\r\n\r\n"); - color(EFI_LIGHTBLUE); - - command_loop(); - - color(EFI_LIGHTGRAY); - cls(); - - return EFI_SUCCESS; -} +struct efi_app_cmd app_cmds[] = { + { u"check", u"check - check SMBIOS table\r\n", do_check }, + { u"save ", u"save <file> - save SMBIOS table to file\r\n", do_save }, + { } +}; -- 2.53.0

