// SPDX-License-Identifier: GPL-2.0+ #include #include #include #include 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 );