xref: /freebsd/sys/contrib/dev/acpica/components/debugger/dbtest.c (revision 1c0e1b6da9c3c45f81c75137dddaebc748995afc)
1313a0c13SJung-uk Kim /*******************************************************************************
2313a0c13SJung-uk Kim  *
3313a0c13SJung-uk Kim  * Module Name: dbtest - Various debug-related tests
4313a0c13SJung-uk Kim  *
5313a0c13SJung-uk Kim  ******************************************************************************/
6313a0c13SJung-uk Kim 
7313a0c13SJung-uk Kim /*
8*1c0e1b6dSJung-uk Kim  * Copyright (C) 2000 - 2015, Intel Corp.
9313a0c13SJung-uk Kim  * All rights reserved.
10313a0c13SJung-uk Kim  *
11313a0c13SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
12313a0c13SJung-uk Kim  * modification, are permitted provided that the following conditions
13313a0c13SJung-uk Kim  * are met:
14313a0c13SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
15313a0c13SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
16313a0c13SJung-uk Kim  *    without modification.
17313a0c13SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18313a0c13SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
19313a0c13SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
20313a0c13SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
21313a0c13SJung-uk Kim  *    binary redistribution.
22313a0c13SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
23313a0c13SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
24313a0c13SJung-uk Kim  *    from this software without specific prior written permission.
25313a0c13SJung-uk Kim  *
26313a0c13SJung-uk Kim  * Alternatively, this software may be distributed under the terms of the
27313a0c13SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
28313a0c13SJung-uk Kim  * Software Foundation.
29313a0c13SJung-uk Kim  *
30313a0c13SJung-uk Kim  * NO WARRANTY
31313a0c13SJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32313a0c13SJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33313a0c13SJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34313a0c13SJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35313a0c13SJung-uk Kim  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36313a0c13SJung-uk Kim  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37313a0c13SJung-uk Kim  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38313a0c13SJung-uk Kim  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39313a0c13SJung-uk Kim  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40313a0c13SJung-uk Kim  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41313a0c13SJung-uk Kim  * POSSIBILITY OF SUCH DAMAGES.
42313a0c13SJung-uk Kim  */
43313a0c13SJung-uk Kim 
44313a0c13SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h>
45313a0c13SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h>
46313a0c13SJung-uk Kim #include <contrib/dev/acpica/include/acdebug.h>
47313a0c13SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h>
48313a0c13SJung-uk Kim #include <contrib/dev/acpica/include/acpredef.h>
49313a0c13SJung-uk Kim 
50313a0c13SJung-uk Kim #ifdef ACPI_DEBUGGER
51313a0c13SJung-uk Kim 
52313a0c13SJung-uk Kim #define _COMPONENT          ACPI_CA_DEBUGGER
53313a0c13SJung-uk Kim         ACPI_MODULE_NAME    ("dbtest")
54313a0c13SJung-uk Kim 
55313a0c13SJung-uk Kim 
56313a0c13SJung-uk Kim /* Local prototypes */
57313a0c13SJung-uk Kim 
58313a0c13SJung-uk Kim static void
59313a0c13SJung-uk Kim AcpiDbTestAllObjects (
60313a0c13SJung-uk Kim     void);
61313a0c13SJung-uk Kim 
62313a0c13SJung-uk Kim static ACPI_STATUS
63313a0c13SJung-uk Kim AcpiDbTestOneObject (
64313a0c13SJung-uk Kim     ACPI_HANDLE             ObjHandle,
65313a0c13SJung-uk Kim     UINT32                  NestingLevel,
66313a0c13SJung-uk Kim     void                    *Context,
67313a0c13SJung-uk Kim     void                    **ReturnValue);
68313a0c13SJung-uk Kim 
69313a0c13SJung-uk Kim static ACPI_STATUS
70313a0c13SJung-uk Kim AcpiDbTestIntegerType (
71313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node,
72313a0c13SJung-uk Kim     UINT32                  BitLength);
73313a0c13SJung-uk Kim 
74313a0c13SJung-uk Kim static ACPI_STATUS
75313a0c13SJung-uk Kim AcpiDbTestBufferType (
76313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node,
77313a0c13SJung-uk Kim     UINT32                  BitLength);
78313a0c13SJung-uk Kim 
79313a0c13SJung-uk Kim static ACPI_STATUS
80313a0c13SJung-uk Kim AcpiDbTestStringType (
81313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node,
82313a0c13SJung-uk Kim     UINT32                  ByteLength);
83313a0c13SJung-uk Kim 
84313a0c13SJung-uk Kim static ACPI_STATUS
85313a0c13SJung-uk Kim AcpiDbReadFromObject (
86313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node,
87313a0c13SJung-uk Kim     ACPI_OBJECT_TYPE        ExpectedType,
88313a0c13SJung-uk Kim     ACPI_OBJECT             **Value);
89313a0c13SJung-uk Kim 
90313a0c13SJung-uk Kim static ACPI_STATUS
91313a0c13SJung-uk Kim AcpiDbWriteToObject (
92313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node,
93313a0c13SJung-uk Kim     ACPI_OBJECT             *Value);
94313a0c13SJung-uk Kim 
95313a0c13SJung-uk Kim static void
96313a0c13SJung-uk Kim AcpiDbEvaluateAllPredefinedNames (
97313a0c13SJung-uk Kim     char                    *CountArg);
98313a0c13SJung-uk Kim 
99313a0c13SJung-uk Kim static ACPI_STATUS
100313a0c13SJung-uk Kim AcpiDbEvaluateOnePredefinedName (
101313a0c13SJung-uk Kim     ACPI_HANDLE             ObjHandle,
102313a0c13SJung-uk Kim     UINT32                  NestingLevel,
103313a0c13SJung-uk Kim     void                    *Context,
104313a0c13SJung-uk Kim     void                    **ReturnValue);
105313a0c13SJung-uk Kim 
106313a0c13SJung-uk Kim /*
107313a0c13SJung-uk Kim  * Test subcommands
108313a0c13SJung-uk Kim  */
109313a0c13SJung-uk Kim static ACPI_DB_ARGUMENT_INFO    AcpiDbTestTypes [] =
110313a0c13SJung-uk Kim {
111313a0c13SJung-uk Kim     {"OBJECTS"},
112313a0c13SJung-uk Kim     {"PREDEFINED"},
113313a0c13SJung-uk Kim     {NULL}           /* Must be null terminated */
114313a0c13SJung-uk Kim };
115313a0c13SJung-uk Kim 
116313a0c13SJung-uk Kim #define CMD_TEST_OBJECTS        0
117313a0c13SJung-uk Kim #define CMD_TEST_PREDEFINED     1
118313a0c13SJung-uk Kim 
119313a0c13SJung-uk Kim #define BUFFER_FILL_VALUE       0xFF
120313a0c13SJung-uk Kim 
121313a0c13SJung-uk Kim /*
122313a0c13SJung-uk Kim  * Support for the special debugger read/write control methods.
123313a0c13SJung-uk Kim  * These methods are installed into the current namespace and are
124313a0c13SJung-uk Kim  * used to read and write the various namespace objects. The point
125313a0c13SJung-uk Kim  * is to force the AML interpreter do all of the work.
126313a0c13SJung-uk Kim  */
127313a0c13SJung-uk Kim #define                     ACPI_DB_READ_METHOD     "\\_T98"
128313a0c13SJung-uk Kim #define                     ACPI_DB_WRITE_METHOD    "\\_T99"
129313a0c13SJung-uk Kim 
130313a0c13SJung-uk Kim static ACPI_HANDLE          ReadHandle = NULL;
131313a0c13SJung-uk Kim static ACPI_HANDLE          WriteHandle = NULL;
132313a0c13SJung-uk Kim 
133313a0c13SJung-uk Kim /* ASL Definitions of the debugger read/write control methods */
134313a0c13SJung-uk Kim 
135313a0c13SJung-uk Kim #if 0
136313a0c13SJung-uk Kim DefinitionBlock ("ssdt.aml", "SSDT", 2, "Intel", "DEBUG", 0x00000001)
137313a0c13SJung-uk Kim {
138313a0c13SJung-uk Kim     Method (_T98, 1, NotSerialized)     /* Read */
139313a0c13SJung-uk Kim     {
140313a0c13SJung-uk Kim         Return (DeRefOf (Arg0))
141313a0c13SJung-uk Kim     }
142313a0c13SJung-uk Kim }
143313a0c13SJung-uk Kim DefinitionBlock ("ssdt2.aml", "SSDT", 2, "Intel", "DEBUG", 0x00000001)
144313a0c13SJung-uk Kim {
145313a0c13SJung-uk Kim     Method (_T99, 2, NotSerialized)     /* Write */
146313a0c13SJung-uk Kim     {
147313a0c13SJung-uk Kim         Store (Arg1, Arg0)
148313a0c13SJung-uk Kim     }
149313a0c13SJung-uk Kim }
150313a0c13SJung-uk Kim #endif
151313a0c13SJung-uk Kim 
152313a0c13SJung-uk Kim static unsigned char ReadMethodCode[] =
153313a0c13SJung-uk Kim {
154313a0c13SJung-uk Kim     0x53,0x53,0x44,0x54,0x2E,0x00,0x00,0x00,  /* 00000000    "SSDT...." */
155313a0c13SJung-uk Kim     0x02,0xC9,0x49,0x6E,0x74,0x65,0x6C,0x00,  /* 00000008    "..Intel." */
156313a0c13SJung-uk Kim     0x44,0x45,0x42,0x55,0x47,0x00,0x00,0x00,  /* 00000010    "DEBUG..." */
157313a0c13SJung-uk Kim     0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
158313a0c13SJung-uk Kim     0x18,0x12,0x13,0x20,0x14,0x09,0x5F,0x54,  /* 00000020    "... .._T" */
159313a0c13SJung-uk Kim     0x39,0x38,0x01,0xA4,0x83,0x68             /* 00000028    "98...h"   */
160313a0c13SJung-uk Kim };
161313a0c13SJung-uk Kim 
162313a0c13SJung-uk Kim static unsigned char WriteMethodCode[] =
163313a0c13SJung-uk Kim {
164313a0c13SJung-uk Kim     0x53,0x53,0x44,0x54,0x2E,0x00,0x00,0x00,  /* 00000000    "SSDT...." */
165313a0c13SJung-uk Kim     0x02,0x15,0x49,0x6E,0x74,0x65,0x6C,0x00,  /* 00000008    "..Intel." */
166313a0c13SJung-uk Kim     0x44,0x45,0x42,0x55,0x47,0x00,0x00,0x00,  /* 00000010    "DEBUG..." */
167313a0c13SJung-uk Kim     0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
168313a0c13SJung-uk Kim     0x18,0x12,0x13,0x20,0x14,0x09,0x5F,0x54,  /* 00000020    "... .._T" */
169313a0c13SJung-uk Kim     0x39,0x39,0x02,0x70,0x69,0x68             /* 00000028    "99.pih"   */
170313a0c13SJung-uk Kim };
171313a0c13SJung-uk Kim 
172313a0c13SJung-uk Kim 
173313a0c13SJung-uk Kim /*******************************************************************************
174313a0c13SJung-uk Kim  *
175313a0c13SJung-uk Kim  * FUNCTION:    AcpiDbExecuteTest
176313a0c13SJung-uk Kim  *
177313a0c13SJung-uk Kim  * PARAMETERS:  TypeArg         - Subcommand
178313a0c13SJung-uk Kim  *
179313a0c13SJung-uk Kim  * RETURN:      None
180313a0c13SJung-uk Kim  *
181313a0c13SJung-uk Kim  * DESCRIPTION: Execute various debug tests.
182313a0c13SJung-uk Kim  *
183313a0c13SJung-uk Kim  * Note: Code is prepared for future expansion of the TEST command.
184313a0c13SJung-uk Kim  *
185313a0c13SJung-uk Kim  ******************************************************************************/
186313a0c13SJung-uk Kim 
187313a0c13SJung-uk Kim void
188313a0c13SJung-uk Kim AcpiDbExecuteTest (
189313a0c13SJung-uk Kim     char                    *TypeArg)
190313a0c13SJung-uk Kim {
191313a0c13SJung-uk Kim     UINT32                  Temp;
192313a0c13SJung-uk Kim 
193313a0c13SJung-uk Kim 
194313a0c13SJung-uk Kim     AcpiUtStrupr (TypeArg);
195313a0c13SJung-uk Kim     Temp = AcpiDbMatchArgument (TypeArg, AcpiDbTestTypes);
196313a0c13SJung-uk Kim     if (Temp == ACPI_TYPE_NOT_FOUND)
197313a0c13SJung-uk Kim     {
198313a0c13SJung-uk Kim         AcpiOsPrintf ("Invalid or unsupported argument\n");
199313a0c13SJung-uk Kim         return;
200313a0c13SJung-uk Kim     }
201313a0c13SJung-uk Kim 
202313a0c13SJung-uk Kim     switch (Temp)
203313a0c13SJung-uk Kim     {
204313a0c13SJung-uk Kim     case CMD_TEST_OBJECTS:
205313a0c13SJung-uk Kim 
206313a0c13SJung-uk Kim         AcpiDbTestAllObjects ();
207313a0c13SJung-uk Kim         break;
208313a0c13SJung-uk Kim 
209313a0c13SJung-uk Kim     case CMD_TEST_PREDEFINED:
210313a0c13SJung-uk Kim 
211313a0c13SJung-uk Kim         AcpiDbEvaluateAllPredefinedNames (NULL);
212313a0c13SJung-uk Kim         break;
213313a0c13SJung-uk Kim 
214313a0c13SJung-uk Kim     default:
215313a0c13SJung-uk Kim         break;
216313a0c13SJung-uk Kim     }
217313a0c13SJung-uk Kim }
218313a0c13SJung-uk Kim 
219313a0c13SJung-uk Kim 
220313a0c13SJung-uk Kim /*******************************************************************************
221313a0c13SJung-uk Kim  *
222313a0c13SJung-uk Kim  * FUNCTION:    AcpiDbTestAllObjects
223313a0c13SJung-uk Kim  *
224313a0c13SJung-uk Kim  * PARAMETERS:  None
225313a0c13SJung-uk Kim  *
226313a0c13SJung-uk Kim  * RETURN:      None
227313a0c13SJung-uk Kim  *
228313a0c13SJung-uk Kim  * DESCRIPTION: This test implements the OBJECTS subcommand. It exercises the
229313a0c13SJung-uk Kim  *              namespace by reading/writing/comparing all data objects such
230313a0c13SJung-uk Kim  *              as integers, strings, buffers, fields, buffer fields, etc.
231313a0c13SJung-uk Kim  *
232313a0c13SJung-uk Kim  ******************************************************************************/
233313a0c13SJung-uk Kim 
234313a0c13SJung-uk Kim static void
235313a0c13SJung-uk Kim AcpiDbTestAllObjects (
236313a0c13SJung-uk Kim     void)
237313a0c13SJung-uk Kim {
238313a0c13SJung-uk Kim     ACPI_STATUS             Status;
239313a0c13SJung-uk Kim 
240313a0c13SJung-uk Kim 
241313a0c13SJung-uk Kim     /* Install the debugger read-object control method if necessary */
242313a0c13SJung-uk Kim 
243313a0c13SJung-uk Kim     if (!ReadHandle)
244313a0c13SJung-uk Kim     {
245313a0c13SJung-uk Kim         Status = AcpiInstallMethod (ReadMethodCode);
246313a0c13SJung-uk Kim         if (ACPI_FAILURE (Status))
247313a0c13SJung-uk Kim         {
248313a0c13SJung-uk Kim             AcpiOsPrintf ("%s, Could not install debugger read method\n",
249313a0c13SJung-uk Kim                 AcpiFormatException (Status));
250313a0c13SJung-uk Kim             return;
251313a0c13SJung-uk Kim         }
252313a0c13SJung-uk Kim 
253313a0c13SJung-uk Kim         Status = AcpiGetHandle (NULL, ACPI_DB_READ_METHOD, &ReadHandle);
254313a0c13SJung-uk Kim         if (ACPI_FAILURE (Status))
255313a0c13SJung-uk Kim         {
256313a0c13SJung-uk Kim             AcpiOsPrintf ("Could not obtain handle for debug method %s\n",
257313a0c13SJung-uk Kim                 ACPI_DB_READ_METHOD);
258313a0c13SJung-uk Kim             return;
259313a0c13SJung-uk Kim         }
260313a0c13SJung-uk Kim     }
261313a0c13SJung-uk Kim 
262313a0c13SJung-uk Kim     /* Install the debugger write-object control method if necessary */
263313a0c13SJung-uk Kim 
264313a0c13SJung-uk Kim     if (!WriteHandle)
265313a0c13SJung-uk Kim     {
266313a0c13SJung-uk Kim         Status = AcpiInstallMethod (WriteMethodCode);
267313a0c13SJung-uk Kim         if (ACPI_FAILURE (Status))
268313a0c13SJung-uk Kim         {
269313a0c13SJung-uk Kim             AcpiOsPrintf ("%s, Could not install debugger write method\n",
270313a0c13SJung-uk Kim                 AcpiFormatException (Status));
271313a0c13SJung-uk Kim             return;
272313a0c13SJung-uk Kim         }
273313a0c13SJung-uk Kim 
274313a0c13SJung-uk Kim         Status = AcpiGetHandle (NULL, ACPI_DB_WRITE_METHOD, &WriteHandle);
275313a0c13SJung-uk Kim         if (ACPI_FAILURE (Status))
276313a0c13SJung-uk Kim         {
277313a0c13SJung-uk Kim             AcpiOsPrintf ("Could not obtain handle for debug method %s\n",
278313a0c13SJung-uk Kim                 ACPI_DB_WRITE_METHOD);
279313a0c13SJung-uk Kim             return;
280313a0c13SJung-uk Kim         }
281313a0c13SJung-uk Kim     }
282313a0c13SJung-uk Kim 
283313a0c13SJung-uk Kim     /* Walk the entire namespace, testing each supported named data object */
284313a0c13SJung-uk Kim 
285313a0c13SJung-uk Kim     (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
286313a0c13SJung-uk Kim                 ACPI_UINT32_MAX, AcpiDbTestOneObject, NULL, NULL, NULL);
287313a0c13SJung-uk Kim }
288313a0c13SJung-uk Kim 
289313a0c13SJung-uk Kim 
290313a0c13SJung-uk Kim /*******************************************************************************
291313a0c13SJung-uk Kim  *
292313a0c13SJung-uk Kim  * FUNCTION:    AcpiDbTestOneObject
293313a0c13SJung-uk Kim  *
294313a0c13SJung-uk Kim  * PARAMETERS:  ACPI_WALK_CALLBACK
295313a0c13SJung-uk Kim  *
296313a0c13SJung-uk Kim  * RETURN:      Status
297313a0c13SJung-uk Kim  *
298313a0c13SJung-uk Kim  * DESCRIPTION: Test one namespace object. Supported types are Integer,
299313a0c13SJung-uk Kim  *              String, Buffer, BufferField, and FieldUnit. All other object
300313a0c13SJung-uk Kim  *              types are simply ignored.
301313a0c13SJung-uk Kim  *
302313a0c13SJung-uk Kim  *              Note: Support for Packages is not implemented.
303313a0c13SJung-uk Kim  *
304313a0c13SJung-uk Kim  ******************************************************************************/
305313a0c13SJung-uk Kim 
306313a0c13SJung-uk Kim static ACPI_STATUS
307313a0c13SJung-uk Kim AcpiDbTestOneObject (
308313a0c13SJung-uk Kim     ACPI_HANDLE             ObjHandle,
309313a0c13SJung-uk Kim     UINT32                  NestingLevel,
310313a0c13SJung-uk Kim     void                    *Context,
311313a0c13SJung-uk Kim     void                    **ReturnValue)
312313a0c13SJung-uk Kim {
313313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node;
314313a0c13SJung-uk Kim     ACPI_OPERAND_OBJECT     *ObjDesc;
315313a0c13SJung-uk Kim     ACPI_OPERAND_OBJECT     *RegionObj;
316313a0c13SJung-uk Kim     ACPI_OBJECT_TYPE        LocalType;
317313a0c13SJung-uk Kim     UINT32                  BitLength = 0;
318313a0c13SJung-uk Kim     UINT32                  ByteLength = 0;
319313a0c13SJung-uk Kim     ACPI_STATUS             Status = AE_OK;
320313a0c13SJung-uk Kim 
321313a0c13SJung-uk Kim 
322313a0c13SJung-uk Kim     Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjHandle);
323313a0c13SJung-uk Kim     ObjDesc = Node->Object;
324313a0c13SJung-uk Kim 
325313a0c13SJung-uk Kim     /*
326313a0c13SJung-uk Kim      * For the supported types, get the actual bit length or
327313a0c13SJung-uk Kim      * byte length. Map the type to one of Integer/String/Buffer.
328313a0c13SJung-uk Kim      */
329313a0c13SJung-uk Kim     switch (Node->Type)
330313a0c13SJung-uk Kim     {
331313a0c13SJung-uk Kim     case ACPI_TYPE_INTEGER:
332313a0c13SJung-uk Kim 
333313a0c13SJung-uk Kim         /* Integer width is either 32 or 64 */
334313a0c13SJung-uk Kim 
335313a0c13SJung-uk Kim         LocalType = ACPI_TYPE_INTEGER;
336313a0c13SJung-uk Kim         BitLength = AcpiGbl_IntegerBitWidth;
337313a0c13SJung-uk Kim         break;
338313a0c13SJung-uk Kim 
339313a0c13SJung-uk Kim     case ACPI_TYPE_STRING:
340313a0c13SJung-uk Kim 
341313a0c13SJung-uk Kim         LocalType = ACPI_TYPE_STRING;
342313a0c13SJung-uk Kim         ByteLength = ObjDesc->String.Length;
343313a0c13SJung-uk Kim         break;
344313a0c13SJung-uk Kim 
345313a0c13SJung-uk Kim     case ACPI_TYPE_BUFFER:
346313a0c13SJung-uk Kim 
347313a0c13SJung-uk Kim         LocalType = ACPI_TYPE_BUFFER;
348313a0c13SJung-uk Kim         ByteLength = ObjDesc->Buffer.Length;
349313a0c13SJung-uk Kim         BitLength = ByteLength * 8;
350313a0c13SJung-uk Kim         break;
351313a0c13SJung-uk Kim 
352313a0c13SJung-uk Kim     case ACPI_TYPE_FIELD_UNIT:
353313a0c13SJung-uk Kim     case ACPI_TYPE_BUFFER_FIELD:
354313a0c13SJung-uk Kim     case ACPI_TYPE_LOCAL_REGION_FIELD:
355313a0c13SJung-uk Kim     case ACPI_TYPE_LOCAL_INDEX_FIELD:
356313a0c13SJung-uk Kim     case ACPI_TYPE_LOCAL_BANK_FIELD:
357313a0c13SJung-uk Kim 
358313a0c13SJung-uk Kim         LocalType = ACPI_TYPE_INTEGER;
359313a0c13SJung-uk Kim         if (ObjDesc)
360313a0c13SJung-uk Kim         {
361313a0c13SJung-uk Kim             /*
362313a0c13SJung-uk Kim              * Returned object will be a Buffer if the field length
363313a0c13SJung-uk Kim              * is larger than the size of an Integer (32 or 64 bits
364313a0c13SJung-uk Kim              * depending on the DSDT version).
365313a0c13SJung-uk Kim              */
366313a0c13SJung-uk Kim             BitLength = ObjDesc->CommonField.BitLength;
367313a0c13SJung-uk Kim             ByteLength = ACPI_ROUND_BITS_UP_TO_BYTES (BitLength);
368313a0c13SJung-uk Kim             if (BitLength > AcpiGbl_IntegerBitWidth)
369313a0c13SJung-uk Kim             {
370313a0c13SJung-uk Kim                 LocalType = ACPI_TYPE_BUFFER;
371313a0c13SJung-uk Kim             }
372313a0c13SJung-uk Kim         }
373313a0c13SJung-uk Kim         break;
374313a0c13SJung-uk Kim 
375313a0c13SJung-uk Kim     default:
376313a0c13SJung-uk Kim 
377313a0c13SJung-uk Kim         /* Ignore all other types */
378313a0c13SJung-uk Kim 
379313a0c13SJung-uk Kim         return (AE_OK);
380313a0c13SJung-uk Kim     }
381313a0c13SJung-uk Kim 
382313a0c13SJung-uk Kim     /* Emit the common prefix: Type:Name */
383313a0c13SJung-uk Kim 
384313a0c13SJung-uk Kim     AcpiOsPrintf ("%14s: %4.4s",
385313a0c13SJung-uk Kim         AcpiUtGetTypeName (Node->Type), Node->Name.Ascii);
386313a0c13SJung-uk Kim     if (!ObjDesc)
387313a0c13SJung-uk Kim     {
388313a0c13SJung-uk Kim         AcpiOsPrintf (" Ignoring, no attached object\n");
389313a0c13SJung-uk Kim         return (AE_OK);
390313a0c13SJung-uk Kim     }
391313a0c13SJung-uk Kim 
392313a0c13SJung-uk Kim     /*
393313a0c13SJung-uk Kim      * Check for unsupported region types. Note: AcpiExec simulates
394313a0c13SJung-uk Kim      * access to SystemMemory, SystemIO, PCI_Config, and EC.
395313a0c13SJung-uk Kim      */
396313a0c13SJung-uk Kim     switch (Node->Type)
397313a0c13SJung-uk Kim     {
398313a0c13SJung-uk Kim     case ACPI_TYPE_LOCAL_REGION_FIELD:
399313a0c13SJung-uk Kim 
400313a0c13SJung-uk Kim         RegionObj = ObjDesc->Field.RegionObj;
401313a0c13SJung-uk Kim         switch (RegionObj->Region.SpaceId)
402313a0c13SJung-uk Kim         {
403313a0c13SJung-uk Kim         case ACPI_ADR_SPACE_SYSTEM_MEMORY:
404313a0c13SJung-uk Kim         case ACPI_ADR_SPACE_SYSTEM_IO:
405313a0c13SJung-uk Kim         case ACPI_ADR_SPACE_PCI_CONFIG:
406313a0c13SJung-uk Kim         case ACPI_ADR_SPACE_EC:
407313a0c13SJung-uk Kim 
408313a0c13SJung-uk Kim             break;
409313a0c13SJung-uk Kim 
410313a0c13SJung-uk Kim         default:
411313a0c13SJung-uk Kim 
412313a0c13SJung-uk Kim             AcpiOsPrintf ("      %s space is not supported [%4.4s]\n",
413313a0c13SJung-uk Kim                 AcpiUtGetRegionName (RegionObj->Region.SpaceId),
414313a0c13SJung-uk Kim                 RegionObj->Region.Node->Name.Ascii);
415313a0c13SJung-uk Kim             return (AE_OK);
416313a0c13SJung-uk Kim         }
417313a0c13SJung-uk Kim         break;
418313a0c13SJung-uk Kim 
419313a0c13SJung-uk Kim     default:
420313a0c13SJung-uk Kim         break;
421313a0c13SJung-uk Kim     }
422313a0c13SJung-uk Kim 
423313a0c13SJung-uk Kim     /* At this point, we have resolved the object to one of the major types */
424313a0c13SJung-uk Kim 
425313a0c13SJung-uk Kim     switch (LocalType)
426313a0c13SJung-uk Kim     {
427313a0c13SJung-uk Kim     case ACPI_TYPE_INTEGER:
428313a0c13SJung-uk Kim 
429313a0c13SJung-uk Kim         Status = AcpiDbTestIntegerType (Node, BitLength);
430313a0c13SJung-uk Kim         break;
431313a0c13SJung-uk Kim 
432313a0c13SJung-uk Kim     case ACPI_TYPE_STRING:
433313a0c13SJung-uk Kim 
434313a0c13SJung-uk Kim         Status = AcpiDbTestStringType (Node, ByteLength);
435313a0c13SJung-uk Kim         break;
436313a0c13SJung-uk Kim 
437313a0c13SJung-uk Kim     case ACPI_TYPE_BUFFER:
438313a0c13SJung-uk Kim 
439313a0c13SJung-uk Kim         Status = AcpiDbTestBufferType (Node, BitLength);
440313a0c13SJung-uk Kim         break;
441313a0c13SJung-uk Kim 
442313a0c13SJung-uk Kim     default:
443313a0c13SJung-uk Kim 
444313a0c13SJung-uk Kim         AcpiOsPrintf (" Ignoring, type not implemented (%2.2X)",
445313a0c13SJung-uk Kim             LocalType);
446313a0c13SJung-uk Kim         break;
447313a0c13SJung-uk Kim     }
448313a0c13SJung-uk Kim 
449313a0c13SJung-uk Kim     switch (Node->Type)
450313a0c13SJung-uk Kim     {
451313a0c13SJung-uk Kim     case ACPI_TYPE_LOCAL_REGION_FIELD:
452313a0c13SJung-uk Kim 
453313a0c13SJung-uk Kim         RegionObj = ObjDesc->Field.RegionObj;
454313a0c13SJung-uk Kim         AcpiOsPrintf (" (%s)",
455313a0c13SJung-uk Kim             AcpiUtGetRegionName (RegionObj->Region.SpaceId));
456313a0c13SJung-uk Kim         break;
457313a0c13SJung-uk Kim 
458313a0c13SJung-uk Kim     default:
459313a0c13SJung-uk Kim         break;
460313a0c13SJung-uk Kim     }
461313a0c13SJung-uk Kim 
462313a0c13SJung-uk Kim     AcpiOsPrintf ("\n");
463313a0c13SJung-uk Kim     return (Status);
464313a0c13SJung-uk Kim }
465313a0c13SJung-uk Kim 
466313a0c13SJung-uk Kim 
467313a0c13SJung-uk Kim /*******************************************************************************
468313a0c13SJung-uk Kim  *
469313a0c13SJung-uk Kim  * FUNCTION:    AcpiDbTestIntegerType
470313a0c13SJung-uk Kim  *
471313a0c13SJung-uk Kim  * PARAMETERS:  Node                - Parent NS node for the object
472313a0c13SJung-uk Kim  *              BitLength           - Actual length of the object. Used for
473313a0c13SJung-uk Kim  *                                    support of arbitrary length FieldUnit
474313a0c13SJung-uk Kim  *                                    and BufferField objects.
475313a0c13SJung-uk Kim  *
476313a0c13SJung-uk Kim  * RETURN:      Status
477313a0c13SJung-uk Kim  *
478313a0c13SJung-uk Kim  * DESCRIPTION: Test read/write for an Integer-valued object. Performs a
479313a0c13SJung-uk Kim  *              write/read/compare of an arbitrary new value, then performs
480313a0c13SJung-uk Kim  *              a write/read/compare of the original value.
481313a0c13SJung-uk Kim  *
482313a0c13SJung-uk Kim  ******************************************************************************/
483313a0c13SJung-uk Kim 
484313a0c13SJung-uk Kim static ACPI_STATUS
485313a0c13SJung-uk Kim AcpiDbTestIntegerType (
486313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node,
487313a0c13SJung-uk Kim     UINT32                  BitLength)
488313a0c13SJung-uk Kim {
489313a0c13SJung-uk Kim     ACPI_OBJECT             *Temp1 = NULL;
490313a0c13SJung-uk Kim     ACPI_OBJECT             *Temp2 = NULL;
491313a0c13SJung-uk Kim     ACPI_OBJECT             *Temp3 = NULL;
492313a0c13SJung-uk Kim     ACPI_OBJECT             WriteValue;
493313a0c13SJung-uk Kim     UINT64                  ValueToWrite;
494313a0c13SJung-uk Kim     ACPI_STATUS             Status;
495313a0c13SJung-uk Kim 
496313a0c13SJung-uk Kim 
497313a0c13SJung-uk Kim     if (BitLength > 64)
498313a0c13SJung-uk Kim     {
499313a0c13SJung-uk Kim         AcpiOsPrintf (" Invalid length for an Integer: %u", BitLength);
500313a0c13SJung-uk Kim         return (AE_OK);
501313a0c13SJung-uk Kim     }
502313a0c13SJung-uk Kim 
503313a0c13SJung-uk Kim     /* Read the original value */
504313a0c13SJung-uk Kim 
505313a0c13SJung-uk Kim     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_INTEGER, &Temp1);
506313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
507313a0c13SJung-uk Kim     {
508313a0c13SJung-uk Kim         return (Status);
509313a0c13SJung-uk Kim     }
510313a0c13SJung-uk Kim 
511313a0c13SJung-uk Kim     AcpiOsPrintf (" (%4.4X/%3.3X) %8.8X%8.8X",
512313a0c13SJung-uk Kim         BitLength, ACPI_ROUND_BITS_UP_TO_BYTES (BitLength),
513313a0c13SJung-uk Kim         ACPI_FORMAT_UINT64 (Temp1->Integer.Value));
514313a0c13SJung-uk Kim 
515313a0c13SJung-uk Kim     ValueToWrite = ACPI_UINT64_MAX >> (64 - BitLength);
516313a0c13SJung-uk Kim     if (Temp1->Integer.Value == ValueToWrite)
517313a0c13SJung-uk Kim     {
518313a0c13SJung-uk Kim         ValueToWrite = 0;
519313a0c13SJung-uk Kim     }
520313a0c13SJung-uk Kim 
521313a0c13SJung-uk Kim     /* Write a new value */
522313a0c13SJung-uk Kim 
523313a0c13SJung-uk Kim     WriteValue.Type = ACPI_TYPE_INTEGER;
524313a0c13SJung-uk Kim     WriteValue.Integer.Value = ValueToWrite;
525313a0c13SJung-uk Kim     Status = AcpiDbWriteToObject (Node, &WriteValue);
526313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
527313a0c13SJung-uk Kim     {
528313a0c13SJung-uk Kim         goto Exit;
529313a0c13SJung-uk Kim     }
530313a0c13SJung-uk Kim 
531313a0c13SJung-uk Kim     /* Ensure that we can read back the new value */
532313a0c13SJung-uk Kim 
533313a0c13SJung-uk Kim     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_INTEGER, &Temp2);
534313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
535313a0c13SJung-uk Kim     {
536313a0c13SJung-uk Kim         goto Exit;
537313a0c13SJung-uk Kim     }
538313a0c13SJung-uk Kim 
539313a0c13SJung-uk Kim     if (Temp2->Integer.Value != ValueToWrite)
540313a0c13SJung-uk Kim     {
541313a0c13SJung-uk Kim         AcpiOsPrintf (" MISMATCH 2: %8.8X%8.8X, expecting %8.8X%8.8X",
542313a0c13SJung-uk Kim             ACPI_FORMAT_UINT64 (Temp2->Integer.Value),
543313a0c13SJung-uk Kim             ACPI_FORMAT_UINT64 (ValueToWrite));
544313a0c13SJung-uk Kim     }
545313a0c13SJung-uk Kim 
546313a0c13SJung-uk Kim     /* Write back the original value */
547313a0c13SJung-uk Kim 
548313a0c13SJung-uk Kim     WriteValue.Integer.Value = Temp1->Integer.Value;
549313a0c13SJung-uk Kim     Status = AcpiDbWriteToObject (Node, &WriteValue);
550313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
551313a0c13SJung-uk Kim     {
552313a0c13SJung-uk Kim         goto Exit;
553313a0c13SJung-uk Kim     }
554313a0c13SJung-uk Kim 
555313a0c13SJung-uk Kim     /* Ensure that we can read back the original value */
556313a0c13SJung-uk Kim 
557313a0c13SJung-uk Kim     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_INTEGER, &Temp3);
558313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
559313a0c13SJung-uk Kim     {
560313a0c13SJung-uk Kim         goto Exit;
561313a0c13SJung-uk Kim     }
562313a0c13SJung-uk Kim 
563313a0c13SJung-uk Kim     if (Temp3->Integer.Value != Temp1->Integer.Value)
564313a0c13SJung-uk Kim     {
565313a0c13SJung-uk Kim         AcpiOsPrintf (" MISMATCH 3: %8.8X%8.8X, expecting %8.8X%8.8X",
566313a0c13SJung-uk Kim             ACPI_FORMAT_UINT64 (Temp3->Integer.Value),
567313a0c13SJung-uk Kim             ACPI_FORMAT_UINT64 (Temp1->Integer.Value));
568313a0c13SJung-uk Kim     }
569313a0c13SJung-uk Kim 
570313a0c13SJung-uk Kim Exit:
571313a0c13SJung-uk Kim     if (Temp1) {AcpiOsFree (Temp1);}
572313a0c13SJung-uk Kim     if (Temp2) {AcpiOsFree (Temp2);}
573313a0c13SJung-uk Kim     if (Temp3) {AcpiOsFree (Temp3);}
574313a0c13SJung-uk Kim     return (AE_OK);
575313a0c13SJung-uk Kim }
576313a0c13SJung-uk Kim 
577313a0c13SJung-uk Kim 
578313a0c13SJung-uk Kim /*******************************************************************************
579313a0c13SJung-uk Kim  *
580313a0c13SJung-uk Kim  * FUNCTION:    AcpiDbTestBufferType
581313a0c13SJung-uk Kim  *
582313a0c13SJung-uk Kim  * PARAMETERS:  Node                - Parent NS node for the object
583313a0c13SJung-uk Kim  *              BitLength           - Actual length of the object.
584313a0c13SJung-uk Kim  *
585313a0c13SJung-uk Kim  * RETURN:      Status
586313a0c13SJung-uk Kim  *
587313a0c13SJung-uk Kim  * DESCRIPTION: Test read/write for an Buffer-valued object. Performs a
588313a0c13SJung-uk Kim  *              write/read/compare of an arbitrary new value, then performs
589313a0c13SJung-uk Kim  *              a write/read/compare of the original value.
590313a0c13SJung-uk Kim  *
591313a0c13SJung-uk Kim  ******************************************************************************/
592313a0c13SJung-uk Kim 
593313a0c13SJung-uk Kim static ACPI_STATUS
594313a0c13SJung-uk Kim AcpiDbTestBufferType (
595313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node,
596313a0c13SJung-uk Kim     UINT32                  BitLength)
597313a0c13SJung-uk Kim {
598313a0c13SJung-uk Kim     ACPI_OBJECT             *Temp1 = NULL;
599313a0c13SJung-uk Kim     ACPI_OBJECT             *Temp2 = NULL;
600313a0c13SJung-uk Kim     ACPI_OBJECT             *Temp3 = NULL;
601313a0c13SJung-uk Kim     UINT8                   *Buffer;
602313a0c13SJung-uk Kim     ACPI_OBJECT             WriteValue;
603313a0c13SJung-uk Kim     ACPI_STATUS             Status;
604313a0c13SJung-uk Kim     UINT32                  ByteLength;
605313a0c13SJung-uk Kim     UINT32                  i;
606313a0c13SJung-uk Kim     UINT8                   ExtraBits;
607313a0c13SJung-uk Kim 
608313a0c13SJung-uk Kim 
609313a0c13SJung-uk Kim     ByteLength = ACPI_ROUND_BITS_UP_TO_BYTES (BitLength);
610313a0c13SJung-uk Kim     if (ByteLength == 0)
611313a0c13SJung-uk Kim     {
612313a0c13SJung-uk Kim         AcpiOsPrintf (" Ignoring zero length buffer");
613313a0c13SJung-uk Kim         return (AE_OK);
614313a0c13SJung-uk Kim     }
615313a0c13SJung-uk Kim 
616313a0c13SJung-uk Kim     /* Allocate a local buffer */
617313a0c13SJung-uk Kim 
618313a0c13SJung-uk Kim     Buffer = ACPI_ALLOCATE_ZEROED (ByteLength);
619313a0c13SJung-uk Kim     if (!Buffer)
620313a0c13SJung-uk Kim     {
621313a0c13SJung-uk Kim         return (AE_NO_MEMORY);
622313a0c13SJung-uk Kim     }
623313a0c13SJung-uk Kim 
624313a0c13SJung-uk Kim     /* Read the original value */
625313a0c13SJung-uk Kim 
626313a0c13SJung-uk Kim     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_BUFFER, &Temp1);
627313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
628313a0c13SJung-uk Kim     {
629313a0c13SJung-uk Kim         goto Exit;
630313a0c13SJung-uk Kim     }
631313a0c13SJung-uk Kim 
632313a0c13SJung-uk Kim     /* Emit a few bytes of the buffer */
633313a0c13SJung-uk Kim 
634313a0c13SJung-uk Kim     AcpiOsPrintf (" (%4.4X/%3.3X)", BitLength, Temp1->Buffer.Length);
635313a0c13SJung-uk Kim     for (i = 0; ((i < 4) && (i < ByteLength)); i++)
636313a0c13SJung-uk Kim     {
637313a0c13SJung-uk Kim         AcpiOsPrintf (" %2.2X", Temp1->Buffer.Pointer[i]);
638313a0c13SJung-uk Kim     }
639313a0c13SJung-uk Kim     AcpiOsPrintf ("...  ");
640313a0c13SJung-uk Kim 
641313a0c13SJung-uk Kim     /*
642313a0c13SJung-uk Kim      * Write a new value.
643313a0c13SJung-uk Kim      *
644313a0c13SJung-uk Kim      * Handle possible extra bits at the end of the buffer. Can
645313a0c13SJung-uk Kim      * happen for FieldUnits larger than an integer, but the bit
646313a0c13SJung-uk Kim      * count is not an integral number of bytes. Zero out the
647313a0c13SJung-uk Kim      * unused bits.
648313a0c13SJung-uk Kim      */
649313a0c13SJung-uk Kim     ACPI_MEMSET (Buffer, BUFFER_FILL_VALUE, ByteLength);
650313a0c13SJung-uk Kim     ExtraBits = BitLength % 8;
651313a0c13SJung-uk Kim     if (ExtraBits)
652313a0c13SJung-uk Kim     {
653313a0c13SJung-uk Kim         Buffer [ByteLength - 1] = ACPI_MASK_BITS_ABOVE (ExtraBits);
654313a0c13SJung-uk Kim     }
655313a0c13SJung-uk Kim 
656313a0c13SJung-uk Kim     WriteValue.Type = ACPI_TYPE_BUFFER;
657313a0c13SJung-uk Kim     WriteValue.Buffer.Length = ByteLength;
658313a0c13SJung-uk Kim     WriteValue.Buffer.Pointer = Buffer;
659313a0c13SJung-uk Kim 
660313a0c13SJung-uk Kim     Status = AcpiDbWriteToObject (Node, &WriteValue);
661313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
662313a0c13SJung-uk Kim     {
663313a0c13SJung-uk Kim         goto Exit;
664313a0c13SJung-uk Kim     }
665313a0c13SJung-uk Kim 
666313a0c13SJung-uk Kim     /* Ensure that we can read back the new value */
667313a0c13SJung-uk Kim 
668313a0c13SJung-uk Kim     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_BUFFER, &Temp2);
669313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
670313a0c13SJung-uk Kim     {
671313a0c13SJung-uk Kim         goto Exit;
672313a0c13SJung-uk Kim     }
673313a0c13SJung-uk Kim 
674313a0c13SJung-uk Kim     if (ACPI_MEMCMP (Temp2->Buffer.Pointer, Buffer, ByteLength))
675313a0c13SJung-uk Kim     {
676313a0c13SJung-uk Kim         AcpiOsPrintf (" MISMATCH 2: New buffer value");
677313a0c13SJung-uk Kim     }
678313a0c13SJung-uk Kim 
679313a0c13SJung-uk Kim     /* Write back the original value */
680313a0c13SJung-uk Kim 
681313a0c13SJung-uk Kim     WriteValue.Buffer.Length = ByteLength;
682313a0c13SJung-uk Kim     WriteValue.Buffer.Pointer = Temp1->Buffer.Pointer;
683313a0c13SJung-uk Kim 
684313a0c13SJung-uk Kim     Status = AcpiDbWriteToObject (Node, &WriteValue);
685313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
686313a0c13SJung-uk Kim     {
687313a0c13SJung-uk Kim         goto Exit;
688313a0c13SJung-uk Kim     }
689313a0c13SJung-uk Kim 
690313a0c13SJung-uk Kim     /* Ensure that we can read back the original value */
691313a0c13SJung-uk Kim 
692313a0c13SJung-uk Kim     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_BUFFER, &Temp3);
693313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
694313a0c13SJung-uk Kim     {
695313a0c13SJung-uk Kim         goto Exit;
696313a0c13SJung-uk Kim     }
697313a0c13SJung-uk Kim 
698313a0c13SJung-uk Kim     if (ACPI_MEMCMP (Temp1->Buffer.Pointer, Temp3->Buffer.Pointer, ByteLength))
699313a0c13SJung-uk Kim     {
700313a0c13SJung-uk Kim         AcpiOsPrintf (" MISMATCH 3: While restoring original buffer");
701313a0c13SJung-uk Kim     }
702313a0c13SJung-uk Kim 
703313a0c13SJung-uk Kim Exit:
704313a0c13SJung-uk Kim     ACPI_FREE (Buffer);
705313a0c13SJung-uk Kim     if (Temp1) {AcpiOsFree (Temp1);}
706313a0c13SJung-uk Kim     if (Temp2) {AcpiOsFree (Temp2);}
707313a0c13SJung-uk Kim     if (Temp3) {AcpiOsFree (Temp3);}
708313a0c13SJung-uk Kim     return (Status);
709313a0c13SJung-uk Kim }
710313a0c13SJung-uk Kim 
711313a0c13SJung-uk Kim 
712313a0c13SJung-uk Kim /*******************************************************************************
713313a0c13SJung-uk Kim  *
714313a0c13SJung-uk Kim  * FUNCTION:    AcpiDbTestStringType
715313a0c13SJung-uk Kim  *
716313a0c13SJung-uk Kim  * PARAMETERS:  Node                - Parent NS node for the object
717313a0c13SJung-uk Kim  *              ByteLength          - Actual length of the object.
718313a0c13SJung-uk Kim  *
719313a0c13SJung-uk Kim  * RETURN:      Status
720313a0c13SJung-uk Kim  *
721313a0c13SJung-uk Kim  * DESCRIPTION: Test read/write for an String-valued object. Performs a
722313a0c13SJung-uk Kim  *              write/read/compare of an arbitrary new value, then performs
723313a0c13SJung-uk Kim  *              a write/read/compare of the original value.
724313a0c13SJung-uk Kim  *
725313a0c13SJung-uk Kim  ******************************************************************************/
726313a0c13SJung-uk Kim 
727313a0c13SJung-uk Kim static ACPI_STATUS
728313a0c13SJung-uk Kim AcpiDbTestStringType (
729313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node,
730313a0c13SJung-uk Kim     UINT32                  ByteLength)
731313a0c13SJung-uk Kim {
732313a0c13SJung-uk Kim     ACPI_OBJECT             *Temp1 = NULL;
733313a0c13SJung-uk Kim     ACPI_OBJECT             *Temp2 = NULL;
734313a0c13SJung-uk Kim     ACPI_OBJECT             *Temp3 = NULL;
735313a0c13SJung-uk Kim     char                    *ValueToWrite = "Test String from AML Debugger";
736313a0c13SJung-uk Kim     ACPI_OBJECT             WriteValue;
737313a0c13SJung-uk Kim     ACPI_STATUS             Status;
738313a0c13SJung-uk Kim 
739313a0c13SJung-uk Kim 
740313a0c13SJung-uk Kim     /* Read the original value */
741313a0c13SJung-uk Kim 
742313a0c13SJung-uk Kim     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_STRING, &Temp1);
743313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
744313a0c13SJung-uk Kim     {
745313a0c13SJung-uk Kim         return (Status);
746313a0c13SJung-uk Kim     }
747313a0c13SJung-uk Kim 
748313a0c13SJung-uk Kim     AcpiOsPrintf (" (%4.4X/%3.3X) \"%s\"", (Temp1->String.Length * 8),
749313a0c13SJung-uk Kim         Temp1->String.Length, Temp1->String.Pointer);
750313a0c13SJung-uk Kim 
751313a0c13SJung-uk Kim     /* Write a new value */
752313a0c13SJung-uk Kim 
753313a0c13SJung-uk Kim     WriteValue.Type = ACPI_TYPE_STRING;
754313a0c13SJung-uk Kim     WriteValue.String.Length = ACPI_STRLEN (ValueToWrite);
755313a0c13SJung-uk Kim     WriteValue.String.Pointer = ValueToWrite;
756313a0c13SJung-uk Kim 
757313a0c13SJung-uk Kim     Status = AcpiDbWriteToObject (Node, &WriteValue);
758313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
759313a0c13SJung-uk Kim     {
760313a0c13SJung-uk Kim         goto Exit;
761313a0c13SJung-uk Kim     }
762313a0c13SJung-uk Kim 
763313a0c13SJung-uk Kim     /* Ensure that we can read back the new value */
764313a0c13SJung-uk Kim 
765313a0c13SJung-uk Kim     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_STRING, &Temp2);
766313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
767313a0c13SJung-uk Kim     {
768313a0c13SJung-uk Kim         goto Exit;
769313a0c13SJung-uk Kim     }
770313a0c13SJung-uk Kim 
771313a0c13SJung-uk Kim     if (ACPI_STRCMP (Temp2->String.Pointer, ValueToWrite))
772313a0c13SJung-uk Kim     {
773313a0c13SJung-uk Kim         AcpiOsPrintf (" MISMATCH 2: %s, expecting %s",
774313a0c13SJung-uk Kim             Temp2->String.Pointer, ValueToWrite);
775313a0c13SJung-uk Kim     }
776313a0c13SJung-uk Kim 
777313a0c13SJung-uk Kim     /* Write back the original value */
778313a0c13SJung-uk Kim 
779313a0c13SJung-uk Kim     WriteValue.String.Length = ACPI_STRLEN (Temp1->String.Pointer);
780313a0c13SJung-uk Kim     WriteValue.String.Pointer = Temp1->String.Pointer;
781313a0c13SJung-uk Kim 
782313a0c13SJung-uk Kim     Status = AcpiDbWriteToObject (Node, &WriteValue);
783313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
784313a0c13SJung-uk Kim     {
785313a0c13SJung-uk Kim         goto Exit;
786313a0c13SJung-uk Kim     }
787313a0c13SJung-uk Kim 
788313a0c13SJung-uk Kim     /* Ensure that we can read back the original value */
789313a0c13SJung-uk Kim 
790313a0c13SJung-uk Kim     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_STRING, &Temp3);
791313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
792313a0c13SJung-uk Kim     {
793313a0c13SJung-uk Kim         goto Exit;
794313a0c13SJung-uk Kim     }
795313a0c13SJung-uk Kim 
796313a0c13SJung-uk Kim     if (ACPI_STRCMP (Temp1->String.Pointer, Temp3->String.Pointer))
797313a0c13SJung-uk Kim     {
798313a0c13SJung-uk Kim         AcpiOsPrintf (" MISMATCH 3: %s, expecting %s",
799313a0c13SJung-uk Kim             Temp3->String.Pointer, Temp1->String.Pointer);
800313a0c13SJung-uk Kim     }
801313a0c13SJung-uk Kim 
802313a0c13SJung-uk Kim Exit:
803313a0c13SJung-uk Kim     if (Temp1) {AcpiOsFree (Temp1);}
804313a0c13SJung-uk Kim     if (Temp2) {AcpiOsFree (Temp2);}
805313a0c13SJung-uk Kim     if (Temp3) {AcpiOsFree (Temp3);}
806313a0c13SJung-uk Kim     return (Status);
807313a0c13SJung-uk Kim }
808313a0c13SJung-uk Kim 
809313a0c13SJung-uk Kim 
810313a0c13SJung-uk Kim /*******************************************************************************
811313a0c13SJung-uk Kim  *
812313a0c13SJung-uk Kim  * FUNCTION:    AcpiDbReadFromObject
813313a0c13SJung-uk Kim  *
814313a0c13SJung-uk Kim  * PARAMETERS:  Node                - Parent NS node for the object
815313a0c13SJung-uk Kim  *              ExpectedType        - Object type expected from the read
816313a0c13SJung-uk Kim  *              Value               - Where the value read is returned
817313a0c13SJung-uk Kim  *
818313a0c13SJung-uk Kim  * RETURN:      Status
819313a0c13SJung-uk Kim  *
820313a0c13SJung-uk Kim  * DESCRIPTION: Performs a read from the specified object by invoking the
821313a0c13SJung-uk Kim  *              special debugger control method that reads the object. Thus,
822313a0c13SJung-uk Kim  *              the AML interpreter is doing all of the work, increasing the
823313a0c13SJung-uk Kim  *              validity of the test.
824313a0c13SJung-uk Kim  *
825313a0c13SJung-uk Kim  ******************************************************************************/
826313a0c13SJung-uk Kim 
827313a0c13SJung-uk Kim static ACPI_STATUS
828313a0c13SJung-uk Kim AcpiDbReadFromObject (
829313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node,
830313a0c13SJung-uk Kim     ACPI_OBJECT_TYPE        ExpectedType,
831313a0c13SJung-uk Kim     ACPI_OBJECT             **Value)
832313a0c13SJung-uk Kim {
833313a0c13SJung-uk Kim     ACPI_OBJECT             *RetValue;
834313a0c13SJung-uk Kim     ACPI_OBJECT_LIST        ParamObjects;
835313a0c13SJung-uk Kim     ACPI_OBJECT             Params[2];
836313a0c13SJung-uk Kim     ACPI_BUFFER             ReturnObj;
837313a0c13SJung-uk Kim     ACPI_STATUS             Status;
838313a0c13SJung-uk Kim 
839313a0c13SJung-uk Kim 
840313a0c13SJung-uk Kim     Params[0].Type = ACPI_TYPE_LOCAL_REFERENCE;
841313a0c13SJung-uk Kim     Params[0].Reference.ActualType = Node->Type;
842313a0c13SJung-uk Kim     Params[0].Reference.Handle = ACPI_CAST_PTR (ACPI_HANDLE, Node);
843313a0c13SJung-uk Kim 
844313a0c13SJung-uk Kim     ParamObjects.Count = 1;
845313a0c13SJung-uk Kim     ParamObjects.Pointer = Params;
846313a0c13SJung-uk Kim 
847313a0c13SJung-uk Kim     ReturnObj.Length  = ACPI_ALLOCATE_BUFFER;
848313a0c13SJung-uk Kim 
849313a0c13SJung-uk Kim     AcpiGbl_MethodExecuting = TRUE;
850313a0c13SJung-uk Kim     Status = AcpiEvaluateObject (ReadHandle, NULL, &ParamObjects, &ReturnObj);
851313a0c13SJung-uk Kim     AcpiGbl_MethodExecuting = FALSE;
852313a0c13SJung-uk Kim 
853313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
854313a0c13SJung-uk Kim     {
855313a0c13SJung-uk Kim         AcpiOsPrintf ("Could not read from object, %s",
856313a0c13SJung-uk Kim             AcpiFormatException (Status));
857313a0c13SJung-uk Kim         return (Status);
858313a0c13SJung-uk Kim     }
859313a0c13SJung-uk Kim 
860313a0c13SJung-uk Kim     RetValue = (ACPI_OBJECT *) ReturnObj.Pointer;
861313a0c13SJung-uk Kim 
862313a0c13SJung-uk Kim     switch (RetValue->Type)
863313a0c13SJung-uk Kim     {
864313a0c13SJung-uk Kim     case ACPI_TYPE_INTEGER:
865313a0c13SJung-uk Kim     case ACPI_TYPE_BUFFER:
866313a0c13SJung-uk Kim     case ACPI_TYPE_STRING:
867313a0c13SJung-uk Kim         /*
868313a0c13SJung-uk Kim          * Did we receive the type we wanted? Most important for the
869313a0c13SJung-uk Kim          * Integer/Buffer case (when a field is larger than an Integer,
870313a0c13SJung-uk Kim          * it should return a Buffer).
871313a0c13SJung-uk Kim          */
872313a0c13SJung-uk Kim         if (RetValue->Type != ExpectedType)
873313a0c13SJung-uk Kim         {
874313a0c13SJung-uk Kim             AcpiOsPrintf (" Type mismatch:  Expected %s, Received %s",
875313a0c13SJung-uk Kim                 AcpiUtGetTypeName (ExpectedType),
876313a0c13SJung-uk Kim                 AcpiUtGetTypeName (RetValue->Type));
877313a0c13SJung-uk Kim 
878313a0c13SJung-uk Kim             return (AE_TYPE);
879313a0c13SJung-uk Kim         }
880313a0c13SJung-uk Kim 
881313a0c13SJung-uk Kim         *Value = RetValue;
882313a0c13SJung-uk Kim         break;
883313a0c13SJung-uk Kim 
884313a0c13SJung-uk Kim     default:
885313a0c13SJung-uk Kim 
886313a0c13SJung-uk Kim         AcpiOsPrintf (" Unsupported return object type, %s",
887313a0c13SJung-uk Kim             AcpiUtGetTypeName (RetValue->Type));
888313a0c13SJung-uk Kim         AcpiOsFree (ReturnObj.Pointer);
889313a0c13SJung-uk Kim 
890313a0c13SJung-uk Kim         return (AE_TYPE);
891313a0c13SJung-uk Kim     }
892313a0c13SJung-uk Kim 
893313a0c13SJung-uk Kim     return (Status);
894313a0c13SJung-uk Kim }
895313a0c13SJung-uk Kim 
896313a0c13SJung-uk Kim 
897313a0c13SJung-uk Kim /*******************************************************************************
898313a0c13SJung-uk Kim  *
899313a0c13SJung-uk Kim  * FUNCTION:    AcpiDbWriteToObject
900313a0c13SJung-uk Kim  *
901313a0c13SJung-uk Kim  * PARAMETERS:  Node                - Parent NS node for the object
902313a0c13SJung-uk Kim  *              Value               - Value to be written
903313a0c13SJung-uk Kim  *
904313a0c13SJung-uk Kim  * RETURN:      Status
905313a0c13SJung-uk Kim  *
906313a0c13SJung-uk Kim  * DESCRIPTION: Performs a write to the specified object by invoking the
907313a0c13SJung-uk Kim  *              special debugger control method that writes the object. Thus,
908313a0c13SJung-uk Kim  *              the AML interpreter is doing all of the work, increasing the
909313a0c13SJung-uk Kim  *              validity of the test.
910313a0c13SJung-uk Kim  *
911313a0c13SJung-uk Kim  ******************************************************************************/
912313a0c13SJung-uk Kim 
913313a0c13SJung-uk Kim static ACPI_STATUS
914313a0c13SJung-uk Kim AcpiDbWriteToObject (
915313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node,
916313a0c13SJung-uk Kim     ACPI_OBJECT             *Value)
917313a0c13SJung-uk Kim {
918313a0c13SJung-uk Kim     ACPI_OBJECT_LIST        ParamObjects;
919313a0c13SJung-uk Kim     ACPI_OBJECT             Params[2];
920313a0c13SJung-uk Kim     ACPI_STATUS             Status;
921313a0c13SJung-uk Kim 
922313a0c13SJung-uk Kim 
923313a0c13SJung-uk Kim     Params[0].Type = ACPI_TYPE_LOCAL_REFERENCE;
924313a0c13SJung-uk Kim     Params[0].Reference.ActualType = Node->Type;
925313a0c13SJung-uk Kim     Params[0].Reference.Handle = ACPI_CAST_PTR (ACPI_HANDLE, Node);
926313a0c13SJung-uk Kim 
927313a0c13SJung-uk Kim     /* Copy the incoming user parameter */
928313a0c13SJung-uk Kim 
929313a0c13SJung-uk Kim     ACPI_MEMCPY (&Params[1], Value, sizeof (ACPI_OBJECT));
930313a0c13SJung-uk Kim 
931313a0c13SJung-uk Kim     ParamObjects.Count = 2;
932313a0c13SJung-uk Kim     ParamObjects.Pointer = Params;
933313a0c13SJung-uk Kim 
934313a0c13SJung-uk Kim     AcpiGbl_MethodExecuting = TRUE;
935313a0c13SJung-uk Kim     Status = AcpiEvaluateObject (WriteHandle, NULL, &ParamObjects, NULL);
936313a0c13SJung-uk Kim     AcpiGbl_MethodExecuting = FALSE;
937313a0c13SJung-uk Kim 
938313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
939313a0c13SJung-uk Kim     {
940313a0c13SJung-uk Kim         AcpiOsPrintf ("Could not write to object, %s",
941313a0c13SJung-uk Kim             AcpiFormatException (Status));
942313a0c13SJung-uk Kim     }
943313a0c13SJung-uk Kim 
944313a0c13SJung-uk Kim     return (Status);
945313a0c13SJung-uk Kim }
946313a0c13SJung-uk Kim 
947313a0c13SJung-uk Kim 
948313a0c13SJung-uk Kim /*******************************************************************************
949313a0c13SJung-uk Kim  *
950313a0c13SJung-uk Kim  * FUNCTION:    AcpiDbEvaluateAllPredefinedNames
951313a0c13SJung-uk Kim  *
952313a0c13SJung-uk Kim  * PARAMETERS:  CountArg            - Max number of methods to execute
953313a0c13SJung-uk Kim  *
954313a0c13SJung-uk Kim  * RETURN:      None
955313a0c13SJung-uk Kim  *
956313a0c13SJung-uk Kim  * DESCRIPTION: Namespace batch execution. Execute predefined names in the
957313a0c13SJung-uk Kim  *              namespace, up to the max count, if specified.
958313a0c13SJung-uk Kim  *
959313a0c13SJung-uk Kim  ******************************************************************************/
960313a0c13SJung-uk Kim 
961313a0c13SJung-uk Kim static void
962313a0c13SJung-uk Kim AcpiDbEvaluateAllPredefinedNames (
963313a0c13SJung-uk Kim     char                    *CountArg)
964313a0c13SJung-uk Kim {
965313a0c13SJung-uk Kim     ACPI_DB_EXECUTE_WALK    Info;
966313a0c13SJung-uk Kim 
967313a0c13SJung-uk Kim 
968313a0c13SJung-uk Kim     Info.Count = 0;
969313a0c13SJung-uk Kim     Info.MaxCount = ACPI_UINT32_MAX;
970313a0c13SJung-uk Kim 
971313a0c13SJung-uk Kim     if (CountArg)
972313a0c13SJung-uk Kim     {
973313a0c13SJung-uk Kim         Info.MaxCount = ACPI_STRTOUL (CountArg, NULL, 0);
974313a0c13SJung-uk Kim     }
975313a0c13SJung-uk Kim 
976313a0c13SJung-uk Kim     /* Search all nodes in namespace */
977313a0c13SJung-uk Kim 
978313a0c13SJung-uk Kim     (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
979313a0c13SJung-uk Kim                 AcpiDbEvaluateOnePredefinedName, NULL, (void *) &Info, NULL);
980313a0c13SJung-uk Kim 
981313a0c13SJung-uk Kim     AcpiOsPrintf ("Evaluated %u predefined names in the namespace\n", Info.Count);
982313a0c13SJung-uk Kim }
983313a0c13SJung-uk Kim 
984313a0c13SJung-uk Kim 
985313a0c13SJung-uk Kim /*******************************************************************************
986313a0c13SJung-uk Kim  *
987313a0c13SJung-uk Kim  * FUNCTION:    AcpiDbEvaluateOnePredefinedName
988313a0c13SJung-uk Kim  *
989313a0c13SJung-uk Kim  * PARAMETERS:  Callback from WalkNamespace
990313a0c13SJung-uk Kim  *
991313a0c13SJung-uk Kim  * RETURN:      Status
992313a0c13SJung-uk Kim  *
993313a0c13SJung-uk Kim  * DESCRIPTION: Batch execution module. Currently only executes predefined
994313a0c13SJung-uk Kim  *              ACPI names.
995313a0c13SJung-uk Kim  *
996313a0c13SJung-uk Kim  ******************************************************************************/
997313a0c13SJung-uk Kim 
998313a0c13SJung-uk Kim static ACPI_STATUS
999313a0c13SJung-uk Kim AcpiDbEvaluateOnePredefinedName (
1000313a0c13SJung-uk Kim     ACPI_HANDLE             ObjHandle,
1001313a0c13SJung-uk Kim     UINT32                  NestingLevel,
1002313a0c13SJung-uk Kim     void                    *Context,
1003313a0c13SJung-uk Kim     void                    **ReturnValue)
1004313a0c13SJung-uk Kim {
1005313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE         *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
1006313a0c13SJung-uk Kim     ACPI_DB_EXECUTE_WALK        *Info = (ACPI_DB_EXECUTE_WALK *) Context;
1007313a0c13SJung-uk Kim     char                        *Pathname;
1008313a0c13SJung-uk Kim     const ACPI_PREDEFINED_INFO  *Predefined;
1009313a0c13SJung-uk Kim     ACPI_DEVICE_INFO            *ObjInfo;
1010313a0c13SJung-uk Kim     ACPI_OBJECT_LIST            ParamObjects;
1011313a0c13SJung-uk Kim     ACPI_OBJECT                 Params[ACPI_METHOD_NUM_ARGS];
1012313a0c13SJung-uk Kim     ACPI_OBJECT                 *ThisParam;
1013313a0c13SJung-uk Kim     ACPI_BUFFER                 ReturnObj;
1014313a0c13SJung-uk Kim     ACPI_STATUS                 Status;
1015313a0c13SJung-uk Kim     UINT16                      ArgTypeList;
1016313a0c13SJung-uk Kim     UINT8                       ArgCount;
1017313a0c13SJung-uk Kim     UINT8                       ArgType;
1018313a0c13SJung-uk Kim     UINT32                      i;
1019313a0c13SJung-uk Kim 
1020313a0c13SJung-uk Kim 
1021313a0c13SJung-uk Kim     /* The name must be a predefined ACPI name */
1022313a0c13SJung-uk Kim 
1023313a0c13SJung-uk Kim     Predefined = AcpiUtMatchPredefinedMethod (Node->Name.Ascii);
1024313a0c13SJung-uk Kim     if (!Predefined)
1025313a0c13SJung-uk Kim     {
1026313a0c13SJung-uk Kim         return (AE_OK);
1027313a0c13SJung-uk Kim     }
1028313a0c13SJung-uk Kim 
1029313a0c13SJung-uk Kim     if (Node->Type == ACPI_TYPE_LOCAL_SCOPE)
1030313a0c13SJung-uk Kim     {
1031313a0c13SJung-uk Kim         return (AE_OK);
1032313a0c13SJung-uk Kim     }
1033313a0c13SJung-uk Kim 
1034313a0c13SJung-uk Kim     Pathname = AcpiNsGetExternalPathname (Node);
1035313a0c13SJung-uk Kim     if (!Pathname)
1036313a0c13SJung-uk Kim     {
1037313a0c13SJung-uk Kim         return (AE_OK);
1038313a0c13SJung-uk Kim     }
1039313a0c13SJung-uk Kim 
1040313a0c13SJung-uk Kim     /* Get the object info for number of method parameters */
1041313a0c13SJung-uk Kim 
1042313a0c13SJung-uk Kim     Status = AcpiGetObjectInfo (ObjHandle, &ObjInfo);
1043313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
1044313a0c13SJung-uk Kim     {
1045313a0c13SJung-uk Kim         ACPI_FREE (Pathname);
1046313a0c13SJung-uk Kim         return (Status);
1047313a0c13SJung-uk Kim     }
1048313a0c13SJung-uk Kim 
1049313a0c13SJung-uk Kim     ParamObjects.Count = 0;
1050313a0c13SJung-uk Kim     ParamObjects.Pointer = NULL;
1051313a0c13SJung-uk Kim 
1052313a0c13SJung-uk Kim     if (ObjInfo->Type == ACPI_TYPE_METHOD)
1053313a0c13SJung-uk Kim     {
1054313a0c13SJung-uk Kim         /* Setup default parameters (with proper types) */
1055313a0c13SJung-uk Kim 
1056313a0c13SJung-uk Kim         ArgTypeList = Predefined->Info.ArgumentList;
1057313a0c13SJung-uk Kim         ArgCount = METHOD_GET_ARG_COUNT (ArgTypeList);
1058313a0c13SJung-uk Kim 
1059313a0c13SJung-uk Kim         /*
1060313a0c13SJung-uk Kim          * Setup the ACPI-required number of arguments, regardless of what
1061313a0c13SJung-uk Kim          * the actual method defines. If there is a difference, then the
1062313a0c13SJung-uk Kim          * method is wrong and a warning will be issued during execution.
1063313a0c13SJung-uk Kim          */
1064313a0c13SJung-uk Kim         ThisParam = Params;
1065313a0c13SJung-uk Kim         for (i = 0; i < ArgCount; i++)
1066313a0c13SJung-uk Kim         {
1067313a0c13SJung-uk Kim             ArgType = METHOD_GET_NEXT_TYPE (ArgTypeList);
1068313a0c13SJung-uk Kim             ThisParam->Type = ArgType;
1069313a0c13SJung-uk Kim 
1070313a0c13SJung-uk Kim             switch (ArgType)
1071313a0c13SJung-uk Kim             {
1072313a0c13SJung-uk Kim             case ACPI_TYPE_INTEGER:
1073313a0c13SJung-uk Kim 
1074313a0c13SJung-uk Kim                 ThisParam->Integer.Value = 1;
1075313a0c13SJung-uk Kim                 break;
1076313a0c13SJung-uk Kim 
1077313a0c13SJung-uk Kim             case ACPI_TYPE_STRING:
1078313a0c13SJung-uk Kim 
1079313a0c13SJung-uk Kim                 ThisParam->String.Pointer = "This is the default argument string";
1080313a0c13SJung-uk Kim                 ThisParam->String.Length = ACPI_STRLEN (ThisParam->String.Pointer);
1081313a0c13SJung-uk Kim                 break;
1082313a0c13SJung-uk Kim 
1083313a0c13SJung-uk Kim             case ACPI_TYPE_BUFFER:
1084313a0c13SJung-uk Kim 
1085313a0c13SJung-uk Kim                 ThisParam->Buffer.Pointer = (UINT8 *) Params; /* just a garbage buffer */
1086313a0c13SJung-uk Kim                 ThisParam->Buffer.Length = 48;
1087313a0c13SJung-uk Kim                 break;
1088313a0c13SJung-uk Kim 
1089313a0c13SJung-uk Kim              case ACPI_TYPE_PACKAGE:
1090313a0c13SJung-uk Kim 
1091313a0c13SJung-uk Kim                 ThisParam->Package.Elements = NULL;
1092313a0c13SJung-uk Kim                 ThisParam->Package.Count = 0;
1093313a0c13SJung-uk Kim                 break;
1094313a0c13SJung-uk Kim 
1095313a0c13SJung-uk Kim            default:
1096313a0c13SJung-uk Kim 
1097313a0c13SJung-uk Kim                 AcpiOsPrintf ("%s: Unsupported argument type: %u\n",
1098313a0c13SJung-uk Kim                     Pathname, ArgType);
1099313a0c13SJung-uk Kim                 break;
1100313a0c13SJung-uk Kim             }
1101313a0c13SJung-uk Kim 
1102313a0c13SJung-uk Kim             ThisParam++;
1103313a0c13SJung-uk Kim         }
1104313a0c13SJung-uk Kim 
1105313a0c13SJung-uk Kim         ParamObjects.Count = ArgCount;
1106313a0c13SJung-uk Kim         ParamObjects.Pointer = Params;
1107313a0c13SJung-uk Kim     }
1108313a0c13SJung-uk Kim 
1109313a0c13SJung-uk Kim     ACPI_FREE (ObjInfo);
1110313a0c13SJung-uk Kim     ReturnObj.Pointer = NULL;
1111313a0c13SJung-uk Kim     ReturnObj.Length = ACPI_ALLOCATE_BUFFER;
1112313a0c13SJung-uk Kim 
1113313a0c13SJung-uk Kim     /* Do the actual method execution */
1114313a0c13SJung-uk Kim 
1115313a0c13SJung-uk Kim     AcpiGbl_MethodExecuting = TRUE;
1116313a0c13SJung-uk Kim 
1117313a0c13SJung-uk Kim     Status = AcpiEvaluateObject (Node, NULL, &ParamObjects, &ReturnObj);
1118313a0c13SJung-uk Kim 
1119313a0c13SJung-uk Kim     AcpiOsPrintf ("%-32s returned %s\n", Pathname, AcpiFormatException (Status));
1120313a0c13SJung-uk Kim     AcpiGbl_MethodExecuting = FALSE;
1121313a0c13SJung-uk Kim     ACPI_FREE (Pathname);
1122313a0c13SJung-uk Kim 
1123313a0c13SJung-uk Kim     /* Ignore status from method execution */
1124313a0c13SJung-uk Kim 
1125313a0c13SJung-uk Kim     Status = AE_OK;
1126313a0c13SJung-uk Kim 
1127313a0c13SJung-uk Kim     /* Update count, check if we have executed enough methods */
1128313a0c13SJung-uk Kim 
1129313a0c13SJung-uk Kim     Info->Count++;
1130313a0c13SJung-uk Kim     if (Info->Count >= Info->MaxCount)
1131313a0c13SJung-uk Kim     {
1132313a0c13SJung-uk Kim         Status = AE_CTRL_TERMINATE;
1133313a0c13SJung-uk Kim     }
1134313a0c13SJung-uk Kim 
1135313a0c13SJung-uk Kim     return (Status);
1136313a0c13SJung-uk Kim }
1137313a0c13SJung-uk Kim 
1138313a0c13SJung-uk Kim #endif /* ACPI_DEBUGGER */
1139