| // SPDX-License-Identifier: GPL-2.0+ |
| |
| #include <cli.h> |
| #include <command.h> |
| #include <string.h> |
| #include <asm/global_data.h> |
| |
| DECLARE_GLOBAL_DATA_PTR; |
| |
| static const char *gd_flags_to_parser_name(void) |
| { |
| if (gd->flags & GD_FLG_HUSH_OLD_PARSER) |
| return "old"; |
| if (gd->flags & GD_FLG_HUSH_MODERN_PARSER) |
| return "modern"; |
| return NULL; |
| } |
| |
| static int do_cli_get(struct cmd_tbl *cmdtp, int flag, int argc, |
| char *const argv[]) |
| { |
| const char *current = gd_flags_to_parser_name(); |
| |
| if (!current) { |
| printf("current cli value is not valid, this should not happen!\n"); |
| return CMD_RET_FAILURE; |
| } |
| |
| printf("%s\n", current); |
| |
| return CMD_RET_SUCCESS; |
| } |
| |
| static int parser_string_to_gd_flags(const char *parser) |
| { |
| if (!strcmp(parser, "old")) |
| return GD_FLG_HUSH_OLD_PARSER; |
| if (!strcmp(parser, "modern")) |
| return GD_FLG_HUSH_MODERN_PARSER; |
| return -1; |
| } |
| |
| static int gd_flags_to_parser_config(int flag) |
| { |
| if (gd->flags & GD_FLG_HUSH_OLD_PARSER) |
| return CONFIG_VAL(HUSH_OLD_PARSER); |
| if (gd->flags & GD_FLG_HUSH_MODERN_PARSER) |
| return CONFIG_VAL(HUSH_MODERN_PARSER); |
| return -1; |
| } |
| |
| static void reset_parser_gd_flags(void) |
| { |
| gd->flags &= ~GD_FLG_HUSH_OLD_PARSER; |
| gd->flags &= ~GD_FLG_HUSH_MODERN_PARSER; |
| } |
| |
| static int do_cli_set(struct cmd_tbl *cmdtp, int flag, int argc, |
| char *const argv[]) |
| { |
| char *parser_name; |
| int parser_config; |
| int parser_flag; |
| |
| if (argc < 2) |
| return CMD_RET_USAGE; |
| |
| parser_name = argv[1]; |
| |
| parser_flag = parser_string_to_gd_flags(parser_name); |
| if (parser_flag == -1) { |
| printf("Bad value for parser name: %s\n", parser_name); |
| return CMD_RET_USAGE; |
| } |
| |
| parser_config = gd_flags_to_parser_config(parser_flag); |
| switch (parser_config) { |
| case -1: |
| printf("Bad value for parser flags: %d\n", parser_flag); |
| return CMD_RET_FAILURE; |
| case 0: |
| printf("Want to set current parser to %s, but its code was not compiled!\n", |
| parser_name); |
| return CMD_RET_FAILURE; |
| } |
| |
| reset_parser_gd_flags(); |
| gd->flags |= parser_flag; |
| |
| cli_init(); |
| cli_loop(); |
| |
| /* cli_loop() should never return. */ |
| return CMD_RET_FAILURE; |
| } |
| |
| static struct cmd_tbl parser_sub[] = { |
| U_BOOT_CMD_MKENT(get, 1, 1, do_cli_get, "", ""), |
| U_BOOT_CMD_MKENT(set, 2, 1, do_cli_set, "", ""), |
| }; |
| |
| static int do_cli(struct cmd_tbl *cmdtp, int flag, int argc, |
| char *const argv[]) |
| { |
| struct cmd_tbl *cp; |
| |
| if (argc < 2) |
| return CMD_RET_USAGE; |
| |
| /* drop initial "parser" arg */ |
| argc--; |
| argv++; |
| |
| cp = find_cmd_tbl(argv[0], parser_sub, ARRAY_SIZE(parser_sub)); |
| if (cp) |
| return cp->cmd(cmdtp, flag, argc, argv); |
| |
| return CMD_RET_USAGE; |
| } |
| |
| U_BOOT_LONGHELP(cli, |
| "get - print current cli\n" |
| "set - set the current cli, possible value are: old, modern\n"); |
| |
| U_BOOT_CMD(cli, 3, 1, do_cli, |
| "cli", |
| cli_help_text |
| ); |