Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | // 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 ); |