1167802Sjkim/******************************************************************************
2167802Sjkim *
3167802Sjkim * Module Name: adwalk - Application-level disassembler parse tree walk routines
4167802Sjkim *
5167802Sjkim *****************************************************************************/
6167802Sjkim
7217365Sjkim/*
8306536Sjkim * Copyright (C) 2000 - 2016, 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;
138306536Sjkim
139167802Sjkim    AcpiDmWalkParseTree (Origin, AcpiDmDumpDescending, NULL, &Info);
140167802Sjkim    AcpiOsPrintf ("*/\n\n");
141167802Sjkim}
142167802Sjkim
143167802Sjkim
144167802Sjkim/*******************************************************************************
145167802Sjkim *
146167802Sjkim * FUNCTION:    AcpiDmFindOrphanMethods
147167802Sjkim *
148198237Sjkim * PARAMETERS:  Origin              - Starting object
149167802Sjkim *
150167802Sjkim * RETURN:      None
151167802Sjkim *
152167802Sjkim * DESCRIPTION: Parse tree walk to find "orphaned" method invocations -- methods
153167802Sjkim *              that are not resolved in the namespace
154167802Sjkim *
155167802Sjkim ******************************************************************************/
156167802Sjkim
157167802Sjkimvoid
158167802SjkimAcpiDmFindOrphanMethods (
159167802Sjkim    ACPI_PARSE_OBJECT       *Origin)
160167802Sjkim{
161167802Sjkim    ACPI_OP_WALK_INFO       Info;
162167802Sjkim
163167802Sjkim
164167802Sjkim    if (!Origin)
165167802Sjkim    {
166167802Sjkim        return;
167167802Sjkim    }
168167802Sjkim
169167802Sjkim    Info.Flags = 0;
170167802Sjkim    Info.Level = 0;
171167802Sjkim    Info.WalkState = NULL;
172306536Sjkim
173167802Sjkim    AcpiDmWalkParseTree (Origin, AcpiDmFindOrphanDescending, NULL, &Info);
174167802Sjkim}
175167802Sjkim
176167802Sjkim
177167802Sjkim/*******************************************************************************
178167802Sjkim *
179167802Sjkim * FUNCTION:    AcpiDmFinishNamespaceLoad
180167802Sjkim *
181167802Sjkim * PARAMETERS:  ParseTreeRoot       - Root of the parse tree
182167802Sjkim *              NamespaceRoot       - Root of the internal namespace
183193529Sjkim *              OwnerId             - OwnerId of the table to be disassembled
184167802Sjkim *
185167802Sjkim * RETURN:      None
186167802Sjkim *
187167802Sjkim * DESCRIPTION: Load all namespace items that are created within control
188167802Sjkim *              methods. Used before namespace cross reference
189167802Sjkim *
190167802Sjkim ******************************************************************************/
191167802Sjkim
192167802Sjkimvoid
193167802SjkimAcpiDmFinishNamespaceLoad (
194167802Sjkim    ACPI_PARSE_OBJECT       *ParseTreeRoot,
195193529Sjkim    ACPI_NAMESPACE_NODE     *NamespaceRoot,
196193529Sjkim    ACPI_OWNER_ID           OwnerId)
197167802Sjkim{
198167802Sjkim    ACPI_STATUS             Status;
199167802Sjkim    ACPI_OP_WALK_INFO       Info;
200167802Sjkim    ACPI_WALK_STATE         *WalkState;
201167802Sjkim
202167802Sjkim
203167802Sjkim    if (!ParseTreeRoot)
204167802Sjkim    {
205167802Sjkim        return;
206167802Sjkim    }
207167802Sjkim
208167802Sjkim    /* Create and initialize a new walk state */
209167802Sjkim
210193529Sjkim    WalkState = AcpiDsCreateWalkState (OwnerId, ParseTreeRoot, NULL, NULL);
211167802Sjkim    if (!WalkState)
212167802Sjkim    {
213167802Sjkim        return;
214167802Sjkim    }
215167802Sjkim
216306536Sjkim    Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type,
217306536Sjkim        WalkState);
218167802Sjkim    if (ACPI_FAILURE (Status))
219167802Sjkim    {
220167802Sjkim        return;
221167802Sjkim    }
222167802Sjkim
223167802Sjkim    Info.Flags = 0;
224167802Sjkim    Info.Level = 0;
225167802Sjkim    Info.WalkState = WalkState;
226306536Sjkim
227167802Sjkim    AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmLoadDescendingOp,
228167802Sjkim        AcpiDmCommonAscendingOp, &Info);
229167802Sjkim    ACPI_FREE (WalkState);
230167802Sjkim}
231167802Sjkim
232167802Sjkim
233167802Sjkim/*******************************************************************************
234167802Sjkim *
235167802Sjkim * FUNCTION:    AcpiDmCrossReferenceNamespace
236167802Sjkim *
237167802Sjkim * PARAMETERS:  ParseTreeRoot       - Root of the parse tree
238167802Sjkim *              NamespaceRoot       - Root of the internal namespace
239193529Sjkim *              OwnerId             - OwnerId of the table to be disassembled
240167802Sjkim *
241167802Sjkim * RETURN:      None
242167802Sjkim *
243167802Sjkim * DESCRIPTION: Cross reference the namespace to create externals
244167802Sjkim *
245167802Sjkim ******************************************************************************/
246167802Sjkim
247167802Sjkimvoid
248167802SjkimAcpiDmCrossReferenceNamespace (
249167802Sjkim    ACPI_PARSE_OBJECT       *ParseTreeRoot,
250193529Sjkim    ACPI_NAMESPACE_NODE     *NamespaceRoot,
251193529Sjkim    ACPI_OWNER_ID           OwnerId)
252167802Sjkim{
253167802Sjkim    ACPI_STATUS             Status;
254167802Sjkim    ACPI_OP_WALK_INFO       Info;
255167802Sjkim    ACPI_WALK_STATE         *WalkState;
256167802Sjkim
257167802Sjkim
258167802Sjkim    if (!ParseTreeRoot)
259167802Sjkim    {
260167802Sjkim        return;
261167802Sjkim    }
262167802Sjkim
263167802Sjkim    /* Create and initialize a new walk state */
264167802Sjkim
265193529Sjkim    WalkState = AcpiDsCreateWalkState (OwnerId, ParseTreeRoot, NULL, NULL);
266167802Sjkim    if (!WalkState)
267167802Sjkim    {
268167802Sjkim        return;
269167802Sjkim    }
270167802Sjkim
271306536Sjkim    Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type,
272306536Sjkim        WalkState);
273167802Sjkim    if (ACPI_FAILURE (Status))
274167802Sjkim    {
275167802Sjkim        return;
276167802Sjkim    }
277167802Sjkim
278167802Sjkim    Info.Flags = 0;
279167802Sjkim    Info.Level = 0;
280167802Sjkim    Info.WalkState = WalkState;
281306536Sjkim
282167802Sjkim    AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmXrefDescendingOp,
283167802Sjkim        AcpiDmCommonAscendingOp, &Info);
284167802Sjkim    ACPI_FREE (WalkState);
285167802Sjkim}
286167802Sjkim
287167802Sjkim
288167802Sjkim/*******************************************************************************
289167802Sjkim *
290167802Sjkim * FUNCTION:    AcpiDmConvertResourceIndexes
291167802Sjkim *
292167802Sjkim * PARAMETERS:  ParseTreeRoot       - Root of the parse tree
293167802Sjkim *              NamespaceRoot       - Root of the internal namespace
294167802Sjkim *
295167802Sjkim * RETURN:      None
296167802Sjkim *
297167802Sjkim * DESCRIPTION: Convert fixed-offset references to resource descriptors to
298167802Sjkim *              symbolic references. Should only be called after namespace has
299167802Sjkim *              been cross referenced.
300167802Sjkim *
301167802Sjkim ******************************************************************************/
302167802Sjkim
303167802Sjkimvoid
304167802SjkimAcpiDmConvertResourceIndexes (
305167802Sjkim    ACPI_PARSE_OBJECT       *ParseTreeRoot,
306167802Sjkim    ACPI_NAMESPACE_NODE     *NamespaceRoot)
307167802Sjkim{
308167802Sjkim    ACPI_STATUS             Status;
309167802Sjkim    ACPI_OP_WALK_INFO       Info;
310167802Sjkim    ACPI_WALK_STATE         *WalkState;
311167802Sjkim
312167802Sjkim
313167802Sjkim    if (!ParseTreeRoot)
314167802Sjkim    {
315167802Sjkim        return;
316167802Sjkim    }
317167802Sjkim
318167802Sjkim    /* Create and initialize a new walk state */
319167802Sjkim
320167802Sjkim    WalkState = AcpiDsCreateWalkState (0, ParseTreeRoot, NULL, NULL);
321167802Sjkim    if (!WalkState)
322167802Sjkim    {
323167802Sjkim        return;
324167802Sjkim    }
325167802Sjkim
326306536Sjkim    Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type,
327306536Sjkim        WalkState);
328167802Sjkim    if (ACPI_FAILURE (Status))
329167802Sjkim    {
330306536Sjkim        ACPI_FREE (WalkState);
331167802Sjkim        return;
332167802Sjkim    }
333167802Sjkim
334167802Sjkim    Info.Flags = 0;
335167802Sjkim    Info.Level = 0;
336167802Sjkim    Info.WalkState = WalkState;
337306536Sjkim
338167802Sjkim    AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmResourceDescendingOp,
339167802Sjkim        AcpiDmCommonAscendingOp, &Info);
340167802Sjkim    ACPI_FREE (WalkState);
341167802Sjkim    return;
342167802Sjkim}
343167802Sjkim
344167802Sjkim
345167802Sjkim/*******************************************************************************
346167802Sjkim *
347167802Sjkim * FUNCTION:    AcpiDmDumpDescending
348167802Sjkim *
349167802Sjkim * PARAMETERS:  ASL_WALK_CALLBACK
350167802Sjkim *
351167802Sjkim * RETURN:      Status
352167802Sjkim *
353167802Sjkim * DESCRIPTION: Format and print contents of one parse Op.
354167802Sjkim *
355167802Sjkim ******************************************************************************/
356167802Sjkim
357167802Sjkimstatic ACPI_STATUS
358167802SjkimAcpiDmDumpDescending (
359167802Sjkim    ACPI_PARSE_OBJECT       *Op,
360167802Sjkim    UINT32                  Level,
361167802Sjkim    void                    *Context)
362167802Sjkim{
363167802Sjkim    ACPI_OP_WALK_INFO       *Info = Context;
364167802Sjkim    char                    *Path;
365167802Sjkim
366167802Sjkim
367167802Sjkim    if (!Op)
368167802Sjkim    {
369167802Sjkim        return (AE_OK);
370167802Sjkim    }
371167802Sjkim
372167802Sjkim    /* Most of the information (count, level, name) here */
373167802Sjkim
374198237Sjkim    Info->Count++;
375167802Sjkim    AcpiOsPrintf ("% 5d [%2.2d] ", Info->Count, Level);
376167802Sjkim    AcpiDmIndent (Level);
377167802Sjkim    AcpiOsPrintf ("%-28s", AcpiPsGetOpcodeName (Op->Common.AmlOpcode));
378167802Sjkim
379167802Sjkim    /* Extra info is helpful */
380167802Sjkim
381167802Sjkim    switch (Op->Common.AmlOpcode)
382167802Sjkim    {
383167802Sjkim    case AML_BYTE_OP:
384254745Sjkim
385254745Sjkim        AcpiOsPrintf ("%2.2X", (UINT32) Op->Common.Value.Integer);
386254745Sjkim        break;
387254745Sjkim
388167802Sjkim    case AML_WORD_OP:
389254745Sjkim
390254745Sjkim        AcpiOsPrintf ("%4.4X", (UINT32) Op->Common.Value.Integer);
391254745Sjkim        break;
392254745Sjkim
393167802Sjkim    case AML_DWORD_OP:
394250838Sjkim
395254745Sjkim        AcpiOsPrintf ("%8.8X", (UINT32) Op->Common.Value.Integer);
396167802Sjkim        break;
397167802Sjkim
398228110Sjkim    case AML_QWORD_OP:
399250838Sjkim
400228110Sjkim        AcpiOsPrintf ("%8.8X%8.8X", ACPI_FORMAT_UINT64 (Op->Common.Value.Integer));
401228110Sjkim        break;
402228110Sjkim
403167802Sjkim    case AML_INT_NAMEPATH_OP:
404250838Sjkim
405167802Sjkim        if (Op->Common.Value.String)
406167802Sjkim        {
407167802Sjkim            AcpiNsExternalizeName (ACPI_UINT32_MAX, Op->Common.Value.String,
408306536Sjkim                NULL, &Path);
409167802Sjkim            AcpiOsPrintf ("%s %p", Path, Op->Common.Node);
410167802Sjkim            ACPI_FREE (Path);
411167802Sjkim        }
412167802Sjkim        else
413167802Sjkim        {
414167802Sjkim            AcpiOsPrintf ("[NULL]");
415167802Sjkim        }
416167802Sjkim        break;
417167802Sjkim
418167802Sjkim    case AML_NAME_OP:
419167802Sjkim    case AML_METHOD_OP:
420167802Sjkim    case AML_DEVICE_OP:
421167802Sjkim    case AML_INT_NAMEDFIELD_OP:
422250838Sjkim
423198237Sjkim        AcpiOsPrintf ("%4.4s", ACPI_CAST_PTR (char, &Op->Named.Name));
424167802Sjkim        break;
425193529Sjkim
426193529Sjkim    default:
427250838Sjkim
428193529Sjkim        break;
429167802Sjkim    }
430167802Sjkim
431167802Sjkim    AcpiOsPrintf ("\n");
432167802Sjkim    return (AE_OK);
433167802Sjkim}
434167802Sjkim
435167802Sjkim
436167802Sjkim/*******************************************************************************
437167802Sjkim *
438167802Sjkim * FUNCTION:    AcpiDmFindOrphanDescending
439167802Sjkim *
440167802Sjkim * PARAMETERS:  ASL_WALK_CALLBACK
441167802Sjkim *
442167802Sjkim * RETURN:      Status
443167802Sjkim *
444167802Sjkim * DESCRIPTION: Check namepath Ops for orphaned method invocations
445167802Sjkim *
446306536Sjkim * Note: Parts of this are experimental, under possible further development.
447167802Sjkim *
448167802Sjkim ******************************************************************************/
449167802Sjkim
450167802Sjkimstatic ACPI_STATUS
451167802SjkimAcpiDmFindOrphanDescending (
452167802Sjkim    ACPI_PARSE_OBJECT       *Op,
453167802Sjkim    UINT32                  Level,
454167802Sjkim    void                    *Context)
455167802Sjkim{
456167802Sjkim    const ACPI_OPCODE_INFO  *OpInfo;
457167802Sjkim    ACPI_PARSE_OBJECT       *ChildOp;
458167802Sjkim    ACPI_PARSE_OBJECT       *NextOp;
459167802Sjkim    ACPI_PARSE_OBJECT       *ParentOp;
460167802Sjkim    UINT32                  ArgCount;
461167802Sjkim
462167802Sjkim
463167802Sjkim    if (!Op)
464167802Sjkim    {
465167802Sjkim        return (AE_OK);
466167802Sjkim    }
467167802Sjkim
468167802Sjkim    OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
469167802Sjkim
470167802Sjkim    switch (Op->Common.AmlOpcode)
471167802Sjkim    {
472167802Sjkim#ifdef ACPI_UNDER_DEVELOPMENT
473167802Sjkim    case AML_ADD_OP:
474250838Sjkim
475167802Sjkim        ChildOp = Op->Common.Value.Arg;
476167802Sjkim        if ((ChildOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
477167802Sjkim            !ChildOp->Common.Node)
478167802Sjkim        {
479167802Sjkim            AcpiNsExternalizeName (ACPI_UINT32_MAX, ChildOp->Common.Value.String,
480281075Sdim                NULL, &Path);
481281075Sdim            AcpiOsPrintf ("/* %-16s A-NAMEPATH: %s  */\n",
482281075Sdim                Op->Common.AmlOpName, Path);
483167802Sjkim            ACPI_FREE (Path);
484167802Sjkim
485167802Sjkim            NextOp = Op->Common.Next;
486167802Sjkim            if (!NextOp)
487167802Sjkim            {
488167802Sjkim                /* This NamePath has no args, assume it is an integer */
489167802Sjkim
490281075Sdim                AcpiDmAddOpToExternalList (ChildOp,
491281075Sdim                    ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0);
492167802Sjkim                return (AE_OK);
493167802Sjkim            }
494167802Sjkim
495167802Sjkim            ArgCount = AcpiDmInspectPossibleArgs (3, 1, NextOp);
496281075Sdim            AcpiOsPrintf ("/* A-CHILDREN: %u Actual %u */\n",
497281075Sdim                ArgCount, AcpiDmCountChildren (Op));
498167802Sjkim
499167802Sjkim            if (ArgCount < 1)
500167802Sjkim            {
501167802Sjkim                /* One Arg means this is just a Store(Name,Target) */
502167802Sjkim
503281075Sdim                AcpiDmAddOpToExternalList (ChildOp,
504281075Sdim                    ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0);
505167802Sjkim                return (AE_OK);
506167802Sjkim            }
507167802Sjkim
508281075Sdim            AcpiDmAddOpToExternalList (ChildOp,
509281075Sdim                ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount, 0);
510167802Sjkim        }
511167802Sjkim        break;
512306536Sjkim
513167802Sjkim#endif
514167802Sjkim
515167802Sjkim    case AML_STORE_OP:
516167802Sjkim
517167802Sjkim        ChildOp = Op->Common.Value.Arg;
518167802Sjkim        if ((ChildOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
519167802Sjkim            !ChildOp->Common.Node)
520167802Sjkim        {
521167802Sjkim            NextOp = Op->Common.Next;
522167802Sjkim            if (!NextOp)
523167802Sjkim            {
524167802Sjkim                /* This NamePath has no args, assume it is an integer */
525167802Sjkim
526281075Sdim                AcpiDmAddOpToExternalList (ChildOp,
527281075Sdim                    ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0);
528167802Sjkim                return (AE_OK);
529167802Sjkim            }
530167802Sjkim
531167802Sjkim            ArgCount = AcpiDmInspectPossibleArgs (2, 1, NextOp);
532167802Sjkim            if (ArgCount <= 1)
533167802Sjkim            {
534167802Sjkim                /* One Arg means this is just a Store(Name,Target) */
535167802Sjkim
536281075Sdim                AcpiDmAddOpToExternalList (ChildOp,
537306536Sjkim                    ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, ArgCount, 0);
538167802Sjkim                return (AE_OK);
539167802Sjkim            }
540167802Sjkim
541281075Sdim            AcpiDmAddOpToExternalList (ChildOp,
542281075Sdim                ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount, 0);
543167802Sjkim        }
544167802Sjkim        break;
545167802Sjkim
546167802Sjkim    case AML_INT_NAMEPATH_OP:
547167802Sjkim
548167802Sjkim        /* Must examine parent to see if this namepath is an argument */
549167802Sjkim
550167802Sjkim        ParentOp = Op->Common.Parent;
551167802Sjkim        OpInfo = AcpiPsGetOpcodeInfo (ParentOp->Common.AmlOpcode);
552167802Sjkim
553167802Sjkim        if ((OpInfo->Class != AML_CLASS_EXECUTE) &&
554167802Sjkim            (OpInfo->Class != AML_CLASS_CREATE) &&
555235945Sjkim            (OpInfo->ObjectType != ACPI_TYPE_LOCAL_ALIAS) &&
556167802Sjkim            (ParentOp->Common.AmlOpcode != AML_INT_METHODCALL_OP) &&
557167802Sjkim            !Op->Common.Node)
558167802Sjkim        {
559306536Sjkim            ArgCount = AcpiDmInspectPossibleArgs (0, 0, Op);
560167802Sjkim
561167802Sjkim            /*
562167802Sjkim             * Check if namepath is a predicate for if/while or lone parameter to
563167802Sjkim             * a return.
564167802Sjkim             */
565167802Sjkim            if (ArgCount == 0)
566167802Sjkim            {
567167802Sjkim                if (((ParentOp->Common.AmlOpcode == AML_IF_OP) ||
568167802Sjkim                     (ParentOp->Common.AmlOpcode == AML_WHILE_OP) ||
569167802Sjkim                     (ParentOp->Common.AmlOpcode == AML_RETURN_OP)) &&
570167802Sjkim
571167802Sjkim                     /* And namepath is the first argument */
572167802Sjkim                     (ParentOp->Common.Value.Arg == Op))
573167802Sjkim                {
574281075Sdim                    AcpiDmAddOpToExternalList (Op,
575281075Sdim                        Op->Common.Value.String, ACPI_TYPE_INTEGER, 0, 0);
576167802Sjkim                    break;
577167802Sjkim                }
578167802Sjkim            }
579167802Sjkim
580167802Sjkim            /*
581167802Sjkim             * This is a standalone namestring (not a parameter to another
582167802Sjkim             * operator) - it *must* be a method invocation, nothing else is
583167802Sjkim             * grammatically possible.
584167802Sjkim             */
585281075Sdim            AcpiDmAddOpToExternalList (Op,
586281075Sdim                Op->Common.Value.String, ACPI_TYPE_METHOD, ArgCount, 0);
587167802Sjkim        }
588167802Sjkim        break;
589193529Sjkim
590193529Sjkim    default:
591250838Sjkim
592193529Sjkim        break;
593167802Sjkim    }
594167802Sjkim
595167802Sjkim    return (AE_OK);
596167802Sjkim}
597167802Sjkim
598167802Sjkim
599167802Sjkim/*******************************************************************************
600167802Sjkim *
601167802Sjkim * FUNCTION:    AcpiDmLoadDescendingOp
602167802Sjkim *
603167802Sjkim * PARAMETERS:  ASL_WALK_CALLBACK
604167802Sjkim *
605167802Sjkim * RETURN:      Status
606167802Sjkim *
607167802Sjkim * DESCRIPTION: Descending handler for namespace control method object load
608167802Sjkim *
609167802Sjkim ******************************************************************************/
610167802Sjkim
611167802Sjkimstatic ACPI_STATUS
612167802SjkimAcpiDmLoadDescendingOp (
613167802Sjkim    ACPI_PARSE_OBJECT       *Op,
614167802Sjkim    UINT32                  Level,
615167802Sjkim    void                    *Context)
616167802Sjkim{
617167802Sjkim    ACPI_OP_WALK_INFO       *Info = Context;
618167802Sjkim    const ACPI_OPCODE_INFO  *OpInfo;
619167802Sjkim    ACPI_WALK_STATE         *WalkState;
620167802Sjkim    ACPI_OBJECT_TYPE        ObjectType;
621167802Sjkim    ACPI_STATUS             Status;
622167802Sjkim    char                    *Path = NULL;
623167802Sjkim    ACPI_PARSE_OBJECT       *NextOp;
624167802Sjkim    ACPI_NAMESPACE_NODE     *Node;
625193529Sjkim    char                    FieldPath[5];
626193529Sjkim    BOOLEAN                 PreDefined = FALSE;
627193529Sjkim    UINT8                   PreDefineIndex = 0;
628167802Sjkim
629167802Sjkim
630167802Sjkim    WalkState = Info->WalkState;
631167802Sjkim    OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
632167802Sjkim    ObjectType = OpInfo->ObjectType;
633167802Sjkim    ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
634167802Sjkim
635167802Sjkim    /* Only interested in operators that create new names */
636167802Sjkim
637167802Sjkim    if (!(OpInfo->Flags & AML_NAMED) &&
638167802Sjkim        !(OpInfo->Flags & AML_CREATE))
639167802Sjkim    {
640167802Sjkim        goto Exit;
641167802Sjkim    }
642167802Sjkim
643167802Sjkim    /* Get the NamePath from the appropriate place */
644167802Sjkim
645167802Sjkim    if (OpInfo->Flags & AML_NAMED)
646167802Sjkim    {
647167802Sjkim        /* For all named operators, get the new name */
648167802Sjkim
649167802Sjkim        Path = (char *) Op->Named.Path;
650193529Sjkim
651193529Sjkim        if (!Path && Op->Common.AmlOpcode == AML_INT_NAMEDFIELD_OP)
652193529Sjkim        {
653193529Sjkim            *ACPI_CAST_PTR (UINT32, &FieldPath[0]) = Op->Named.Name;
654193529Sjkim            FieldPath[4] = 0;
655193529Sjkim            Path = FieldPath;
656193529Sjkim        }
657167802Sjkim    }
658167802Sjkim    else if (OpInfo->Flags & AML_CREATE)
659167802Sjkim    {
660167802Sjkim        /* New name is the last child */
661167802Sjkim
662167802Sjkim        NextOp = Op->Common.Value.Arg;
663167802Sjkim
664167802Sjkim        while (NextOp->Common.Next)
665167802Sjkim        {
666167802Sjkim            NextOp = NextOp->Common.Next;
667167802Sjkim        }
668306536Sjkim
669167802Sjkim        Path = NextOp->Common.Value.String;
670167802Sjkim    }
671167802Sjkim
672167802Sjkim    if (!Path)
673167802Sjkim    {
674167802Sjkim        goto Exit;
675167802Sjkim    }
676167802Sjkim
677167802Sjkim    /* Insert the name into the namespace */
678167802Sjkim
679167802Sjkim    Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType,
680306536Sjkim        ACPI_IMODE_LOAD_PASS2, ACPI_NS_DONT_OPEN_SCOPE,
681306536Sjkim        WalkState, &Node);
682167802Sjkim
683167802Sjkim    Op->Common.Node = Node;
684167802Sjkim
685193529Sjkim    if (ACPI_SUCCESS (Status))
686193529Sjkim    {
687193529Sjkim        /* Check if it's a predefined node */
688167802Sjkim
689193529Sjkim        while (AcpiGbl_PreDefinedNames[PreDefineIndex].Name)
690193529Sjkim        {
691241973Sjkim            if (ACPI_COMPARE_NAME (Node->Name.Ascii,
692241973Sjkim                AcpiGbl_PreDefinedNames[PreDefineIndex].Name))
693193529Sjkim            {
694193529Sjkim                PreDefined = TRUE;
695193529Sjkim                break;
696193529Sjkim            }
697193529Sjkim
698193529Sjkim            PreDefineIndex++;
699193529Sjkim        }
700193529Sjkim
701193529Sjkim        /*
702193529Sjkim         * Set node owner id if it satisfies all the following conditions:
703193529Sjkim         * 1) Not a predefined node, _SB_ etc
704193529Sjkim         * 2) Not the root node
705193529Sjkim         * 3) Not a node created by Scope
706193529Sjkim         */
707193529Sjkim
708193529Sjkim        if (!PreDefined && Node != AcpiGbl_RootNode &&
709193529Sjkim            Op->Common.AmlOpcode != AML_SCOPE_OP)
710193529Sjkim        {
711193529Sjkim            Node->OwnerId = WalkState->OwnerId;
712193529Sjkim        }
713193529Sjkim    }
714193529Sjkim
715193529Sjkim
716167802SjkimExit:
717167802Sjkim
718167802Sjkim    if (AcpiNsOpensScope (ObjectType))
719167802Sjkim    {
720167802Sjkim        if (Op->Common.Node)
721167802Sjkim        {
722306536Sjkim            Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType,
723306536Sjkim                WalkState);
724167802Sjkim            if (ACPI_FAILURE (Status))
725167802Sjkim            {
726167802Sjkim                return (Status);
727167802Sjkim            }
728167802Sjkim        }
729167802Sjkim    }
730167802Sjkim
731167802Sjkim    return (AE_OK);
732167802Sjkim}
733167802Sjkim
734167802Sjkim
735167802Sjkim/*******************************************************************************
736167802Sjkim *
737167802Sjkim * FUNCTION:    AcpiDmXrefDescendingOp
738167802Sjkim *
739167802Sjkim * PARAMETERS:  ASL_WALK_CALLBACK
740167802Sjkim *
741167802Sjkim * RETURN:      Status
742167802Sjkim *
743167802Sjkim * DESCRIPTION: Descending handler for namespace cross reference
744167802Sjkim *
745167802Sjkim ******************************************************************************/
746167802Sjkim
747167802Sjkimstatic ACPI_STATUS
748167802SjkimAcpiDmXrefDescendingOp (
749167802Sjkim    ACPI_PARSE_OBJECT       *Op,
750167802Sjkim    UINT32                  Level,
751167802Sjkim    void                    *Context)
752167802Sjkim{
753167802Sjkim    ACPI_OP_WALK_INFO       *Info = Context;
754167802Sjkim    const ACPI_OPCODE_INFO  *OpInfo;
755167802Sjkim    ACPI_WALK_STATE         *WalkState;
756167802Sjkim    ACPI_OBJECT_TYPE        ObjectType;
757193529Sjkim    ACPI_OBJECT_TYPE        ObjectType2;
758167802Sjkim    ACPI_STATUS             Status;
759167802Sjkim    char                    *Path = NULL;
760167802Sjkim    ACPI_PARSE_OBJECT       *NextOp;
761167802Sjkim    ACPI_NAMESPACE_NODE     *Node;
762193529Sjkim    ACPI_OPERAND_OBJECT     *Object;
763212761Sjkim    UINT32                  ParamCount = 0;
764281075Sdim    char                    *Pathname;
765306536Sjkim    UINT16                  Flags = 0;
766167802Sjkim
767167802Sjkim
768167802Sjkim    WalkState = Info->WalkState;
769167802Sjkim    OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
770167802Sjkim    ObjectType = OpInfo->ObjectType;
771167802Sjkim    ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
772167802Sjkim
773167802Sjkim    if ((!(OpInfo->Flags & AML_NAMED)) &&
774167802Sjkim        (!(OpInfo->Flags & AML_CREATE)) &&
775281075Sdim        (Op->Common.AmlOpcode != AML_INT_NAMEPATH_OP) &&
776281075Sdim        (Op->Common.AmlOpcode != AML_NOTIFY_OP))
777167802Sjkim    {
778167802Sjkim        goto Exit;
779167802Sjkim    }
780306536Sjkim    else if (Op->Common.Parent &&
781306536Sjkim             Op->Common.Parent->Common.AmlOpcode == AML_EXTERNAL_OP)
782306536Sjkim    {
783306536Sjkim        /* External() NamePath */
784167802Sjkim
785306536Sjkim        Path = Op->Common.Value.String;
786306536Sjkim        ObjectType = (ACPI_OBJECT_TYPE) Op->Common.Next->Common.Value.Integer;
787306536Sjkim        if (ObjectType == ACPI_TYPE_METHOD)
788306536Sjkim        {
789306536Sjkim            ParamCount = (UINT32)
790306536Sjkim                Op->Common.Next->Common.Next->Common.Value.Integer;
791306536Sjkim        }
792281075Sdim
793306536Sjkim        Flags |= ACPI_EXT_RESOLVED_REFERENCE | ACPI_EXT_ORIGIN_FROM_OPCODE;
794306536Sjkim        AcpiDmAddOpToExternalList (Op, Path,
795306536Sjkim            (UINT8) ObjectType, ParamCount, Flags);
796306536Sjkim
797306536Sjkim        goto Exit;
798306536Sjkim    }
799306536Sjkim
800167802Sjkim    /* Get the NamePath from the appropriate place */
801167802Sjkim
802167802Sjkim    if (OpInfo->Flags & AML_NAMED)
803167802Sjkim    {
804235945Sjkim        /*
805235945Sjkim         * Only these two operators (Alias, Scope) refer to an existing
806235945Sjkim         * name, it is the first argument
807235945Sjkim         */
808235945Sjkim        if (Op->Common.AmlOpcode == AML_ALIAS_OP)
809167802Sjkim        {
810235945Sjkim            ObjectType = ACPI_TYPE_ANY;
811235945Sjkim
812235945Sjkim            NextOp = Op->Common.Value.Arg;
813235945Sjkim            NextOp = NextOp->Common.Value.Arg;
814235945Sjkim            if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP)
815235945Sjkim            {
816235945Sjkim                Path = NextOp->Common.Value.String;
817235945Sjkim            }
818235945Sjkim        }
819235945Sjkim        else if (Op->Common.AmlOpcode == AML_SCOPE_OP)
820235945Sjkim        {
821167802Sjkim            Path = (char *) Op->Named.Path;
822167802Sjkim        }
823167802Sjkim    }
824167802Sjkim    else if (OpInfo->Flags & AML_CREATE)
825167802Sjkim    {
826167802Sjkim        /* Referenced Buffer Name is the first child */
827167802Sjkim
828235945Sjkim        ObjectType = ACPI_TYPE_BUFFER; /* Change from TYPE_BUFFER_FIELD */
829235945Sjkim
830167802Sjkim        NextOp = Op->Common.Value.Arg;
831167802Sjkim        if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP)
832167802Sjkim        {
833167802Sjkim            Path = NextOp->Common.Value.String;
834167802Sjkim        }
835167802Sjkim    }
836281075Sdim    else if (Op->Common.AmlOpcode == AML_NOTIFY_OP)
837281075Sdim    {
838281075Sdim        Path = Op->Common.Value.Arg->Asl.Value.String;
839281075Sdim    }
840167802Sjkim    else
841167802Sjkim    {
842167802Sjkim        Path = Op->Common.Value.String;
843167802Sjkim    }
844167802Sjkim
845167802Sjkim    if (!Path)
846167802Sjkim    {
847167802Sjkim        goto Exit;
848167802Sjkim    }
849167802Sjkim
850167802Sjkim    /*
851241973Sjkim     * Lookup the name in the namespace. Name must exist at this point, or it
852167802Sjkim     * is an invalid reference.
853167802Sjkim     *
854167802Sjkim     * The namespace is also used as a lookup table for references to resource
855167802Sjkim     * descriptors and the fields within them.
856167802Sjkim     */
857281075Sdim    Node = NULL;
858167802Sjkim    Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY,
859306536Sjkim        ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
860306536Sjkim        WalkState, &Node);
861306536Sjkim
862235945Sjkim    if (ACPI_SUCCESS (Status) && (Node->Flags & ANOBJ_IS_EXTERNAL))
863235945Sjkim    {
864281075Sdim        /* Node was created by an External() statement */
865281075Sdim
866235945Sjkim        Status = AE_NOT_FOUND;
867235945Sjkim    }
868235945Sjkim
869167802Sjkim    if (ACPI_FAILURE (Status))
870167802Sjkim    {
871167802Sjkim        if (Status == AE_NOT_FOUND)
872167802Sjkim        {
873167802Sjkim            /*
874281075Sdim             * Add this symbol as an external declaration, except if the
875281075Sdim             * parent is a CondRefOf operator. For this operator, we do not
876281075Sdim             * need an external, nor do we want one, since this can cause
877281075Sdim             * disassembly problems if the symbol is actually a control
878281075Sdim             * method.
879167802Sjkim             */
880281075Sdim            if (!(Op->Asl.Parent &&
881281075Sdim                (Op->Asl.Parent->Asl.AmlOpcode == AML_COND_REF_OF_OP)))
882281075Sdim            {
883281075Sdim                if (Node)
884281075Sdim                {
885281075Sdim                    AcpiDmAddNodeToExternalList (Node,
886306536Sjkim                        (UINT8) ObjectType, 7, Flags);
887281075Sdim                }
888281075Sdim                else
889281075Sdim                {
890281075Sdim                    AcpiDmAddOpToExternalList (Op, Path,
891306536Sjkim                        (UINT8) ObjectType, 7, Flags);
892281075Sdim                }
893281075Sdim            }
894167802Sjkim        }
895167802Sjkim    }
896193529Sjkim
897193529Sjkim    /*
898281075Sdim     * Found the node, but check if it came from an external table.
899281075Sdim     * Add it to external list. Note: Node->OwnerId == 0 indicates
900281075Sdim     * one of the built-in ACPI Names (_OS_ etc.) which can safely
901281075Sdim     * be ignored.
902193529Sjkim     */
903281075Sdim    else if (Node->OwnerId &&
904281075Sdim            (WalkState->OwnerId != Node->OwnerId))
905193529Sjkim    {
906193529Sjkim        ObjectType2 = ObjectType;
907193529Sjkim
908193529Sjkim        Object = AcpiNsGetAttachedObject (Node);
909193529Sjkim        if (Object)
910193529Sjkim        {
911193529Sjkim            ObjectType2 = Object->Common.Type;
912212761Sjkim            if (ObjectType2 == ACPI_TYPE_METHOD)
913212761Sjkim            {
914212761Sjkim                ParamCount = Object->Method.ParamCount;
915212761Sjkim            }
916193529Sjkim        }
917193529Sjkim
918281075Sdim        Pathname = AcpiNsGetExternalPathname (Node);
919281075Sdim        if (!Pathname)
920281075Sdim        {
921281075Sdim            return (AE_NO_MEMORY);
922281075Sdim        }
923281075Sdim
924281075Sdim        AcpiDmAddNodeToExternalList (Node, (UINT8) ObjectType2,
925281075Sdim            ParamCount, ACPI_EXT_RESOLVED_REFERENCE);
926281075Sdim
927281075Sdim        ACPI_FREE (Pathname);
928193529Sjkim        Op->Common.Node = Node;
929193529Sjkim    }
930167802Sjkim    else
931167802Sjkim    {
932167802Sjkim        Op->Common.Node = Node;
933167802Sjkim    }
934167802Sjkim
935167802Sjkim
936167802SjkimExit:
937167802Sjkim    /* Open new scope if necessary */
938167802Sjkim
939167802Sjkim    if (AcpiNsOpensScope (ObjectType))
940167802Sjkim    {
941167802Sjkim        if (Op->Common.Node)
942167802Sjkim        {
943306536Sjkim            Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType,
944306536Sjkim                WalkState);
945167802Sjkim            if (ACPI_FAILURE (Status))
946167802Sjkim            {
947167802Sjkim                return (Status);
948167802Sjkim            }
949167802Sjkim        }
950167802Sjkim    }
951167802Sjkim
952167802Sjkim    return (AE_OK);
953167802Sjkim}
954167802Sjkim
955167802Sjkim
956167802Sjkim/*******************************************************************************
957167802Sjkim *
958167802Sjkim * FUNCTION:    AcpiDmResourceDescendingOp
959167802Sjkim *
960167802Sjkim * PARAMETERS:  ASL_WALK_CALLBACK
961167802Sjkim *
962167802Sjkim * RETURN:      None
963167802Sjkim *
964167802Sjkim * DESCRIPTION: Process one parse op during symbolic resource index conversion.
965167802Sjkim *
966167802Sjkim ******************************************************************************/
967167802Sjkim
968167802Sjkimstatic ACPI_STATUS
969167802SjkimAcpiDmResourceDescendingOp (
970167802Sjkim    ACPI_PARSE_OBJECT       *Op,
971167802Sjkim    UINT32                  Level,
972167802Sjkim    void                    *Context)
973167802Sjkim{
974167802Sjkim    ACPI_OP_WALK_INFO       *Info = Context;
975167802Sjkim    const ACPI_OPCODE_INFO  *OpInfo;
976167802Sjkim    ACPI_WALK_STATE         *WalkState;
977167802Sjkim    ACPI_OBJECT_TYPE        ObjectType;
978167802Sjkim    ACPI_STATUS             Status;
979167802Sjkim
980167802Sjkim
981167802Sjkim    WalkState = Info->WalkState;
982167802Sjkim    OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
983167802Sjkim
984167802Sjkim    /* Open new scope if necessary */
985167802Sjkim
986167802Sjkim    ObjectType = OpInfo->ObjectType;
987167802Sjkim    if (AcpiNsOpensScope (ObjectType))
988167802Sjkim    {
989167802Sjkim        if (Op->Common.Node)
990167802Sjkim        {
991167802Sjkim
992306536Sjkim            Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType,
993306536Sjkim                WalkState);
994167802Sjkim            if (ACPI_FAILURE (Status))
995167802Sjkim            {
996167802Sjkim                return (Status);
997167802Sjkim            }
998167802Sjkim        }
999167802Sjkim    }
1000167802Sjkim
1001167802Sjkim    /*
1002167802Sjkim     * Check if this operator contains a reference to a resource descriptor.
1003167802Sjkim     * If so, convert the reference into a symbolic reference.
1004167802Sjkim     */
1005167802Sjkim    AcpiDmCheckResourceReference (Op, WalkState);
1006167802Sjkim    return (AE_OK);
1007167802Sjkim}
1008167802Sjkim
1009167802Sjkim
1010167802Sjkim/*******************************************************************************
1011167802Sjkim *
1012167802Sjkim * FUNCTION:    AcpiDmCommonAscendingOp
1013167802Sjkim *
1014167802Sjkim * PARAMETERS:  ASL_WALK_CALLBACK
1015167802Sjkim *
1016167802Sjkim * RETURN:      None
1017167802Sjkim *
1018167802Sjkim * DESCRIPTION: Ascending handler for combined parse/namespace walks. Closes
1019167802Sjkim *              scope if necessary.
1020167802Sjkim *
1021167802Sjkim ******************************************************************************/
1022167802Sjkim
1023167802Sjkimstatic ACPI_STATUS
1024167802SjkimAcpiDmCommonAscendingOp (
1025167802Sjkim    ACPI_PARSE_OBJECT       *Op,
1026167802Sjkim    UINT32                  Level,
1027167802Sjkim    void                    *Context)
1028167802Sjkim{
1029167802Sjkim    ACPI_OP_WALK_INFO       *Info = Context;
1030167802Sjkim    const ACPI_OPCODE_INFO  *OpInfo;
1031167802Sjkim    ACPI_OBJECT_TYPE        ObjectType;
1032167802Sjkim
1033167802Sjkim
1034167802Sjkim    /* Close scope if necessary */
1035167802Sjkim
1036167802Sjkim    OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
1037167802Sjkim    ObjectType = OpInfo->ObjectType;
1038167802Sjkim    ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
1039167802Sjkim
1040167802Sjkim    if (AcpiNsOpensScope (ObjectType))
1041167802Sjkim    {
1042167802Sjkim        (void) AcpiDsScopeStackPop (Info->WalkState);
1043167802Sjkim    }
1044167802Sjkim
1045167802Sjkim    return (AE_OK);
1046167802Sjkim}
1047167802Sjkim
1048167802Sjkim
1049167802Sjkim/*******************************************************************************
1050167802Sjkim *
1051167802Sjkim * FUNCTION:    AcpiDmInspectPossibleArgs
1052167802Sjkim *
1053167802Sjkim * PARAMETERS:  CurrentOpArgCount   - Which arg of the current op was the
1054167802Sjkim *                                    possible method invocation found
1055167802Sjkim *              TargetCount         - Number of targets (0,1,2) for this op
1056167802Sjkim *              Op                  - Parse op
1057167802Sjkim *
1058167802Sjkim * RETURN:      Status
1059167802Sjkim *
1060167802Sjkim * DESCRIPTION: Examine following args and next ops for possible arguments
1061167802Sjkim *              for an unrecognized method invocation.
1062167802Sjkim *
1063167802Sjkim ******************************************************************************/
1064167802Sjkim
1065167802Sjkimstatic UINT32
1066167802SjkimAcpiDmInspectPossibleArgs (
1067167802Sjkim    UINT32                  CurrentOpArgCount,
1068167802Sjkim    UINT32                  TargetCount,
1069167802Sjkim    ACPI_PARSE_OBJECT       *Op)
1070167802Sjkim{
1071167802Sjkim    const ACPI_OPCODE_INFO  *OpInfo;
1072167802Sjkim    UINT32                  i;
1073306536Sjkim    UINT32                  ArgumentCount = 0;
1074306536Sjkim    ACPI_PARSE_OBJECT       *NextOp;
1075306536Sjkim    ACPI_PARSE_OBJECT       *ExecuteOp;
1076167802Sjkim
1077167802Sjkim
1078306536Sjkim    if (!Op)
1079306536Sjkim    {
1080306536Sjkim        return (0);
1081306536Sjkim    }
1082167802Sjkim
1083167802Sjkim    /* Lookahead for the maximum number of possible arguments */
1084167802Sjkim
1085306536Sjkim    NextOp = Op->Common.Next;
1086306536Sjkim
1087306536Sjkim    for (i = 0; (i < ACPI_METHOD_NUM_ARGS) && NextOp; i++)
1088167802Sjkim    {
1089306536Sjkim        OpInfo = AcpiPsGetOpcodeInfo (NextOp->Common.AmlOpcode);
1090167802Sjkim
1091306536Sjkim        /* Any one of these operators is "very probably" not a method arg */
1092167802Sjkim
1093306536Sjkim        if ((NextOp->Common.AmlOpcode == AML_STORE_OP) ||
1094306536Sjkim            (NextOp->Common.AmlOpcode == AML_NOTIFY_OP) ||
1095306536Sjkim            (OpInfo->Class == AML_CLASS_CONTROL) ||
1096306536Sjkim            (OpInfo->Class == AML_CLASS_CREATE) ||
1097306536Sjkim            (OpInfo->Class == AML_CLASS_NAMED_OBJECT))
1098167802Sjkim        {
1099167802Sjkim            break;
1100167802Sjkim        }
1101167802Sjkim
1102306536Sjkim        if (OpInfo->Class == AML_CLASS_EXECUTE)
1103167802Sjkim        {
1104306536Sjkim            /* Probable that this is method arg if there is no target */
1105306536Sjkim
1106306536Sjkim            ExecuteOp = NextOp->Common.Value.Arg;
1107306536Sjkim            while (ExecuteOp)
1108306536Sjkim            {
1109306536Sjkim                if ((ExecuteOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
1110306536Sjkim                    (ExecuteOp->Common.Value.Arg == NULL))
1111306536Sjkim                {
1112306536Sjkim                    /* No target, could be a method arg */
1113306536Sjkim
1114306536Sjkim                    break;
1115306536Sjkim                }
1116306536Sjkim
1117306536Sjkim                if (NextOp->Common.AmlOpcode == AML_REF_OF_OP)
1118306536Sjkim                {
1119306536Sjkim                    break;
1120306536Sjkim                }
1121306536Sjkim
1122306536Sjkim                ExecuteOp = ExecuteOp->Common.Next;
1123306536Sjkim            }
1124306536Sjkim
1125306536Sjkim            if (!ExecuteOp)
1126306536Sjkim            {
1127306536Sjkim                /* Has a target, not method arg */
1128306536Sjkim
1129306536Sjkim                return (ArgumentCount);
1130306536Sjkim            }
1131167802Sjkim        }
1132167802Sjkim
1133306536Sjkim        ArgumentCount++;
1134306536Sjkim        NextOp = NextOp->Common.Next;
1135167802Sjkim    }
1136167802Sjkim
1137306536Sjkim    return (ArgumentCount);
1138167802Sjkim}
1139