1167802Sjkim/******************************************************************************
2167802Sjkim *
3167802Sjkim * Module Name: adwalk - Application-level disassembler parse tree walk routines
4167802Sjkim *
5167802Sjkim *****************************************************************************/
6167802Sjkim
7217365Sjkim/*
8281075Sdim * Copyright (C) 2000 - 2015, Intel Corp.
9167802Sjkim * All rights reserved.
10167802Sjkim *
11217365Sjkim * Redistribution and use in source and binary forms, with or without
12217365Sjkim * modification, are permitted provided that the following conditions
13217365Sjkim * are met:
14217365Sjkim * 1. Redistributions of source code must retain the above copyright
15217365Sjkim *    notice, this list of conditions, and the following disclaimer,
16217365Sjkim *    without modification.
17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18217365Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19217365Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20217365Sjkim *    including a substantially similar Disclaimer requirement for further
21217365Sjkim *    binary redistribution.
22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23217365Sjkim *    of any contributors may be used to endorse or promote products derived
24217365Sjkim *    from this software without specific prior written permission.
25167802Sjkim *
26217365Sjkim * Alternatively, this software may be distributed under the terms of the
27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28217365Sjkim * Software Foundation.
29167802Sjkim *
30217365Sjkim * NO WARRANTY
31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41217365Sjkim * POSSIBILITY OF SUCH DAMAGES.
42217365Sjkim */
43167802Sjkim
44193529Sjkim#include <contrib/dev/acpica/include/acpi.h>
45193529Sjkim#include <contrib/dev/acpica/include/accommon.h>
46193529Sjkim#include <contrib/dev/acpica/include/acparser.h>
47193529Sjkim#include <contrib/dev/acpica/include/amlcode.h>
48193529Sjkim#include <contrib/dev/acpica/include/acdisasm.h>
49193529Sjkim#include <contrib/dev/acpica/include/acdispat.h>
50193529Sjkim#include <contrib/dev/acpica/include/acnamesp.h>
51193529Sjkim#include <contrib/dev/acpica/include/acapps.h>
52167802Sjkim
53167802Sjkim
54167802Sjkim#define _COMPONENT          ACPI_TOOLS
55167802Sjkim        ACPI_MODULE_NAME    ("adwalk")
56167802Sjkim
57167802Sjkim/*
58167802Sjkim * aslmap - opcode mappings and reserved method names
59167802Sjkim */
60167802SjkimACPI_OBJECT_TYPE
61167802SjkimAslMapNamedOpcodeToDataType (
62167802Sjkim    UINT16                  Opcode);
63167802Sjkim
64167802Sjkim/* Local prototypes */
65167802Sjkim
66167802Sjkimstatic ACPI_STATUS
67167802SjkimAcpiDmFindOrphanDescending (
68167802Sjkim    ACPI_PARSE_OBJECT       *Op,
69167802Sjkim    UINT32                  Level,
70167802Sjkim    void                    *Context);
71167802Sjkim
72167802Sjkimstatic ACPI_STATUS
73167802SjkimAcpiDmDumpDescending (
74167802Sjkim    ACPI_PARSE_OBJECT       *Op,
75167802Sjkim    UINT32                  Level,
76167802Sjkim    void                    *Context);
77167802Sjkim
78167802Sjkimstatic ACPI_STATUS
79167802SjkimAcpiDmXrefDescendingOp (
80167802Sjkim    ACPI_PARSE_OBJECT       *Op,
81167802Sjkim    UINT32                  Level,
82167802Sjkim    void                    *Context);
83167802Sjkim
84167802Sjkimstatic ACPI_STATUS
85167802SjkimAcpiDmCommonAscendingOp (
86167802Sjkim    ACPI_PARSE_OBJECT       *Op,
87167802Sjkim    UINT32                  Level,
88167802Sjkim    void                    *Context);
89167802Sjkim
90167802Sjkimstatic ACPI_STATUS
91167802SjkimAcpiDmLoadDescendingOp (
92167802Sjkim    ACPI_PARSE_OBJECT       *Op,
93167802Sjkim    UINT32                  Level,
94167802Sjkim    void                    *Context);
95167802Sjkim
96167802Sjkimstatic UINT32
97167802SjkimAcpiDmInspectPossibleArgs (
98167802Sjkim    UINT32                  CurrentOpArgCount,
99167802Sjkim    UINT32                  TargetCount,
100167802Sjkim    ACPI_PARSE_OBJECT       *Op);
101167802Sjkim
102167802Sjkimstatic ACPI_STATUS
103167802SjkimAcpiDmResourceDescendingOp (
104167802Sjkim    ACPI_PARSE_OBJECT       *Op,
105167802Sjkim    UINT32                  Level,
106167802Sjkim    void                    *Context);
107167802Sjkim
108167802Sjkim
109167802Sjkim/*******************************************************************************
110167802Sjkim *
111167802Sjkim * FUNCTION:    AcpiDmDumpTree
112167802Sjkim *
113198237Sjkim * PARAMETERS:  Origin              - Starting object
114167802Sjkim *
115167802Sjkim * RETURN:      None
116167802Sjkim *
117167802Sjkim * DESCRIPTION: Parse tree walk to format and output the nodes
118167802Sjkim *
119167802Sjkim ******************************************************************************/
120167802Sjkim
121167802Sjkimvoid
122167802SjkimAcpiDmDumpTree (
123167802Sjkim    ACPI_PARSE_OBJECT       *Origin)
124167802Sjkim{
125167802Sjkim    ACPI_OP_WALK_INFO       Info;
126167802Sjkim
127167802Sjkim
128167802Sjkim    if (!Origin)
129167802Sjkim    {
130167802Sjkim        return;
131167802Sjkim    }
132167802Sjkim
133167802Sjkim    AcpiOsPrintf ("/*\nAML Parse Tree\n\n");
134167802Sjkim    Info.Flags = 0;
135167802Sjkim    Info.Count = 0;
136167802Sjkim    Info.Level = 0;
137167802Sjkim    Info.WalkState = NULL;
138167802Sjkim    AcpiDmWalkParseTree (Origin, AcpiDmDumpDescending, NULL, &Info);
139167802Sjkim    AcpiOsPrintf ("*/\n\n");
140167802Sjkim}
141167802Sjkim
142167802Sjkim
143167802Sjkim/*******************************************************************************
144167802Sjkim *
145167802Sjkim * FUNCTION:    AcpiDmFindOrphanMethods
146167802Sjkim *
147198237Sjkim * PARAMETERS:  Origin              - Starting object
148167802Sjkim *
149167802Sjkim * RETURN:      None
150167802Sjkim *
151167802Sjkim * DESCRIPTION: Parse tree walk to find "orphaned" method invocations -- methods
152167802Sjkim *              that are not resolved in the namespace
153167802Sjkim *
154167802Sjkim ******************************************************************************/
155167802Sjkim
156167802Sjkimvoid
157167802SjkimAcpiDmFindOrphanMethods (
158167802Sjkim    ACPI_PARSE_OBJECT       *Origin)
159167802Sjkim{
160167802Sjkim    ACPI_OP_WALK_INFO       Info;
161167802Sjkim
162167802Sjkim
163167802Sjkim    if (!Origin)
164167802Sjkim    {
165167802Sjkim        return;
166167802Sjkim    }
167167802Sjkim
168167802Sjkim    Info.Flags = 0;
169167802Sjkim    Info.Level = 0;
170167802Sjkim    Info.WalkState = NULL;
171167802Sjkim    AcpiDmWalkParseTree (Origin, AcpiDmFindOrphanDescending, NULL, &Info);
172167802Sjkim}
173167802Sjkim
174167802Sjkim
175167802Sjkim/*******************************************************************************
176167802Sjkim *
177167802Sjkim * FUNCTION:    AcpiDmFinishNamespaceLoad
178167802Sjkim *
179167802Sjkim * PARAMETERS:  ParseTreeRoot       - Root of the parse tree
180167802Sjkim *              NamespaceRoot       - Root of the internal namespace
181193529Sjkim *              OwnerId             - OwnerId of the table to be disassembled
182167802Sjkim *
183167802Sjkim * RETURN:      None
184167802Sjkim *
185167802Sjkim * DESCRIPTION: Load all namespace items that are created within control
186167802Sjkim *              methods. Used before namespace cross reference
187167802Sjkim *
188167802Sjkim ******************************************************************************/
189167802Sjkim
190167802Sjkimvoid
191167802SjkimAcpiDmFinishNamespaceLoad (
192167802Sjkim    ACPI_PARSE_OBJECT       *ParseTreeRoot,
193193529Sjkim    ACPI_NAMESPACE_NODE     *NamespaceRoot,
194193529Sjkim    ACPI_OWNER_ID           OwnerId)
195167802Sjkim{
196167802Sjkim    ACPI_STATUS             Status;
197167802Sjkim    ACPI_OP_WALK_INFO       Info;
198167802Sjkim    ACPI_WALK_STATE         *WalkState;
199167802Sjkim
200167802Sjkim
201167802Sjkim    if (!ParseTreeRoot)
202167802Sjkim    {
203167802Sjkim        return;
204167802Sjkim    }
205167802Sjkim
206167802Sjkim    /* Create and initialize a new walk state */
207167802Sjkim
208193529Sjkim    WalkState = AcpiDsCreateWalkState (OwnerId, ParseTreeRoot, NULL, NULL);
209167802Sjkim    if (!WalkState)
210167802Sjkim    {
211167802Sjkim        return;
212167802Sjkim    }
213167802Sjkim
214167802Sjkim    Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, WalkState);
215167802Sjkim    if (ACPI_FAILURE (Status))
216167802Sjkim    {
217167802Sjkim        return;
218167802Sjkim    }
219167802Sjkim
220167802Sjkim    Info.Flags = 0;
221167802Sjkim    Info.Level = 0;
222167802Sjkim    Info.WalkState = WalkState;
223167802Sjkim    AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmLoadDescendingOp,
224167802Sjkim        AcpiDmCommonAscendingOp, &Info);
225167802Sjkim    ACPI_FREE (WalkState);
226167802Sjkim}
227167802Sjkim
228167802Sjkim
229167802Sjkim/*******************************************************************************
230167802Sjkim *
231167802Sjkim * FUNCTION:    AcpiDmCrossReferenceNamespace
232167802Sjkim *
233167802Sjkim * PARAMETERS:  ParseTreeRoot       - Root of the parse tree
234167802Sjkim *              NamespaceRoot       - Root of the internal namespace
235193529Sjkim *              OwnerId             - OwnerId of the table to be disassembled
236167802Sjkim *
237167802Sjkim * RETURN:      None
238167802Sjkim *
239167802Sjkim * DESCRIPTION: Cross reference the namespace to create externals
240167802Sjkim *
241167802Sjkim ******************************************************************************/
242167802Sjkim
243167802Sjkimvoid
244167802SjkimAcpiDmCrossReferenceNamespace (
245167802Sjkim    ACPI_PARSE_OBJECT       *ParseTreeRoot,
246193529Sjkim    ACPI_NAMESPACE_NODE     *NamespaceRoot,
247193529Sjkim    ACPI_OWNER_ID           OwnerId)
248167802Sjkim{
249167802Sjkim    ACPI_STATUS             Status;
250167802Sjkim    ACPI_OP_WALK_INFO       Info;
251167802Sjkim    ACPI_WALK_STATE         *WalkState;
252167802Sjkim
253167802Sjkim
254167802Sjkim    if (!ParseTreeRoot)
255167802Sjkim    {
256167802Sjkim        return;
257167802Sjkim    }
258167802Sjkim
259167802Sjkim    /* Create and initialize a new walk state */
260167802Sjkim
261193529Sjkim    WalkState = AcpiDsCreateWalkState (OwnerId, ParseTreeRoot, NULL, NULL);
262167802Sjkim    if (!WalkState)
263167802Sjkim    {
264167802Sjkim        return;
265167802Sjkim    }
266167802Sjkim
267167802Sjkim    Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, WalkState);
268167802Sjkim    if (ACPI_FAILURE (Status))
269167802Sjkim    {
270167802Sjkim        return;
271167802Sjkim    }
272167802Sjkim
273167802Sjkim    Info.Flags = 0;
274167802Sjkim    Info.Level = 0;
275167802Sjkim    Info.WalkState = WalkState;
276167802Sjkim    AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmXrefDescendingOp,
277167802Sjkim        AcpiDmCommonAscendingOp, &Info);
278167802Sjkim    ACPI_FREE (WalkState);
279167802Sjkim}
280167802Sjkim
281167802Sjkim
282167802Sjkim/*******************************************************************************
283167802Sjkim *
284167802Sjkim * FUNCTION:    AcpiDmConvertResourceIndexes
285167802Sjkim *
286167802Sjkim * PARAMETERS:  ParseTreeRoot       - Root of the parse tree
287167802Sjkim *              NamespaceRoot       - Root of the internal namespace
288167802Sjkim *
289167802Sjkim * RETURN:      None
290167802Sjkim *
291167802Sjkim * DESCRIPTION: Convert fixed-offset references to resource descriptors to
292167802Sjkim *              symbolic references. Should only be called after namespace has
293167802Sjkim *              been cross referenced.
294167802Sjkim *
295167802Sjkim ******************************************************************************/
296167802Sjkim
297167802Sjkimvoid
298167802SjkimAcpiDmConvertResourceIndexes (
299167802Sjkim    ACPI_PARSE_OBJECT       *ParseTreeRoot,
300167802Sjkim    ACPI_NAMESPACE_NODE     *NamespaceRoot)
301167802Sjkim{
302167802Sjkim    ACPI_STATUS             Status;
303167802Sjkim    ACPI_OP_WALK_INFO       Info;
304167802Sjkim    ACPI_WALK_STATE         *WalkState;
305167802Sjkim
306167802Sjkim
307167802Sjkim    if (!ParseTreeRoot)
308167802Sjkim    {
309167802Sjkim        return;
310167802Sjkim    }
311167802Sjkim
312167802Sjkim    /* Create and initialize a new walk state */
313167802Sjkim
314167802Sjkim    WalkState = AcpiDsCreateWalkState (0, ParseTreeRoot, NULL, NULL);
315167802Sjkim    if (!WalkState)
316167802Sjkim    {
317167802Sjkim        return;
318167802Sjkim    }
319167802Sjkim
320167802Sjkim    Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, WalkState);
321167802Sjkim    if (ACPI_FAILURE (Status))
322167802Sjkim    {
323167802Sjkim        return;
324167802Sjkim    }
325167802Sjkim
326167802Sjkim    Info.Flags = 0;
327167802Sjkim    Info.Level = 0;
328167802Sjkim    Info.WalkState = WalkState;
329167802Sjkim    AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmResourceDescendingOp,
330167802Sjkim        AcpiDmCommonAscendingOp, &Info);
331167802Sjkim    ACPI_FREE (WalkState);
332167802Sjkim    return;
333167802Sjkim}
334167802Sjkim
335167802Sjkim
336167802Sjkim/*******************************************************************************
337167802Sjkim *
338167802Sjkim * FUNCTION:    AcpiDmDumpDescending
339167802Sjkim *
340167802Sjkim * PARAMETERS:  ASL_WALK_CALLBACK
341167802Sjkim *
342167802Sjkim * RETURN:      Status
343167802Sjkim *
344167802Sjkim * DESCRIPTION: Format and print contents of one parse Op.
345167802Sjkim *
346167802Sjkim ******************************************************************************/
347167802Sjkim
348167802Sjkimstatic ACPI_STATUS
349167802SjkimAcpiDmDumpDescending (
350167802Sjkim    ACPI_PARSE_OBJECT       *Op,
351167802Sjkim    UINT32                  Level,
352167802Sjkim    void                    *Context)
353167802Sjkim{
354167802Sjkim    ACPI_OP_WALK_INFO       *Info = Context;
355167802Sjkim    char                    *Path;
356167802Sjkim
357167802Sjkim
358167802Sjkim    if (!Op)
359167802Sjkim    {
360167802Sjkim        return (AE_OK);
361167802Sjkim    }
362167802Sjkim
363167802Sjkim    /* Most of the information (count, level, name) here */
364167802Sjkim
365198237Sjkim    Info->Count++;
366167802Sjkim    AcpiOsPrintf ("% 5d [%2.2d] ", Info->Count, Level);
367167802Sjkim    AcpiDmIndent (Level);
368167802Sjkim    AcpiOsPrintf ("%-28s", AcpiPsGetOpcodeName (Op->Common.AmlOpcode));
369167802Sjkim
370167802Sjkim    /* Extra info is helpful */
371167802Sjkim
372167802Sjkim    switch (Op->Common.AmlOpcode)
373167802Sjkim    {
374167802Sjkim    case AML_BYTE_OP:
375254745Sjkim
376254745Sjkim        AcpiOsPrintf ("%2.2X", (UINT32) Op->Common.Value.Integer);
377254745Sjkim        break;
378254745Sjkim
379167802Sjkim    case AML_WORD_OP:
380254745Sjkim
381254745Sjkim        AcpiOsPrintf ("%4.4X", (UINT32) Op->Common.Value.Integer);
382254745Sjkim        break;
383254745Sjkim
384167802Sjkim    case AML_DWORD_OP:
385250838Sjkim
386254745Sjkim        AcpiOsPrintf ("%8.8X", (UINT32) Op->Common.Value.Integer);
387167802Sjkim        break;
388167802Sjkim
389228110Sjkim    case AML_QWORD_OP:
390250838Sjkim
391228110Sjkim        AcpiOsPrintf ("%8.8X%8.8X", ACPI_FORMAT_UINT64 (Op->Common.Value.Integer));
392228110Sjkim        break;
393228110Sjkim
394167802Sjkim    case AML_INT_NAMEPATH_OP:
395250838Sjkim
396167802Sjkim        if (Op->Common.Value.String)
397167802Sjkim        {
398167802Sjkim            AcpiNsExternalizeName (ACPI_UINT32_MAX, Op->Common.Value.String,
399167802Sjkim                            NULL, &Path);
400167802Sjkim            AcpiOsPrintf ("%s %p", Path, Op->Common.Node);
401167802Sjkim            ACPI_FREE (Path);
402167802Sjkim        }
403167802Sjkim        else
404167802Sjkim        {
405167802Sjkim            AcpiOsPrintf ("[NULL]");
406167802Sjkim        }
407167802Sjkim        break;
408167802Sjkim
409167802Sjkim    case AML_NAME_OP:
410167802Sjkim    case AML_METHOD_OP:
411167802Sjkim    case AML_DEVICE_OP:
412167802Sjkim    case AML_INT_NAMEDFIELD_OP:
413250838Sjkim
414198237Sjkim        AcpiOsPrintf ("%4.4s", ACPI_CAST_PTR (char, &Op->Named.Name));
415167802Sjkim        break;
416193529Sjkim
417193529Sjkim    default:
418250838Sjkim
419193529Sjkim        break;
420167802Sjkim    }
421167802Sjkim
422167802Sjkim    AcpiOsPrintf ("\n");
423167802Sjkim    return (AE_OK);
424167802Sjkim}
425167802Sjkim
426167802Sjkim
427167802Sjkim/*******************************************************************************
428167802Sjkim *
429167802Sjkim * FUNCTION:    AcpiDmFindOrphanDescending
430167802Sjkim *
431167802Sjkim * PARAMETERS:  ASL_WALK_CALLBACK
432167802Sjkim *
433167802Sjkim * RETURN:      Status
434167802Sjkim *
435167802Sjkim * DESCRIPTION: Check namepath Ops for orphaned method invocations
436167802Sjkim *
437167802Sjkim * Note: Experimental.
438167802Sjkim *
439167802Sjkim ******************************************************************************/
440167802Sjkim
441167802Sjkimstatic ACPI_STATUS
442167802SjkimAcpiDmFindOrphanDescending (
443167802Sjkim    ACPI_PARSE_OBJECT       *Op,
444167802Sjkim    UINT32                  Level,
445167802Sjkim    void                    *Context)
446167802Sjkim{
447167802Sjkim    const ACPI_OPCODE_INFO  *OpInfo;
448167802Sjkim    ACPI_PARSE_OBJECT       *ChildOp;
449167802Sjkim    ACPI_PARSE_OBJECT       *NextOp;
450167802Sjkim    ACPI_PARSE_OBJECT       *ParentOp;
451167802Sjkim    UINT32                  ArgCount;
452167802Sjkim
453167802Sjkim
454167802Sjkim    if (!Op)
455167802Sjkim    {
456167802Sjkim        return (AE_OK);
457167802Sjkim    }
458167802Sjkim
459167802Sjkim    OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
460167802Sjkim
461167802Sjkim    switch (Op->Common.AmlOpcode)
462167802Sjkim    {
463167802Sjkim#ifdef ACPI_UNDER_DEVELOPMENT
464167802Sjkim    case AML_ADD_OP:
465250838Sjkim
466167802Sjkim        ChildOp = Op->Common.Value.Arg;
467167802Sjkim        if ((ChildOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
468167802Sjkim            !ChildOp->Common.Node)
469167802Sjkim        {
470167802Sjkim            AcpiNsExternalizeName (ACPI_UINT32_MAX, ChildOp->Common.Value.String,
471281075Sdim                NULL, &Path);
472281075Sdim            AcpiOsPrintf ("/* %-16s A-NAMEPATH: %s  */\n",
473281075Sdim                Op->Common.AmlOpName, Path);
474167802Sjkim            ACPI_FREE (Path);
475167802Sjkim
476167802Sjkim            NextOp = Op->Common.Next;
477167802Sjkim            if (!NextOp)
478167802Sjkim            {
479167802Sjkim                /* This NamePath has no args, assume it is an integer */
480167802Sjkim
481281075Sdim                AcpiDmAddOpToExternalList (ChildOp,
482281075Sdim                    ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0);
483167802Sjkim                return (AE_OK);
484167802Sjkim            }
485167802Sjkim
486167802Sjkim            ArgCount = AcpiDmInspectPossibleArgs (3, 1, NextOp);
487281075Sdim            AcpiOsPrintf ("/* A-CHILDREN: %u Actual %u */\n",
488281075Sdim                ArgCount, AcpiDmCountChildren (Op));
489167802Sjkim
490167802Sjkim            if (ArgCount < 1)
491167802Sjkim            {
492167802Sjkim                /* One Arg means this is just a Store(Name,Target) */
493167802Sjkim
494281075Sdim                AcpiDmAddOpToExternalList (ChildOp,
495281075Sdim                    ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0);
496167802Sjkim                return (AE_OK);
497167802Sjkim            }
498167802Sjkim
499281075Sdim            AcpiDmAddOpToExternalList (ChildOp,
500281075Sdim                ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount, 0);
501167802Sjkim        }
502167802Sjkim        break;
503167802Sjkim#endif
504167802Sjkim
505167802Sjkim    case AML_STORE_OP:
506167802Sjkim
507167802Sjkim        ChildOp = Op->Common.Value.Arg;
508167802Sjkim        if ((ChildOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
509167802Sjkim            !ChildOp->Common.Node)
510167802Sjkim        {
511167802Sjkim            NextOp = Op->Common.Next;
512167802Sjkim            if (!NextOp)
513167802Sjkim            {
514167802Sjkim                /* This NamePath has no args, assume it is an integer */
515167802Sjkim
516281075Sdim                AcpiDmAddOpToExternalList (ChildOp,
517281075Sdim                    ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0);
518167802Sjkim                return (AE_OK);
519167802Sjkim            }
520167802Sjkim
521167802Sjkim            ArgCount = AcpiDmInspectPossibleArgs (2, 1, NextOp);
522167802Sjkim            if (ArgCount <= 1)
523167802Sjkim            {
524167802Sjkim                /* One Arg means this is just a Store(Name,Target) */
525167802Sjkim
526281075Sdim                AcpiDmAddOpToExternalList (ChildOp,
527281075Sdim                    ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0);
528167802Sjkim                return (AE_OK);
529167802Sjkim            }
530167802Sjkim
531281075Sdim            AcpiDmAddOpToExternalList (ChildOp,
532281075Sdim                ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount, 0);
533167802Sjkim        }
534167802Sjkim        break;
535167802Sjkim
536167802Sjkim    case AML_INT_NAMEPATH_OP:
537167802Sjkim
538167802Sjkim        /* Must examine parent to see if this namepath is an argument */
539167802Sjkim
540167802Sjkim        ParentOp = Op->Common.Parent;
541167802Sjkim        OpInfo = AcpiPsGetOpcodeInfo (ParentOp->Common.AmlOpcode);
542167802Sjkim
543167802Sjkim        if ((OpInfo->Class != AML_CLASS_EXECUTE) &&
544167802Sjkim            (OpInfo->Class != AML_CLASS_CREATE) &&
545235945Sjkim            (OpInfo->ObjectType != ACPI_TYPE_LOCAL_ALIAS) &&
546167802Sjkim            (ParentOp->Common.AmlOpcode != AML_INT_METHODCALL_OP) &&
547167802Sjkim            !Op->Common.Node)
548167802Sjkim        {
549167802Sjkim            ArgCount = AcpiDmInspectPossibleArgs (0, 0, Op->Common.Next);
550167802Sjkim
551167802Sjkim            /*
552167802Sjkim             * Check if namepath is a predicate for if/while or lone parameter to
553167802Sjkim             * a return.
554167802Sjkim             */
555167802Sjkim            if (ArgCount == 0)
556167802Sjkim            {
557167802Sjkim                if (((ParentOp->Common.AmlOpcode == AML_IF_OP) ||
558167802Sjkim                     (ParentOp->Common.AmlOpcode == AML_WHILE_OP) ||
559167802Sjkim                     (ParentOp->Common.AmlOpcode == AML_RETURN_OP)) &&
560167802Sjkim
561167802Sjkim                     /* And namepath is the first argument */
562167802Sjkim                     (ParentOp->Common.Value.Arg == Op))
563167802Sjkim                {
564281075Sdim                    AcpiDmAddOpToExternalList (Op,
565281075Sdim                        Op->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0);
566167802Sjkim                    break;
567167802Sjkim                }
568167802Sjkim            }
569167802Sjkim
570167802Sjkim            /*
571167802Sjkim             * This is a standalone namestring (not a parameter to another
572167802Sjkim             * operator) - it *must* be a method invocation, nothing else is
573167802Sjkim             * grammatically possible.
574167802Sjkim             */
575281075Sdim            AcpiDmAddOpToExternalList (Op,
576281075Sdim                Op->Common.Value.String, ACPI_TYPE_METHOD, ArgCount, 0);
577167802Sjkim        }
578167802Sjkim        break;
579193529Sjkim
580193529Sjkim    default:
581250838Sjkim
582193529Sjkim        break;
583167802Sjkim    }
584167802Sjkim
585167802Sjkim    return (AE_OK);
586167802Sjkim}
587167802Sjkim
588167802Sjkim
589167802Sjkim/*******************************************************************************
590167802Sjkim *
591167802Sjkim * FUNCTION:    AcpiDmLoadDescendingOp
592167802Sjkim *
593167802Sjkim * PARAMETERS:  ASL_WALK_CALLBACK
594167802Sjkim *
595167802Sjkim * RETURN:      Status
596167802Sjkim *
597167802Sjkim * DESCRIPTION: Descending handler for namespace control method object load
598167802Sjkim *
599167802Sjkim ******************************************************************************/
600167802Sjkim
601167802Sjkimstatic ACPI_STATUS
602167802SjkimAcpiDmLoadDescendingOp (
603167802Sjkim    ACPI_PARSE_OBJECT       *Op,
604167802Sjkim    UINT32                  Level,
605167802Sjkim    void                    *Context)
606167802Sjkim{
607167802Sjkim    ACPI_OP_WALK_INFO       *Info = Context;
608167802Sjkim    const ACPI_OPCODE_INFO  *OpInfo;
609167802Sjkim    ACPI_WALK_STATE         *WalkState;
610167802Sjkim    ACPI_OBJECT_TYPE        ObjectType;
611167802Sjkim    ACPI_STATUS             Status;
612167802Sjkim    char                    *Path = NULL;
613167802Sjkim    ACPI_PARSE_OBJECT       *NextOp;
614167802Sjkim    ACPI_NAMESPACE_NODE     *Node;
615193529Sjkim    char                    FieldPath[5];
616193529Sjkim    BOOLEAN                 PreDefined = FALSE;
617193529Sjkim    UINT8                   PreDefineIndex = 0;
618167802Sjkim
619167802Sjkim
620167802Sjkim    WalkState = Info->WalkState;
621167802Sjkim    OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
622167802Sjkim    ObjectType = OpInfo->ObjectType;
623167802Sjkim    ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
624167802Sjkim
625167802Sjkim    /* Only interested in operators that create new names */
626167802Sjkim
627167802Sjkim    if (!(OpInfo->Flags & AML_NAMED) &&
628167802Sjkim        !(OpInfo->Flags & AML_CREATE))
629167802Sjkim    {
630167802Sjkim        goto Exit;
631167802Sjkim    }
632167802Sjkim
633167802Sjkim    /* Get the NamePath from the appropriate place */
634167802Sjkim
635167802Sjkim    if (OpInfo->Flags & AML_NAMED)
636167802Sjkim    {
637167802Sjkim        /* For all named operators, get the new name */
638167802Sjkim
639167802Sjkim        Path = (char *) Op->Named.Path;
640193529Sjkim
641193529Sjkim        if (!Path && Op->Common.AmlOpcode == AML_INT_NAMEDFIELD_OP)
642193529Sjkim        {
643193529Sjkim            *ACPI_CAST_PTR (UINT32, &FieldPath[0]) = Op->Named.Name;
644193529Sjkim            FieldPath[4] = 0;
645193529Sjkim            Path = FieldPath;
646193529Sjkim        }
647167802Sjkim    }
648167802Sjkim    else if (OpInfo->Flags & AML_CREATE)
649167802Sjkim    {
650167802Sjkim        /* New name is the last child */
651167802Sjkim
652167802Sjkim        NextOp = Op->Common.Value.Arg;
653167802Sjkim
654167802Sjkim        while (NextOp->Common.Next)
655167802Sjkim        {
656167802Sjkim            NextOp = NextOp->Common.Next;
657167802Sjkim        }
658167802Sjkim        Path = NextOp->Common.Value.String;
659167802Sjkim    }
660167802Sjkim
661167802Sjkim    if (!Path)
662167802Sjkim    {
663167802Sjkim        goto Exit;
664167802Sjkim    }
665167802Sjkim
666167802Sjkim    /* Insert the name into the namespace */
667167802Sjkim
668167802Sjkim    Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType,
669167802Sjkim                ACPI_IMODE_LOAD_PASS2, ACPI_NS_DONT_OPEN_SCOPE,
670167802Sjkim                WalkState, &Node);
671167802Sjkim
672167802Sjkim    Op->Common.Node = Node;
673167802Sjkim
674193529Sjkim    if (ACPI_SUCCESS (Status))
675193529Sjkim    {
676193529Sjkim        /* Check if it's a predefined node */
677167802Sjkim
678193529Sjkim        while (AcpiGbl_PreDefinedNames[PreDefineIndex].Name)
679193529Sjkim        {
680241973Sjkim            if (ACPI_COMPARE_NAME (Node->Name.Ascii,
681241973Sjkim                AcpiGbl_PreDefinedNames[PreDefineIndex].Name))
682193529Sjkim            {
683193529Sjkim                PreDefined = TRUE;
684193529Sjkim                break;
685193529Sjkim            }
686193529Sjkim
687193529Sjkim            PreDefineIndex++;
688193529Sjkim        }
689193529Sjkim
690193529Sjkim        /*
691193529Sjkim         * Set node owner id if it satisfies all the following conditions:
692193529Sjkim         * 1) Not a predefined node, _SB_ etc
693193529Sjkim         * 2) Not the root node
694193529Sjkim         * 3) Not a node created by Scope
695193529Sjkim         */
696193529Sjkim
697193529Sjkim        if (!PreDefined && Node != AcpiGbl_RootNode &&
698193529Sjkim            Op->Common.AmlOpcode != AML_SCOPE_OP)
699193529Sjkim        {
700193529Sjkim            Node->OwnerId = WalkState->OwnerId;
701193529Sjkim        }
702193529Sjkim    }
703193529Sjkim
704193529Sjkim
705167802SjkimExit:
706167802Sjkim
707167802Sjkim    if (AcpiNsOpensScope (ObjectType))
708167802Sjkim    {
709167802Sjkim        if (Op->Common.Node)
710167802Sjkim        {
711167802Sjkim            Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, WalkState);
712167802Sjkim            if (ACPI_FAILURE (Status))
713167802Sjkim            {
714167802Sjkim                return (Status);
715167802Sjkim            }
716167802Sjkim        }
717167802Sjkim    }
718167802Sjkim
719167802Sjkim    return (AE_OK);
720167802Sjkim}
721167802Sjkim
722167802Sjkim
723167802Sjkim/*******************************************************************************
724167802Sjkim *
725167802Sjkim * FUNCTION:    AcpiDmXrefDescendingOp
726167802Sjkim *
727167802Sjkim * PARAMETERS:  ASL_WALK_CALLBACK
728167802Sjkim *
729167802Sjkim * RETURN:      Status
730167802Sjkim *
731167802Sjkim * DESCRIPTION: Descending handler for namespace cross reference
732167802Sjkim *
733167802Sjkim ******************************************************************************/
734167802Sjkim
735167802Sjkimstatic ACPI_STATUS
736167802SjkimAcpiDmXrefDescendingOp (
737167802Sjkim    ACPI_PARSE_OBJECT       *Op,
738167802Sjkim    UINT32                  Level,
739167802Sjkim    void                    *Context)
740167802Sjkim{
741167802Sjkim    ACPI_OP_WALK_INFO       *Info = Context;
742167802Sjkim    const ACPI_OPCODE_INFO  *OpInfo;
743167802Sjkim    ACPI_WALK_STATE         *WalkState;
744167802Sjkim    ACPI_OBJECT_TYPE        ObjectType;
745193529Sjkim    ACPI_OBJECT_TYPE        ObjectType2;
746167802Sjkim    ACPI_STATUS             Status;
747167802Sjkim    char                    *Path = NULL;
748167802Sjkim    ACPI_PARSE_OBJECT       *NextOp;
749167802Sjkim    ACPI_NAMESPACE_NODE     *Node;
750193529Sjkim    ACPI_OPERAND_OBJECT     *Object;
751212761Sjkim    UINT32                  ParamCount = 0;
752281075Sdim    char                    *Pathname;
753167802Sjkim
754167802Sjkim
755167802Sjkim    WalkState = Info->WalkState;
756167802Sjkim    OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
757167802Sjkim    ObjectType = OpInfo->ObjectType;
758167802Sjkim    ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
759167802Sjkim
760167802Sjkim    if ((!(OpInfo->Flags & AML_NAMED)) &&
761167802Sjkim        (!(OpInfo->Flags & AML_CREATE)) &&
762281075Sdim        (Op->Common.AmlOpcode != AML_INT_NAMEPATH_OP) &&
763281075Sdim        (Op->Common.AmlOpcode != AML_NOTIFY_OP))
764167802Sjkim    {
765167802Sjkim        goto Exit;
766167802Sjkim    }
767167802Sjkim
768281075Sdim
769167802Sjkim    /* Get the NamePath from the appropriate place */
770167802Sjkim
771167802Sjkim    if (OpInfo->Flags & AML_NAMED)
772167802Sjkim    {
773235945Sjkim        /*
774235945Sjkim         * Only these two operators (Alias, Scope) refer to an existing
775235945Sjkim         * name, it is the first argument
776235945Sjkim         */
777235945Sjkim        if (Op->Common.AmlOpcode == AML_ALIAS_OP)
778167802Sjkim        {
779235945Sjkim            ObjectType = ACPI_TYPE_ANY;
780235945Sjkim
781235945Sjkim            NextOp = Op->Common.Value.Arg;
782235945Sjkim            NextOp = NextOp->Common.Value.Arg;
783235945Sjkim            if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP)
784235945Sjkim            {
785235945Sjkim                Path = NextOp->Common.Value.String;
786235945Sjkim            }
787235945Sjkim        }
788235945Sjkim        else if (Op->Common.AmlOpcode == AML_SCOPE_OP)
789235945Sjkim        {
790167802Sjkim            Path = (char *) Op->Named.Path;
791167802Sjkim        }
792167802Sjkim    }
793167802Sjkim    else if (OpInfo->Flags & AML_CREATE)
794167802Sjkim    {
795167802Sjkim        /* Referenced Buffer Name is the first child */
796167802Sjkim
797235945Sjkim        ObjectType = ACPI_TYPE_BUFFER; /* Change from TYPE_BUFFER_FIELD */
798235945Sjkim
799167802Sjkim        NextOp = Op->Common.Value.Arg;
800167802Sjkim        if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP)
801167802Sjkim        {
802167802Sjkim            Path = NextOp->Common.Value.String;
803167802Sjkim        }
804167802Sjkim    }
805281075Sdim    else if (Op->Common.AmlOpcode == AML_NOTIFY_OP)
806281075Sdim    {
807281075Sdim        Path = Op->Common.Value.Arg->Asl.Value.String;
808281075Sdim    }
809167802Sjkim    else
810167802Sjkim    {
811167802Sjkim        Path = Op->Common.Value.String;
812167802Sjkim    }
813167802Sjkim
814167802Sjkim    if (!Path)
815167802Sjkim    {
816167802Sjkim        goto Exit;
817167802Sjkim    }
818167802Sjkim
819167802Sjkim    /*
820241973Sjkim     * Lookup the name in the namespace. Name must exist at this point, or it
821167802Sjkim     * is an invalid reference.
822167802Sjkim     *
823167802Sjkim     * The namespace is also used as a lookup table for references to resource
824167802Sjkim     * descriptors and the fields within them.
825167802Sjkim     */
826281075Sdim    Node = NULL;
827167802Sjkim    Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY,
828167802Sjkim                ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
829167802Sjkim                WalkState, &Node);
830235945Sjkim    if (ACPI_SUCCESS (Status) && (Node->Flags & ANOBJ_IS_EXTERNAL))
831235945Sjkim    {
832281075Sdim        /* Node was created by an External() statement */
833281075Sdim
834235945Sjkim        Status = AE_NOT_FOUND;
835235945Sjkim    }
836235945Sjkim
837167802Sjkim    if (ACPI_FAILURE (Status))
838167802Sjkim    {
839167802Sjkim        if (Status == AE_NOT_FOUND)
840167802Sjkim        {
841167802Sjkim            /*
842281075Sdim             * Add this symbol as an external declaration, except if the
843281075Sdim             * parent is a CondRefOf operator. For this operator, we do not
844281075Sdim             * need an external, nor do we want one, since this can cause
845281075Sdim             * disassembly problems if the symbol is actually a control
846281075Sdim             * method.
847167802Sjkim             */
848281075Sdim            if (!(Op->Asl.Parent &&
849281075Sdim                (Op->Asl.Parent->Asl.AmlOpcode == AML_COND_REF_OF_OP)))
850281075Sdim            {
851281075Sdim                if (Node)
852281075Sdim                {
853281075Sdim                    AcpiDmAddNodeToExternalList (Node,
854281075Sdim                        (UINT8) ObjectType, 0, 0);
855281075Sdim                }
856281075Sdim                else
857281075Sdim                {
858281075Sdim                    AcpiDmAddOpToExternalList (Op, Path,
859281075Sdim                        (UINT8) ObjectType, 0, 0);
860281075Sdim                }
861281075Sdim            }
862167802Sjkim        }
863167802Sjkim    }
864193529Sjkim
865193529Sjkim    /*
866281075Sdim     * Found the node, but check if it came from an external table.
867281075Sdim     * Add it to external list. Note: Node->OwnerId == 0 indicates
868281075Sdim     * one of the built-in ACPI Names (_OS_ etc.) which can safely
869281075Sdim     * be ignored.
870193529Sjkim     */
871281075Sdim    else if (Node->OwnerId &&
872281075Sdim            (WalkState->OwnerId != Node->OwnerId))
873193529Sjkim    {
874193529Sjkim        ObjectType2 = ObjectType;
875193529Sjkim
876193529Sjkim        Object = AcpiNsGetAttachedObject (Node);
877193529Sjkim        if (Object)
878193529Sjkim        {
879193529Sjkim            ObjectType2 = Object->Common.Type;
880212761Sjkim            if (ObjectType2 == ACPI_TYPE_METHOD)
881212761Sjkim            {
882212761Sjkim                ParamCount = Object->Method.ParamCount;
883212761Sjkim            }
884193529Sjkim        }
885193529Sjkim
886281075Sdim        Pathname = AcpiNsGetExternalPathname (Node);
887281075Sdim        if (!Pathname)
888281075Sdim        {
889281075Sdim            return (AE_NO_MEMORY);
890281075Sdim        }
891281075Sdim
892281075Sdim        AcpiDmAddNodeToExternalList (Node, (UINT8) ObjectType2,
893281075Sdim            ParamCount, ACPI_EXT_RESOLVED_REFERENCE);
894281075Sdim
895281075Sdim        ACPI_FREE (Pathname);
896193529Sjkim        Op->Common.Node = Node;
897193529Sjkim    }
898167802Sjkim    else
899167802Sjkim    {
900167802Sjkim        Op->Common.Node = Node;
901167802Sjkim    }
902167802Sjkim
903167802Sjkim
904167802SjkimExit:
905167802Sjkim    /* Open new scope if necessary */
906167802Sjkim
907167802Sjkim    if (AcpiNsOpensScope (ObjectType))
908167802Sjkim    {
909167802Sjkim        if (Op->Common.Node)
910167802Sjkim        {
911167802Sjkim            Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, WalkState);
912167802Sjkim            if (ACPI_FAILURE (Status))
913167802Sjkim            {
914167802Sjkim                return (Status);
915167802Sjkim            }
916167802Sjkim        }
917167802Sjkim    }
918167802Sjkim
919167802Sjkim    return (AE_OK);
920167802Sjkim}
921167802Sjkim
922167802Sjkim
923167802Sjkim/*******************************************************************************
924167802Sjkim *
925167802Sjkim * FUNCTION:    AcpiDmResourceDescendingOp
926167802Sjkim *
927167802Sjkim * PARAMETERS:  ASL_WALK_CALLBACK
928167802Sjkim *
929167802Sjkim * RETURN:      None
930167802Sjkim *
931167802Sjkim * DESCRIPTION: Process one parse op during symbolic resource index conversion.
932167802Sjkim *
933167802Sjkim ******************************************************************************/
934167802Sjkim
935167802Sjkimstatic ACPI_STATUS
936167802SjkimAcpiDmResourceDescendingOp (
937167802Sjkim    ACPI_PARSE_OBJECT       *Op,
938167802Sjkim    UINT32                  Level,
939167802Sjkim    void                    *Context)
940167802Sjkim{
941167802Sjkim    ACPI_OP_WALK_INFO       *Info = Context;
942167802Sjkim    const ACPI_OPCODE_INFO  *OpInfo;
943167802Sjkim    ACPI_WALK_STATE         *WalkState;
944167802Sjkim    ACPI_OBJECT_TYPE        ObjectType;
945167802Sjkim    ACPI_STATUS             Status;
946167802Sjkim
947167802Sjkim
948167802Sjkim    WalkState = Info->WalkState;
949167802Sjkim    OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
950167802Sjkim
951167802Sjkim    /* Open new scope if necessary */
952167802Sjkim
953167802Sjkim    ObjectType = OpInfo->ObjectType;
954167802Sjkim    if (AcpiNsOpensScope (ObjectType))
955167802Sjkim    {
956167802Sjkim        if (Op->Common.Node)
957167802Sjkim        {
958167802Sjkim
959167802Sjkim            Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, WalkState);
960167802Sjkim            if (ACPI_FAILURE (Status))
961167802Sjkim            {
962167802Sjkim                return (Status);
963167802Sjkim            }
964167802Sjkim        }
965167802Sjkim    }
966167802Sjkim
967167802Sjkim    /*
968167802Sjkim     * Check if this operator contains a reference to a resource descriptor.
969167802Sjkim     * If so, convert the reference into a symbolic reference.
970167802Sjkim     */
971167802Sjkim    AcpiDmCheckResourceReference (Op, WalkState);
972167802Sjkim    return (AE_OK);
973167802Sjkim}
974167802Sjkim
975167802Sjkim
976167802Sjkim/*******************************************************************************
977167802Sjkim *
978167802Sjkim * FUNCTION:    AcpiDmCommonAscendingOp
979167802Sjkim *
980167802Sjkim * PARAMETERS:  ASL_WALK_CALLBACK
981167802Sjkim *
982167802Sjkim * RETURN:      None
983167802Sjkim *
984167802Sjkim * DESCRIPTION: Ascending handler for combined parse/namespace walks. Closes
985167802Sjkim *              scope if necessary.
986167802Sjkim *
987167802Sjkim ******************************************************************************/
988167802Sjkim
989167802Sjkimstatic ACPI_STATUS
990167802SjkimAcpiDmCommonAscendingOp (
991167802Sjkim    ACPI_PARSE_OBJECT       *Op,
992167802Sjkim    UINT32                  Level,
993167802Sjkim    void                    *Context)
994167802Sjkim{
995167802Sjkim    ACPI_OP_WALK_INFO       *Info = Context;
996167802Sjkim    const ACPI_OPCODE_INFO  *OpInfo;
997167802Sjkim    ACPI_OBJECT_TYPE        ObjectType;
998167802Sjkim
999167802Sjkim
1000167802Sjkim    /* Close scope if necessary */
1001167802Sjkim
1002167802Sjkim    OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
1003167802Sjkim    ObjectType = OpInfo->ObjectType;
1004167802Sjkim    ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
1005167802Sjkim
1006167802Sjkim    if (AcpiNsOpensScope (ObjectType))
1007167802Sjkim    {
1008167802Sjkim        (void) AcpiDsScopeStackPop (Info->WalkState);
1009167802Sjkim    }
1010167802Sjkim
1011167802Sjkim    return (AE_OK);
1012167802Sjkim}
1013167802Sjkim
1014167802Sjkim
1015167802Sjkim/*******************************************************************************
1016167802Sjkim *
1017167802Sjkim * FUNCTION:    AcpiDmInspectPossibleArgs
1018167802Sjkim *
1019167802Sjkim * PARAMETERS:  CurrentOpArgCount   - Which arg of the current op was the
1020167802Sjkim *                                    possible method invocation found
1021167802Sjkim *              TargetCount         - Number of targets (0,1,2) for this op
1022167802Sjkim *              Op                  - Parse op
1023167802Sjkim *
1024167802Sjkim * RETURN:      Status
1025167802Sjkim *
1026167802Sjkim * DESCRIPTION: Examine following args and next ops for possible arguments
1027167802Sjkim *              for an unrecognized method invocation.
1028167802Sjkim *
1029167802Sjkim ******************************************************************************/
1030167802Sjkim
1031167802Sjkimstatic UINT32
1032167802SjkimAcpiDmInspectPossibleArgs (
1033167802Sjkim    UINT32                  CurrentOpArgCount,
1034167802Sjkim    UINT32                  TargetCount,
1035167802Sjkim    ACPI_PARSE_OBJECT       *Op)
1036167802Sjkim{
1037167802Sjkim    const ACPI_OPCODE_INFO  *OpInfo;
1038167802Sjkim    UINT32                  i;
1039167802Sjkim    UINT32                  Last = 0;
1040167802Sjkim    UINT32                  Lookahead;
1041167802Sjkim
1042167802Sjkim
1043167802Sjkim    Lookahead = (ACPI_METHOD_NUM_ARGS + TargetCount) - CurrentOpArgCount;
1044167802Sjkim
1045167802Sjkim    /* Lookahead for the maximum number of possible arguments */
1046167802Sjkim
1047167802Sjkim    for (i = 0; i < Lookahead; i++)
1048167802Sjkim    {
1049167802Sjkim        if (!Op)
1050167802Sjkim        {
1051167802Sjkim            break;
1052167802Sjkim        }
1053167802Sjkim
1054167802Sjkim        OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
1055167802Sjkim
1056167802Sjkim        /*
1057167802Sjkim         * Any one of these operators is "very probably" not a method arg
1058167802Sjkim         */
1059167802Sjkim        if ((Op->Common.AmlOpcode == AML_STORE_OP) ||
1060167802Sjkim            (Op->Common.AmlOpcode == AML_NOTIFY_OP))
1061167802Sjkim        {
1062167802Sjkim            break;
1063167802Sjkim        }
1064167802Sjkim
1065167802Sjkim        if ((OpInfo->Class != AML_CLASS_EXECUTE) &&
1066167802Sjkim            (OpInfo->Class != AML_CLASS_CONTROL))
1067167802Sjkim        {
1068167802Sjkim            Last = i+1;
1069167802Sjkim        }
1070167802Sjkim
1071167802Sjkim        Op = Op->Common.Next;
1072167802Sjkim    }
1073167802Sjkim
1074167802Sjkim    return (Last);
1075167802Sjkim}
1076