xref: /freebsd/sys/contrib/dev/acpica/components/debugger/dbtest.c (revision 313a0c13efa638cf248e35eed49f36ec0a1a7f26)
1*313a0c13SJung-uk Kim /*******************************************************************************
2*313a0c13SJung-uk Kim  *
3*313a0c13SJung-uk Kim  * Module Name: dbtest - Various debug-related tests
4*313a0c13SJung-uk Kim  *
5*313a0c13SJung-uk Kim  ******************************************************************************/
6*313a0c13SJung-uk Kim 
7*313a0c13SJung-uk Kim /*
8*313a0c13SJung-uk Kim  * Copyright (C) 2000 - 2014, Intel Corp.
9*313a0c13SJung-uk Kim  * All rights reserved.
10*313a0c13SJung-uk Kim  *
11*313a0c13SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
12*313a0c13SJung-uk Kim  * modification, are permitted provided that the following conditions
13*313a0c13SJung-uk Kim  * are met:
14*313a0c13SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
15*313a0c13SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
16*313a0c13SJung-uk Kim  *    without modification.
17*313a0c13SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18*313a0c13SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
19*313a0c13SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
20*313a0c13SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
21*313a0c13SJung-uk Kim  *    binary redistribution.
22*313a0c13SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
23*313a0c13SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
24*313a0c13SJung-uk Kim  *    from this software without specific prior written permission.
25*313a0c13SJung-uk Kim  *
26*313a0c13SJung-uk Kim  * Alternatively, this software may be distributed under the terms of the
27*313a0c13SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
28*313a0c13SJung-uk Kim  * Software Foundation.
29*313a0c13SJung-uk Kim  *
30*313a0c13SJung-uk Kim  * NO WARRANTY
31*313a0c13SJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32*313a0c13SJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33*313a0c13SJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34*313a0c13SJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35*313a0c13SJung-uk Kim  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36*313a0c13SJung-uk Kim  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37*313a0c13SJung-uk Kim  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38*313a0c13SJung-uk Kim  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39*313a0c13SJung-uk Kim  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40*313a0c13SJung-uk Kim  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41*313a0c13SJung-uk Kim  * POSSIBILITY OF SUCH DAMAGES.
42*313a0c13SJung-uk Kim  */
43*313a0c13SJung-uk Kim 
44*313a0c13SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h>
45*313a0c13SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h>
46*313a0c13SJung-uk Kim #include <contrib/dev/acpica/include/acdebug.h>
47*313a0c13SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h>
48*313a0c13SJung-uk Kim #include <contrib/dev/acpica/include/acpredef.h>
49*313a0c13SJung-uk Kim 
50*313a0c13SJung-uk Kim #ifdef ACPI_DEBUGGER
51*313a0c13SJung-uk Kim 
52*313a0c13SJung-uk Kim #define _COMPONENT          ACPI_CA_DEBUGGER
53*313a0c13SJung-uk Kim         ACPI_MODULE_NAME    ("dbtest")
54*313a0c13SJung-uk Kim 
55*313a0c13SJung-uk Kim 
56*313a0c13SJung-uk Kim /* Local prototypes */
57*313a0c13SJung-uk Kim 
58*313a0c13SJung-uk Kim static void
59*313a0c13SJung-uk Kim AcpiDbTestAllObjects (
60*313a0c13SJung-uk Kim     void);
61*313a0c13SJung-uk Kim 
62*313a0c13SJung-uk Kim static ACPI_STATUS
63*313a0c13SJung-uk Kim AcpiDbTestOneObject (
64*313a0c13SJung-uk Kim     ACPI_HANDLE             ObjHandle,
65*313a0c13SJung-uk Kim     UINT32                  NestingLevel,
66*313a0c13SJung-uk Kim     void                    *Context,
67*313a0c13SJung-uk Kim     void                    **ReturnValue);
68*313a0c13SJung-uk Kim 
69*313a0c13SJung-uk Kim static ACPI_STATUS
70*313a0c13SJung-uk Kim AcpiDbTestIntegerType (
71*313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node,
72*313a0c13SJung-uk Kim     UINT32                  BitLength);
73*313a0c13SJung-uk Kim 
74*313a0c13SJung-uk Kim static ACPI_STATUS
75*313a0c13SJung-uk Kim AcpiDbTestBufferType (
76*313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node,
77*313a0c13SJung-uk Kim     UINT32                  BitLength);
78*313a0c13SJung-uk Kim 
79*313a0c13SJung-uk Kim static ACPI_STATUS
80*313a0c13SJung-uk Kim AcpiDbTestStringType (
81*313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node,
82*313a0c13SJung-uk Kim     UINT32                  ByteLength);
83*313a0c13SJung-uk Kim 
84*313a0c13SJung-uk Kim static ACPI_STATUS
85*313a0c13SJung-uk Kim AcpiDbReadFromObject (
86*313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node,
87*313a0c13SJung-uk Kim     ACPI_OBJECT_TYPE        ExpectedType,
88*313a0c13SJung-uk Kim     ACPI_OBJECT             **Value);
89*313a0c13SJung-uk Kim 
90*313a0c13SJung-uk Kim static ACPI_STATUS
91*313a0c13SJung-uk Kim AcpiDbWriteToObject (
92*313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node,
93*313a0c13SJung-uk Kim     ACPI_OBJECT             *Value);
94*313a0c13SJung-uk Kim 
95*313a0c13SJung-uk Kim static void
96*313a0c13SJung-uk Kim AcpiDbEvaluateAllPredefinedNames (
97*313a0c13SJung-uk Kim     char                    *CountArg);
98*313a0c13SJung-uk Kim 
99*313a0c13SJung-uk Kim static ACPI_STATUS
100*313a0c13SJung-uk Kim AcpiDbEvaluateOnePredefinedName (
101*313a0c13SJung-uk Kim     ACPI_HANDLE             ObjHandle,
102*313a0c13SJung-uk Kim     UINT32                  NestingLevel,
103*313a0c13SJung-uk Kim     void                    *Context,
104*313a0c13SJung-uk Kim     void                    **ReturnValue);
105*313a0c13SJung-uk Kim 
106*313a0c13SJung-uk Kim /*
107*313a0c13SJung-uk Kim  * Test subcommands
108*313a0c13SJung-uk Kim  */
109*313a0c13SJung-uk Kim static ACPI_DB_ARGUMENT_INFO    AcpiDbTestTypes [] =
110*313a0c13SJung-uk Kim {
111*313a0c13SJung-uk Kim     {"OBJECTS"},
112*313a0c13SJung-uk Kim     {"PREDEFINED"},
113*313a0c13SJung-uk Kim     {NULL}           /* Must be null terminated */
114*313a0c13SJung-uk Kim };
115*313a0c13SJung-uk Kim 
116*313a0c13SJung-uk Kim #define CMD_TEST_OBJECTS        0
117*313a0c13SJung-uk Kim #define CMD_TEST_PREDEFINED     1
118*313a0c13SJung-uk Kim 
119*313a0c13SJung-uk Kim #define BUFFER_FILL_VALUE       0xFF
120*313a0c13SJung-uk Kim 
121*313a0c13SJung-uk Kim /*
122*313a0c13SJung-uk Kim  * Support for the special debugger read/write control methods.
123*313a0c13SJung-uk Kim  * These methods are installed into the current namespace and are
124*313a0c13SJung-uk Kim  * used to read and write the various namespace objects. The point
125*313a0c13SJung-uk Kim  * is to force the AML interpreter do all of the work.
126*313a0c13SJung-uk Kim  */
127*313a0c13SJung-uk Kim #define                     ACPI_DB_READ_METHOD     "\\_T98"
128*313a0c13SJung-uk Kim #define                     ACPI_DB_WRITE_METHOD    "\\_T99"
129*313a0c13SJung-uk Kim 
130*313a0c13SJung-uk Kim static ACPI_HANDLE          ReadHandle = NULL;
131*313a0c13SJung-uk Kim static ACPI_HANDLE          WriteHandle = NULL;
132*313a0c13SJung-uk Kim 
133*313a0c13SJung-uk Kim /* ASL Definitions of the debugger read/write control methods */
134*313a0c13SJung-uk Kim 
135*313a0c13SJung-uk Kim #if 0
136*313a0c13SJung-uk Kim DefinitionBlock ("ssdt.aml", "SSDT", 2, "Intel", "DEBUG", 0x00000001)
137*313a0c13SJung-uk Kim {
138*313a0c13SJung-uk Kim     Method (_T98, 1, NotSerialized)     /* Read */
139*313a0c13SJung-uk Kim     {
140*313a0c13SJung-uk Kim         Return (DeRefOf (Arg0))
141*313a0c13SJung-uk Kim     }
142*313a0c13SJung-uk Kim }
143*313a0c13SJung-uk Kim DefinitionBlock ("ssdt2.aml", "SSDT", 2, "Intel", "DEBUG", 0x00000001)
144*313a0c13SJung-uk Kim {
145*313a0c13SJung-uk Kim     Method (_T99, 2, NotSerialized)     /* Write */
146*313a0c13SJung-uk Kim     {
147*313a0c13SJung-uk Kim         Store (Arg1, Arg0)
148*313a0c13SJung-uk Kim     }
149*313a0c13SJung-uk Kim }
150*313a0c13SJung-uk Kim #endif
151*313a0c13SJung-uk Kim 
152*313a0c13SJung-uk Kim static unsigned char ReadMethodCode[] =
153*313a0c13SJung-uk Kim {
154*313a0c13SJung-uk Kim     0x53,0x53,0x44,0x54,0x2E,0x00,0x00,0x00,  /* 00000000    "SSDT...." */
155*313a0c13SJung-uk Kim     0x02,0xC9,0x49,0x6E,0x74,0x65,0x6C,0x00,  /* 00000008    "..Intel." */
156*313a0c13SJung-uk Kim     0x44,0x45,0x42,0x55,0x47,0x00,0x00,0x00,  /* 00000010    "DEBUG..." */
157*313a0c13SJung-uk Kim     0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
158*313a0c13SJung-uk Kim     0x18,0x12,0x13,0x20,0x14,0x09,0x5F,0x54,  /* 00000020    "... .._T" */
159*313a0c13SJung-uk Kim     0x39,0x38,0x01,0xA4,0x83,0x68             /* 00000028    "98...h"   */
160*313a0c13SJung-uk Kim };
161*313a0c13SJung-uk Kim 
162*313a0c13SJung-uk Kim static unsigned char WriteMethodCode[] =
163*313a0c13SJung-uk Kim {
164*313a0c13SJung-uk Kim     0x53,0x53,0x44,0x54,0x2E,0x00,0x00,0x00,  /* 00000000    "SSDT...." */
165*313a0c13SJung-uk Kim     0x02,0x15,0x49,0x6E,0x74,0x65,0x6C,0x00,  /* 00000008    "..Intel." */
166*313a0c13SJung-uk Kim     0x44,0x45,0x42,0x55,0x47,0x00,0x00,0x00,  /* 00000010    "DEBUG..." */
167*313a0c13SJung-uk Kim     0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
168*313a0c13SJung-uk Kim     0x18,0x12,0x13,0x20,0x14,0x09,0x5F,0x54,  /* 00000020    "... .._T" */
169*313a0c13SJung-uk Kim     0x39,0x39,0x02,0x70,0x69,0x68             /* 00000028    "99.pih"   */
170*313a0c13SJung-uk Kim };
171*313a0c13SJung-uk Kim 
172*313a0c13SJung-uk Kim 
173*313a0c13SJung-uk Kim /*******************************************************************************
174*313a0c13SJung-uk Kim  *
175*313a0c13SJung-uk Kim  * FUNCTION:    AcpiDbExecuteTest
176*313a0c13SJung-uk Kim  *
177*313a0c13SJung-uk Kim  * PARAMETERS:  TypeArg         - Subcommand
178*313a0c13SJung-uk Kim  *
179*313a0c13SJung-uk Kim  * RETURN:      None
180*313a0c13SJung-uk Kim  *
181*313a0c13SJung-uk Kim  * DESCRIPTION: Execute various debug tests.
182*313a0c13SJung-uk Kim  *
183*313a0c13SJung-uk Kim  * Note: Code is prepared for future expansion of the TEST command.
184*313a0c13SJung-uk Kim  *
185*313a0c13SJung-uk Kim  ******************************************************************************/
186*313a0c13SJung-uk Kim 
187*313a0c13SJung-uk Kim void
188*313a0c13SJung-uk Kim AcpiDbExecuteTest (
189*313a0c13SJung-uk Kim     char                    *TypeArg)
190*313a0c13SJung-uk Kim {
191*313a0c13SJung-uk Kim     UINT32                  Temp;
192*313a0c13SJung-uk Kim 
193*313a0c13SJung-uk Kim 
194*313a0c13SJung-uk Kim     AcpiUtStrupr (TypeArg);
195*313a0c13SJung-uk Kim     Temp = AcpiDbMatchArgument (TypeArg, AcpiDbTestTypes);
196*313a0c13SJung-uk Kim     if (Temp == ACPI_TYPE_NOT_FOUND)
197*313a0c13SJung-uk Kim     {
198*313a0c13SJung-uk Kim         AcpiOsPrintf ("Invalid or unsupported argument\n");
199*313a0c13SJung-uk Kim         return;
200*313a0c13SJung-uk Kim     }
201*313a0c13SJung-uk Kim 
202*313a0c13SJung-uk Kim     switch (Temp)
203*313a0c13SJung-uk Kim     {
204*313a0c13SJung-uk Kim     case CMD_TEST_OBJECTS:
205*313a0c13SJung-uk Kim 
206*313a0c13SJung-uk Kim         AcpiDbTestAllObjects ();
207*313a0c13SJung-uk Kim         break;
208*313a0c13SJung-uk Kim 
209*313a0c13SJung-uk Kim     case CMD_TEST_PREDEFINED:
210*313a0c13SJung-uk Kim 
211*313a0c13SJung-uk Kim         AcpiDbEvaluateAllPredefinedNames (NULL);
212*313a0c13SJung-uk Kim         break;
213*313a0c13SJung-uk Kim 
214*313a0c13SJung-uk Kim     default:
215*313a0c13SJung-uk Kim         break;
216*313a0c13SJung-uk Kim     }
217*313a0c13SJung-uk Kim }
218*313a0c13SJung-uk Kim 
219*313a0c13SJung-uk Kim 
220*313a0c13SJung-uk Kim /*******************************************************************************
221*313a0c13SJung-uk Kim  *
222*313a0c13SJung-uk Kim  * FUNCTION:    AcpiDbTestAllObjects
223*313a0c13SJung-uk Kim  *
224*313a0c13SJung-uk Kim  * PARAMETERS:  None
225*313a0c13SJung-uk Kim  *
226*313a0c13SJung-uk Kim  * RETURN:      None
227*313a0c13SJung-uk Kim  *
228*313a0c13SJung-uk Kim  * DESCRIPTION: This test implements the OBJECTS subcommand. It exercises the
229*313a0c13SJung-uk Kim  *              namespace by reading/writing/comparing all data objects such
230*313a0c13SJung-uk Kim  *              as integers, strings, buffers, fields, buffer fields, etc.
231*313a0c13SJung-uk Kim  *
232*313a0c13SJung-uk Kim  ******************************************************************************/
233*313a0c13SJung-uk Kim 
234*313a0c13SJung-uk Kim static void
235*313a0c13SJung-uk Kim AcpiDbTestAllObjects (
236*313a0c13SJung-uk Kim     void)
237*313a0c13SJung-uk Kim {
238*313a0c13SJung-uk Kim     ACPI_STATUS             Status;
239*313a0c13SJung-uk Kim 
240*313a0c13SJung-uk Kim 
241*313a0c13SJung-uk Kim     /* Install the debugger read-object control method if necessary */
242*313a0c13SJung-uk Kim 
243*313a0c13SJung-uk Kim     if (!ReadHandle)
244*313a0c13SJung-uk Kim     {
245*313a0c13SJung-uk Kim         Status = AcpiInstallMethod (ReadMethodCode);
246*313a0c13SJung-uk Kim         if (ACPI_FAILURE (Status))
247*313a0c13SJung-uk Kim         {
248*313a0c13SJung-uk Kim             AcpiOsPrintf ("%s, Could not install debugger read method\n",
249*313a0c13SJung-uk Kim                 AcpiFormatException (Status));
250*313a0c13SJung-uk Kim             return;
251*313a0c13SJung-uk Kim         }
252*313a0c13SJung-uk Kim 
253*313a0c13SJung-uk Kim         Status = AcpiGetHandle (NULL, ACPI_DB_READ_METHOD, &ReadHandle);
254*313a0c13SJung-uk Kim         if (ACPI_FAILURE (Status))
255*313a0c13SJung-uk Kim         {
256*313a0c13SJung-uk Kim             AcpiOsPrintf ("Could not obtain handle for debug method %s\n",
257*313a0c13SJung-uk Kim                 ACPI_DB_READ_METHOD);
258*313a0c13SJung-uk Kim             return;
259*313a0c13SJung-uk Kim         }
260*313a0c13SJung-uk Kim     }
261*313a0c13SJung-uk Kim 
262*313a0c13SJung-uk Kim     /* Install the debugger write-object control method if necessary */
263*313a0c13SJung-uk Kim 
264*313a0c13SJung-uk Kim     if (!WriteHandle)
265*313a0c13SJung-uk Kim     {
266*313a0c13SJung-uk Kim         Status = AcpiInstallMethod (WriteMethodCode);
267*313a0c13SJung-uk Kim         if (ACPI_FAILURE (Status))
268*313a0c13SJung-uk Kim         {
269*313a0c13SJung-uk Kim             AcpiOsPrintf ("%s, Could not install debugger write method\n",
270*313a0c13SJung-uk Kim                 AcpiFormatException (Status));
271*313a0c13SJung-uk Kim             return;
272*313a0c13SJung-uk Kim         }
273*313a0c13SJung-uk Kim 
274*313a0c13SJung-uk Kim         Status = AcpiGetHandle (NULL, ACPI_DB_WRITE_METHOD, &WriteHandle);
275*313a0c13SJung-uk Kim         if (ACPI_FAILURE (Status))
276*313a0c13SJung-uk Kim         {
277*313a0c13SJung-uk Kim             AcpiOsPrintf ("Could not obtain handle for debug method %s\n",
278*313a0c13SJung-uk Kim                 ACPI_DB_WRITE_METHOD);
279*313a0c13SJung-uk Kim             return;
280*313a0c13SJung-uk Kim         }
281*313a0c13SJung-uk Kim     }
282*313a0c13SJung-uk Kim 
283*313a0c13SJung-uk Kim     /* Walk the entire namespace, testing each supported named data object */
284*313a0c13SJung-uk Kim 
285*313a0c13SJung-uk Kim     (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
286*313a0c13SJung-uk Kim                 ACPI_UINT32_MAX, AcpiDbTestOneObject, NULL, NULL, NULL);
287*313a0c13SJung-uk Kim }
288*313a0c13SJung-uk Kim 
289*313a0c13SJung-uk Kim 
290*313a0c13SJung-uk Kim /*******************************************************************************
291*313a0c13SJung-uk Kim  *
292*313a0c13SJung-uk Kim  * FUNCTION:    AcpiDbTestOneObject
293*313a0c13SJung-uk Kim  *
294*313a0c13SJung-uk Kim  * PARAMETERS:  ACPI_WALK_CALLBACK
295*313a0c13SJung-uk Kim  *
296*313a0c13SJung-uk Kim  * RETURN:      Status
297*313a0c13SJung-uk Kim  *
298*313a0c13SJung-uk Kim  * DESCRIPTION: Test one namespace object. Supported types are Integer,
299*313a0c13SJung-uk Kim  *              String, Buffer, BufferField, and FieldUnit. All other object
300*313a0c13SJung-uk Kim  *              types are simply ignored.
301*313a0c13SJung-uk Kim  *
302*313a0c13SJung-uk Kim  *              Note: Support for Packages is not implemented.
303*313a0c13SJung-uk Kim  *
304*313a0c13SJung-uk Kim  ******************************************************************************/
305*313a0c13SJung-uk Kim 
306*313a0c13SJung-uk Kim static ACPI_STATUS
307*313a0c13SJung-uk Kim AcpiDbTestOneObject (
308*313a0c13SJung-uk Kim     ACPI_HANDLE             ObjHandle,
309*313a0c13SJung-uk Kim     UINT32                  NestingLevel,
310*313a0c13SJung-uk Kim     void                    *Context,
311*313a0c13SJung-uk Kim     void                    **ReturnValue)
312*313a0c13SJung-uk Kim {
313*313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node;
314*313a0c13SJung-uk Kim     ACPI_OPERAND_OBJECT     *ObjDesc;
315*313a0c13SJung-uk Kim     ACPI_OPERAND_OBJECT     *RegionObj;
316*313a0c13SJung-uk Kim     ACPI_OBJECT_TYPE        LocalType;
317*313a0c13SJung-uk Kim     UINT32                  BitLength = 0;
318*313a0c13SJung-uk Kim     UINT32                  ByteLength = 0;
319*313a0c13SJung-uk Kim     ACPI_STATUS             Status = AE_OK;
320*313a0c13SJung-uk Kim 
321*313a0c13SJung-uk Kim 
322*313a0c13SJung-uk Kim     Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjHandle);
323*313a0c13SJung-uk Kim     ObjDesc = Node->Object;
324*313a0c13SJung-uk Kim 
325*313a0c13SJung-uk Kim     /*
326*313a0c13SJung-uk Kim      * For the supported types, get the actual bit length or
327*313a0c13SJung-uk Kim      * byte length. Map the type to one of Integer/String/Buffer.
328*313a0c13SJung-uk Kim      */
329*313a0c13SJung-uk Kim     switch (Node->Type)
330*313a0c13SJung-uk Kim     {
331*313a0c13SJung-uk Kim     case ACPI_TYPE_INTEGER:
332*313a0c13SJung-uk Kim 
333*313a0c13SJung-uk Kim         /* Integer width is either 32 or 64 */
334*313a0c13SJung-uk Kim 
335*313a0c13SJung-uk Kim         LocalType = ACPI_TYPE_INTEGER;
336*313a0c13SJung-uk Kim         BitLength = AcpiGbl_IntegerBitWidth;
337*313a0c13SJung-uk Kim         break;
338*313a0c13SJung-uk Kim 
339*313a0c13SJung-uk Kim     case ACPI_TYPE_STRING:
340*313a0c13SJung-uk Kim 
341*313a0c13SJung-uk Kim         LocalType = ACPI_TYPE_STRING;
342*313a0c13SJung-uk Kim         ByteLength = ObjDesc->String.Length;
343*313a0c13SJung-uk Kim         break;
344*313a0c13SJung-uk Kim 
345*313a0c13SJung-uk Kim     case ACPI_TYPE_BUFFER:
346*313a0c13SJung-uk Kim 
347*313a0c13SJung-uk Kim         LocalType = ACPI_TYPE_BUFFER;
348*313a0c13SJung-uk Kim         ByteLength = ObjDesc->Buffer.Length;
349*313a0c13SJung-uk Kim         BitLength = ByteLength * 8;
350*313a0c13SJung-uk Kim         break;
351*313a0c13SJung-uk Kim 
352*313a0c13SJung-uk Kim     case ACPI_TYPE_FIELD_UNIT:
353*313a0c13SJung-uk Kim     case ACPI_TYPE_BUFFER_FIELD:
354*313a0c13SJung-uk Kim     case ACPI_TYPE_LOCAL_REGION_FIELD:
355*313a0c13SJung-uk Kim     case ACPI_TYPE_LOCAL_INDEX_FIELD:
356*313a0c13SJung-uk Kim     case ACPI_TYPE_LOCAL_BANK_FIELD:
357*313a0c13SJung-uk Kim 
358*313a0c13SJung-uk Kim         LocalType = ACPI_TYPE_INTEGER;
359*313a0c13SJung-uk Kim         if (ObjDesc)
360*313a0c13SJung-uk Kim         {
361*313a0c13SJung-uk Kim             /*
362*313a0c13SJung-uk Kim              * Returned object will be a Buffer if the field length
363*313a0c13SJung-uk Kim              * is larger than the size of an Integer (32 or 64 bits
364*313a0c13SJung-uk Kim              * depending on the DSDT version).
365*313a0c13SJung-uk Kim              */
366*313a0c13SJung-uk Kim             BitLength = ObjDesc->CommonField.BitLength;
367*313a0c13SJung-uk Kim             ByteLength = ACPI_ROUND_BITS_UP_TO_BYTES (BitLength);
368*313a0c13SJung-uk Kim             if (BitLength > AcpiGbl_IntegerBitWidth)
369*313a0c13SJung-uk Kim             {
370*313a0c13SJung-uk Kim                 LocalType = ACPI_TYPE_BUFFER;
371*313a0c13SJung-uk Kim             }
372*313a0c13SJung-uk Kim         }
373*313a0c13SJung-uk Kim         break;
374*313a0c13SJung-uk Kim 
375*313a0c13SJung-uk Kim     default:
376*313a0c13SJung-uk Kim 
377*313a0c13SJung-uk Kim         /* Ignore all other types */
378*313a0c13SJung-uk Kim 
379*313a0c13SJung-uk Kim         return (AE_OK);
380*313a0c13SJung-uk Kim     }
381*313a0c13SJung-uk Kim 
382*313a0c13SJung-uk Kim     /* Emit the common prefix: Type:Name */
383*313a0c13SJung-uk Kim 
384*313a0c13SJung-uk Kim     AcpiOsPrintf ("%14s: %4.4s",
385*313a0c13SJung-uk Kim         AcpiUtGetTypeName (Node->Type), Node->Name.Ascii);
386*313a0c13SJung-uk Kim     if (!ObjDesc)
387*313a0c13SJung-uk Kim     {
388*313a0c13SJung-uk Kim         AcpiOsPrintf (" Ignoring, no attached object\n");
389*313a0c13SJung-uk Kim         return (AE_OK);
390*313a0c13SJung-uk Kim     }
391*313a0c13SJung-uk Kim 
392*313a0c13SJung-uk Kim     /*
393*313a0c13SJung-uk Kim      * Check for unsupported region types. Note: AcpiExec simulates
394*313a0c13SJung-uk Kim      * access to SystemMemory, SystemIO, PCI_Config, and EC.
395*313a0c13SJung-uk Kim      */
396*313a0c13SJung-uk Kim     switch (Node->Type)
397*313a0c13SJung-uk Kim     {
398*313a0c13SJung-uk Kim     case ACPI_TYPE_LOCAL_REGION_FIELD:
399*313a0c13SJung-uk Kim 
400*313a0c13SJung-uk Kim         RegionObj = ObjDesc->Field.RegionObj;
401*313a0c13SJung-uk Kim         switch (RegionObj->Region.SpaceId)
402*313a0c13SJung-uk Kim         {
403*313a0c13SJung-uk Kim         case ACPI_ADR_SPACE_SYSTEM_MEMORY:
404*313a0c13SJung-uk Kim         case ACPI_ADR_SPACE_SYSTEM_IO:
405*313a0c13SJung-uk Kim         case ACPI_ADR_SPACE_PCI_CONFIG:
406*313a0c13SJung-uk Kim         case ACPI_ADR_SPACE_EC:
407*313a0c13SJung-uk Kim 
408*313a0c13SJung-uk Kim             break;
409*313a0c13SJung-uk Kim 
410*313a0c13SJung-uk Kim         default:
411*313a0c13SJung-uk Kim 
412*313a0c13SJung-uk Kim             AcpiOsPrintf ("      %s space is not supported [%4.4s]\n",
413*313a0c13SJung-uk Kim                 AcpiUtGetRegionName (RegionObj->Region.SpaceId),
414*313a0c13SJung-uk Kim                 RegionObj->Region.Node->Name.Ascii);
415*313a0c13SJung-uk Kim             return (AE_OK);
416*313a0c13SJung-uk Kim         }
417*313a0c13SJung-uk Kim         break;
418*313a0c13SJung-uk Kim 
419*313a0c13SJung-uk Kim     default:
420*313a0c13SJung-uk Kim         break;
421*313a0c13SJung-uk Kim     }
422*313a0c13SJung-uk Kim 
423*313a0c13SJung-uk Kim     /* At this point, we have resolved the object to one of the major types */
424*313a0c13SJung-uk Kim 
425*313a0c13SJung-uk Kim     switch (LocalType)
426*313a0c13SJung-uk Kim     {
427*313a0c13SJung-uk Kim     case ACPI_TYPE_INTEGER:
428*313a0c13SJung-uk Kim 
429*313a0c13SJung-uk Kim         Status = AcpiDbTestIntegerType (Node, BitLength);
430*313a0c13SJung-uk Kim         break;
431*313a0c13SJung-uk Kim 
432*313a0c13SJung-uk Kim     case ACPI_TYPE_STRING:
433*313a0c13SJung-uk Kim 
434*313a0c13SJung-uk Kim         Status = AcpiDbTestStringType (Node, ByteLength);
435*313a0c13SJung-uk Kim         break;
436*313a0c13SJung-uk Kim 
437*313a0c13SJung-uk Kim     case ACPI_TYPE_BUFFER:
438*313a0c13SJung-uk Kim 
439*313a0c13SJung-uk Kim         Status = AcpiDbTestBufferType (Node, BitLength);
440*313a0c13SJung-uk Kim         break;
441*313a0c13SJung-uk Kim 
442*313a0c13SJung-uk Kim     default:
443*313a0c13SJung-uk Kim 
444*313a0c13SJung-uk Kim         AcpiOsPrintf (" Ignoring, type not implemented (%2.2X)",
445*313a0c13SJung-uk Kim             LocalType);
446*313a0c13SJung-uk Kim         break;
447*313a0c13SJung-uk Kim     }
448*313a0c13SJung-uk Kim 
449*313a0c13SJung-uk Kim     switch (Node->Type)
450*313a0c13SJung-uk Kim     {
451*313a0c13SJung-uk Kim     case ACPI_TYPE_LOCAL_REGION_FIELD:
452*313a0c13SJung-uk Kim 
453*313a0c13SJung-uk Kim         RegionObj = ObjDesc->Field.RegionObj;
454*313a0c13SJung-uk Kim         AcpiOsPrintf (" (%s)",
455*313a0c13SJung-uk Kim             AcpiUtGetRegionName (RegionObj->Region.SpaceId));
456*313a0c13SJung-uk Kim         break;
457*313a0c13SJung-uk Kim 
458*313a0c13SJung-uk Kim     default:
459*313a0c13SJung-uk Kim         break;
460*313a0c13SJung-uk Kim     }
461*313a0c13SJung-uk Kim 
462*313a0c13SJung-uk Kim     AcpiOsPrintf ("\n");
463*313a0c13SJung-uk Kim     return (Status);
464*313a0c13SJung-uk Kim }
465*313a0c13SJung-uk Kim 
466*313a0c13SJung-uk Kim 
467*313a0c13SJung-uk Kim /*******************************************************************************
468*313a0c13SJung-uk Kim  *
469*313a0c13SJung-uk Kim  * FUNCTION:    AcpiDbTestIntegerType
470*313a0c13SJung-uk Kim  *
471*313a0c13SJung-uk Kim  * PARAMETERS:  Node                - Parent NS node for the object
472*313a0c13SJung-uk Kim  *              BitLength           - Actual length of the object. Used for
473*313a0c13SJung-uk Kim  *                                    support of arbitrary length FieldUnit
474*313a0c13SJung-uk Kim  *                                    and BufferField objects.
475*313a0c13SJung-uk Kim  *
476*313a0c13SJung-uk Kim  * RETURN:      Status
477*313a0c13SJung-uk Kim  *
478*313a0c13SJung-uk Kim  * DESCRIPTION: Test read/write for an Integer-valued object. Performs a
479*313a0c13SJung-uk Kim  *              write/read/compare of an arbitrary new value, then performs
480*313a0c13SJung-uk Kim  *              a write/read/compare of the original value.
481*313a0c13SJung-uk Kim  *
482*313a0c13SJung-uk Kim  ******************************************************************************/
483*313a0c13SJung-uk Kim 
484*313a0c13SJung-uk Kim static ACPI_STATUS
485*313a0c13SJung-uk Kim AcpiDbTestIntegerType (
486*313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node,
487*313a0c13SJung-uk Kim     UINT32                  BitLength)
488*313a0c13SJung-uk Kim {
489*313a0c13SJung-uk Kim     ACPI_OBJECT             *Temp1 = NULL;
490*313a0c13SJung-uk Kim     ACPI_OBJECT             *Temp2 = NULL;
491*313a0c13SJung-uk Kim     ACPI_OBJECT             *Temp3 = NULL;
492*313a0c13SJung-uk Kim     ACPI_OBJECT             WriteValue;
493*313a0c13SJung-uk Kim     UINT64                  ValueToWrite;
494*313a0c13SJung-uk Kim     ACPI_STATUS             Status;
495*313a0c13SJung-uk Kim 
496*313a0c13SJung-uk Kim 
497*313a0c13SJung-uk Kim     if (BitLength > 64)
498*313a0c13SJung-uk Kim     {
499*313a0c13SJung-uk Kim         AcpiOsPrintf (" Invalid length for an Integer: %u", BitLength);
500*313a0c13SJung-uk Kim         return (AE_OK);
501*313a0c13SJung-uk Kim     }
502*313a0c13SJung-uk Kim 
503*313a0c13SJung-uk Kim     /* Read the original value */
504*313a0c13SJung-uk Kim 
505*313a0c13SJung-uk Kim     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_INTEGER, &Temp1);
506*313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
507*313a0c13SJung-uk Kim     {
508*313a0c13SJung-uk Kim         return (Status);
509*313a0c13SJung-uk Kim     }
510*313a0c13SJung-uk Kim 
511*313a0c13SJung-uk Kim     AcpiOsPrintf (" (%4.4X/%3.3X) %8.8X%8.8X",
512*313a0c13SJung-uk Kim         BitLength, ACPI_ROUND_BITS_UP_TO_BYTES (BitLength),
513*313a0c13SJung-uk Kim         ACPI_FORMAT_UINT64 (Temp1->Integer.Value));
514*313a0c13SJung-uk Kim 
515*313a0c13SJung-uk Kim     ValueToWrite = ACPI_UINT64_MAX >> (64 - BitLength);
516*313a0c13SJung-uk Kim     if (Temp1->Integer.Value == ValueToWrite)
517*313a0c13SJung-uk Kim     {
518*313a0c13SJung-uk Kim         ValueToWrite = 0;
519*313a0c13SJung-uk Kim     }
520*313a0c13SJung-uk Kim 
521*313a0c13SJung-uk Kim     /* Write a new value */
522*313a0c13SJung-uk Kim 
523*313a0c13SJung-uk Kim     WriteValue.Type = ACPI_TYPE_INTEGER;
524*313a0c13SJung-uk Kim     WriteValue.Integer.Value = ValueToWrite;
525*313a0c13SJung-uk Kim     Status = AcpiDbWriteToObject (Node, &WriteValue);
526*313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
527*313a0c13SJung-uk Kim     {
528*313a0c13SJung-uk Kim         goto Exit;
529*313a0c13SJung-uk Kim     }
530*313a0c13SJung-uk Kim 
531*313a0c13SJung-uk Kim     /* Ensure that we can read back the new value */
532*313a0c13SJung-uk Kim 
533*313a0c13SJung-uk Kim     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_INTEGER, &Temp2);
534*313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
535*313a0c13SJung-uk Kim     {
536*313a0c13SJung-uk Kim         goto Exit;
537*313a0c13SJung-uk Kim     }
538*313a0c13SJung-uk Kim 
539*313a0c13SJung-uk Kim     if (Temp2->Integer.Value != ValueToWrite)
540*313a0c13SJung-uk Kim     {
541*313a0c13SJung-uk Kim         AcpiOsPrintf (" MISMATCH 2: %8.8X%8.8X, expecting %8.8X%8.8X",
542*313a0c13SJung-uk Kim             ACPI_FORMAT_UINT64 (Temp2->Integer.Value),
543*313a0c13SJung-uk Kim             ACPI_FORMAT_UINT64 (ValueToWrite));
544*313a0c13SJung-uk Kim     }
545*313a0c13SJung-uk Kim 
546*313a0c13SJung-uk Kim     /* Write back the original value */
547*313a0c13SJung-uk Kim 
548*313a0c13SJung-uk Kim     WriteValue.Integer.Value = Temp1->Integer.Value;
549*313a0c13SJung-uk Kim     Status = AcpiDbWriteToObject (Node, &WriteValue);
550*313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
551*313a0c13SJung-uk Kim     {
552*313a0c13SJung-uk Kim         goto Exit;
553*313a0c13SJung-uk Kim     }
554*313a0c13SJung-uk Kim 
555*313a0c13SJung-uk Kim     /* Ensure that we can read back the original value */
556*313a0c13SJung-uk Kim 
557*313a0c13SJung-uk Kim     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_INTEGER, &Temp3);
558*313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
559*313a0c13SJung-uk Kim     {
560*313a0c13SJung-uk Kim         goto Exit;
561*313a0c13SJung-uk Kim     }
562*313a0c13SJung-uk Kim 
563*313a0c13SJung-uk Kim     if (Temp3->Integer.Value != Temp1->Integer.Value)
564*313a0c13SJung-uk Kim     {
565*313a0c13SJung-uk Kim         AcpiOsPrintf (" MISMATCH 3: %8.8X%8.8X, expecting %8.8X%8.8X",
566*313a0c13SJung-uk Kim             ACPI_FORMAT_UINT64 (Temp3->Integer.Value),
567*313a0c13SJung-uk Kim             ACPI_FORMAT_UINT64 (Temp1->Integer.Value));
568*313a0c13SJung-uk Kim     }
569*313a0c13SJung-uk Kim 
570*313a0c13SJung-uk Kim Exit:
571*313a0c13SJung-uk Kim     if (Temp1) {AcpiOsFree (Temp1);}
572*313a0c13SJung-uk Kim     if (Temp2) {AcpiOsFree (Temp2);}
573*313a0c13SJung-uk Kim     if (Temp3) {AcpiOsFree (Temp3);}
574*313a0c13SJung-uk Kim     return (AE_OK);
575*313a0c13SJung-uk Kim }
576*313a0c13SJung-uk Kim 
577*313a0c13SJung-uk Kim 
578*313a0c13SJung-uk Kim /*******************************************************************************
579*313a0c13SJung-uk Kim  *
580*313a0c13SJung-uk Kim  * FUNCTION:    AcpiDbTestBufferType
581*313a0c13SJung-uk Kim  *
582*313a0c13SJung-uk Kim  * PARAMETERS:  Node                - Parent NS node for the object
583*313a0c13SJung-uk Kim  *              BitLength           - Actual length of the object.
584*313a0c13SJung-uk Kim  *
585*313a0c13SJung-uk Kim  * RETURN:      Status
586*313a0c13SJung-uk Kim  *
587*313a0c13SJung-uk Kim  * DESCRIPTION: Test read/write for an Buffer-valued object. Performs a
588*313a0c13SJung-uk Kim  *              write/read/compare of an arbitrary new value, then performs
589*313a0c13SJung-uk Kim  *              a write/read/compare of the original value.
590*313a0c13SJung-uk Kim  *
591*313a0c13SJung-uk Kim  ******************************************************************************/
592*313a0c13SJung-uk Kim 
593*313a0c13SJung-uk Kim static ACPI_STATUS
594*313a0c13SJung-uk Kim AcpiDbTestBufferType (
595*313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node,
596*313a0c13SJung-uk Kim     UINT32                  BitLength)
597*313a0c13SJung-uk Kim {
598*313a0c13SJung-uk Kim     ACPI_OBJECT             *Temp1 = NULL;
599*313a0c13SJung-uk Kim     ACPI_OBJECT             *Temp2 = NULL;
600*313a0c13SJung-uk Kim     ACPI_OBJECT             *Temp3 = NULL;
601*313a0c13SJung-uk Kim     UINT8                   *Buffer;
602*313a0c13SJung-uk Kim     ACPI_OBJECT             WriteValue;
603*313a0c13SJung-uk Kim     ACPI_STATUS             Status;
604*313a0c13SJung-uk Kim     UINT32                  ByteLength;
605*313a0c13SJung-uk Kim     UINT32                  i;
606*313a0c13SJung-uk Kim     UINT8                   ExtraBits;
607*313a0c13SJung-uk Kim 
608*313a0c13SJung-uk Kim 
609*313a0c13SJung-uk Kim     ByteLength = ACPI_ROUND_BITS_UP_TO_BYTES (BitLength);
610*313a0c13SJung-uk Kim     if (ByteLength == 0)
611*313a0c13SJung-uk Kim     {
612*313a0c13SJung-uk Kim         AcpiOsPrintf (" Ignoring zero length buffer");
613*313a0c13SJung-uk Kim         return (AE_OK);
614*313a0c13SJung-uk Kim     }
615*313a0c13SJung-uk Kim 
616*313a0c13SJung-uk Kim     /* Allocate a local buffer */
617*313a0c13SJung-uk Kim 
618*313a0c13SJung-uk Kim     Buffer = ACPI_ALLOCATE_ZEROED (ByteLength);
619*313a0c13SJung-uk Kim     if (!Buffer)
620*313a0c13SJung-uk Kim     {
621*313a0c13SJung-uk Kim         return (AE_NO_MEMORY);
622*313a0c13SJung-uk Kim     }
623*313a0c13SJung-uk Kim 
624*313a0c13SJung-uk Kim     /* Read the original value */
625*313a0c13SJung-uk Kim 
626*313a0c13SJung-uk Kim     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_BUFFER, &Temp1);
627*313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
628*313a0c13SJung-uk Kim     {
629*313a0c13SJung-uk Kim         goto Exit;
630*313a0c13SJung-uk Kim     }
631*313a0c13SJung-uk Kim 
632*313a0c13SJung-uk Kim     /* Emit a few bytes of the buffer */
633*313a0c13SJung-uk Kim 
634*313a0c13SJung-uk Kim     AcpiOsPrintf (" (%4.4X/%3.3X)", BitLength, Temp1->Buffer.Length);
635*313a0c13SJung-uk Kim     for (i = 0; ((i < 4) && (i < ByteLength)); i++)
636*313a0c13SJung-uk Kim     {
637*313a0c13SJung-uk Kim         AcpiOsPrintf (" %2.2X", Temp1->Buffer.Pointer[i]);
638*313a0c13SJung-uk Kim     }
639*313a0c13SJung-uk Kim     AcpiOsPrintf ("...  ");
640*313a0c13SJung-uk Kim 
641*313a0c13SJung-uk Kim     /*
642*313a0c13SJung-uk Kim      * Write a new value.
643*313a0c13SJung-uk Kim      *
644*313a0c13SJung-uk Kim      * Handle possible extra bits at the end of the buffer. Can
645*313a0c13SJung-uk Kim      * happen for FieldUnits larger than an integer, but the bit
646*313a0c13SJung-uk Kim      * count is not an integral number of bytes. Zero out the
647*313a0c13SJung-uk Kim      * unused bits.
648*313a0c13SJung-uk Kim      */
649*313a0c13SJung-uk Kim     ACPI_MEMSET (Buffer, BUFFER_FILL_VALUE, ByteLength);
650*313a0c13SJung-uk Kim     ExtraBits = BitLength % 8;
651*313a0c13SJung-uk Kim     if (ExtraBits)
652*313a0c13SJung-uk Kim     {
653*313a0c13SJung-uk Kim         Buffer [ByteLength - 1] = ACPI_MASK_BITS_ABOVE (ExtraBits);
654*313a0c13SJung-uk Kim     }
655*313a0c13SJung-uk Kim 
656*313a0c13SJung-uk Kim     WriteValue.Type = ACPI_TYPE_BUFFER;
657*313a0c13SJung-uk Kim     WriteValue.Buffer.Length = ByteLength;
658*313a0c13SJung-uk Kim     WriteValue.Buffer.Pointer = Buffer;
659*313a0c13SJung-uk Kim 
660*313a0c13SJung-uk Kim     Status = AcpiDbWriteToObject (Node, &WriteValue);
661*313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
662*313a0c13SJung-uk Kim     {
663*313a0c13SJung-uk Kim         goto Exit;
664*313a0c13SJung-uk Kim     }
665*313a0c13SJung-uk Kim 
666*313a0c13SJung-uk Kim     /* Ensure that we can read back the new value */
667*313a0c13SJung-uk Kim 
668*313a0c13SJung-uk Kim     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_BUFFER, &Temp2);
669*313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
670*313a0c13SJung-uk Kim     {
671*313a0c13SJung-uk Kim         goto Exit;
672*313a0c13SJung-uk Kim     }
673*313a0c13SJung-uk Kim 
674*313a0c13SJung-uk Kim     if (ACPI_MEMCMP (Temp2->Buffer.Pointer, Buffer, ByteLength))
675*313a0c13SJung-uk Kim     {
676*313a0c13SJung-uk Kim         AcpiOsPrintf (" MISMATCH 2: New buffer value");
677*313a0c13SJung-uk Kim     }
678*313a0c13SJung-uk Kim 
679*313a0c13SJung-uk Kim     /* Write back the original value */
680*313a0c13SJung-uk Kim 
681*313a0c13SJung-uk Kim     WriteValue.Buffer.Length = ByteLength;
682*313a0c13SJung-uk Kim     WriteValue.Buffer.Pointer = Temp1->Buffer.Pointer;
683*313a0c13SJung-uk Kim 
684*313a0c13SJung-uk Kim     Status = AcpiDbWriteToObject (Node, &WriteValue);
685*313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
686*313a0c13SJung-uk Kim     {
687*313a0c13SJung-uk Kim         goto Exit;
688*313a0c13SJung-uk Kim     }
689*313a0c13SJung-uk Kim 
690*313a0c13SJung-uk Kim     /* Ensure that we can read back the original value */
691*313a0c13SJung-uk Kim 
692*313a0c13SJung-uk Kim     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_BUFFER, &Temp3);
693*313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
694*313a0c13SJung-uk Kim     {
695*313a0c13SJung-uk Kim         goto Exit;
696*313a0c13SJung-uk Kim     }
697*313a0c13SJung-uk Kim 
698*313a0c13SJung-uk Kim     if (ACPI_MEMCMP (Temp1->Buffer.Pointer, Temp3->Buffer.Pointer, ByteLength))
699*313a0c13SJung-uk Kim     {
700*313a0c13SJung-uk Kim         AcpiOsPrintf (" MISMATCH 3: While restoring original buffer");
701*313a0c13SJung-uk Kim     }
702*313a0c13SJung-uk Kim 
703*313a0c13SJung-uk Kim Exit:
704*313a0c13SJung-uk Kim     ACPI_FREE (Buffer);
705*313a0c13SJung-uk Kim     if (Temp1) {AcpiOsFree (Temp1);}
706*313a0c13SJung-uk Kim     if (Temp2) {AcpiOsFree (Temp2);}
707*313a0c13SJung-uk Kim     if (Temp3) {AcpiOsFree (Temp3);}
708*313a0c13SJung-uk Kim     return (Status);
709*313a0c13SJung-uk Kim }
710*313a0c13SJung-uk Kim 
711*313a0c13SJung-uk Kim 
712*313a0c13SJung-uk Kim /*******************************************************************************
713*313a0c13SJung-uk Kim  *
714*313a0c13SJung-uk Kim  * FUNCTION:    AcpiDbTestStringType
715*313a0c13SJung-uk Kim  *
716*313a0c13SJung-uk Kim  * PARAMETERS:  Node                - Parent NS node for the object
717*313a0c13SJung-uk Kim  *              ByteLength          - Actual length of the object.
718*313a0c13SJung-uk Kim  *
719*313a0c13SJung-uk Kim  * RETURN:      Status
720*313a0c13SJung-uk Kim  *
721*313a0c13SJung-uk Kim  * DESCRIPTION: Test read/write for an String-valued object. Performs a
722*313a0c13SJung-uk Kim  *              write/read/compare of an arbitrary new value, then performs
723*313a0c13SJung-uk Kim  *              a write/read/compare of the original value.
724*313a0c13SJung-uk Kim  *
725*313a0c13SJung-uk Kim  ******************************************************************************/
726*313a0c13SJung-uk Kim 
727*313a0c13SJung-uk Kim static ACPI_STATUS
728*313a0c13SJung-uk Kim AcpiDbTestStringType (
729*313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node,
730*313a0c13SJung-uk Kim     UINT32                  ByteLength)
731*313a0c13SJung-uk Kim {
732*313a0c13SJung-uk Kim     ACPI_OBJECT             *Temp1 = NULL;
733*313a0c13SJung-uk Kim     ACPI_OBJECT             *Temp2 = NULL;
734*313a0c13SJung-uk Kim     ACPI_OBJECT             *Temp3 = NULL;
735*313a0c13SJung-uk Kim     char                    *ValueToWrite = "Test String from AML Debugger";
736*313a0c13SJung-uk Kim     ACPI_OBJECT             WriteValue;
737*313a0c13SJung-uk Kim     ACPI_STATUS             Status;
738*313a0c13SJung-uk Kim 
739*313a0c13SJung-uk Kim 
740*313a0c13SJung-uk Kim     /* Read the original value */
741*313a0c13SJung-uk Kim 
742*313a0c13SJung-uk Kim     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_STRING, &Temp1);
743*313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
744*313a0c13SJung-uk Kim     {
745*313a0c13SJung-uk Kim         return (Status);
746*313a0c13SJung-uk Kim     }
747*313a0c13SJung-uk Kim 
748*313a0c13SJung-uk Kim     AcpiOsPrintf (" (%4.4X/%3.3X) \"%s\"", (Temp1->String.Length * 8),
749*313a0c13SJung-uk Kim         Temp1->String.Length, Temp1->String.Pointer);
750*313a0c13SJung-uk Kim 
751*313a0c13SJung-uk Kim     /* Write a new value */
752*313a0c13SJung-uk Kim 
753*313a0c13SJung-uk Kim     WriteValue.Type = ACPI_TYPE_STRING;
754*313a0c13SJung-uk Kim     WriteValue.String.Length = ACPI_STRLEN (ValueToWrite);
755*313a0c13SJung-uk Kim     WriteValue.String.Pointer = ValueToWrite;
756*313a0c13SJung-uk Kim 
757*313a0c13SJung-uk Kim     Status = AcpiDbWriteToObject (Node, &WriteValue);
758*313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
759*313a0c13SJung-uk Kim     {
760*313a0c13SJung-uk Kim         goto Exit;
761*313a0c13SJung-uk Kim     }
762*313a0c13SJung-uk Kim 
763*313a0c13SJung-uk Kim     /* Ensure that we can read back the new value */
764*313a0c13SJung-uk Kim 
765*313a0c13SJung-uk Kim     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_STRING, &Temp2);
766*313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
767*313a0c13SJung-uk Kim     {
768*313a0c13SJung-uk Kim         goto Exit;
769*313a0c13SJung-uk Kim     }
770*313a0c13SJung-uk Kim 
771*313a0c13SJung-uk Kim     if (ACPI_STRCMP (Temp2->String.Pointer, ValueToWrite))
772*313a0c13SJung-uk Kim     {
773*313a0c13SJung-uk Kim         AcpiOsPrintf (" MISMATCH 2: %s, expecting %s",
774*313a0c13SJung-uk Kim             Temp2->String.Pointer, ValueToWrite);
775*313a0c13SJung-uk Kim     }
776*313a0c13SJung-uk Kim 
777*313a0c13SJung-uk Kim     /* Write back the original value */
778*313a0c13SJung-uk Kim 
779*313a0c13SJung-uk Kim     WriteValue.String.Length = ACPI_STRLEN (Temp1->String.Pointer);
780*313a0c13SJung-uk Kim     WriteValue.String.Pointer = Temp1->String.Pointer;
781*313a0c13SJung-uk Kim 
782*313a0c13SJung-uk Kim     Status = AcpiDbWriteToObject (Node, &WriteValue);
783*313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
784*313a0c13SJung-uk Kim     {
785*313a0c13SJung-uk Kim         goto Exit;
786*313a0c13SJung-uk Kim     }
787*313a0c13SJung-uk Kim 
788*313a0c13SJung-uk Kim     /* Ensure that we can read back the original value */
789*313a0c13SJung-uk Kim 
790*313a0c13SJung-uk Kim     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_STRING, &Temp3);
791*313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
792*313a0c13SJung-uk Kim     {
793*313a0c13SJung-uk Kim         goto Exit;
794*313a0c13SJung-uk Kim     }
795*313a0c13SJung-uk Kim 
796*313a0c13SJung-uk Kim     if (ACPI_STRCMP (Temp1->String.Pointer, Temp3->String.Pointer))
797*313a0c13SJung-uk Kim     {
798*313a0c13SJung-uk Kim         AcpiOsPrintf (" MISMATCH 3: %s, expecting %s",
799*313a0c13SJung-uk Kim             Temp3->String.Pointer, Temp1->String.Pointer);
800*313a0c13SJung-uk Kim     }
801*313a0c13SJung-uk Kim 
802*313a0c13SJung-uk Kim Exit:
803*313a0c13SJung-uk Kim     if (Temp1) {AcpiOsFree (Temp1);}
804*313a0c13SJung-uk Kim     if (Temp2) {AcpiOsFree (Temp2);}
805*313a0c13SJung-uk Kim     if (Temp3) {AcpiOsFree (Temp3);}
806*313a0c13SJung-uk Kim     return (Status);
807*313a0c13SJung-uk Kim }
808*313a0c13SJung-uk Kim 
809*313a0c13SJung-uk Kim 
810*313a0c13SJung-uk Kim /*******************************************************************************
811*313a0c13SJung-uk Kim  *
812*313a0c13SJung-uk Kim  * FUNCTION:    AcpiDbReadFromObject
813*313a0c13SJung-uk Kim  *
814*313a0c13SJung-uk Kim  * PARAMETERS:  Node                - Parent NS node for the object
815*313a0c13SJung-uk Kim  *              ExpectedType        - Object type expected from the read
816*313a0c13SJung-uk Kim  *              Value               - Where the value read is returned
817*313a0c13SJung-uk Kim  *
818*313a0c13SJung-uk Kim  * RETURN:      Status
819*313a0c13SJung-uk Kim  *
820*313a0c13SJung-uk Kim  * DESCRIPTION: Performs a read from the specified object by invoking the
821*313a0c13SJung-uk Kim  *              special debugger control method that reads the object. Thus,
822*313a0c13SJung-uk Kim  *              the AML interpreter is doing all of the work, increasing the
823*313a0c13SJung-uk Kim  *              validity of the test.
824*313a0c13SJung-uk Kim  *
825*313a0c13SJung-uk Kim  ******************************************************************************/
826*313a0c13SJung-uk Kim 
827*313a0c13SJung-uk Kim static ACPI_STATUS
828*313a0c13SJung-uk Kim AcpiDbReadFromObject (
829*313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node,
830*313a0c13SJung-uk Kim     ACPI_OBJECT_TYPE        ExpectedType,
831*313a0c13SJung-uk Kim     ACPI_OBJECT             **Value)
832*313a0c13SJung-uk Kim {
833*313a0c13SJung-uk Kim     ACPI_OBJECT             *RetValue;
834*313a0c13SJung-uk Kim     ACPI_OBJECT_LIST        ParamObjects;
835*313a0c13SJung-uk Kim     ACPI_OBJECT             Params[2];
836*313a0c13SJung-uk Kim     ACPI_BUFFER             ReturnObj;
837*313a0c13SJung-uk Kim     ACPI_STATUS             Status;
838*313a0c13SJung-uk Kim 
839*313a0c13SJung-uk Kim 
840*313a0c13SJung-uk Kim     Params[0].Type = ACPI_TYPE_LOCAL_REFERENCE;
841*313a0c13SJung-uk Kim     Params[0].Reference.ActualType = Node->Type;
842*313a0c13SJung-uk Kim     Params[0].Reference.Handle = ACPI_CAST_PTR (ACPI_HANDLE, Node);
843*313a0c13SJung-uk Kim 
844*313a0c13SJung-uk Kim     ParamObjects.Count = 1;
845*313a0c13SJung-uk Kim     ParamObjects.Pointer = Params;
846*313a0c13SJung-uk Kim 
847*313a0c13SJung-uk Kim     ReturnObj.Length  = ACPI_ALLOCATE_BUFFER;
848*313a0c13SJung-uk Kim 
849*313a0c13SJung-uk Kim     AcpiGbl_MethodExecuting = TRUE;
850*313a0c13SJung-uk Kim     Status = AcpiEvaluateObject (ReadHandle, NULL, &ParamObjects, &ReturnObj);
851*313a0c13SJung-uk Kim     AcpiGbl_MethodExecuting = FALSE;
852*313a0c13SJung-uk Kim 
853*313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
854*313a0c13SJung-uk Kim     {
855*313a0c13SJung-uk Kim         AcpiOsPrintf ("Could not read from object, %s",
856*313a0c13SJung-uk Kim             AcpiFormatException (Status));
857*313a0c13SJung-uk Kim         return (Status);
858*313a0c13SJung-uk Kim     }
859*313a0c13SJung-uk Kim 
860*313a0c13SJung-uk Kim     RetValue = (ACPI_OBJECT *) ReturnObj.Pointer;
861*313a0c13SJung-uk Kim 
862*313a0c13SJung-uk Kim     switch (RetValue->Type)
863*313a0c13SJung-uk Kim     {
864*313a0c13SJung-uk Kim     case ACPI_TYPE_INTEGER:
865*313a0c13SJung-uk Kim     case ACPI_TYPE_BUFFER:
866*313a0c13SJung-uk Kim     case ACPI_TYPE_STRING:
867*313a0c13SJung-uk Kim         /*
868*313a0c13SJung-uk Kim          * Did we receive the type we wanted? Most important for the
869*313a0c13SJung-uk Kim          * Integer/Buffer case (when a field is larger than an Integer,
870*313a0c13SJung-uk Kim          * it should return a Buffer).
871*313a0c13SJung-uk Kim          */
872*313a0c13SJung-uk Kim         if (RetValue->Type != ExpectedType)
873*313a0c13SJung-uk Kim         {
874*313a0c13SJung-uk Kim             AcpiOsPrintf (" Type mismatch:  Expected %s, Received %s",
875*313a0c13SJung-uk Kim                 AcpiUtGetTypeName (ExpectedType),
876*313a0c13SJung-uk Kim                 AcpiUtGetTypeName (RetValue->Type));
877*313a0c13SJung-uk Kim 
878*313a0c13SJung-uk Kim             return (AE_TYPE);
879*313a0c13SJung-uk Kim         }
880*313a0c13SJung-uk Kim 
881*313a0c13SJung-uk Kim         *Value = RetValue;
882*313a0c13SJung-uk Kim         break;
883*313a0c13SJung-uk Kim 
884*313a0c13SJung-uk Kim     default:
885*313a0c13SJung-uk Kim 
886*313a0c13SJung-uk Kim         AcpiOsPrintf (" Unsupported return object type, %s",
887*313a0c13SJung-uk Kim             AcpiUtGetTypeName (RetValue->Type));
888*313a0c13SJung-uk Kim         AcpiOsFree (ReturnObj.Pointer);
889*313a0c13SJung-uk Kim 
890*313a0c13SJung-uk Kim         return (AE_TYPE);
891*313a0c13SJung-uk Kim     }
892*313a0c13SJung-uk Kim 
893*313a0c13SJung-uk Kim     return (Status);
894*313a0c13SJung-uk Kim }
895*313a0c13SJung-uk Kim 
896*313a0c13SJung-uk Kim 
897*313a0c13SJung-uk Kim /*******************************************************************************
898*313a0c13SJung-uk Kim  *
899*313a0c13SJung-uk Kim  * FUNCTION:    AcpiDbWriteToObject
900*313a0c13SJung-uk Kim  *
901*313a0c13SJung-uk Kim  * PARAMETERS:  Node                - Parent NS node for the object
902*313a0c13SJung-uk Kim  *              Value               - Value to be written
903*313a0c13SJung-uk Kim  *
904*313a0c13SJung-uk Kim  * RETURN:      Status
905*313a0c13SJung-uk Kim  *
906*313a0c13SJung-uk Kim  * DESCRIPTION: Performs a write to the specified object by invoking the
907*313a0c13SJung-uk Kim  *              special debugger control method that writes the object. Thus,
908*313a0c13SJung-uk Kim  *              the AML interpreter is doing all of the work, increasing the
909*313a0c13SJung-uk Kim  *              validity of the test.
910*313a0c13SJung-uk Kim  *
911*313a0c13SJung-uk Kim  ******************************************************************************/
912*313a0c13SJung-uk Kim 
913*313a0c13SJung-uk Kim static ACPI_STATUS
914*313a0c13SJung-uk Kim AcpiDbWriteToObject (
915*313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node,
916*313a0c13SJung-uk Kim     ACPI_OBJECT             *Value)
917*313a0c13SJung-uk Kim {
918*313a0c13SJung-uk Kim     ACPI_OBJECT_LIST        ParamObjects;
919*313a0c13SJung-uk Kim     ACPI_OBJECT             Params[2];
920*313a0c13SJung-uk Kim     ACPI_STATUS             Status;
921*313a0c13SJung-uk Kim 
922*313a0c13SJung-uk Kim 
923*313a0c13SJung-uk Kim     Params[0].Type = ACPI_TYPE_LOCAL_REFERENCE;
924*313a0c13SJung-uk Kim     Params[0].Reference.ActualType = Node->Type;
925*313a0c13SJung-uk Kim     Params[0].Reference.Handle = ACPI_CAST_PTR (ACPI_HANDLE, Node);
926*313a0c13SJung-uk Kim 
927*313a0c13SJung-uk Kim     /* Copy the incoming user parameter */
928*313a0c13SJung-uk Kim 
929*313a0c13SJung-uk Kim     ACPI_MEMCPY (&Params[1], Value, sizeof (ACPI_OBJECT));
930*313a0c13SJung-uk Kim 
931*313a0c13SJung-uk Kim     ParamObjects.Count = 2;
932*313a0c13SJung-uk Kim     ParamObjects.Pointer = Params;
933*313a0c13SJung-uk Kim 
934*313a0c13SJung-uk Kim     AcpiGbl_MethodExecuting = TRUE;
935*313a0c13SJung-uk Kim     Status = AcpiEvaluateObject (WriteHandle, NULL, &ParamObjects, NULL);
936*313a0c13SJung-uk Kim     AcpiGbl_MethodExecuting = FALSE;
937*313a0c13SJung-uk Kim 
938*313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
939*313a0c13SJung-uk Kim     {
940*313a0c13SJung-uk Kim         AcpiOsPrintf ("Could not write to object, %s",
941*313a0c13SJung-uk Kim             AcpiFormatException (Status));
942*313a0c13SJung-uk Kim     }
943*313a0c13SJung-uk Kim 
944*313a0c13SJung-uk Kim     return (Status);
945*313a0c13SJung-uk Kim }
946*313a0c13SJung-uk Kim 
947*313a0c13SJung-uk Kim 
948*313a0c13SJung-uk Kim /*******************************************************************************
949*313a0c13SJung-uk Kim  *
950*313a0c13SJung-uk Kim  * FUNCTION:    AcpiDbEvaluateAllPredefinedNames
951*313a0c13SJung-uk Kim  *
952*313a0c13SJung-uk Kim  * PARAMETERS:  CountArg            - Max number of methods to execute
953*313a0c13SJung-uk Kim  *
954*313a0c13SJung-uk Kim  * RETURN:      None
955*313a0c13SJung-uk Kim  *
956*313a0c13SJung-uk Kim  * DESCRIPTION: Namespace batch execution. Execute predefined names in the
957*313a0c13SJung-uk Kim  *              namespace, up to the max count, if specified.
958*313a0c13SJung-uk Kim  *
959*313a0c13SJung-uk Kim  ******************************************************************************/
960*313a0c13SJung-uk Kim 
961*313a0c13SJung-uk Kim static void
962*313a0c13SJung-uk Kim AcpiDbEvaluateAllPredefinedNames (
963*313a0c13SJung-uk Kim     char                    *CountArg)
964*313a0c13SJung-uk Kim {
965*313a0c13SJung-uk Kim     ACPI_DB_EXECUTE_WALK    Info;
966*313a0c13SJung-uk Kim 
967*313a0c13SJung-uk Kim 
968*313a0c13SJung-uk Kim     Info.Count = 0;
969*313a0c13SJung-uk Kim     Info.MaxCount = ACPI_UINT32_MAX;
970*313a0c13SJung-uk Kim 
971*313a0c13SJung-uk Kim     if (CountArg)
972*313a0c13SJung-uk Kim     {
973*313a0c13SJung-uk Kim         Info.MaxCount = ACPI_STRTOUL (CountArg, NULL, 0);
974*313a0c13SJung-uk Kim     }
975*313a0c13SJung-uk Kim 
976*313a0c13SJung-uk Kim     /* Search all nodes in namespace */
977*313a0c13SJung-uk Kim 
978*313a0c13SJung-uk Kim     (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
979*313a0c13SJung-uk Kim                 AcpiDbEvaluateOnePredefinedName, NULL, (void *) &Info, NULL);
980*313a0c13SJung-uk Kim 
981*313a0c13SJung-uk Kim     AcpiOsPrintf ("Evaluated %u predefined names in the namespace\n", Info.Count);
982*313a0c13SJung-uk Kim }
983*313a0c13SJung-uk Kim 
984*313a0c13SJung-uk Kim 
985*313a0c13SJung-uk Kim /*******************************************************************************
986*313a0c13SJung-uk Kim  *
987*313a0c13SJung-uk Kim  * FUNCTION:    AcpiDbEvaluateOnePredefinedName
988*313a0c13SJung-uk Kim  *
989*313a0c13SJung-uk Kim  * PARAMETERS:  Callback from WalkNamespace
990*313a0c13SJung-uk Kim  *
991*313a0c13SJung-uk Kim  * RETURN:      Status
992*313a0c13SJung-uk Kim  *
993*313a0c13SJung-uk Kim  * DESCRIPTION: Batch execution module. Currently only executes predefined
994*313a0c13SJung-uk Kim  *              ACPI names.
995*313a0c13SJung-uk Kim  *
996*313a0c13SJung-uk Kim  ******************************************************************************/
997*313a0c13SJung-uk Kim 
998*313a0c13SJung-uk Kim static ACPI_STATUS
999*313a0c13SJung-uk Kim AcpiDbEvaluateOnePredefinedName (
1000*313a0c13SJung-uk Kim     ACPI_HANDLE             ObjHandle,
1001*313a0c13SJung-uk Kim     UINT32                  NestingLevel,
1002*313a0c13SJung-uk Kim     void                    *Context,
1003*313a0c13SJung-uk Kim     void                    **ReturnValue)
1004*313a0c13SJung-uk Kim {
1005*313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE         *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
1006*313a0c13SJung-uk Kim     ACPI_DB_EXECUTE_WALK        *Info = (ACPI_DB_EXECUTE_WALK *) Context;
1007*313a0c13SJung-uk Kim     char                        *Pathname;
1008*313a0c13SJung-uk Kim     const ACPI_PREDEFINED_INFO  *Predefined;
1009*313a0c13SJung-uk Kim     ACPI_DEVICE_INFO            *ObjInfo;
1010*313a0c13SJung-uk Kim     ACPI_OBJECT_LIST            ParamObjects;
1011*313a0c13SJung-uk Kim     ACPI_OBJECT                 Params[ACPI_METHOD_NUM_ARGS];
1012*313a0c13SJung-uk Kim     ACPI_OBJECT                 *ThisParam;
1013*313a0c13SJung-uk Kim     ACPI_BUFFER                 ReturnObj;
1014*313a0c13SJung-uk Kim     ACPI_STATUS                 Status;
1015*313a0c13SJung-uk Kim     UINT16                      ArgTypeList;
1016*313a0c13SJung-uk Kim     UINT8                       ArgCount;
1017*313a0c13SJung-uk Kim     UINT8                       ArgType;
1018*313a0c13SJung-uk Kim     UINT32                      i;
1019*313a0c13SJung-uk Kim 
1020*313a0c13SJung-uk Kim 
1021*313a0c13SJung-uk Kim     /* The name must be a predefined ACPI name */
1022*313a0c13SJung-uk Kim 
1023*313a0c13SJung-uk Kim     Predefined = AcpiUtMatchPredefinedMethod (Node->Name.Ascii);
1024*313a0c13SJung-uk Kim     if (!Predefined)
1025*313a0c13SJung-uk Kim     {
1026*313a0c13SJung-uk Kim         return (AE_OK);
1027*313a0c13SJung-uk Kim     }
1028*313a0c13SJung-uk Kim 
1029*313a0c13SJung-uk Kim     if (Node->Type == ACPI_TYPE_LOCAL_SCOPE)
1030*313a0c13SJung-uk Kim     {
1031*313a0c13SJung-uk Kim         return (AE_OK);
1032*313a0c13SJung-uk Kim     }
1033*313a0c13SJung-uk Kim 
1034*313a0c13SJung-uk Kim     Pathname = AcpiNsGetExternalPathname (Node);
1035*313a0c13SJung-uk Kim     if (!Pathname)
1036*313a0c13SJung-uk Kim     {
1037*313a0c13SJung-uk Kim         return (AE_OK);
1038*313a0c13SJung-uk Kim     }
1039*313a0c13SJung-uk Kim 
1040*313a0c13SJung-uk Kim     /* Get the object info for number of method parameters */
1041*313a0c13SJung-uk Kim 
1042*313a0c13SJung-uk Kim     Status = AcpiGetObjectInfo (ObjHandle, &ObjInfo);
1043*313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
1044*313a0c13SJung-uk Kim     {
1045*313a0c13SJung-uk Kim         ACPI_FREE (Pathname);
1046*313a0c13SJung-uk Kim         return (Status);
1047*313a0c13SJung-uk Kim     }
1048*313a0c13SJung-uk Kim 
1049*313a0c13SJung-uk Kim     ParamObjects.Count = 0;
1050*313a0c13SJung-uk Kim     ParamObjects.Pointer = NULL;
1051*313a0c13SJung-uk Kim 
1052*313a0c13SJung-uk Kim     if (ObjInfo->Type == ACPI_TYPE_METHOD)
1053*313a0c13SJung-uk Kim     {
1054*313a0c13SJung-uk Kim         /* Setup default parameters (with proper types) */
1055*313a0c13SJung-uk Kim 
1056*313a0c13SJung-uk Kim         ArgTypeList = Predefined->Info.ArgumentList;
1057*313a0c13SJung-uk Kim         ArgCount = METHOD_GET_ARG_COUNT (ArgTypeList);
1058*313a0c13SJung-uk Kim 
1059*313a0c13SJung-uk Kim         /*
1060*313a0c13SJung-uk Kim          * Setup the ACPI-required number of arguments, regardless of what
1061*313a0c13SJung-uk Kim          * the actual method defines. If there is a difference, then the
1062*313a0c13SJung-uk Kim          * method is wrong and a warning will be issued during execution.
1063*313a0c13SJung-uk Kim          */
1064*313a0c13SJung-uk Kim         ThisParam = Params;
1065*313a0c13SJung-uk Kim         for (i = 0; i < ArgCount; i++)
1066*313a0c13SJung-uk Kim         {
1067*313a0c13SJung-uk Kim             ArgType = METHOD_GET_NEXT_TYPE (ArgTypeList);
1068*313a0c13SJung-uk Kim             ThisParam->Type = ArgType;
1069*313a0c13SJung-uk Kim 
1070*313a0c13SJung-uk Kim             switch (ArgType)
1071*313a0c13SJung-uk Kim             {
1072*313a0c13SJung-uk Kim             case ACPI_TYPE_INTEGER:
1073*313a0c13SJung-uk Kim 
1074*313a0c13SJung-uk Kim                 ThisParam->Integer.Value = 1;
1075*313a0c13SJung-uk Kim                 break;
1076*313a0c13SJung-uk Kim 
1077*313a0c13SJung-uk Kim             case ACPI_TYPE_STRING:
1078*313a0c13SJung-uk Kim 
1079*313a0c13SJung-uk Kim                 ThisParam->String.Pointer = "This is the default argument string";
1080*313a0c13SJung-uk Kim                 ThisParam->String.Length = ACPI_STRLEN (ThisParam->String.Pointer);
1081*313a0c13SJung-uk Kim                 break;
1082*313a0c13SJung-uk Kim 
1083*313a0c13SJung-uk Kim             case ACPI_TYPE_BUFFER:
1084*313a0c13SJung-uk Kim 
1085*313a0c13SJung-uk Kim                 ThisParam->Buffer.Pointer = (UINT8 *) Params; /* just a garbage buffer */
1086*313a0c13SJung-uk Kim                 ThisParam->Buffer.Length = 48;
1087*313a0c13SJung-uk Kim                 break;
1088*313a0c13SJung-uk Kim 
1089*313a0c13SJung-uk Kim              case ACPI_TYPE_PACKAGE:
1090*313a0c13SJung-uk Kim 
1091*313a0c13SJung-uk Kim                 ThisParam->Package.Elements = NULL;
1092*313a0c13SJung-uk Kim                 ThisParam->Package.Count = 0;
1093*313a0c13SJung-uk Kim                 break;
1094*313a0c13SJung-uk Kim 
1095*313a0c13SJung-uk Kim            default:
1096*313a0c13SJung-uk Kim 
1097*313a0c13SJung-uk Kim                 AcpiOsPrintf ("%s: Unsupported argument type: %u\n",
1098*313a0c13SJung-uk Kim                     Pathname, ArgType);
1099*313a0c13SJung-uk Kim                 break;
1100*313a0c13SJung-uk Kim             }
1101*313a0c13SJung-uk Kim 
1102*313a0c13SJung-uk Kim             ThisParam++;
1103*313a0c13SJung-uk Kim         }
1104*313a0c13SJung-uk Kim 
1105*313a0c13SJung-uk Kim         ParamObjects.Count = ArgCount;
1106*313a0c13SJung-uk Kim         ParamObjects.Pointer = Params;
1107*313a0c13SJung-uk Kim     }
1108*313a0c13SJung-uk Kim 
1109*313a0c13SJung-uk Kim     ACPI_FREE (ObjInfo);
1110*313a0c13SJung-uk Kim     ReturnObj.Pointer = NULL;
1111*313a0c13SJung-uk Kim     ReturnObj.Length = ACPI_ALLOCATE_BUFFER;
1112*313a0c13SJung-uk Kim 
1113*313a0c13SJung-uk Kim     /* Do the actual method execution */
1114*313a0c13SJung-uk Kim 
1115*313a0c13SJung-uk Kim     AcpiGbl_MethodExecuting = TRUE;
1116*313a0c13SJung-uk Kim 
1117*313a0c13SJung-uk Kim     Status = AcpiEvaluateObject (Node, NULL, &ParamObjects, &ReturnObj);
1118*313a0c13SJung-uk Kim 
1119*313a0c13SJung-uk Kim     AcpiOsPrintf ("%-32s returned %s\n", Pathname, AcpiFormatException (Status));
1120*313a0c13SJung-uk Kim     AcpiGbl_MethodExecuting = FALSE;
1121*313a0c13SJung-uk Kim     ACPI_FREE (Pathname);
1122*313a0c13SJung-uk Kim 
1123*313a0c13SJung-uk Kim     /* Ignore status from method execution */
1124*313a0c13SJung-uk Kim 
1125*313a0c13SJung-uk Kim     Status = AE_OK;
1126*313a0c13SJung-uk Kim 
1127*313a0c13SJung-uk Kim     /* Update count, check if we have executed enough methods */
1128*313a0c13SJung-uk Kim 
1129*313a0c13SJung-uk Kim     Info->Count++;
1130*313a0c13SJung-uk Kim     if (Info->Count >= Info->MaxCount)
1131*313a0c13SJung-uk Kim     {
1132*313a0c13SJung-uk Kim         Status = AE_CTRL_TERMINATE;
1133*313a0c13SJung-uk Kim     }
1134*313a0c13SJung-uk Kim 
1135*313a0c13SJung-uk Kim     return (Status);
1136*313a0c13SJung-uk Kim }
1137*313a0c13SJung-uk Kim 
1138*313a0c13SJung-uk Kim #endif /* ACPI_DEBUGGER */
1139