xref: /freebsd/sys/contrib/dev/acpica/components/debugger/dbtest.c (revision f8146b882bc156c1d8ddf14bbea67253ebc064bb)
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*f8146b88SJung-uk Kim  * Copyright (C) 2000 - 2016, 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 
51313a0c13SJung-uk Kim #define _COMPONENT          ACPI_CA_DEBUGGER
52313a0c13SJung-uk Kim         ACPI_MODULE_NAME    ("dbtest")
53313a0c13SJung-uk Kim 
54313a0c13SJung-uk Kim 
55313a0c13SJung-uk Kim /* Local prototypes */
56313a0c13SJung-uk Kim 
57313a0c13SJung-uk Kim static void
58313a0c13SJung-uk Kim AcpiDbTestAllObjects (
59313a0c13SJung-uk Kim     void);
60313a0c13SJung-uk Kim 
61313a0c13SJung-uk Kim static ACPI_STATUS
62313a0c13SJung-uk Kim AcpiDbTestOneObject (
63313a0c13SJung-uk Kim     ACPI_HANDLE             ObjHandle,
64313a0c13SJung-uk Kim     UINT32                  NestingLevel,
65313a0c13SJung-uk Kim     void                    *Context,
66313a0c13SJung-uk Kim     void                    **ReturnValue);
67313a0c13SJung-uk Kim 
68313a0c13SJung-uk Kim static ACPI_STATUS
69313a0c13SJung-uk Kim AcpiDbTestIntegerType (
70313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node,
71313a0c13SJung-uk Kim     UINT32                  BitLength);
72313a0c13SJung-uk Kim 
73313a0c13SJung-uk Kim static ACPI_STATUS
74313a0c13SJung-uk Kim AcpiDbTestBufferType (
75313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node,
76313a0c13SJung-uk Kim     UINT32                  BitLength);
77313a0c13SJung-uk Kim 
78313a0c13SJung-uk Kim static ACPI_STATUS
79313a0c13SJung-uk Kim AcpiDbTestStringType (
80313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node,
81313a0c13SJung-uk Kim     UINT32                  ByteLength);
82313a0c13SJung-uk Kim 
83313a0c13SJung-uk Kim static ACPI_STATUS
84313a0c13SJung-uk Kim AcpiDbReadFromObject (
85313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node,
86313a0c13SJung-uk Kim     ACPI_OBJECT_TYPE        ExpectedType,
87313a0c13SJung-uk Kim     ACPI_OBJECT             **Value);
88313a0c13SJung-uk Kim 
89313a0c13SJung-uk Kim static ACPI_STATUS
90313a0c13SJung-uk Kim AcpiDbWriteToObject (
91313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node,
92313a0c13SJung-uk Kim     ACPI_OBJECT             *Value);
93313a0c13SJung-uk Kim 
94313a0c13SJung-uk Kim static void
95313a0c13SJung-uk Kim AcpiDbEvaluateAllPredefinedNames (
96313a0c13SJung-uk Kim     char                    *CountArg);
97313a0c13SJung-uk Kim 
98313a0c13SJung-uk Kim static ACPI_STATUS
99313a0c13SJung-uk Kim AcpiDbEvaluateOnePredefinedName (
100313a0c13SJung-uk Kim     ACPI_HANDLE             ObjHandle,
101313a0c13SJung-uk Kim     UINT32                  NestingLevel,
102313a0c13SJung-uk Kim     void                    *Context,
103313a0c13SJung-uk Kim     void                    **ReturnValue);
104313a0c13SJung-uk Kim 
105313a0c13SJung-uk Kim /*
106313a0c13SJung-uk Kim  * Test subcommands
107313a0c13SJung-uk Kim  */
108313a0c13SJung-uk Kim static ACPI_DB_ARGUMENT_INFO    AcpiDbTestTypes [] =
109313a0c13SJung-uk Kim {
110313a0c13SJung-uk Kim     {"OBJECTS"},
111313a0c13SJung-uk Kim     {"PREDEFINED"},
112313a0c13SJung-uk Kim     {NULL}           /* Must be null terminated */
113313a0c13SJung-uk Kim };
114313a0c13SJung-uk Kim 
115313a0c13SJung-uk Kim #define CMD_TEST_OBJECTS        0
116313a0c13SJung-uk Kim #define CMD_TEST_PREDEFINED     1
117313a0c13SJung-uk Kim 
118313a0c13SJung-uk Kim #define BUFFER_FILL_VALUE       0xFF
119313a0c13SJung-uk Kim 
120313a0c13SJung-uk Kim /*
121313a0c13SJung-uk Kim  * Support for the special debugger read/write control methods.
122313a0c13SJung-uk Kim  * These methods are installed into the current namespace and are
123313a0c13SJung-uk Kim  * used to read and write the various namespace objects. The point
124313a0c13SJung-uk Kim  * is to force the AML interpreter do all of the work.
125313a0c13SJung-uk Kim  */
126313a0c13SJung-uk Kim #define ACPI_DB_READ_METHOD     "\\_T98"
127313a0c13SJung-uk Kim #define ACPI_DB_WRITE_METHOD    "\\_T99"
128313a0c13SJung-uk Kim 
129313a0c13SJung-uk Kim static ACPI_HANDLE          ReadHandle = NULL;
130313a0c13SJung-uk Kim static ACPI_HANDLE          WriteHandle = NULL;
131313a0c13SJung-uk Kim 
132313a0c13SJung-uk Kim /* ASL Definitions of the debugger read/write control methods */
133313a0c13SJung-uk Kim 
134313a0c13SJung-uk Kim #if 0
135313a0c13SJung-uk Kim DefinitionBlock ("ssdt.aml", "SSDT", 2, "Intel", "DEBUG", 0x00000001)
136313a0c13SJung-uk Kim {
137313a0c13SJung-uk Kim     Method (_T98, 1, NotSerialized)     /* Read */
138313a0c13SJung-uk Kim     {
139313a0c13SJung-uk Kim         Return (DeRefOf (Arg0))
140313a0c13SJung-uk Kim     }
141313a0c13SJung-uk Kim }
142313a0c13SJung-uk Kim DefinitionBlock ("ssdt2.aml", "SSDT", 2, "Intel", "DEBUG", 0x00000001)
143313a0c13SJung-uk Kim {
144313a0c13SJung-uk Kim     Method (_T99, 2, NotSerialized)     /* Write */
145313a0c13SJung-uk Kim     {
146313a0c13SJung-uk Kim         Store (Arg1, Arg0)
147313a0c13SJung-uk Kim     }
148313a0c13SJung-uk Kim }
149313a0c13SJung-uk Kim #endif
150313a0c13SJung-uk Kim 
151313a0c13SJung-uk Kim static unsigned char ReadMethodCode[] =
152313a0c13SJung-uk Kim {
153313a0c13SJung-uk Kim     0x53,0x53,0x44,0x54,0x2E,0x00,0x00,0x00,  /* 00000000    "SSDT...." */
154313a0c13SJung-uk Kim     0x02,0xC9,0x49,0x6E,0x74,0x65,0x6C,0x00,  /* 00000008    "..Intel." */
155313a0c13SJung-uk Kim     0x44,0x45,0x42,0x55,0x47,0x00,0x00,0x00,  /* 00000010    "DEBUG..." */
156313a0c13SJung-uk Kim     0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
157313a0c13SJung-uk Kim     0x18,0x12,0x13,0x20,0x14,0x09,0x5F,0x54,  /* 00000020    "... .._T" */
158313a0c13SJung-uk Kim     0x39,0x38,0x01,0xA4,0x83,0x68             /* 00000028    "98...h"   */
159313a0c13SJung-uk Kim };
160313a0c13SJung-uk Kim 
161313a0c13SJung-uk Kim static unsigned char WriteMethodCode[] =
162313a0c13SJung-uk Kim {
163313a0c13SJung-uk Kim     0x53,0x53,0x44,0x54,0x2E,0x00,0x00,0x00,  /* 00000000    "SSDT...." */
164313a0c13SJung-uk Kim     0x02,0x15,0x49,0x6E,0x74,0x65,0x6C,0x00,  /* 00000008    "..Intel." */
165313a0c13SJung-uk Kim     0x44,0x45,0x42,0x55,0x47,0x00,0x00,0x00,  /* 00000010    "DEBUG..." */
166313a0c13SJung-uk Kim     0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
167313a0c13SJung-uk Kim     0x18,0x12,0x13,0x20,0x14,0x09,0x5F,0x54,  /* 00000020    "... .._T" */
168313a0c13SJung-uk Kim     0x39,0x39,0x02,0x70,0x69,0x68             /* 00000028    "99.pih"   */
169313a0c13SJung-uk Kim };
170313a0c13SJung-uk Kim 
171313a0c13SJung-uk Kim 
172313a0c13SJung-uk Kim /*******************************************************************************
173313a0c13SJung-uk Kim  *
174313a0c13SJung-uk Kim  * FUNCTION:    AcpiDbExecuteTest
175313a0c13SJung-uk Kim  *
176313a0c13SJung-uk Kim  * PARAMETERS:  TypeArg         - Subcommand
177313a0c13SJung-uk Kim  *
178313a0c13SJung-uk Kim  * RETURN:      None
179313a0c13SJung-uk Kim  *
180313a0c13SJung-uk Kim  * DESCRIPTION: Execute various debug tests.
181313a0c13SJung-uk Kim  *
182313a0c13SJung-uk Kim  * Note: Code is prepared for future expansion of the TEST command.
183313a0c13SJung-uk Kim  *
184313a0c13SJung-uk Kim  ******************************************************************************/
185313a0c13SJung-uk Kim 
186313a0c13SJung-uk Kim void
187313a0c13SJung-uk Kim AcpiDbExecuteTest (
188313a0c13SJung-uk Kim     char                    *TypeArg)
189313a0c13SJung-uk Kim {
190313a0c13SJung-uk Kim     UINT32                  Temp;
191313a0c13SJung-uk Kim 
192313a0c13SJung-uk Kim 
193313a0c13SJung-uk Kim     AcpiUtStrupr (TypeArg);
194313a0c13SJung-uk Kim     Temp = AcpiDbMatchArgument (TypeArg, AcpiDbTestTypes);
195313a0c13SJung-uk Kim     if (Temp == ACPI_TYPE_NOT_FOUND)
196313a0c13SJung-uk Kim     {
197313a0c13SJung-uk Kim         AcpiOsPrintf ("Invalid or unsupported argument\n");
198313a0c13SJung-uk Kim         return;
199313a0c13SJung-uk Kim     }
200313a0c13SJung-uk Kim 
201313a0c13SJung-uk Kim     switch (Temp)
202313a0c13SJung-uk Kim     {
203313a0c13SJung-uk Kim     case CMD_TEST_OBJECTS:
204313a0c13SJung-uk Kim 
205313a0c13SJung-uk Kim         AcpiDbTestAllObjects ();
206313a0c13SJung-uk Kim         break;
207313a0c13SJung-uk Kim 
208313a0c13SJung-uk Kim     case CMD_TEST_PREDEFINED:
209313a0c13SJung-uk Kim 
210313a0c13SJung-uk Kim         AcpiDbEvaluateAllPredefinedNames (NULL);
211313a0c13SJung-uk Kim         break;
212313a0c13SJung-uk Kim 
213313a0c13SJung-uk Kim     default:
214313a0c13SJung-uk Kim         break;
215313a0c13SJung-uk Kim     }
216313a0c13SJung-uk Kim }
217313a0c13SJung-uk Kim 
218313a0c13SJung-uk Kim 
219313a0c13SJung-uk Kim /*******************************************************************************
220313a0c13SJung-uk Kim  *
221313a0c13SJung-uk Kim  * FUNCTION:    AcpiDbTestAllObjects
222313a0c13SJung-uk Kim  *
223313a0c13SJung-uk Kim  * PARAMETERS:  None
224313a0c13SJung-uk Kim  *
225313a0c13SJung-uk Kim  * RETURN:      None
226313a0c13SJung-uk Kim  *
227313a0c13SJung-uk Kim  * DESCRIPTION: This test implements the OBJECTS subcommand. It exercises the
228313a0c13SJung-uk Kim  *              namespace by reading/writing/comparing all data objects such
229313a0c13SJung-uk Kim  *              as integers, strings, buffers, fields, buffer fields, etc.
230313a0c13SJung-uk Kim  *
231313a0c13SJung-uk Kim  ******************************************************************************/
232313a0c13SJung-uk Kim 
233313a0c13SJung-uk Kim static void
234313a0c13SJung-uk Kim AcpiDbTestAllObjects (
235313a0c13SJung-uk Kim     void)
236313a0c13SJung-uk Kim {
237313a0c13SJung-uk Kim     ACPI_STATUS             Status;
238313a0c13SJung-uk Kim 
239313a0c13SJung-uk Kim 
240313a0c13SJung-uk Kim     /* Install the debugger read-object control method if necessary */
241313a0c13SJung-uk Kim 
242313a0c13SJung-uk Kim     if (!ReadHandle)
243313a0c13SJung-uk Kim     {
244313a0c13SJung-uk Kim         Status = AcpiInstallMethod (ReadMethodCode);
245313a0c13SJung-uk Kim         if (ACPI_FAILURE (Status))
246313a0c13SJung-uk Kim         {
247313a0c13SJung-uk Kim             AcpiOsPrintf ("%s, Could not install debugger read method\n",
248313a0c13SJung-uk Kim                 AcpiFormatException (Status));
249313a0c13SJung-uk Kim             return;
250313a0c13SJung-uk Kim         }
251313a0c13SJung-uk Kim 
252313a0c13SJung-uk Kim         Status = AcpiGetHandle (NULL, ACPI_DB_READ_METHOD, &ReadHandle);
253313a0c13SJung-uk Kim         if (ACPI_FAILURE (Status))
254313a0c13SJung-uk Kim         {
255313a0c13SJung-uk Kim             AcpiOsPrintf ("Could not obtain handle for debug method %s\n",
256313a0c13SJung-uk Kim                 ACPI_DB_READ_METHOD);
257313a0c13SJung-uk Kim             return;
258313a0c13SJung-uk Kim         }
259313a0c13SJung-uk Kim     }
260313a0c13SJung-uk Kim 
261313a0c13SJung-uk Kim     /* Install the debugger write-object control method if necessary */
262313a0c13SJung-uk Kim 
263313a0c13SJung-uk Kim     if (!WriteHandle)
264313a0c13SJung-uk Kim     {
265313a0c13SJung-uk Kim         Status = AcpiInstallMethod (WriteMethodCode);
266313a0c13SJung-uk Kim         if (ACPI_FAILURE (Status))
267313a0c13SJung-uk Kim         {
268313a0c13SJung-uk Kim             AcpiOsPrintf ("%s, Could not install debugger write method\n",
269313a0c13SJung-uk Kim                 AcpiFormatException (Status));
270313a0c13SJung-uk Kim             return;
271313a0c13SJung-uk Kim         }
272313a0c13SJung-uk Kim 
273313a0c13SJung-uk Kim         Status = AcpiGetHandle (NULL, ACPI_DB_WRITE_METHOD, &WriteHandle);
274313a0c13SJung-uk Kim         if (ACPI_FAILURE (Status))
275313a0c13SJung-uk Kim         {
276313a0c13SJung-uk Kim             AcpiOsPrintf ("Could not obtain handle for debug method %s\n",
277313a0c13SJung-uk Kim                 ACPI_DB_WRITE_METHOD);
278313a0c13SJung-uk Kim             return;
279313a0c13SJung-uk Kim         }
280313a0c13SJung-uk Kim     }
281313a0c13SJung-uk Kim 
282313a0c13SJung-uk Kim     /* Walk the entire namespace, testing each supported named data object */
283313a0c13SJung-uk Kim 
284313a0c13SJung-uk Kim     (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
285313a0c13SJung-uk Kim         ACPI_UINT32_MAX, AcpiDbTestOneObject, NULL, NULL, NULL);
286313a0c13SJung-uk Kim }
287313a0c13SJung-uk Kim 
288313a0c13SJung-uk Kim 
289313a0c13SJung-uk Kim /*******************************************************************************
290313a0c13SJung-uk Kim  *
291313a0c13SJung-uk Kim  * FUNCTION:    AcpiDbTestOneObject
292313a0c13SJung-uk Kim  *
293313a0c13SJung-uk Kim  * PARAMETERS:  ACPI_WALK_CALLBACK
294313a0c13SJung-uk Kim  *
295313a0c13SJung-uk Kim  * RETURN:      Status
296313a0c13SJung-uk Kim  *
297313a0c13SJung-uk Kim  * DESCRIPTION: Test one namespace object. Supported types are Integer,
298313a0c13SJung-uk Kim  *              String, Buffer, BufferField, and FieldUnit. All other object
299313a0c13SJung-uk Kim  *              types are simply ignored.
300313a0c13SJung-uk Kim  *
301313a0c13SJung-uk Kim  *              Note: Support for Packages is not implemented.
302313a0c13SJung-uk Kim  *
303313a0c13SJung-uk Kim  ******************************************************************************/
304313a0c13SJung-uk Kim 
305313a0c13SJung-uk Kim static ACPI_STATUS
306313a0c13SJung-uk Kim AcpiDbTestOneObject (
307313a0c13SJung-uk Kim     ACPI_HANDLE             ObjHandle,
308313a0c13SJung-uk Kim     UINT32                  NestingLevel,
309313a0c13SJung-uk Kim     void                    *Context,
310313a0c13SJung-uk Kim     void                    **ReturnValue)
311313a0c13SJung-uk Kim {
312313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node;
313313a0c13SJung-uk Kim     ACPI_OPERAND_OBJECT     *ObjDesc;
314313a0c13SJung-uk Kim     ACPI_OPERAND_OBJECT     *RegionObj;
315313a0c13SJung-uk Kim     ACPI_OBJECT_TYPE        LocalType;
316313a0c13SJung-uk Kim     UINT32                  BitLength = 0;
317313a0c13SJung-uk Kim     UINT32                  ByteLength = 0;
318313a0c13SJung-uk Kim     ACPI_STATUS             Status = AE_OK;
319313a0c13SJung-uk Kim 
320313a0c13SJung-uk Kim 
321313a0c13SJung-uk Kim     Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjHandle);
322313a0c13SJung-uk Kim     ObjDesc = Node->Object;
323313a0c13SJung-uk Kim 
324313a0c13SJung-uk Kim     /*
325313a0c13SJung-uk Kim      * For the supported types, get the actual bit length or
326313a0c13SJung-uk Kim      * byte length. Map the type to one of Integer/String/Buffer.
327313a0c13SJung-uk Kim      */
328313a0c13SJung-uk Kim     switch (Node->Type)
329313a0c13SJung-uk Kim     {
330313a0c13SJung-uk Kim     case ACPI_TYPE_INTEGER:
331313a0c13SJung-uk Kim 
332313a0c13SJung-uk Kim         /* Integer width is either 32 or 64 */
333313a0c13SJung-uk Kim 
334313a0c13SJung-uk Kim         LocalType = ACPI_TYPE_INTEGER;
335313a0c13SJung-uk Kim         BitLength = AcpiGbl_IntegerBitWidth;
336313a0c13SJung-uk Kim         break;
337313a0c13SJung-uk Kim 
338313a0c13SJung-uk Kim     case ACPI_TYPE_STRING:
339313a0c13SJung-uk Kim 
340313a0c13SJung-uk Kim         LocalType = ACPI_TYPE_STRING;
341313a0c13SJung-uk Kim         ByteLength = ObjDesc->String.Length;
342313a0c13SJung-uk Kim         break;
343313a0c13SJung-uk Kim 
344313a0c13SJung-uk Kim     case ACPI_TYPE_BUFFER:
345313a0c13SJung-uk Kim 
346313a0c13SJung-uk Kim         LocalType = ACPI_TYPE_BUFFER;
347313a0c13SJung-uk Kim         ByteLength = ObjDesc->Buffer.Length;
348313a0c13SJung-uk Kim         BitLength = ByteLength * 8;
349313a0c13SJung-uk Kim         break;
350313a0c13SJung-uk Kim 
351313a0c13SJung-uk Kim     case ACPI_TYPE_FIELD_UNIT:
352313a0c13SJung-uk Kim     case ACPI_TYPE_BUFFER_FIELD:
353313a0c13SJung-uk Kim     case ACPI_TYPE_LOCAL_REGION_FIELD:
354313a0c13SJung-uk Kim     case ACPI_TYPE_LOCAL_INDEX_FIELD:
355313a0c13SJung-uk Kim     case ACPI_TYPE_LOCAL_BANK_FIELD:
356313a0c13SJung-uk Kim 
357313a0c13SJung-uk Kim         LocalType = ACPI_TYPE_INTEGER;
358313a0c13SJung-uk Kim         if (ObjDesc)
359313a0c13SJung-uk Kim         {
360313a0c13SJung-uk Kim             /*
361313a0c13SJung-uk Kim              * Returned object will be a Buffer if the field length
362313a0c13SJung-uk Kim              * is larger than the size of an Integer (32 or 64 bits
363313a0c13SJung-uk Kim              * depending on the DSDT version).
364313a0c13SJung-uk Kim              */
365313a0c13SJung-uk Kim             BitLength = ObjDesc->CommonField.BitLength;
366313a0c13SJung-uk Kim             ByteLength = ACPI_ROUND_BITS_UP_TO_BYTES (BitLength);
367313a0c13SJung-uk Kim             if (BitLength > AcpiGbl_IntegerBitWidth)
368313a0c13SJung-uk Kim             {
369313a0c13SJung-uk Kim                 LocalType = ACPI_TYPE_BUFFER;
370313a0c13SJung-uk Kim             }
371313a0c13SJung-uk Kim         }
372313a0c13SJung-uk Kim         break;
373313a0c13SJung-uk Kim 
374313a0c13SJung-uk Kim     default:
375313a0c13SJung-uk Kim 
376313a0c13SJung-uk Kim         /* Ignore all other types */
377313a0c13SJung-uk Kim 
378313a0c13SJung-uk Kim         return (AE_OK);
379313a0c13SJung-uk Kim     }
380313a0c13SJung-uk Kim 
381313a0c13SJung-uk Kim     /* Emit the common prefix: Type:Name */
382313a0c13SJung-uk Kim 
383313a0c13SJung-uk Kim     AcpiOsPrintf ("%14s: %4.4s",
384313a0c13SJung-uk Kim         AcpiUtGetTypeName (Node->Type), Node->Name.Ascii);
385313a0c13SJung-uk Kim     if (!ObjDesc)
386313a0c13SJung-uk Kim     {
387313a0c13SJung-uk Kim         AcpiOsPrintf (" Ignoring, no attached object\n");
388313a0c13SJung-uk Kim         return (AE_OK);
389313a0c13SJung-uk Kim     }
390313a0c13SJung-uk Kim 
391313a0c13SJung-uk Kim     /*
392313a0c13SJung-uk Kim      * Check for unsupported region types. Note: AcpiExec simulates
393313a0c13SJung-uk Kim      * access to SystemMemory, SystemIO, PCI_Config, and EC.
394313a0c13SJung-uk Kim      */
395313a0c13SJung-uk Kim     switch (Node->Type)
396313a0c13SJung-uk Kim     {
397313a0c13SJung-uk Kim     case ACPI_TYPE_LOCAL_REGION_FIELD:
398313a0c13SJung-uk Kim 
399313a0c13SJung-uk Kim         RegionObj = ObjDesc->Field.RegionObj;
400313a0c13SJung-uk Kim         switch (RegionObj->Region.SpaceId)
401313a0c13SJung-uk Kim         {
402313a0c13SJung-uk Kim         case ACPI_ADR_SPACE_SYSTEM_MEMORY:
403313a0c13SJung-uk Kim         case ACPI_ADR_SPACE_SYSTEM_IO:
404313a0c13SJung-uk Kim         case ACPI_ADR_SPACE_PCI_CONFIG:
405313a0c13SJung-uk Kim         case ACPI_ADR_SPACE_EC:
406313a0c13SJung-uk Kim 
407313a0c13SJung-uk Kim             break;
408313a0c13SJung-uk Kim 
409313a0c13SJung-uk Kim         default:
410313a0c13SJung-uk Kim 
411313a0c13SJung-uk Kim             AcpiOsPrintf ("      %s space is not supported [%4.4s]\n",
412313a0c13SJung-uk Kim                 AcpiUtGetRegionName (RegionObj->Region.SpaceId),
413313a0c13SJung-uk Kim                 RegionObj->Region.Node->Name.Ascii);
414313a0c13SJung-uk Kim             return (AE_OK);
415313a0c13SJung-uk Kim         }
416313a0c13SJung-uk Kim         break;
417313a0c13SJung-uk Kim 
418313a0c13SJung-uk Kim     default:
419313a0c13SJung-uk Kim         break;
420313a0c13SJung-uk Kim     }
421313a0c13SJung-uk Kim 
422313a0c13SJung-uk Kim     /* At this point, we have resolved the object to one of the major types */
423313a0c13SJung-uk Kim 
424313a0c13SJung-uk Kim     switch (LocalType)
425313a0c13SJung-uk Kim     {
426313a0c13SJung-uk Kim     case ACPI_TYPE_INTEGER:
427313a0c13SJung-uk Kim 
428313a0c13SJung-uk Kim         Status = AcpiDbTestIntegerType (Node, BitLength);
429313a0c13SJung-uk Kim         break;
430313a0c13SJung-uk Kim 
431313a0c13SJung-uk Kim     case ACPI_TYPE_STRING:
432313a0c13SJung-uk Kim 
433313a0c13SJung-uk Kim         Status = AcpiDbTestStringType (Node, ByteLength);
434313a0c13SJung-uk Kim         break;
435313a0c13SJung-uk Kim 
436313a0c13SJung-uk Kim     case ACPI_TYPE_BUFFER:
437313a0c13SJung-uk Kim 
438313a0c13SJung-uk Kim         Status = AcpiDbTestBufferType (Node, BitLength);
439313a0c13SJung-uk Kim         break;
440313a0c13SJung-uk Kim 
441313a0c13SJung-uk Kim     default:
442313a0c13SJung-uk Kim 
443313a0c13SJung-uk Kim         AcpiOsPrintf (" Ignoring, type not implemented (%2.2X)",
444313a0c13SJung-uk Kim             LocalType);
445313a0c13SJung-uk Kim         break;
446313a0c13SJung-uk Kim     }
447313a0c13SJung-uk Kim 
448313a0c13SJung-uk Kim     switch (Node->Type)
449313a0c13SJung-uk Kim     {
450313a0c13SJung-uk Kim     case ACPI_TYPE_LOCAL_REGION_FIELD:
451313a0c13SJung-uk Kim 
452313a0c13SJung-uk Kim         RegionObj = ObjDesc->Field.RegionObj;
453313a0c13SJung-uk Kim         AcpiOsPrintf (" (%s)",
454313a0c13SJung-uk Kim             AcpiUtGetRegionName (RegionObj->Region.SpaceId));
455313a0c13SJung-uk Kim         break;
456313a0c13SJung-uk Kim 
457313a0c13SJung-uk Kim     default:
458313a0c13SJung-uk Kim         break;
459313a0c13SJung-uk Kim     }
460313a0c13SJung-uk Kim 
461313a0c13SJung-uk Kim     AcpiOsPrintf ("\n");
462313a0c13SJung-uk Kim     return (Status);
463313a0c13SJung-uk Kim }
464313a0c13SJung-uk Kim 
465313a0c13SJung-uk Kim 
466313a0c13SJung-uk Kim /*******************************************************************************
467313a0c13SJung-uk Kim  *
468313a0c13SJung-uk Kim  * FUNCTION:    AcpiDbTestIntegerType
469313a0c13SJung-uk Kim  *
470313a0c13SJung-uk Kim  * PARAMETERS:  Node                - Parent NS node for the object
471313a0c13SJung-uk Kim  *              BitLength           - Actual length of the object. Used for
472313a0c13SJung-uk Kim  *                                    support of arbitrary length FieldUnit
473313a0c13SJung-uk Kim  *                                    and BufferField objects.
474313a0c13SJung-uk Kim  *
475313a0c13SJung-uk Kim  * RETURN:      Status
476313a0c13SJung-uk Kim  *
477313a0c13SJung-uk Kim  * DESCRIPTION: Test read/write for an Integer-valued object. Performs a
478313a0c13SJung-uk Kim  *              write/read/compare of an arbitrary new value, then performs
479313a0c13SJung-uk Kim  *              a write/read/compare of the original value.
480313a0c13SJung-uk Kim  *
481313a0c13SJung-uk Kim  ******************************************************************************/
482313a0c13SJung-uk Kim 
483313a0c13SJung-uk Kim static ACPI_STATUS
484313a0c13SJung-uk Kim AcpiDbTestIntegerType (
485313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node,
486313a0c13SJung-uk Kim     UINT32                  BitLength)
487313a0c13SJung-uk Kim {
488313a0c13SJung-uk Kim     ACPI_OBJECT             *Temp1 = NULL;
489313a0c13SJung-uk Kim     ACPI_OBJECT             *Temp2 = NULL;
490313a0c13SJung-uk Kim     ACPI_OBJECT             *Temp3 = NULL;
491313a0c13SJung-uk Kim     ACPI_OBJECT             WriteValue;
492313a0c13SJung-uk Kim     UINT64                  ValueToWrite;
493313a0c13SJung-uk Kim     ACPI_STATUS             Status;
494313a0c13SJung-uk Kim 
495313a0c13SJung-uk Kim 
496313a0c13SJung-uk Kim     if (BitLength > 64)
497313a0c13SJung-uk Kim     {
498313a0c13SJung-uk Kim         AcpiOsPrintf (" Invalid length for an Integer: %u", BitLength);
499313a0c13SJung-uk Kim         return (AE_OK);
500313a0c13SJung-uk Kim     }
501313a0c13SJung-uk Kim 
502313a0c13SJung-uk Kim     /* Read the original value */
503313a0c13SJung-uk Kim 
504313a0c13SJung-uk Kim     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_INTEGER, &Temp1);
505313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
506313a0c13SJung-uk Kim     {
507313a0c13SJung-uk Kim         return (Status);
508313a0c13SJung-uk Kim     }
509313a0c13SJung-uk Kim 
510313a0c13SJung-uk Kim     AcpiOsPrintf (" (%4.4X/%3.3X) %8.8X%8.8X",
511313a0c13SJung-uk Kim         BitLength, ACPI_ROUND_BITS_UP_TO_BYTES (BitLength),
512313a0c13SJung-uk Kim         ACPI_FORMAT_UINT64 (Temp1->Integer.Value));
513313a0c13SJung-uk Kim 
514313a0c13SJung-uk Kim     ValueToWrite = ACPI_UINT64_MAX >> (64 - BitLength);
515313a0c13SJung-uk Kim     if (Temp1->Integer.Value == ValueToWrite)
516313a0c13SJung-uk Kim     {
517313a0c13SJung-uk Kim         ValueToWrite = 0;
518313a0c13SJung-uk Kim     }
519313a0c13SJung-uk Kim 
520313a0c13SJung-uk Kim     /* Write a new value */
521313a0c13SJung-uk Kim 
522313a0c13SJung-uk Kim     WriteValue.Type = ACPI_TYPE_INTEGER;
523313a0c13SJung-uk Kim     WriteValue.Integer.Value = ValueToWrite;
524313a0c13SJung-uk Kim     Status = AcpiDbWriteToObject (Node, &WriteValue);
525313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
526313a0c13SJung-uk Kim     {
527313a0c13SJung-uk Kim         goto Exit;
528313a0c13SJung-uk Kim     }
529313a0c13SJung-uk Kim 
530313a0c13SJung-uk Kim     /* Ensure that we can read back the new value */
531313a0c13SJung-uk Kim 
532313a0c13SJung-uk Kim     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_INTEGER, &Temp2);
533313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
534313a0c13SJung-uk Kim     {
535313a0c13SJung-uk Kim         goto Exit;
536313a0c13SJung-uk Kim     }
537313a0c13SJung-uk Kim 
538313a0c13SJung-uk Kim     if (Temp2->Integer.Value != ValueToWrite)
539313a0c13SJung-uk Kim     {
540313a0c13SJung-uk Kim         AcpiOsPrintf (" MISMATCH 2: %8.8X%8.8X, expecting %8.8X%8.8X",
541313a0c13SJung-uk Kim             ACPI_FORMAT_UINT64 (Temp2->Integer.Value),
542313a0c13SJung-uk Kim             ACPI_FORMAT_UINT64 (ValueToWrite));
543313a0c13SJung-uk Kim     }
544313a0c13SJung-uk Kim 
545313a0c13SJung-uk Kim     /* Write back the original value */
546313a0c13SJung-uk Kim 
547313a0c13SJung-uk Kim     WriteValue.Integer.Value = Temp1->Integer.Value;
548313a0c13SJung-uk Kim     Status = AcpiDbWriteToObject (Node, &WriteValue);
549313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
550313a0c13SJung-uk Kim     {
551313a0c13SJung-uk Kim         goto Exit;
552313a0c13SJung-uk Kim     }
553313a0c13SJung-uk Kim 
554313a0c13SJung-uk Kim     /* Ensure that we can read back the original value */
555313a0c13SJung-uk Kim 
556313a0c13SJung-uk Kim     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_INTEGER, &Temp3);
557313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
558313a0c13SJung-uk Kim     {
559313a0c13SJung-uk Kim         goto Exit;
560313a0c13SJung-uk Kim     }
561313a0c13SJung-uk Kim 
562313a0c13SJung-uk Kim     if (Temp3->Integer.Value != Temp1->Integer.Value)
563313a0c13SJung-uk Kim     {
564313a0c13SJung-uk Kim         AcpiOsPrintf (" MISMATCH 3: %8.8X%8.8X, expecting %8.8X%8.8X",
565313a0c13SJung-uk Kim             ACPI_FORMAT_UINT64 (Temp3->Integer.Value),
566313a0c13SJung-uk Kim             ACPI_FORMAT_UINT64 (Temp1->Integer.Value));
567313a0c13SJung-uk Kim     }
568313a0c13SJung-uk Kim 
569313a0c13SJung-uk Kim Exit:
570313a0c13SJung-uk Kim     if (Temp1) {AcpiOsFree (Temp1);}
571313a0c13SJung-uk Kim     if (Temp2) {AcpiOsFree (Temp2);}
572313a0c13SJung-uk Kim     if (Temp3) {AcpiOsFree (Temp3);}
573313a0c13SJung-uk Kim     return (AE_OK);
574313a0c13SJung-uk Kim }
575313a0c13SJung-uk Kim 
576313a0c13SJung-uk Kim 
577313a0c13SJung-uk Kim /*******************************************************************************
578313a0c13SJung-uk Kim  *
579313a0c13SJung-uk Kim  * FUNCTION:    AcpiDbTestBufferType
580313a0c13SJung-uk Kim  *
581313a0c13SJung-uk Kim  * PARAMETERS:  Node                - Parent NS node for the object
582313a0c13SJung-uk Kim  *              BitLength           - Actual length of the object.
583313a0c13SJung-uk Kim  *
584313a0c13SJung-uk Kim  * RETURN:      Status
585313a0c13SJung-uk Kim  *
586313a0c13SJung-uk Kim  * DESCRIPTION: Test read/write for an Buffer-valued object. Performs a
587313a0c13SJung-uk Kim  *              write/read/compare of an arbitrary new value, then performs
588313a0c13SJung-uk Kim  *              a write/read/compare of the original value.
589313a0c13SJung-uk Kim  *
590313a0c13SJung-uk Kim  ******************************************************************************/
591313a0c13SJung-uk Kim 
592313a0c13SJung-uk Kim static ACPI_STATUS
593313a0c13SJung-uk Kim AcpiDbTestBufferType (
594313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node,
595313a0c13SJung-uk Kim     UINT32                  BitLength)
596313a0c13SJung-uk Kim {
597313a0c13SJung-uk Kim     ACPI_OBJECT             *Temp1 = NULL;
598313a0c13SJung-uk Kim     ACPI_OBJECT             *Temp2 = NULL;
599313a0c13SJung-uk Kim     ACPI_OBJECT             *Temp3 = NULL;
600313a0c13SJung-uk Kim     UINT8                   *Buffer;
601313a0c13SJung-uk Kim     ACPI_OBJECT             WriteValue;
602313a0c13SJung-uk Kim     ACPI_STATUS             Status;
603313a0c13SJung-uk Kim     UINT32                  ByteLength;
604313a0c13SJung-uk Kim     UINT32                  i;
605313a0c13SJung-uk Kim     UINT8                   ExtraBits;
606313a0c13SJung-uk Kim 
607313a0c13SJung-uk Kim 
608313a0c13SJung-uk Kim     ByteLength = ACPI_ROUND_BITS_UP_TO_BYTES (BitLength);
609313a0c13SJung-uk Kim     if (ByteLength == 0)
610313a0c13SJung-uk Kim     {
611313a0c13SJung-uk Kim         AcpiOsPrintf (" Ignoring zero length buffer");
612313a0c13SJung-uk Kim         return (AE_OK);
613313a0c13SJung-uk Kim     }
614313a0c13SJung-uk Kim 
615313a0c13SJung-uk Kim     /* Allocate a local buffer */
616313a0c13SJung-uk Kim 
617313a0c13SJung-uk Kim     Buffer = ACPI_ALLOCATE_ZEROED (ByteLength);
618313a0c13SJung-uk Kim     if (!Buffer)
619313a0c13SJung-uk Kim     {
620313a0c13SJung-uk Kim         return (AE_NO_MEMORY);
621313a0c13SJung-uk Kim     }
622313a0c13SJung-uk Kim 
623313a0c13SJung-uk Kim     /* Read the original value */
624313a0c13SJung-uk Kim 
625313a0c13SJung-uk Kim     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_BUFFER, &Temp1);
626313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
627313a0c13SJung-uk Kim     {
628313a0c13SJung-uk Kim         goto Exit;
629313a0c13SJung-uk Kim     }
630313a0c13SJung-uk Kim 
631313a0c13SJung-uk Kim     /* Emit a few bytes of the buffer */
632313a0c13SJung-uk Kim 
633313a0c13SJung-uk Kim     AcpiOsPrintf (" (%4.4X/%3.3X)", BitLength, Temp1->Buffer.Length);
634313a0c13SJung-uk Kim     for (i = 0; ((i < 4) && (i < ByteLength)); i++)
635313a0c13SJung-uk Kim     {
636313a0c13SJung-uk Kim         AcpiOsPrintf (" %2.2X", Temp1->Buffer.Pointer[i]);
637313a0c13SJung-uk Kim     }
638313a0c13SJung-uk Kim     AcpiOsPrintf ("...  ");
639313a0c13SJung-uk Kim 
640313a0c13SJung-uk Kim     /*
641313a0c13SJung-uk Kim      * Write a new value.
642313a0c13SJung-uk Kim      *
643313a0c13SJung-uk Kim      * Handle possible extra bits at the end of the buffer. Can
644313a0c13SJung-uk Kim      * happen for FieldUnits larger than an integer, but the bit
645313a0c13SJung-uk Kim      * count is not an integral number of bytes. Zero out the
646313a0c13SJung-uk Kim      * unused bits.
647313a0c13SJung-uk Kim      */
6485ef50723SJung-uk Kim     memset (Buffer, BUFFER_FILL_VALUE, ByteLength);
649313a0c13SJung-uk Kim     ExtraBits = BitLength % 8;
650313a0c13SJung-uk Kim     if (ExtraBits)
651313a0c13SJung-uk Kim     {
652313a0c13SJung-uk Kim         Buffer [ByteLength - 1] = ACPI_MASK_BITS_ABOVE (ExtraBits);
653313a0c13SJung-uk Kim     }
654313a0c13SJung-uk Kim 
655313a0c13SJung-uk Kim     WriteValue.Type = ACPI_TYPE_BUFFER;
656313a0c13SJung-uk Kim     WriteValue.Buffer.Length = ByteLength;
657313a0c13SJung-uk Kim     WriteValue.Buffer.Pointer = Buffer;
658313a0c13SJung-uk Kim 
659313a0c13SJung-uk Kim     Status = AcpiDbWriteToObject (Node, &WriteValue);
660313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
661313a0c13SJung-uk Kim     {
662313a0c13SJung-uk Kim         goto Exit;
663313a0c13SJung-uk Kim     }
664313a0c13SJung-uk Kim 
665313a0c13SJung-uk Kim     /* Ensure that we can read back the new value */
666313a0c13SJung-uk Kim 
667313a0c13SJung-uk Kim     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_BUFFER, &Temp2);
668313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
669313a0c13SJung-uk Kim     {
670313a0c13SJung-uk Kim         goto Exit;
671313a0c13SJung-uk Kim     }
672313a0c13SJung-uk Kim 
6735ef50723SJung-uk Kim     if (memcmp (Temp2->Buffer.Pointer, Buffer, ByteLength))
674313a0c13SJung-uk Kim     {
675313a0c13SJung-uk Kim         AcpiOsPrintf (" MISMATCH 2: New buffer value");
676313a0c13SJung-uk Kim     }
677313a0c13SJung-uk Kim 
678313a0c13SJung-uk Kim     /* Write back the original value */
679313a0c13SJung-uk Kim 
680313a0c13SJung-uk Kim     WriteValue.Buffer.Length = ByteLength;
681313a0c13SJung-uk Kim     WriteValue.Buffer.Pointer = Temp1->Buffer.Pointer;
682313a0c13SJung-uk Kim 
683313a0c13SJung-uk Kim     Status = AcpiDbWriteToObject (Node, &WriteValue);
684313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
685313a0c13SJung-uk Kim     {
686313a0c13SJung-uk Kim         goto Exit;
687313a0c13SJung-uk Kim     }
688313a0c13SJung-uk Kim 
689313a0c13SJung-uk Kim     /* Ensure that we can read back the original value */
690313a0c13SJung-uk Kim 
691313a0c13SJung-uk Kim     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_BUFFER, &Temp3);
692313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
693313a0c13SJung-uk Kim     {
694313a0c13SJung-uk Kim         goto Exit;
695313a0c13SJung-uk Kim     }
696313a0c13SJung-uk Kim 
69770e6ab8fSJung-uk Kim     if (memcmp (Temp1->Buffer.Pointer,
69870e6ab8fSJung-uk Kim             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;
7545ef50723SJung-uk Kim     WriteValue.String.Length = 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 
7715ef50723SJung-uk Kim     if (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 
7795ef50723SJung-uk Kim     WriteValue.String.Length = 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 
7965ef50723SJung-uk Kim     if (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;
85070e6ab8fSJung-uk Kim     Status = AcpiEvaluateObject (ReadHandle, NULL,
85170e6ab8fSJung-uk Kim         &ParamObjects, &ReturnObj);
852313a0c13SJung-uk Kim     AcpiGbl_MethodExecuting = FALSE;
853313a0c13SJung-uk Kim 
854313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
855313a0c13SJung-uk Kim     {
856313a0c13SJung-uk Kim         AcpiOsPrintf ("Could not read from object, %s",
857313a0c13SJung-uk Kim             AcpiFormatException (Status));
858313a0c13SJung-uk Kim         return (Status);
859313a0c13SJung-uk Kim     }
860313a0c13SJung-uk Kim 
861313a0c13SJung-uk Kim     RetValue = (ACPI_OBJECT *) ReturnObj.Pointer;
862313a0c13SJung-uk Kim 
863313a0c13SJung-uk Kim     switch (RetValue->Type)
864313a0c13SJung-uk Kim     {
865313a0c13SJung-uk Kim     case ACPI_TYPE_INTEGER:
866313a0c13SJung-uk Kim     case ACPI_TYPE_BUFFER:
867313a0c13SJung-uk Kim     case ACPI_TYPE_STRING:
868313a0c13SJung-uk Kim         /*
869313a0c13SJung-uk Kim          * Did we receive the type we wanted? Most important for the
870313a0c13SJung-uk Kim          * Integer/Buffer case (when a field is larger than an Integer,
871313a0c13SJung-uk Kim          * it should return a Buffer).
872313a0c13SJung-uk Kim          */
873313a0c13SJung-uk Kim         if (RetValue->Type != ExpectedType)
874313a0c13SJung-uk Kim         {
875313a0c13SJung-uk Kim             AcpiOsPrintf (" Type mismatch:  Expected %s, Received %s",
876313a0c13SJung-uk Kim                 AcpiUtGetTypeName (ExpectedType),
877313a0c13SJung-uk Kim                 AcpiUtGetTypeName (RetValue->Type));
878313a0c13SJung-uk Kim 
879313a0c13SJung-uk Kim             return (AE_TYPE);
880313a0c13SJung-uk Kim         }
881313a0c13SJung-uk Kim 
882313a0c13SJung-uk Kim         *Value = RetValue;
883313a0c13SJung-uk Kim         break;
884313a0c13SJung-uk Kim 
885313a0c13SJung-uk Kim     default:
886313a0c13SJung-uk Kim 
887313a0c13SJung-uk Kim         AcpiOsPrintf (" Unsupported return object type, %s",
888313a0c13SJung-uk Kim             AcpiUtGetTypeName (RetValue->Type));
889313a0c13SJung-uk Kim 
89070e6ab8fSJung-uk Kim         AcpiOsFree (ReturnObj.Pointer);
891313a0c13SJung-uk Kim         return (AE_TYPE);
892313a0c13SJung-uk Kim     }
893313a0c13SJung-uk Kim 
894313a0c13SJung-uk Kim     return (Status);
895313a0c13SJung-uk Kim }
896313a0c13SJung-uk Kim 
897313a0c13SJung-uk Kim 
898313a0c13SJung-uk Kim /*******************************************************************************
899313a0c13SJung-uk Kim  *
900313a0c13SJung-uk Kim  * FUNCTION:    AcpiDbWriteToObject
901313a0c13SJung-uk Kim  *
902313a0c13SJung-uk Kim  * PARAMETERS:  Node                - Parent NS node for the object
903313a0c13SJung-uk Kim  *              Value               - Value to be written
904313a0c13SJung-uk Kim  *
905313a0c13SJung-uk Kim  * RETURN:      Status
906313a0c13SJung-uk Kim  *
907313a0c13SJung-uk Kim  * DESCRIPTION: Performs a write to the specified object by invoking the
908313a0c13SJung-uk Kim  *              special debugger control method that writes the object. Thus,
909313a0c13SJung-uk Kim  *              the AML interpreter is doing all of the work, increasing the
910313a0c13SJung-uk Kim  *              validity of the test.
911313a0c13SJung-uk Kim  *
912313a0c13SJung-uk Kim  ******************************************************************************/
913313a0c13SJung-uk Kim 
914313a0c13SJung-uk Kim static ACPI_STATUS
915313a0c13SJung-uk Kim AcpiDbWriteToObject (
916313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node,
917313a0c13SJung-uk Kim     ACPI_OBJECT             *Value)
918313a0c13SJung-uk Kim {
919313a0c13SJung-uk Kim     ACPI_OBJECT_LIST        ParamObjects;
920313a0c13SJung-uk Kim     ACPI_OBJECT             Params[2];
921313a0c13SJung-uk Kim     ACPI_STATUS             Status;
922313a0c13SJung-uk Kim 
923313a0c13SJung-uk Kim 
924313a0c13SJung-uk Kim     Params[0].Type = ACPI_TYPE_LOCAL_REFERENCE;
925313a0c13SJung-uk Kim     Params[0].Reference.ActualType = Node->Type;
926313a0c13SJung-uk Kim     Params[0].Reference.Handle = ACPI_CAST_PTR (ACPI_HANDLE, Node);
927313a0c13SJung-uk Kim 
928313a0c13SJung-uk Kim     /* Copy the incoming user parameter */
929313a0c13SJung-uk Kim 
9305ef50723SJung-uk Kim     memcpy (&Params[1], Value, sizeof (ACPI_OBJECT));
931313a0c13SJung-uk Kim 
932313a0c13SJung-uk Kim     ParamObjects.Count = 2;
933313a0c13SJung-uk Kim     ParamObjects.Pointer = Params;
934313a0c13SJung-uk Kim 
935313a0c13SJung-uk Kim     AcpiGbl_MethodExecuting = TRUE;
936313a0c13SJung-uk Kim     Status = AcpiEvaluateObject (WriteHandle, NULL, &ParamObjects, NULL);
937313a0c13SJung-uk Kim     AcpiGbl_MethodExecuting = FALSE;
938313a0c13SJung-uk Kim 
939313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
940313a0c13SJung-uk Kim     {
941313a0c13SJung-uk Kim         AcpiOsPrintf ("Could not write to object, %s",
942313a0c13SJung-uk Kim             AcpiFormatException (Status));
943313a0c13SJung-uk Kim     }
944313a0c13SJung-uk Kim 
945313a0c13SJung-uk Kim     return (Status);
946313a0c13SJung-uk Kim }
947313a0c13SJung-uk Kim 
948313a0c13SJung-uk Kim 
949313a0c13SJung-uk Kim /*******************************************************************************
950313a0c13SJung-uk Kim  *
951313a0c13SJung-uk Kim  * FUNCTION:    AcpiDbEvaluateAllPredefinedNames
952313a0c13SJung-uk Kim  *
953313a0c13SJung-uk Kim  * PARAMETERS:  CountArg            - Max number of methods to execute
954313a0c13SJung-uk Kim  *
955313a0c13SJung-uk Kim  * RETURN:      None
956313a0c13SJung-uk Kim  *
957313a0c13SJung-uk Kim  * DESCRIPTION: Namespace batch execution. Execute predefined names in the
958313a0c13SJung-uk Kim  *              namespace, up to the max count, if specified.
959313a0c13SJung-uk Kim  *
960313a0c13SJung-uk Kim  ******************************************************************************/
961313a0c13SJung-uk Kim 
962313a0c13SJung-uk Kim static void
963313a0c13SJung-uk Kim AcpiDbEvaluateAllPredefinedNames (
964313a0c13SJung-uk Kim     char                    *CountArg)
965313a0c13SJung-uk Kim {
966313a0c13SJung-uk Kim     ACPI_DB_EXECUTE_WALK    Info;
967313a0c13SJung-uk Kim 
968313a0c13SJung-uk Kim 
969313a0c13SJung-uk Kim     Info.Count = 0;
970313a0c13SJung-uk Kim     Info.MaxCount = ACPI_UINT32_MAX;
971313a0c13SJung-uk Kim 
972313a0c13SJung-uk Kim     if (CountArg)
973313a0c13SJung-uk Kim     {
9745ef50723SJung-uk Kim         Info.MaxCount = strtoul (CountArg, NULL, 0);
975313a0c13SJung-uk Kim     }
976313a0c13SJung-uk Kim 
977313a0c13SJung-uk Kim     /* Search all nodes in namespace */
978313a0c13SJung-uk Kim 
97970e6ab8fSJung-uk Kim     (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
98070e6ab8fSJung-uk Kim         ACPI_UINT32_MAX, AcpiDbEvaluateOnePredefinedName, NULL,
98170e6ab8fSJung-uk Kim         (void *) &Info, NULL);
982313a0c13SJung-uk Kim 
983*f8146b88SJung-uk Kim     AcpiOsPrintf (
984*f8146b88SJung-uk Kim         "Evaluated %u predefined names in the namespace\n", Info.Count);
985313a0c13SJung-uk Kim }
986313a0c13SJung-uk Kim 
987313a0c13SJung-uk Kim 
988313a0c13SJung-uk Kim /*******************************************************************************
989313a0c13SJung-uk Kim  *
990313a0c13SJung-uk Kim  * FUNCTION:    AcpiDbEvaluateOnePredefinedName
991313a0c13SJung-uk Kim  *
992313a0c13SJung-uk Kim  * PARAMETERS:  Callback from WalkNamespace
993313a0c13SJung-uk Kim  *
994313a0c13SJung-uk Kim  * RETURN:      Status
995313a0c13SJung-uk Kim  *
996313a0c13SJung-uk Kim  * DESCRIPTION: Batch execution module. Currently only executes predefined
997313a0c13SJung-uk Kim  *              ACPI names.
998313a0c13SJung-uk Kim  *
999313a0c13SJung-uk Kim  ******************************************************************************/
1000313a0c13SJung-uk Kim 
1001313a0c13SJung-uk Kim static ACPI_STATUS
1002313a0c13SJung-uk Kim AcpiDbEvaluateOnePredefinedName (
1003313a0c13SJung-uk Kim     ACPI_HANDLE             ObjHandle,
1004313a0c13SJung-uk Kim     UINT32                  NestingLevel,
1005313a0c13SJung-uk Kim     void                    *Context,
1006313a0c13SJung-uk Kim     void                    **ReturnValue)
1007313a0c13SJung-uk Kim {
1008313a0c13SJung-uk Kim     ACPI_NAMESPACE_NODE         *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
1009313a0c13SJung-uk Kim     ACPI_DB_EXECUTE_WALK        *Info = (ACPI_DB_EXECUTE_WALK *) Context;
1010313a0c13SJung-uk Kim     char                        *Pathname;
1011313a0c13SJung-uk Kim     const ACPI_PREDEFINED_INFO  *Predefined;
1012313a0c13SJung-uk Kim     ACPI_DEVICE_INFO            *ObjInfo;
1013313a0c13SJung-uk Kim     ACPI_OBJECT_LIST            ParamObjects;
1014313a0c13SJung-uk Kim     ACPI_OBJECT                 Params[ACPI_METHOD_NUM_ARGS];
1015313a0c13SJung-uk Kim     ACPI_OBJECT                 *ThisParam;
1016313a0c13SJung-uk Kim     ACPI_BUFFER                 ReturnObj;
1017313a0c13SJung-uk Kim     ACPI_STATUS                 Status;
1018313a0c13SJung-uk Kim     UINT16                      ArgTypeList;
1019313a0c13SJung-uk Kim     UINT8                       ArgCount;
1020313a0c13SJung-uk Kim     UINT8                       ArgType;
1021313a0c13SJung-uk Kim     UINT32                      i;
1022313a0c13SJung-uk Kim 
1023313a0c13SJung-uk Kim 
1024313a0c13SJung-uk Kim     /* The name must be a predefined ACPI name */
1025313a0c13SJung-uk Kim 
1026313a0c13SJung-uk Kim     Predefined = AcpiUtMatchPredefinedMethod (Node->Name.Ascii);
1027313a0c13SJung-uk Kim     if (!Predefined)
1028313a0c13SJung-uk Kim     {
1029313a0c13SJung-uk Kim         return (AE_OK);
1030313a0c13SJung-uk Kim     }
1031313a0c13SJung-uk Kim 
1032313a0c13SJung-uk Kim     if (Node->Type == ACPI_TYPE_LOCAL_SCOPE)
1033313a0c13SJung-uk Kim     {
1034313a0c13SJung-uk Kim         return (AE_OK);
1035313a0c13SJung-uk Kim     }
1036313a0c13SJung-uk Kim 
1037*f8146b88SJung-uk Kim     Pathname = AcpiNsGetNormalizedPathname (Node, TRUE);
1038313a0c13SJung-uk Kim     if (!Pathname)
1039313a0c13SJung-uk Kim     {
1040313a0c13SJung-uk Kim         return (AE_OK);
1041313a0c13SJung-uk Kim     }
1042313a0c13SJung-uk Kim 
1043313a0c13SJung-uk Kim     /* Get the object info for number of method parameters */
1044313a0c13SJung-uk Kim 
1045313a0c13SJung-uk Kim     Status = AcpiGetObjectInfo (ObjHandle, &ObjInfo);
1046313a0c13SJung-uk Kim     if (ACPI_FAILURE (Status))
1047313a0c13SJung-uk Kim     {
1048313a0c13SJung-uk Kim         ACPI_FREE (Pathname);
1049313a0c13SJung-uk Kim         return (Status);
1050313a0c13SJung-uk Kim     }
1051313a0c13SJung-uk Kim 
1052313a0c13SJung-uk Kim     ParamObjects.Count = 0;
1053313a0c13SJung-uk Kim     ParamObjects.Pointer = NULL;
1054313a0c13SJung-uk Kim 
1055313a0c13SJung-uk Kim     if (ObjInfo->Type == ACPI_TYPE_METHOD)
1056313a0c13SJung-uk Kim     {
1057313a0c13SJung-uk Kim         /* Setup default parameters (with proper types) */
1058313a0c13SJung-uk Kim 
1059313a0c13SJung-uk Kim         ArgTypeList = Predefined->Info.ArgumentList;
1060313a0c13SJung-uk Kim         ArgCount = METHOD_GET_ARG_COUNT (ArgTypeList);
1061313a0c13SJung-uk Kim 
1062313a0c13SJung-uk Kim         /*
1063313a0c13SJung-uk Kim          * Setup the ACPI-required number of arguments, regardless of what
1064313a0c13SJung-uk Kim          * the actual method defines. If there is a difference, then the
1065313a0c13SJung-uk Kim          * method is wrong and a warning will be issued during execution.
1066313a0c13SJung-uk Kim          */
1067313a0c13SJung-uk Kim         ThisParam = Params;
1068313a0c13SJung-uk Kim         for (i = 0; i < ArgCount; i++)
1069313a0c13SJung-uk Kim         {
1070313a0c13SJung-uk Kim             ArgType = METHOD_GET_NEXT_TYPE (ArgTypeList);
1071313a0c13SJung-uk Kim             ThisParam->Type = ArgType;
1072313a0c13SJung-uk Kim 
1073313a0c13SJung-uk Kim             switch (ArgType)
1074313a0c13SJung-uk Kim             {
1075313a0c13SJung-uk Kim             case ACPI_TYPE_INTEGER:
1076313a0c13SJung-uk Kim 
1077313a0c13SJung-uk Kim                 ThisParam->Integer.Value = 1;
1078313a0c13SJung-uk Kim                 break;
1079313a0c13SJung-uk Kim 
1080313a0c13SJung-uk Kim             case ACPI_TYPE_STRING:
1081313a0c13SJung-uk Kim 
108270e6ab8fSJung-uk Kim                 ThisParam->String.Pointer =
108370e6ab8fSJung-uk Kim                     "This is the default argument string";
108470e6ab8fSJung-uk Kim                 ThisParam->String.Length =
108570e6ab8fSJung-uk Kim                     strlen (ThisParam->String.Pointer);
1086313a0c13SJung-uk Kim                 break;
1087313a0c13SJung-uk Kim 
1088313a0c13SJung-uk Kim             case ACPI_TYPE_BUFFER:
1089313a0c13SJung-uk Kim 
1090313a0c13SJung-uk Kim                 ThisParam->Buffer.Pointer = (UINT8 *) Params; /* just a garbage buffer */
1091313a0c13SJung-uk Kim                 ThisParam->Buffer.Length = 48;
1092313a0c13SJung-uk Kim                 break;
1093313a0c13SJung-uk Kim 
1094313a0c13SJung-uk Kim              case ACPI_TYPE_PACKAGE:
1095313a0c13SJung-uk Kim 
1096313a0c13SJung-uk Kim                 ThisParam->Package.Elements = NULL;
1097313a0c13SJung-uk Kim                 ThisParam->Package.Count = 0;
1098313a0c13SJung-uk Kim                 break;
1099313a0c13SJung-uk Kim 
1100313a0c13SJung-uk Kim            default:
1101313a0c13SJung-uk Kim 
1102313a0c13SJung-uk Kim                 AcpiOsPrintf ("%s: Unsupported argument type: %u\n",
1103313a0c13SJung-uk Kim                     Pathname, ArgType);
1104313a0c13SJung-uk Kim                 break;
1105313a0c13SJung-uk Kim             }
1106313a0c13SJung-uk Kim 
1107313a0c13SJung-uk Kim             ThisParam++;
1108313a0c13SJung-uk Kim         }
1109313a0c13SJung-uk Kim 
1110313a0c13SJung-uk Kim         ParamObjects.Count = ArgCount;
1111313a0c13SJung-uk Kim         ParamObjects.Pointer = Params;
1112313a0c13SJung-uk Kim     }
1113313a0c13SJung-uk Kim 
1114313a0c13SJung-uk Kim     ACPI_FREE (ObjInfo);
1115313a0c13SJung-uk Kim     ReturnObj.Pointer = NULL;
1116313a0c13SJung-uk Kim     ReturnObj.Length = ACPI_ALLOCATE_BUFFER;
1117313a0c13SJung-uk Kim 
1118313a0c13SJung-uk Kim     /* Do the actual method execution */
1119313a0c13SJung-uk Kim 
1120313a0c13SJung-uk Kim     AcpiGbl_MethodExecuting = TRUE;
1121313a0c13SJung-uk Kim 
1122313a0c13SJung-uk Kim     Status = AcpiEvaluateObject (Node, NULL, &ParamObjects, &ReturnObj);
1123313a0c13SJung-uk Kim 
112470e6ab8fSJung-uk Kim     AcpiOsPrintf ("%-32s returned %s\n",
112570e6ab8fSJung-uk Kim         Pathname, AcpiFormatException (Status));
1126313a0c13SJung-uk Kim     AcpiGbl_MethodExecuting = FALSE;
1127313a0c13SJung-uk Kim     ACPI_FREE (Pathname);
1128313a0c13SJung-uk Kim 
1129313a0c13SJung-uk Kim     /* Ignore status from method execution */
1130313a0c13SJung-uk Kim 
1131313a0c13SJung-uk Kim     Status = AE_OK;
1132313a0c13SJung-uk Kim 
1133313a0c13SJung-uk Kim     /* Update count, check if we have executed enough methods */
1134313a0c13SJung-uk Kim 
1135313a0c13SJung-uk Kim     Info->Count++;
1136313a0c13SJung-uk Kim     if (Info->Count >= Info->MaxCount)
1137313a0c13SJung-uk Kim     {
1138313a0c13SJung-uk Kim         Status = AE_CTRL_TERMINATE;
1139313a0c13SJung-uk Kim     }
1140313a0c13SJung-uk Kim 
1141313a0c13SJung-uk Kim     return (Status);
1142313a0c13SJung-uk Kim }
1143