xref: /netbsd-src/sys/external/bsd/acpica/dist/debugger/dbmethod.c (revision 2c7d7e3ca2e4f0b675c6c58e614f6aede66c678e)
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