1124f4c82Sjruoho /*******************************************************************************
2124f4c82Sjruoho *
3124f4c82Sjruoho * Module Name: dbmethod - Debug commands for control methods
4124f4c82Sjruoho *
5124f4c82Sjruoho ******************************************************************************/
6124f4c82Sjruoho
7124f4c82Sjruoho /*
8*2c7d7e3cSchristos * Copyright (C) 2000 - 2023, Intel Corp.
9124f4c82Sjruoho * All rights reserved.
10124f4c82Sjruoho *
11124f4c82Sjruoho * Redistribution and use in source and binary forms, with or without
12124f4c82Sjruoho * modification, are permitted provided that the following conditions
13124f4c82Sjruoho * are met:
14124f4c82Sjruoho * 1. Redistributions of source code must retain the above copyright
15124f4c82Sjruoho * notice, this list of conditions, and the following disclaimer,
16124f4c82Sjruoho * without modification.
17124f4c82Sjruoho * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18124f4c82Sjruoho * substantially similar to the "NO WARRANTY" disclaimer below
19124f4c82Sjruoho * ("Disclaimer") and any redistribution must be conditioned upon
20124f4c82Sjruoho * including a substantially similar Disclaimer requirement for further
21124f4c82Sjruoho * binary redistribution.
22124f4c82Sjruoho * 3. Neither the names of the above-listed copyright holders nor the names
23124f4c82Sjruoho * of any contributors may be used to endorse or promote products derived
24124f4c82Sjruoho * from this software without specific prior written permission.
25124f4c82Sjruoho *
26124f4c82Sjruoho * Alternatively, this software may be distributed under the terms of the
27124f4c82Sjruoho * GNU General Public License ("GPL") version 2 as published by the Free
28124f4c82Sjruoho * Software Foundation.
29124f4c82Sjruoho *
30124f4c82Sjruoho * NO WARRANTY
31124f4c82Sjruoho * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32124f4c82Sjruoho * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3398244dcfSchristos * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
34124f4c82Sjruoho * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35124f4c82Sjruoho * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36124f4c82Sjruoho * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37124f4c82Sjruoho * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38124f4c82Sjruoho * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39124f4c82Sjruoho * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40124f4c82Sjruoho * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41124f4c82Sjruoho * POSSIBILITY OF SUCH DAMAGES.
42124f4c82Sjruoho */
43124f4c82Sjruoho
44124f4c82Sjruoho #include "acpi.h"
45124f4c82Sjruoho #include "accommon.h"
46124f4c82Sjruoho #include "acdispat.h"
47124f4c82Sjruoho #include "acnamesp.h"
48124f4c82Sjruoho #include "acdebug.h"
49124f4c82Sjruoho #include "acparser.h"
50ff4a156dSchristos #include "acpredef.h"
51124f4c82Sjruoho
52124f4c82Sjruoho
53124f4c82Sjruoho #define _COMPONENT ACPI_CA_DEBUGGER
54124f4c82Sjruoho ACPI_MODULE_NAME ("dbmethod")
55124f4c82Sjruoho
5647dc3895Schristos /* Local prototypes */
5747dc3895Schristos
5847dc3895Schristos static ACPI_STATUS
5947dc3895Schristos AcpiDbWalkForExecute (
6047dc3895Schristos ACPI_HANDLE ObjHandle,
6147dc3895Schristos UINT32 NestingLevel,
6247dc3895Schristos void *Context,
6347dc3895Schristos void **ReturnValue);
6447dc3895Schristos
65b558e860Schristos static ACPI_STATUS
66b558e860Schristos AcpiDbEvaluateObject (
67b558e860Schristos ACPI_NAMESPACE_NODE *Node);
68b558e860Schristos
69124f4c82Sjruoho
70124f4c82Sjruoho /*******************************************************************************
71124f4c82Sjruoho *
72124f4c82Sjruoho * FUNCTION: AcpiDbSetMethodBreakpoint
73124f4c82Sjruoho *
74124f4c82Sjruoho * PARAMETERS: Location - AML offset of breakpoint
75124f4c82Sjruoho * WalkState - Current walk info
76124f4c82Sjruoho * Op - Current Op (from parse walk)
77124f4c82Sjruoho *
78124f4c82Sjruoho * RETURN: None
79124f4c82Sjruoho *
80124f4c82Sjruoho * DESCRIPTION: Set a breakpoint in a control method at the specified
81124f4c82Sjruoho * AML offset
82124f4c82Sjruoho *
83124f4c82Sjruoho ******************************************************************************/
84124f4c82Sjruoho
85124f4c82Sjruoho void
AcpiDbSetMethodBreakpoint(char * Location,ACPI_WALK_STATE * WalkState,ACPI_PARSE_OBJECT * Op)86124f4c82Sjruoho AcpiDbSetMethodBreakpoint (
87124f4c82Sjruoho char *Location,
88124f4c82Sjruoho ACPI_WALK_STATE *WalkState,
89124f4c82Sjruoho ACPI_PARSE_OBJECT *Op)
90124f4c82Sjruoho {
91124f4c82Sjruoho UINT32 Address;
929b9ee194Schristos UINT32 AmlOffset;
93124f4c82Sjruoho
94124f4c82Sjruoho
95124f4c82Sjruoho if (!Op)
96124f4c82Sjruoho {
97124f4c82Sjruoho AcpiOsPrintf ("There is no method currently executing\n");
98124f4c82Sjruoho return;
99124f4c82Sjruoho }
100124f4c82Sjruoho
101124f4c82Sjruoho /* Get and verify the breakpoint address */
102124f4c82Sjruoho
1039b9ee194Schristos Address = strtoul (Location, NULL, 16);
1049b9ee194Schristos AmlOffset = (UINT32) ACPI_PTR_DIFF (Op->Common.Aml,
1059b9ee194Schristos WalkState->ParserState.AmlStart);
1069b9ee194Schristos if (Address <= AmlOffset)
107124f4c82Sjruoho {
108124f4c82Sjruoho AcpiOsPrintf ("Breakpoint %X is beyond current address %X\n",
1099b9ee194Schristos Address, AmlOffset);
110124f4c82Sjruoho }
111124f4c82Sjruoho
112124f4c82Sjruoho /* Save breakpoint in current walk */
113124f4c82Sjruoho
114124f4c82Sjruoho WalkState->UserBreakpoint = Address;
115124f4c82Sjruoho AcpiOsPrintf ("Breakpoint set at AML offset %X\n", Address);
116124f4c82Sjruoho }
117124f4c82Sjruoho
118124f4c82Sjruoho
119124f4c82Sjruoho /*******************************************************************************
120124f4c82Sjruoho *
121124f4c82Sjruoho * FUNCTION: AcpiDbSetMethodCallBreakpoint
122124f4c82Sjruoho *
123124f4c82Sjruoho * PARAMETERS: Op - Current Op (from parse walk)
124124f4c82Sjruoho *
125124f4c82Sjruoho * RETURN: None
126124f4c82Sjruoho *
127124f4c82Sjruoho * DESCRIPTION: Set a breakpoint in a control method at the specified
128124f4c82Sjruoho * AML offset
129124f4c82Sjruoho *
130124f4c82Sjruoho ******************************************************************************/
131124f4c82Sjruoho
132124f4c82Sjruoho void
AcpiDbSetMethodCallBreakpoint(ACPI_PARSE_OBJECT * Op)133124f4c82Sjruoho AcpiDbSetMethodCallBreakpoint (
134124f4c82Sjruoho ACPI_PARSE_OBJECT *Op)
135124f4c82Sjruoho {
136124f4c82Sjruoho
137124f4c82Sjruoho
138124f4c82Sjruoho if (!Op)
139124f4c82Sjruoho {
140124f4c82Sjruoho AcpiOsPrintf ("There is no method currently executing\n");
141124f4c82Sjruoho return;
142124f4c82Sjruoho }
143124f4c82Sjruoho
144124f4c82Sjruoho AcpiGbl_StepToNextCall = TRUE;
145124f4c82Sjruoho }
146124f4c82Sjruoho
147124f4c82Sjruoho
148124f4c82Sjruoho /*******************************************************************************
149124f4c82Sjruoho *
150124f4c82Sjruoho * FUNCTION: AcpiDbSetMethodData
151124f4c82Sjruoho *
152124f4c82Sjruoho * PARAMETERS: TypeArg - L for local, A for argument
153124f4c82Sjruoho * IndexArg - which one
154124f4c82Sjruoho * ValueArg - Value to set.
155124f4c82Sjruoho *
156124f4c82Sjruoho * RETURN: None
157124f4c82Sjruoho *
158124f4c82Sjruoho * DESCRIPTION: Set a local or argument for the running control method.
159124f4c82Sjruoho * NOTE: only object supported is Number.
160124f4c82Sjruoho *
161124f4c82Sjruoho ******************************************************************************/
162124f4c82Sjruoho
163124f4c82Sjruoho void
AcpiDbSetMethodData(char * TypeArg,char * IndexArg,char * ValueArg)164124f4c82Sjruoho AcpiDbSetMethodData (
165124f4c82Sjruoho char *TypeArg,
166124f4c82Sjruoho char *IndexArg,
167124f4c82Sjruoho char *ValueArg)
168124f4c82Sjruoho {
169124f4c82Sjruoho char Type;
170124f4c82Sjruoho UINT32 Index;
171124f4c82Sjruoho UINT32 Value;
172124f4c82Sjruoho ACPI_WALK_STATE *WalkState;
173124f4c82Sjruoho ACPI_OPERAND_OBJECT *ObjDesc;
174124f4c82Sjruoho ACPI_STATUS Status;
175124f4c82Sjruoho ACPI_NAMESPACE_NODE *Node;
176124f4c82Sjruoho
177124f4c82Sjruoho
178124f4c82Sjruoho /* Validate TypeArg */
179124f4c82Sjruoho
180124f4c82Sjruoho AcpiUtStrupr (TypeArg);
181124f4c82Sjruoho Type = TypeArg[0];
182124f4c82Sjruoho if ((Type != 'L') &&
183124f4c82Sjruoho (Type != 'A') &&
184124f4c82Sjruoho (Type != 'N'))
185124f4c82Sjruoho {
186124f4c82Sjruoho AcpiOsPrintf ("Invalid SET operand: %s\n", TypeArg);
187124f4c82Sjruoho return;
188124f4c82Sjruoho }
189124f4c82Sjruoho
1909b9ee194Schristos Value = strtoul (ValueArg, NULL, 16);
191124f4c82Sjruoho
192124f4c82Sjruoho if (Type == 'N')
193124f4c82Sjruoho {
194124f4c82Sjruoho Node = AcpiDbConvertToNode (IndexArg);
195414ef032Schristos if (!Node)
196414ef032Schristos {
197414ef032Schristos return;
198414ef032Schristos }
199414ef032Schristos
200124f4c82Sjruoho if (Node->Type != ACPI_TYPE_INTEGER)
201124f4c82Sjruoho {
202124f4c82Sjruoho AcpiOsPrintf ("Can only set Integer nodes\n");
203124f4c82Sjruoho return;
204124f4c82Sjruoho }
205124f4c82Sjruoho ObjDesc = Node->Object;
206124f4c82Sjruoho ObjDesc->Integer.Value = Value;
207124f4c82Sjruoho return;
208124f4c82Sjruoho }
209124f4c82Sjruoho
210124f4c82Sjruoho /* Get the index and value */
211124f4c82Sjruoho
2129b9ee194Schristos Index = strtoul (IndexArg, NULL, 16);
213124f4c82Sjruoho
214124f4c82Sjruoho WalkState = AcpiDsGetCurrentWalkState (AcpiGbl_CurrentWalkList);
215124f4c82Sjruoho if (!WalkState)
216124f4c82Sjruoho {
217124f4c82Sjruoho AcpiOsPrintf ("There is no method currently executing\n");
218124f4c82Sjruoho return;
219124f4c82Sjruoho }
220124f4c82Sjruoho
221124f4c82Sjruoho /* Create and initialize the new object */
222124f4c82Sjruoho
223124f4c82Sjruoho ObjDesc = AcpiUtCreateIntegerObject ((UINT64) Value);
224124f4c82Sjruoho if (!ObjDesc)
225124f4c82Sjruoho {
226124f4c82Sjruoho AcpiOsPrintf ("Could not create an internal object\n");
227124f4c82Sjruoho return;
228124f4c82Sjruoho }
229124f4c82Sjruoho
230124f4c82Sjruoho /* Store the new object into the target */
231124f4c82Sjruoho
232124f4c82Sjruoho switch (Type)
233124f4c82Sjruoho {
234124f4c82Sjruoho case 'A':
235124f4c82Sjruoho
236124f4c82Sjruoho /* Set a method argument */
237124f4c82Sjruoho
238124f4c82Sjruoho if (Index > ACPI_METHOD_MAX_ARG)
239124f4c82Sjruoho {
24081bd9c9cSchristos AcpiOsPrintf ("Arg%u - Invalid argument name\n",
24181bd9c9cSchristos Index);
242124f4c82Sjruoho goto Cleanup;
243124f4c82Sjruoho }
244124f4c82Sjruoho
24581bd9c9cSchristos Status = AcpiDsStoreObjectToLocal (ACPI_REFCLASS_ARG,
24681bd9c9cSchristos Index, ObjDesc, WalkState);
247124f4c82Sjruoho if (ACPI_FAILURE (Status))
248124f4c82Sjruoho {
249124f4c82Sjruoho goto Cleanup;
250124f4c82Sjruoho }
251124f4c82Sjruoho
252124f4c82Sjruoho ObjDesc = WalkState->Arguments[Index].Object;
253124f4c82Sjruoho
254124f4c82Sjruoho AcpiOsPrintf ("Arg%u: ", Index);
2559b9ee194Schristos AcpiDbDisplayInternalObject (ObjDesc, WalkState);
256124f4c82Sjruoho break;
257124f4c82Sjruoho
258124f4c82Sjruoho case 'L':
259124f4c82Sjruoho
260124f4c82Sjruoho /* Set a method local */
261124f4c82Sjruoho
262124f4c82Sjruoho if (Index > ACPI_METHOD_MAX_LOCAL)
263124f4c82Sjruoho {
26481bd9c9cSchristos AcpiOsPrintf ("Local%u - Invalid local variable name\n",
26581bd9c9cSchristos Index);
266124f4c82Sjruoho goto Cleanup;
267124f4c82Sjruoho }
268124f4c82Sjruoho
26981bd9c9cSchristos Status = AcpiDsStoreObjectToLocal (ACPI_REFCLASS_LOCAL,
27081bd9c9cSchristos Index, ObjDesc, WalkState);
271124f4c82Sjruoho if (ACPI_FAILURE (Status))
272124f4c82Sjruoho {
273124f4c82Sjruoho goto Cleanup;
274124f4c82Sjruoho }
275124f4c82Sjruoho
276124f4c82Sjruoho ObjDesc = WalkState->LocalVariables[Index].Object;
277124f4c82Sjruoho
278124f4c82Sjruoho AcpiOsPrintf ("Local%u: ", Index);
2799b9ee194Schristos AcpiDbDisplayInternalObject (ObjDesc, WalkState);
280124f4c82Sjruoho break;
281124f4c82Sjruoho
282124f4c82Sjruoho default:
283ff4a156dSchristos
284124f4c82Sjruoho break;
285124f4c82Sjruoho }
286124f4c82Sjruoho
287124f4c82Sjruoho Cleanup:
288124f4c82Sjruoho AcpiUtRemoveReference (ObjDesc);
289124f4c82Sjruoho }
290124f4c82Sjruoho
291124f4c82Sjruoho
292a147b75fSchristos #ifdef ACPI_DISASSEMBLER
293124f4c82Sjruoho /*******************************************************************************
294124f4c82Sjruoho *
295124f4c82Sjruoho * FUNCTION: AcpiDbDisassembleAml
296124f4c82Sjruoho *
297124f4c82Sjruoho * PARAMETERS: Statements - Number of statements to disassemble
298124f4c82Sjruoho * Op - Current Op (from parse walk)
299124f4c82Sjruoho *
300124f4c82Sjruoho * RETURN: None
301124f4c82Sjruoho *
302124f4c82Sjruoho * DESCRIPTION: Display disassembled AML (ASL) starting from Op for the number
303124f4c82Sjruoho * of statements specified.
304124f4c82Sjruoho *
305124f4c82Sjruoho ******************************************************************************/
306124f4c82Sjruoho
307124f4c82Sjruoho void
AcpiDbDisassembleAml(char * Statements,ACPI_PARSE_OBJECT * Op)308124f4c82Sjruoho AcpiDbDisassembleAml (
309124f4c82Sjruoho char *Statements,
310124f4c82Sjruoho ACPI_PARSE_OBJECT *Op)
311124f4c82Sjruoho {
312124f4c82Sjruoho UINT32 NumStatements = 8;
313124f4c82Sjruoho
314124f4c82Sjruoho
315124f4c82Sjruoho if (!Op)
316124f4c82Sjruoho {
317124f4c82Sjruoho AcpiOsPrintf ("There is no method currently executing\n");
318124f4c82Sjruoho return;
319124f4c82Sjruoho }
320124f4c82Sjruoho
321124f4c82Sjruoho if (Statements)
322124f4c82Sjruoho {
3239b9ee194Schristos NumStatements = strtoul (Statements, NULL, 0);
324124f4c82Sjruoho }
325124f4c82Sjruoho
326124f4c82Sjruoho AcpiDmDisassemble (NULL, Op, NumStatements);
327124f4c82Sjruoho }
328124f4c82Sjruoho
329124f4c82Sjruoho
330124f4c82Sjruoho /*******************************************************************************
331124f4c82Sjruoho *
332124f4c82Sjruoho * FUNCTION: AcpiDbDisassembleMethod
333124f4c82Sjruoho *
334124f4c82Sjruoho * PARAMETERS: Name - Name of control method
335124f4c82Sjruoho *
336124f4c82Sjruoho * RETURN: None
337124f4c82Sjruoho *
338124f4c82Sjruoho * DESCRIPTION: Display disassembled AML (ASL) starting from Op for the number
339124f4c82Sjruoho * of statements specified.
340124f4c82Sjruoho *
341124f4c82Sjruoho ******************************************************************************/
342124f4c82Sjruoho
343124f4c82Sjruoho ACPI_STATUS
AcpiDbDisassembleMethod(char * Name)344124f4c82Sjruoho AcpiDbDisassembleMethod (
345124f4c82Sjruoho char *Name)
346124f4c82Sjruoho {
347124f4c82Sjruoho ACPI_STATUS Status;
348124f4c82Sjruoho ACPI_PARSE_OBJECT *Op;
349124f4c82Sjruoho ACPI_WALK_STATE *WalkState;
350124f4c82Sjruoho ACPI_OPERAND_OBJECT *ObjDesc;
351124f4c82Sjruoho ACPI_NAMESPACE_NODE *Method;
352124f4c82Sjruoho
353124f4c82Sjruoho
354124f4c82Sjruoho Method = AcpiDbConvertToNode (Name);
355124f4c82Sjruoho if (!Method)
356124f4c82Sjruoho {
357124f4c82Sjruoho return (AE_BAD_PARAMETER);
358124f4c82Sjruoho }
359124f4c82Sjruoho
360ff4a156dSchristos if (Method->Type != ACPI_TYPE_METHOD)
361ff4a156dSchristos {
362ff4a156dSchristos ACPI_ERROR ((AE_INFO, "%s (%s): Object must be a control method",
363ff4a156dSchristos Name, AcpiUtGetTypeName (Method->Type)));
364ff4a156dSchristos return (AE_BAD_PARAMETER);
365ff4a156dSchristos }
366ff4a156dSchristos
367124f4c82Sjruoho ObjDesc = Method->Object;
368124f4c82Sjruoho
3699b9ee194Schristos Op = AcpiPsCreateScopeOp (ObjDesc->Method.AmlStart);
370124f4c82Sjruoho if (!Op)
371124f4c82Sjruoho {
372124f4c82Sjruoho return (AE_NO_MEMORY);
373124f4c82Sjruoho }
374124f4c82Sjruoho
375124f4c82Sjruoho /* Create and initialize a new walk state */
376124f4c82Sjruoho
377124f4c82Sjruoho WalkState = AcpiDsCreateWalkState (0, Op, NULL, NULL);
378124f4c82Sjruoho if (!WalkState)
379124f4c82Sjruoho {
380124f4c82Sjruoho return (AE_NO_MEMORY);
381124f4c82Sjruoho }
382124f4c82Sjruoho
383124f4c82Sjruoho Status = AcpiDsInitAmlWalk (WalkState, Op, NULL,
384124f4c82Sjruoho ObjDesc->Method.AmlStart,
385124f4c82Sjruoho ObjDesc->Method.AmlLength, NULL, ACPI_IMODE_LOAD_PASS1);
386124f4c82Sjruoho if (ACPI_FAILURE (Status))
387124f4c82Sjruoho {
388124f4c82Sjruoho return (Status);
389124f4c82Sjruoho }
390124f4c82Sjruoho
391ff4a156dSchristos Status = AcpiUtAllocateOwnerId (&ObjDesc->Method.OwnerId);
3927ab6b89bSchristos if (ACPI_FAILURE(Status))
3937ab6b89bSchristos {
3947ab6b89bSchristos return (Status);
3957ab6b89bSchristos }
3967ab6b89bSchristos
397ff4a156dSchristos WalkState->OwnerId = ObjDesc->Method.OwnerId;
398ff4a156dSchristos
399ff4a156dSchristos /* Push start scope on scope stack and make it current */
400ff4a156dSchristos
401ff4a156dSchristos Status = AcpiDsScopeStackPush (Method,
402ff4a156dSchristos Method->Type, WalkState);
403ff4a156dSchristos if (ACPI_FAILURE (Status))
404ff4a156dSchristos {
405ff4a156dSchristos return (Status);
406ff4a156dSchristos }
407ff4a156dSchristos
408ff4a156dSchristos /* Parse the entire method AML including deferred operators */
409124f4c82Sjruoho
410124f4c82Sjruoho WalkState->ParseFlags &= ~ACPI_PARSE_DELETE_TREE;
411124f4c82Sjruoho WalkState->ParseFlags |= ACPI_PARSE_DISASSEMBLE;
412124f4c82Sjruoho
413ff4a156dSchristos Status = AcpiPsParseAml (WalkState);
4141c663068Schristos if (ACPI_FAILURE(Status))
4151c663068Schristos {
4161c663068Schristos return (Status);
4171c663068Schristos }
4181c663068Schristos
419ff4a156dSchristos (void) AcpiDmParseDeferredOps (Op);
420ff4a156dSchristos
421ff4a156dSchristos /* Now we can disassemble the method */
422ff4a156dSchristos
42381bd9c9cSchristos AcpiGbl_DmOpt_Verbose = FALSE;
424124f4c82Sjruoho AcpiDmDisassemble (NULL, Op, 0);
42581bd9c9cSchristos AcpiGbl_DmOpt_Verbose = TRUE;
426ff4a156dSchristos
427124f4c82Sjruoho AcpiPsDeleteParseTree (Op);
428ff4a156dSchristos
429ff4a156dSchristos /* Method cleanup */
430ff4a156dSchristos
431ff4a156dSchristos AcpiNsDeleteNamespaceSubtree (Method);
432ff4a156dSchristos AcpiNsDeleteNamespaceByOwner (ObjDesc->Method.OwnerId);
433ff4a156dSchristos AcpiUtReleaseOwnerId (&ObjDesc->Method.OwnerId);
434124f4c82Sjruoho return (AE_OK);
435124f4c82Sjruoho }
436a147b75fSchristos #endif
43747dc3895Schristos
43847dc3895Schristos
43947dc3895Schristos /*******************************************************************************
44047dc3895Schristos *
441b558e860Schristos * FUNCTION: AcpiDbEvaluateObject
44247dc3895Schristos *
443b558e860Schristos * PARAMETERS: Node - Namespace node for the object
44447dc3895Schristos *
44547dc3895Schristos * RETURN: Status
44647dc3895Schristos *
447b558e860Schristos * DESCRIPTION: Main execution function for the Evaluate/Execute/All debugger
448b558e860Schristos * commands.
44947dc3895Schristos *
45047dc3895Schristos ******************************************************************************/
45147dc3895Schristos
45247dc3895Schristos static ACPI_STATUS
AcpiDbEvaluateObject(ACPI_NAMESPACE_NODE * Node)453b558e860Schristos AcpiDbEvaluateObject (
454b558e860Schristos ACPI_NAMESPACE_NODE *Node)
45547dc3895Schristos {
45647dc3895Schristos char *Pathname;
45747dc3895Schristos UINT32 i;
45847dc3895Schristos ACPI_DEVICE_INFO *ObjInfo;
45947dc3895Schristos ACPI_OBJECT_LIST ParamObjects;
46047dc3895Schristos ACPI_OBJECT Params[ACPI_METHOD_NUM_ARGS];
461b558e860Schristos ACPI_BUFFER ReturnObj;
462b558e860Schristos ACPI_STATUS Status;
46347dc3895Schristos
46447dc3895Schristos
46547dc3895Schristos Pathname = AcpiNsGetExternalPathname (Node);
46647dc3895Schristos if (!Pathname)
46747dc3895Schristos {
46847dc3895Schristos return (AE_OK);
46947dc3895Schristos }
47047dc3895Schristos
47147dc3895Schristos /* Get the object info for number of method parameters */
47247dc3895Schristos
473b558e860Schristos Status = AcpiGetObjectInfo (Node, &ObjInfo);
47447dc3895Schristos if (ACPI_FAILURE (Status))
47547dc3895Schristos {
4768f1e17bdSchristos ACPI_FREE (Pathname);
47747dc3895Schristos return (Status);
47847dc3895Schristos }
47947dc3895Schristos
48047dc3895Schristos ParamObjects.Pointer = NULL;
48147dc3895Schristos ParamObjects.Count = 0;
48247dc3895Schristos
48347dc3895Schristos if (ObjInfo->Type == ACPI_TYPE_METHOD)
48447dc3895Schristos {
48547dc3895Schristos /* Setup default parameters */
48647dc3895Schristos
48747dc3895Schristos for (i = 0; i < ObjInfo->ParamCount; i++)
48847dc3895Schristos {
48947dc3895Schristos Params[i].Type = ACPI_TYPE_INTEGER;
49047dc3895Schristos Params[i].Integer.Value = 1;
49147dc3895Schristos }
49247dc3895Schristos
49347dc3895Schristos ParamObjects.Pointer = Params;
49447dc3895Schristos ParamObjects.Count = ObjInfo->ParamCount;
49547dc3895Schristos }
49647dc3895Schristos
49747dc3895Schristos ACPI_FREE (ObjInfo);
49847dc3895Schristos ReturnObj.Pointer = NULL;
49947dc3895Schristos ReturnObj.Length = ACPI_ALLOCATE_BUFFER;
50047dc3895Schristos
50147dc3895Schristos /* Do the actual method execution */
50247dc3895Schristos
50347dc3895Schristos AcpiGbl_MethodExecuting = TRUE;
50447dc3895Schristos
50547dc3895Schristos Status = AcpiEvaluateObject (Node, NULL, &ParamObjects, &ReturnObj);
506b558e860Schristos AcpiGbl_MethodExecuting = FALSE;
50747dc3895Schristos
50847dc3895Schristos AcpiOsPrintf ("%-32s returned %s\n", Pathname, AcpiFormatException (Status));
509b558e860Schristos if (ReturnObj.Length)
510b558e860Schristos {
511b558e860Schristos AcpiOsPrintf ("Evaluation of %s returned object %p, "
512b558e860Schristos "external buffer length %X\n",
513b558e860Schristos Pathname, ReturnObj.Pointer, (UINT32) ReturnObj.Length);
514b558e860Schristos
515b558e860Schristos AcpiDbDumpExternalObject (ReturnObj.Pointer, 1);
516b558e860Schristos AcpiOsPrintf ("\n");
517b558e860Schristos }
518b558e860Schristos
51947dc3895Schristos ACPI_FREE (Pathname);
52047dc3895Schristos
52147dc3895Schristos /* Ignore status from method execution */
52247dc3895Schristos
523b558e860Schristos return (AE_OK);
524b558e860Schristos
525b558e860Schristos /* Update count, check if we have executed enough methods */
526b558e860Schristos
527b558e860Schristos }
528b558e860Schristos
529b558e860Schristos /*******************************************************************************
530b558e860Schristos *
531b558e860Schristos * FUNCTION: AcpiDbWalkForExecute
532b558e860Schristos *
533b558e860Schristos * PARAMETERS: Callback from WalkNamespace
534b558e860Schristos *
535b558e860Schristos * RETURN: Status
536b558e860Schristos *
537b558e860Schristos * DESCRIPTION: Batch execution function. Evaluates all "predefined" objects --
538b558e860Schristos * the nameseg begins with an underscore.
539b558e860Schristos *
540b558e860Schristos ******************************************************************************/
541b558e860Schristos
542b558e860Schristos static ACPI_STATUS
AcpiDbWalkForExecute(ACPI_HANDLE ObjHandle,UINT32 NestingLevel,void * Context,void ** ReturnValue)543b558e860Schristos AcpiDbWalkForExecute (
544b558e860Schristos ACPI_HANDLE ObjHandle,
545b558e860Schristos UINT32 NestingLevel,
546b558e860Schristos void *Context,
547b558e860Schristos void **ReturnValue)
548b558e860Schristos {
549b558e860Schristos ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
550b558e860Schristos ACPI_DB_EXECUTE_WALK *Info = (ACPI_DB_EXECUTE_WALK *) Context;
551b558e860Schristos ACPI_STATUS Status;
552b558e860Schristos const ACPI_PREDEFINED_INFO *Predefined;
553b558e860Schristos
554b558e860Schristos
555b558e860Schristos Predefined = AcpiUtMatchPredefinedMethod (Node->Name.Ascii);
556b558e860Schristos if (!Predefined)
557b558e860Schristos {
558b558e860Schristos return (AE_OK);
559b558e860Schristos }
560b558e860Schristos
561b558e860Schristos if (Node->Type == ACPI_TYPE_LOCAL_SCOPE)
562b558e860Schristos {
563b558e860Schristos return (AE_OK);
564b558e860Schristos }
565b558e860Schristos
566b558e860Schristos AcpiDbEvaluateObject (Node);
567b558e860Schristos
568b558e860Schristos /* Ignore status from object evaluation */
569b558e860Schristos
57047dc3895Schristos Status = AE_OK;
57147dc3895Schristos
57247dc3895Schristos /* Update count, check if we have executed enough methods */
57347dc3895Schristos
57447dc3895Schristos Info->Count++;
57547dc3895Schristos if (Info->Count >= Info->MaxCount)
57647dc3895Schristos {
57747dc3895Schristos Status = AE_CTRL_TERMINATE;
57847dc3895Schristos }
57947dc3895Schristos
58047dc3895Schristos return (Status);
58147dc3895Schristos }
58247dc3895Schristos
58347dc3895Schristos
58447dc3895Schristos /*******************************************************************************
58547dc3895Schristos *
586b558e860Schristos * FUNCTION: AcpiDbWalkForExecuteAll
587b558e860Schristos *
588b558e860Schristos * PARAMETERS: Callback from WalkNamespace
589b558e860Schristos *
590b558e860Schristos * RETURN: Status
591b558e860Schristos *
592b558e860Schristos * DESCRIPTION: Batch execution function. Evaluates all objects whose path ends
593b558e860Schristos * with the nameseg "Info->NameSeg". Used for the "ALL" command.
594b558e860Schristos *
595b558e860Schristos ******************************************************************************/
596b558e860Schristos
597b558e860Schristos static ACPI_STATUS
AcpiDbWalkForExecuteAll(ACPI_HANDLE ObjHandle,UINT32 NestingLevel,void * Context,void ** ReturnValue)598b558e860Schristos AcpiDbWalkForExecuteAll (
599b558e860Schristos ACPI_HANDLE ObjHandle,
600b558e860Schristos UINT32 NestingLevel,
601b558e860Schristos void *Context,
602b558e860Schristos void **ReturnValue)
603b558e860Schristos {
604b558e860Schristos ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
605b558e860Schristos ACPI_DB_EXECUTE_WALK *Info = (ACPI_DB_EXECUTE_WALK *) Context;
606b558e860Schristos ACPI_STATUS Status;
607b558e860Schristos
608b558e860Schristos
609b558e860Schristos if (!ACPI_COMPARE_NAMESEG (Node->Name.Ascii, Info->NameSeg))
610b558e860Schristos {
611b558e860Schristos return (AE_OK);
612b558e860Schristos }
613b558e860Schristos
614b558e860Schristos if (Node->Type == ACPI_TYPE_LOCAL_SCOPE)
615b558e860Schristos {
616b558e860Schristos return (AE_OK);
617b558e860Schristos }
618b558e860Schristos
619b558e860Schristos /* Now evaluate the input object (node) */
620b558e860Schristos
621b558e860Schristos AcpiDbEvaluateObject (Node);
622b558e860Schristos
623b558e860Schristos /* Ignore status from method execution */
624b558e860Schristos
625b558e860Schristos Status = AE_OK;
626b558e860Schristos
627b558e860Schristos /* Update count of executed methods/objects */
628b558e860Schristos
629b558e860Schristos Info->Count++;
630b558e860Schristos return (Status);
631b558e860Schristos }
632b558e860Schristos
633b558e860Schristos
634b558e860Schristos /*******************************************************************************
635b558e860Schristos *
63647dc3895Schristos * FUNCTION: AcpiDbEvaluatePredefinedNames
63747dc3895Schristos *
63847dc3895Schristos * PARAMETERS: None
63947dc3895Schristos *
64047dc3895Schristos * RETURN: None
64147dc3895Schristos *
64247dc3895Schristos * DESCRIPTION: Namespace batch execution. Execute predefined names in the
64347dc3895Schristos * namespace, up to the max count, if specified.
64447dc3895Schristos *
64547dc3895Schristos ******************************************************************************/
64647dc3895Schristos
64747dc3895Schristos void
AcpiDbEvaluatePredefinedNames(void)64847dc3895Schristos AcpiDbEvaluatePredefinedNames (
64947dc3895Schristos void)
65047dc3895Schristos {
65147dc3895Schristos ACPI_DB_EXECUTE_WALK Info;
65247dc3895Schristos
65347dc3895Schristos
65447dc3895Schristos Info.Count = 0;
65547dc3895Schristos Info.MaxCount = ACPI_UINT32_MAX;
65647dc3895Schristos
65747dc3895Schristos /* Search all nodes in namespace */
65847dc3895Schristos
65947dc3895Schristos (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
66047dc3895Schristos AcpiDbWalkForExecute, NULL, (void *) &Info, NULL);
66147dc3895Schristos
66247dc3895Schristos AcpiOsPrintf ("Evaluated %u predefined names in the namespace\n", Info.Count);
66347dc3895Schristos }
664b558e860Schristos
665b558e860Schristos
666b558e860Schristos /*******************************************************************************
667b558e860Schristos *
668b558e860Schristos * FUNCTION: AcpiDbEvaluateAll
669b558e860Schristos *
670b558e860Schristos * PARAMETERS: NoneAcpiGbl_DbMethodInfo
671b558e860Schristos *
672b558e860Schristos * RETURN: None
673b558e860Schristos *
674b558e860Schristos * DESCRIPTION: Namespace batch execution. Implements the "ALL" command.
675b558e860Schristos * Execute all namepaths whose final nameseg matches the
676b558e860Schristos * input nameseg.
677b558e860Schristos *
678b558e860Schristos ******************************************************************************/
679b558e860Schristos
680b558e860Schristos void
AcpiDbEvaluateAll(char * NameSeg)681b558e860Schristos AcpiDbEvaluateAll (
682b558e860Schristos char *NameSeg)
683b558e860Schristos {
684b558e860Schristos ACPI_DB_EXECUTE_WALK Info;
685b558e860Schristos
686b558e860Schristos
687b558e860Schristos Info.Count = 0;
688b558e860Schristos Info.MaxCount = ACPI_UINT32_MAX;
689b558e860Schristos ACPI_COPY_NAMESEG (Info.NameSeg, NameSeg);
690b558e860Schristos Info.NameSeg[ACPI_NAMESEG_SIZE] = 0;
691b558e860Schristos
692b558e860Schristos /* Search all nodes in namespace */
693b558e860Schristos
694b558e860Schristos (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
695b558e860Schristos AcpiDbWalkForExecuteAll, NULL, (void *) &Info, NULL);
696b558e860Schristos
697b558e860Schristos AcpiOsPrintf ("Evaluated %u names in the namespace\n", Info.Count);
698b558e860Schristos }
699