brintos

brintos / linux-shallow public Read only

0
0
Text · 28.4 KiB · 861b12c Raw
1270 lines · c
1// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.02/*******************************************************************************3 *4 * Module Name: dbinput - user front-end to the AML debugger5 *6 ******************************************************************************/7 8#include <acpi/acpi.h>9#include "accommon.h"10#include "acdebug.h"11 12#ifdef ACPI_APPLICATION13#include "acapps.h"14#endif15 16#define _COMPONENT          ACPI_CA_DEBUGGER17ACPI_MODULE_NAME("dbinput")18 19/* Local prototypes */20static u32 acpi_db_get_line(char *input_buffer);21 22static u32 acpi_db_match_command(char *user_command);23 24static void acpi_db_display_command_info(const char *command, u8 display_all);25 26static void acpi_db_display_help(char *command);27 28static u829acpi_db_match_command_help(const char *command,30			   const struct acpi_db_command_help *help);31 32/*33 * Top-level debugger commands.34 *35 * This list of commands must match the string table below it36 */37enum acpi_ex_debugger_commands {38	CMD_NOT_FOUND = 0,39	CMD_NULL,40	CMD_ALL,41	CMD_ALLOCATIONS,42	CMD_ARGS,43	CMD_ARGUMENTS,44	CMD_BREAKPOINT,45	CMD_BUSINFO,46	CMD_CALL,47	CMD_DEBUG,48	CMD_DISASSEMBLE,49	CMD_DISASM,50	CMD_DUMP,51	CMD_EVALUATE,52	CMD_EXECUTE,53	CMD_EXIT,54	CMD_FIELDS,55	CMD_FIND,56	CMD_GO,57	CMD_HANDLERS,58	CMD_HELP,59	CMD_HELP2,60	CMD_HISTORY,61	CMD_HISTORY_EXE,62	CMD_HISTORY_LAST,63	CMD_INFORMATION,64	CMD_INTEGRITY,65	CMD_INTO,66	CMD_LEVEL,67	CMD_LIST,68	CMD_LOCALS,69	CMD_LOCKS,70	CMD_METHODS,71	CMD_NAMESPACE,72	CMD_NOTIFY,73	CMD_OBJECTS,74	CMD_OSI,75	CMD_OWNER,76	CMD_PATHS,77	CMD_PREDEFINED,78	CMD_PREFIX,79	CMD_QUIT,80	CMD_REFERENCES,81	CMD_RESOURCES,82	CMD_RESULTS,83	CMD_SET,84	CMD_STATS,85	CMD_STOP,86	CMD_TABLES,87	CMD_TEMPLATE,88	CMD_TRACE,89	CMD_TREE,90	CMD_TYPE,91#ifdef ACPI_APPLICATION92	CMD_ENABLEACPI,93	CMD_EVENT,94	CMD_GPE,95	CMD_GPES,96	CMD_SCI,97	CMD_SLEEP,98 99	CMD_CLOSE,100	CMD_LOAD,101	CMD_OPEN,102	CMD_UNLOAD,103 104	CMD_TERMINATE,105	CMD_BACKGROUND,106	CMD_THREADS,107 108	CMD_TEST,109	CMD_INTERRUPT,110#endif111};112 113#define CMD_FIRST_VALID     2114 115/* Second parameter is the required argument count */116 117static const struct acpi_db_command_info acpi_gbl_db_commands[] = {118	{"<NOT FOUND>", 0},119	{"<NULL>", 0},120	{"ALL", 1},121	{"ALLOCATIONS", 0},122	{"ARGS", 0},123	{"ARGUMENTS", 0},124	{"BREAKPOINT", 1},125	{"BUSINFO", 0},126	{"CALL", 0},127	{"DEBUG", 1},128	{"DISASSEMBLE", 1},129	{"DISASM", 1},130	{"DUMP", 1},131	{"EVALUATE", 1},132	{"EXECUTE", 1},133	{"EXIT", 0},134	{"FIELDS", 1},135	{"FIND", 1},136	{"GO", 0},137	{"HANDLERS", 0},138	{"HELP", 0},139	{"?", 0},140	{"HISTORY", 0},141	{"!", 1},142	{"!!", 0},143	{"INFORMATION", 0},144	{"INTEGRITY", 0},145	{"INTO", 0},146	{"LEVEL", 0},147	{"LIST", 0},148	{"LOCALS", 0},149	{"LOCKS", 0},150	{"METHODS", 0},151	{"NAMESPACE", 0},152	{"NOTIFY", 2},153	{"OBJECTS", 0},154	{"OSI", 0},155	{"OWNER", 1},156	{"PATHS", 0},157	{"PREDEFINED", 0},158	{"PREFIX", 0},159	{"QUIT", 0},160	{"REFERENCES", 1},161	{"RESOURCES", 0},162	{"RESULTS", 0},163	{"SET", 3},164	{"STATS", 1},165	{"STOP", 0},166	{"TABLES", 0},167	{"TEMPLATE", 1},168	{"TRACE", 1},169	{"TREE", 0},170	{"TYPE", 1},171#ifdef ACPI_APPLICATION172	{"ENABLEACPI", 0},173	{"EVENT", 1},174	{"GPE", 1},175	{"GPES", 0},176	{"SCI", 0},177	{"SLEEP", 0},178 179	{"CLOSE", 0},180	{"LOAD", 1},181	{"OPEN", 1},182	{"UNLOAD", 1},183 184	{"TERMINATE", 0},185	{"BACKGROUND", 1},186	{"THREADS", 3},187 188	{"TEST", 1},189	{"INTERRUPT", 1},190#endif191	{NULL, 0}192};193 194/*195 * Help for all debugger commands. First argument is the number of lines196 * of help to output for the command.197 *198 * Note: Some commands are not supported by the kernel-level version of199 * the debugger.200 */201static const struct acpi_db_command_help acpi_gbl_db_command_help[] = {202	{0, "\nNamespace Access:", "\n"},203	{1, "  Businfo", "Display system bus info\n"},204	{1, "  Disassemble <Method>", "Disassemble a control method\n"},205	{1, "  Find <AcpiName> (? is wildcard)",206	 "Find ACPI name(s) with wildcards\n"},207	{1, "  Integrity", "Validate namespace integrity\n"},208	{1, "  Methods", "Display list of loaded control methods\n"},209	{1, "  Fields <AddressSpaceId>",210	 "Display list of loaded field units by space ID\n"},211	{1, "  Namespace [Object] [Depth]",212	 "Display loaded namespace tree/subtree\n"},213	{1, "  Notify <Object> <Value>", "Send a notification on Object\n"},214	{1, "  Objects [ObjectType]",215	 "Display summary of all objects or just given type\n"},216	{1, "  Owner <OwnerId> [Depth]",217	 "Display loaded namespace by object owner\n"},218	{1, "  Paths", "Display full pathnames of namespace objects\n"},219	{1, "  Predefined", "Check all predefined names\n"},220	{1, "  Prefix [<Namepath>]", "Set or Get current execution prefix\n"},221	{1, "  References <Addr>", "Find all references to object at addr\n"},222	{1, "  Resources [DeviceName]",223	 "Display Device resources (no arg = all devices)\n"},224	{1, "  Set N <NamedObject> <Value>", "Set value for named integer\n"},225	{1, "  Template <Object>", "Format/dump a Buffer/ResourceTemplate\n"},226	{1, "  Type <Object>", "Display object type\n"},227 228	{0, "\nControl Method Execution:", "\n"},229	{1, "  All <NameSeg>", "Evaluate all objects named NameSeg\n"},230	{1, "  Evaluate <Namepath> [Arguments]",231	 "Evaluate object or control method\n"},232	{1, "  Execute <Namepath> [Arguments]", "Synonym for Evaluate\n"},233#ifdef ACPI_APPLICATION234	{1, "  Background <Namepath> [Arguments]",235	 "Evaluate object/method in a separate thread\n"},236	{1, "  Thread <Threads><Loops><NamePath>",237	 "Spawn threads to execute method(s)\n"},238#endif239	{1, "  Debug <Namepath> [Arguments]", "Single-Step a control method\n"},240	{7, "  [Arguments] formats:", "Control method argument formats\n"},241	{1, "     Hex Integer", "Integer\n"},242	{1, "     \"Ascii String\"", "String\n"},243	{1, "     (Hex Byte List)", "Buffer\n"},244	{1, "         (01 42 7A BF)", "Buffer example (4 bytes)\n"},245	{1, "     [Package Element List]", "Package\n"},246	{1, "         [0x01 0x1234 \"string\"]",247	 "Package example (3 elements)\n"},248 249	{0, "\nMiscellaneous:", "\n"},250	{1, "  Allocations", "Display list of current memory allocations\n"},251	{2, "  Dump <Address>|<Namepath>", "\n"},252	{0, "       [Byte|Word|Dword|Qword]",253	 "Display ACPI objects or memory\n"},254	{1, "  Handlers", "Info about global handlers\n"},255	{1, "  Help [Command]", "This help screen or individual command\n"},256	{1, "  History", "Display command history buffer\n"},257	{1, "  Level <DebugLevel>] [console]",258	 "Get/Set debug level for file or console\n"},259	{1, "  Locks", "Current status of internal mutexes\n"},260	{1, "  Osi [Install|Remove <name>]",261	 "Display or modify global _OSI list\n"},262	{1, "  Quit or Exit", "Exit this command\n"},263	{8, "  Stats <SubCommand>",264	 "Display namespace and memory statistics\n"},265	{1, "     Allocations", "Display list of current memory allocations\n"},266	{1, "     Memory", "Dump internal memory lists\n"},267	{1, "     Misc", "Namespace search and mutex stats\n"},268	{1, "     Objects", "Summary of namespace objects\n"},269	{1, "     Sizes", "Sizes for each of the internal objects\n"},270	{1, "     Stack", "Display CPU stack usage\n"},271	{1, "     Tables", "Info about current ACPI table(s)\n"},272	{1, "  Tables", "Display info about loaded ACPI tables\n"},273#ifdef ACPI_APPLICATION274	{1, "  Terminate", "Delete namespace and all internal objects\n"},275#endif276	{1, "  ! <CommandNumber>", "Execute command from history buffer\n"},277	{1, "  !!", "Execute last command again\n"},278 279	{0, "\nMethod and Namespace Debugging:", "\n"},280	{5, "  Trace <State> [<Namepath>] [Once]",281	 "Trace control method execution\n"},282	{1, "     Enable", "Enable all messages\n"},283	{1, "     Disable", "Disable tracing\n"},284	{1, "     Method", "Enable method execution messages\n"},285	{1, "     Opcode", "Enable opcode execution messages\n"},286	{3, "  Test <TestName>", "Invoke a debug test\n"},287	{1, "     Objects", "Read/write/compare all namespace data objects\n"},288	{1, "     Predefined",289	 "Validate all ACPI predefined names (_STA, etc.)\n"},290	{1, "  Execute predefined",291	 "Execute all predefined (public) methods\n"},292 293	{0, "\nControl Method Single-Step Execution:", "\n"},294	{1, "  Arguments (or Args)", "Display method arguments\n"},295	{1, "  Breakpoint <AmlOffset>", "Set an AML execution breakpoint\n"},296	{1, "  Call", "Run to next control method invocation\n"},297	{1, "  Go", "Allow method to run to completion\n"},298	{1, "  Information", "Display info about the current method\n"},299	{1, "  Into", "Step into (not over) a method call\n"},300	{1, "  List [# of Aml Opcodes]", "Display method ASL statements\n"},301	{1, "  Locals", "Display method local variables\n"},302	{1, "  Results", "Display method result stack\n"},303	{1, "  Set <A|L> <#> <Value>", "Set method data (Arguments/Locals)\n"},304	{1, "  Stop", "Terminate control method\n"},305	{1, "  Tree", "Display control method calling tree\n"},306	{1, "  <Enter>", "Single step next AML opcode (over calls)\n"},307 308#ifdef ACPI_APPLICATION309	{0, "\nFile Operations:", "\n"},310	{1, "  Close", "Close debug output file\n"},311	{1, "  Load <Input Filename>", "Load ACPI table from a file\n"},312	{1, "  Open <Output Filename>", "Open a file for debug output\n"},313	{1, "  Unload <Namepath>",314	 "Unload an ACPI table via namespace object\n"},315 316	{0, "\nHardware Simulation:", "\n"},317	{1, "  EnableAcpi", "Enable ACPI (hardware) mode\n"},318	{1, "  Event <F|G> <Value>", "Generate AcpiEvent (Fixed/GPE)\n"},319	{1, "  Gpe <GpeNum> [GpeBlockDevice]", "Simulate a GPE\n"},320	{1, "  Gpes", "Display info on all GPE devices\n"},321	{1, "  Sci", "Generate an SCI\n"},322	{1, "  Sleep [SleepState]", "Simulate sleep/wake sequence(s) (0-5)\n"},323	{1, "  Interrupt <GSIV>", "Simulate an interrupt\n"},324#endif325	{0, NULL, NULL}326};327 328/*******************************************************************************329 *330 * FUNCTION:    acpi_db_match_command_help331 *332 * PARAMETERS:  command             - Command string to match333 *              help                - Help table entry to attempt match334 *335 * RETURN:      TRUE if command matched, FALSE otherwise336 *337 * DESCRIPTION: Attempt to match a command in the help table in order to338 *              print help information for a single command.339 *340 ******************************************************************************/341 342static u8343acpi_db_match_command_help(const char *command,344			   const struct acpi_db_command_help *help)345{346	char *invocation = help->invocation;347	u32 line_count;348 349	/* Valid commands in the help table begin with a couple of spaces */350 351	if (*invocation != ' ') {352		return (FALSE);353	}354 355	while (*invocation == ' ') {356		invocation++;357	}358 359	/* Match command name (full command or substring) */360 361	while ((*command) && (*invocation) && (*invocation != ' ')) {362		if (tolower((int)*command) != tolower((int)*invocation)) {363			return (FALSE);364		}365 366		invocation++;367		command++;368	}369 370	/* Print the appropriate number of help lines */371 372	line_count = help->line_count;373	while (line_count) {374		acpi_os_printf("%-38s : %s", help->invocation,375			       help->description);376		help++;377		line_count--;378	}379 380	return (TRUE);381}382 383/*******************************************************************************384 *385 * FUNCTION:    acpi_db_display_command_info386 *387 * PARAMETERS:  command             - Command string to match388 *              display_all         - Display all matching commands, or just389 *                                    the first one (substring match)390 *391 * RETURN:      None392 *393 * DESCRIPTION: Display help information for a Debugger command.394 *395 ******************************************************************************/396 397static void acpi_db_display_command_info(const char *command, u8 display_all)398{399	const struct acpi_db_command_help *next;400	u8 matched;401 402	next = acpi_gbl_db_command_help;403	while (next->invocation) {404		matched = acpi_db_match_command_help(command, next);405		if (!display_all && matched) {406			return;407		}408 409		next++;410	}411}412 413/*******************************************************************************414 *415 * FUNCTION:    acpi_db_display_help416 *417 * PARAMETERS:  command             - Optional command string to display help.418 *                                    if not specified, all debugger command419 *                                    help strings are displayed420 *421 * RETURN:      None422 *423 * DESCRIPTION: Display help for a single debugger command, or all of them.424 *425 ******************************************************************************/426 427static void acpi_db_display_help(char *command)428{429	const struct acpi_db_command_help *next = acpi_gbl_db_command_help;430 431	if (!command) {432 433		/* No argument to help, display help for all commands */434 435		acpi_os_printf("\nSummary of AML Debugger Commands\n\n");436 437		while (next->invocation) {438			acpi_os_printf("%-38s%s", next->invocation,439				       next->description);440			next++;441		}442		acpi_os_printf("\n");443 444	} else {445		/* Display help for all commands that match the substring */446 447		acpi_db_display_command_info(command, TRUE);448	}449}450 451/*******************************************************************************452 *453 * FUNCTION:    acpi_db_get_next_token454 *455 * PARAMETERS:  string          - Command buffer456 *              next            - Return value, end of next token457 *458 * RETURN:      Pointer to the start of the next token.459 *460 * DESCRIPTION: Command line parsing. Get the next token on the command line461 *462 ******************************************************************************/463 464char *acpi_db_get_next_token(char *string,465			     char **next, acpi_object_type *return_type)466{467	char *start;468	u32 depth;469	acpi_object_type type = ACPI_TYPE_INTEGER;470 471	/* At end of buffer? */472 473	if (!string || !(*string)) {474		return (NULL);475	}476 477	/* Remove any spaces at the beginning, ignore blank lines */478 479	while (*string && isspace((int)*string)) {480		string++;481	}482 483	if (!(*string)) {484		return (NULL);485	}486 487	switch (*string) {488	case '"':489 490		/* This is a quoted string, scan until closing quote */491 492		string++;493		start = string;494		type = ACPI_TYPE_STRING;495 496		/* Find end of string */497 498		while (*string && (*string != '"')) {499			string++;500		}501		break;502 503	case '(':504 505		/* This is the start of a buffer, scan until closing paren */506 507		string++;508		start = string;509		type = ACPI_TYPE_BUFFER;510 511		/* Find end of buffer */512 513		while (*string && (*string != ')')) {514			string++;515		}516		break;517 518	case '{':519 520		/* This is the start of a field unit, scan until closing brace */521 522		string++;523		start = string;524		type = ACPI_TYPE_FIELD_UNIT;525 526		/* Find end of buffer */527 528		while (*string && (*string != '}')) {529			string++;530		}531		break;532 533	case '[':534 535		/* This is the start of a package, scan until closing bracket */536 537		string++;538		depth = 1;539		start = string;540		type = ACPI_TYPE_PACKAGE;541 542		/* Find end of package (closing bracket) */543 544		while (*string) {545 546			/* Handle String package elements */547 548			if (*string == '"') {549				/* Find end of string */550 551				string++;552				while (*string && (*string != '"')) {553					string++;554				}555				if (!(*string)) {556					break;557				}558			} else if (*string == '[') {559				depth++;	/* A nested package declaration */560			} else if (*string == ']') {561				depth--;562				if (depth == 0) {	/* Found final package closing bracket */563					break;564				}565			}566 567			string++;568		}569		break;570 571	default:572 573		start = string;574 575		/* Find end of token */576 577		while (*string && !isspace((int)*string)) {578			string++;579		}580		break;581	}582 583	if (!(*string)) {584		*next = NULL;585	} else {586		*string = 0;587		*next = string + 1;588	}589 590	*return_type = type;591	return (start);592}593 594/*******************************************************************************595 *596 * FUNCTION:    acpi_db_get_line597 *598 * PARAMETERS:  input_buffer        - Command line buffer599 *600 * RETURN:      Count of arguments to the command601 *602 * DESCRIPTION: Get the next command line from the user. Gets entire line603 *              up to the next newline604 *605 ******************************************************************************/606 607static u32 acpi_db_get_line(char *input_buffer)608{609	u32 i;610	u32 count;611	char *next;612	char *this;613 614	if (acpi_ut_safe_strcpy615	    (acpi_gbl_db_parsed_buf, sizeof(acpi_gbl_db_parsed_buf),616	     input_buffer)) {617		acpi_os_printf618		    ("Buffer overflow while parsing input line (max %u characters)\n",619		     (u32)sizeof(acpi_gbl_db_parsed_buf));620		return (0);621	}622 623	this = acpi_gbl_db_parsed_buf;624	for (i = 0; i < ACPI_DEBUGGER_MAX_ARGS; i++) {625		acpi_gbl_db_args[i] = acpi_db_get_next_token(this, &next,626							     &acpi_gbl_db_arg_types627							     [i]);628		if (!acpi_gbl_db_args[i]) {629			break;630		}631 632		this = next;633	}634 635	/* Uppercase the actual command */636 637	acpi_ut_strupr(acpi_gbl_db_args[0]);638 639	count = i;640	if (count) {641		count--;	/* Number of args only */642	}643 644	return (count);645}646 647/*******************************************************************************648 *649 * FUNCTION:    acpi_db_match_command650 *651 * PARAMETERS:  user_command            - User command line652 *653 * RETURN:      Index into command array, -1 if not found654 *655 * DESCRIPTION: Search command array for a command match656 *657 ******************************************************************************/658 659static u32 acpi_db_match_command(char *user_command)660{661	u32 i;662 663	if (!user_command || user_command[0] == 0) {664		return (CMD_NULL);665	}666 667	for (i = CMD_FIRST_VALID; acpi_gbl_db_commands[i].name; i++) {668		if (strstr669		    (ACPI_CAST_PTR(char, acpi_gbl_db_commands[i].name),670		     user_command) == acpi_gbl_db_commands[i].name) {671			return (i);672		}673	}674 675	/* Command not recognized */676 677	return (CMD_NOT_FOUND);678}679 680/*******************************************************************************681 *682 * FUNCTION:    acpi_db_command_dispatch683 *684 * PARAMETERS:  input_buffer        - Command line buffer685 *              walk_state          - Current walk686 *              op                  - Current (executing) parse op687 *688 * RETURN:      Status689 *690 * DESCRIPTION: Command dispatcher.691 *692 ******************************************************************************/693 694acpi_status695acpi_db_command_dispatch(char *input_buffer,696			 struct acpi_walk_state *walk_state,697			 union acpi_parse_object *op)698{699	u32 temp;700	u64 temp64;701	u32 command_index;702	u32 param_count;703	char *command_line;704	acpi_status status = AE_CTRL_TRUE;705 706	/* If acpi_terminate has been called, terminate this thread */707 708	if (acpi_gbl_db_terminate_loop) {709		return (AE_CTRL_TERMINATE);710	}711 712	/* Find command and add to the history buffer */713 714	param_count = acpi_db_get_line(input_buffer);715	command_index = acpi_db_match_command(acpi_gbl_db_args[0]);716 717	/*718	 * We don't want to add the !! command to the history buffer. It719	 * would cause an infinite loop because it would always be the720	 * previous command.721	 */722	if (command_index != CMD_HISTORY_LAST) {723		acpi_db_add_to_history(input_buffer);724	}725 726	/* Verify that we have the minimum number of params */727 728	if (param_count < acpi_gbl_db_commands[command_index].min_args) {729		acpi_os_printf730		    ("%u parameters entered, [%s] requires %u parameters\n",731		     param_count, acpi_gbl_db_commands[command_index].name,732		     acpi_gbl_db_commands[command_index].min_args);733 734		acpi_db_display_command_info(acpi_gbl_db_commands735					     [command_index].name, FALSE);736		return (AE_CTRL_TRUE);737	}738 739	/* Decode and dispatch the command */740 741	switch (command_index) {742	case CMD_NULL:743 744		if (op) {745			return (AE_OK);746		}747		break;748 749	case CMD_ALL:750 751		acpi_os_printf("Executing all objects with NameSeg: %s\n",752			       acpi_gbl_db_args[1]);753		acpi_db_execute(acpi_gbl_db_args[1], &acpi_gbl_db_args[2],754				&acpi_gbl_db_arg_types[2],755				EX_NO_SINGLE_STEP | EX_ALL);756		break;757 758	case CMD_ALLOCATIONS:759 760#ifdef ACPI_DBG_TRACK_ALLOCATIONS761		acpi_ut_dump_allocations((u32)-1, NULL);762#endif763		break;764 765	case CMD_ARGS:766	case CMD_ARGUMENTS:767 768		acpi_db_display_arguments();769		break;770 771	case CMD_BREAKPOINT:772 773		acpi_db_set_method_breakpoint(acpi_gbl_db_args[1], walk_state,774					      op);775		break;776 777	case CMD_BUSINFO:778 779		acpi_db_get_bus_info();780		break;781 782	case CMD_CALL:783 784		acpi_db_set_method_call_breakpoint(op);785		status = AE_OK;786		break;787 788	case CMD_DEBUG:789 790		acpi_db_execute(acpi_gbl_db_args[1],791				&acpi_gbl_db_args[2], &acpi_gbl_db_arg_types[2],792				EX_SINGLE_STEP);793		break;794 795	case CMD_DISASSEMBLE:796	case CMD_DISASM:797 798#ifdef ACPI_DISASSEMBLER799		(void)acpi_db_disassemble_method(acpi_gbl_db_args[1]);800#else801		acpi_os_printf802		    ("The AML Disassembler is not configured/present\n");803#endif804		break;805 806	case CMD_DUMP:807 808		acpi_db_decode_and_display_object(acpi_gbl_db_args[1],809						  acpi_gbl_db_args[2]);810		break;811 812	case CMD_EVALUATE:813	case CMD_EXECUTE:814 815		acpi_db_execute(acpi_gbl_db_args[1],816				&acpi_gbl_db_args[2], &acpi_gbl_db_arg_types[2],817				EX_NO_SINGLE_STEP);818		break;819 820	case CMD_FIND:821 822		status = acpi_db_find_name_in_namespace(acpi_gbl_db_args[1]);823		break;824 825	case CMD_FIELDS:826 827		status = acpi_ut_strtoul64(acpi_gbl_db_args[1], &temp64);828 829		if (ACPI_FAILURE(status)830		    || temp64 >= ACPI_NUM_PREDEFINED_REGIONS) {831			acpi_os_printf832			    ("Invalid address space ID: must be between 0 and %u inclusive\n",833			     ACPI_NUM_PREDEFINED_REGIONS - 1);834			return (AE_OK);835		}836 837		status = acpi_db_display_fields((u32)temp64);838		break;839 840	case CMD_GO:841 842		acpi_gbl_cm_single_step = FALSE;843		return (AE_OK);844 845	case CMD_HANDLERS:846 847		acpi_db_display_handlers();848		break;849 850	case CMD_HELP:851	case CMD_HELP2:852 853		acpi_db_display_help(acpi_gbl_db_args[1]);854		break;855 856	case CMD_HISTORY:857 858		acpi_db_display_history();859		break;860 861	case CMD_HISTORY_EXE:	/* ! command */862 863		command_line = acpi_db_get_from_history(acpi_gbl_db_args[1]);864		if (!command_line) {865			return (AE_CTRL_TRUE);866		}867 868		status = acpi_db_command_dispatch(command_line, walk_state, op);869		return (status);870 871	case CMD_HISTORY_LAST:	/* !! command */872 873		command_line = acpi_db_get_from_history(NULL);874		if (!command_line) {875			return (AE_CTRL_TRUE);876		}877 878		status = acpi_db_command_dispatch(command_line, walk_state, op);879		return (status);880 881	case CMD_INFORMATION:882 883		acpi_db_display_method_info(op);884		break;885 886	case CMD_INTEGRITY:887 888		acpi_db_check_integrity();889		break;890 891	case CMD_INTO:892 893		if (op) {894			acpi_gbl_cm_single_step = TRUE;895			return (AE_OK);896		}897		break;898 899	case CMD_LEVEL:900 901		if (param_count == 0) {902			acpi_os_printf903			    ("Current debug level for file output is:    %8.8X\n",904			     acpi_gbl_db_debug_level);905			acpi_os_printf906			    ("Current debug level for console output is: %8.8X\n",907			     acpi_gbl_db_console_debug_level);908		} else if (param_count == 2) {909			temp = acpi_gbl_db_console_debug_level;910			acpi_gbl_db_console_debug_level =911			    strtoul(acpi_gbl_db_args[1], NULL, 16);912			acpi_os_printf913			    ("Debug Level for console output was %8.8X, now %8.8X\n",914			     temp, acpi_gbl_db_console_debug_level);915		} else {916			temp = acpi_gbl_db_debug_level;917			acpi_gbl_db_debug_level =918			    strtoul(acpi_gbl_db_args[1], NULL, 16);919			acpi_os_printf920			    ("Debug Level for file output was %8.8X, now %8.8X\n",921			     temp, acpi_gbl_db_debug_level);922		}923		break;924 925	case CMD_LIST:926 927#ifdef ACPI_DISASSEMBLER928		acpi_db_disassemble_aml(acpi_gbl_db_args[1], op);929#else930		acpi_os_printf931		    ("The AML Disassembler is not configured/present\n");932#endif933		break;934 935	case CMD_LOCKS:936 937		acpi_db_display_locks();938		break;939 940	case CMD_LOCALS:941 942		acpi_db_display_locals();943		break;944 945	case CMD_METHODS:946 947		status = acpi_db_display_objects("METHOD", acpi_gbl_db_args[1]);948		break;949 950	case CMD_NAMESPACE:951 952		acpi_db_dump_namespace(acpi_gbl_db_args[1],953				       acpi_gbl_db_args[2]);954		break;955 956	case CMD_NOTIFY:957 958		temp = strtoul(acpi_gbl_db_args[2], NULL, 0);959		acpi_db_send_notify(acpi_gbl_db_args[1], temp);960		break;961 962	case CMD_OBJECTS:963 964		acpi_ut_strupr(acpi_gbl_db_args[1]);965		status =966		    acpi_db_display_objects(acpi_gbl_db_args[1],967					    acpi_gbl_db_args[2]);968		break;969 970	case CMD_OSI:971 972		acpi_db_display_interfaces(acpi_gbl_db_args[1],973					   acpi_gbl_db_args[2]);974		break;975 976	case CMD_OWNER:977 978		acpi_db_dump_namespace_by_owner(acpi_gbl_db_args[1],979						acpi_gbl_db_args[2]);980		break;981 982	case CMD_PATHS:983 984		acpi_db_dump_namespace_paths();985		break;986 987	case CMD_PREFIX:988 989		acpi_db_set_scope(acpi_gbl_db_args[1]);990		break;991 992	case CMD_REFERENCES:993 994		acpi_db_find_references(acpi_gbl_db_args[1]);995		break;996 997	case CMD_RESOURCES:998 999		acpi_db_display_resources(acpi_gbl_db_args[1]);1000		break;1001 1002	case CMD_RESULTS:1003 1004		acpi_db_display_results();1005		break;1006 1007	case CMD_SET:1008 1009		acpi_db_set_method_data(acpi_gbl_db_args[1],1010					acpi_gbl_db_args[2],1011					acpi_gbl_db_args[3]);1012		break;1013 1014	case CMD_STATS:1015 1016		status = acpi_db_display_statistics(acpi_gbl_db_args[1]);1017		break;1018 1019	case CMD_STOP:1020 1021		return (AE_NOT_IMPLEMENTED);1022 1023	case CMD_TABLES:1024 1025		acpi_db_display_table_info(acpi_gbl_db_args[1]);1026		break;1027 1028	case CMD_TEMPLATE:1029 1030		acpi_db_display_template(acpi_gbl_db_args[1]);1031		break;1032 1033	case CMD_TRACE:1034 1035		acpi_db_trace(acpi_gbl_db_args[1], acpi_gbl_db_args[2],1036			      acpi_gbl_db_args[3]);1037		break;1038 1039	case CMD_TREE:1040 1041		acpi_db_display_calling_tree();1042		break;1043 1044	case CMD_TYPE:1045 1046		acpi_db_display_object_type(acpi_gbl_db_args[1]);1047		break;1048 1049#ifdef ACPI_APPLICATION1050 1051		/* Hardware simulation commands. */1052 1053	case CMD_ENABLEACPI:1054#if (!ACPI_REDUCED_HARDWARE)1055 1056		status = acpi_enable();1057		if (ACPI_FAILURE(status)) {1058			acpi_os_printf("AcpiEnable failed (Status=%X)\n",1059				       status);1060			return (status);1061		}1062#endif				/* !ACPI_REDUCED_HARDWARE */1063		break;1064 1065	case CMD_EVENT:1066 1067		acpi_os_printf("Event command not implemented\n");1068		break;1069 1070	case CMD_INTERRUPT:1071 1072		acpi_db_generate_interrupt(acpi_gbl_db_args[1]);1073		break;1074 1075	case CMD_GPE:1076 1077		acpi_db_generate_gpe(acpi_gbl_db_args[1], acpi_gbl_db_args[2]);1078		break;1079 1080	case CMD_GPES:1081 1082		acpi_db_display_gpes();1083		break;1084 1085	case CMD_SCI:1086 1087		acpi_db_generate_sci();1088		break;1089 1090	case CMD_SLEEP:1091 1092		status = acpi_db_sleep(acpi_gbl_db_args[1]);1093		break;1094 1095		/* File I/O commands. */1096 1097	case CMD_CLOSE:1098 1099		acpi_db_close_debug_file();1100		break;1101 1102	case CMD_LOAD:{1103			struct acpi_new_table_desc *list_head = NULL;1104 1105			status =1106			    ac_get_all_tables_from_file(acpi_gbl_db_args[1],1107							ACPI_GET_ALL_TABLES,1108							&list_head);1109			if (ACPI_SUCCESS(status)) {1110				acpi_db_load_tables(list_head);1111			}1112		}1113		break;1114 1115	case CMD_OPEN:1116 1117		acpi_db_open_debug_file(acpi_gbl_db_args[1]);1118		break;1119 1120		/* User space commands. */1121 1122	case CMD_TERMINATE:1123 1124		acpi_db_set_output_destination(ACPI_DB_REDIRECTABLE_OUTPUT);1125		acpi_ut_subsystem_shutdown();1126 1127		/*1128		 * TBD: [Restructure] Need some way to re-initialize without1129		 * re-creating the semaphores!1130		 */1131 1132		acpi_gbl_db_terminate_loop = TRUE;1133		/*  acpi_initialize (NULL); */1134		break;1135 1136	case CMD_BACKGROUND:1137 1138		acpi_db_create_execution_thread(acpi_gbl_db_args[1],1139						&acpi_gbl_db_args[2],1140						&acpi_gbl_db_arg_types[2]);1141		break;1142 1143	case CMD_THREADS:1144 1145		acpi_db_create_execution_threads(acpi_gbl_db_args[1],1146						 acpi_gbl_db_args[2],1147						 acpi_gbl_db_args[3]);1148		break;1149 1150		/* Debug test commands. */1151 1152	case CMD_PREDEFINED:1153 1154		acpi_db_check_predefined_names();1155		break;1156 1157	case CMD_TEST:1158 1159		acpi_db_execute_test(acpi_gbl_db_args[1]);1160		break;1161 1162	case CMD_UNLOAD:1163 1164		acpi_db_unload_acpi_table(acpi_gbl_db_args[1]);1165		break;1166#endif1167 1168	case CMD_EXIT:1169	case CMD_QUIT:1170 1171		if (op) {1172			acpi_os_printf("Method execution terminated\n");1173			return (AE_CTRL_TERMINATE);1174		}1175 1176		if (!acpi_gbl_db_output_to_file) {1177			acpi_dbg_level = ACPI_DEBUG_DEFAULT;1178		}1179#ifdef ACPI_APPLICATION1180		acpi_db_close_debug_file();1181#endif1182		acpi_gbl_db_terminate_loop = TRUE;1183		return (AE_CTRL_TERMINATE);1184 1185	case CMD_NOT_FOUND:1186	default:1187 1188		acpi_os_printf("%s: unknown command\n", acpi_gbl_db_args[0]);1189		return (AE_CTRL_TRUE);1190	}1191 1192	if (ACPI_SUCCESS(status)) {1193		status = AE_CTRL_TRUE;1194	}1195 1196	return (status);1197}1198 1199/*******************************************************************************1200 *1201 * FUNCTION:    acpi_db_execute_thread1202 *1203 * PARAMETERS:  context         - Not used1204 *1205 * RETURN:      None1206 *1207 * DESCRIPTION: Debugger execute thread. Waits for a command line, then1208 *              simply dispatches it.1209 *1210 ******************************************************************************/1211 1212void ACPI_SYSTEM_XFACE acpi_db_execute_thread(void *context)1213{1214 1215	(void)acpi_db_user_commands();1216	acpi_gbl_db_threads_terminated = TRUE;1217}1218 1219/*******************************************************************************1220 *1221 * FUNCTION:    acpi_db_user_commands1222 *1223 * PARAMETERS:  None1224 *1225 * RETURN:      None1226 *1227 * DESCRIPTION: Command line execution for the AML debugger. Commands are1228 *              matched and dispatched here.1229 *1230 ******************************************************************************/1231 1232acpi_status acpi_db_user_commands(void)1233{1234	acpi_status status = AE_OK;1235 1236	acpi_os_printf("\n");1237 1238	/* TBD: [Restructure] Need a separate command line buffer for step mode */1239 1240	while (!acpi_gbl_db_terminate_loop) {1241 1242		/* Wait the readiness of the command */1243 1244		status = acpi_os_wait_command_ready();1245		if (ACPI_FAILURE(status)) {1246			break;1247		}1248 1249		/* Just call to the command line interpreter */1250 1251		acpi_gbl_method_executing = FALSE;1252		acpi_gbl_step_to_next_call = FALSE;1253 1254		(void)acpi_db_command_dispatch(acpi_gbl_db_line_buf, NULL,1255					       NULL);1256 1257		/* Notify the completion of the command */1258 1259		status = acpi_os_notify_command_complete();1260		if (ACPI_FAILURE(status)) {1261			break;1262		}1263	}1264 1265	if (ACPI_FAILURE(status) && status != AE_CTRL_TERMINATE) {1266		ACPI_EXCEPTION((AE_INFO, status, "While parsing command line"));1267	}1268	return (status);1269}1270