xref: /dflybsd-src/sys/contrib/dev/acpica/source/components/debugger/dbtest.c (revision 383048aca08c2de51d27aa8638a36982a0d74550)
120294b7eSSascha Wildner /*******************************************************************************
220294b7eSSascha Wildner  *
320294b7eSSascha Wildner  * Module Name: dbtest - Various debug-related tests
420294b7eSSascha Wildner  *
520294b7eSSascha Wildner  ******************************************************************************/
620294b7eSSascha Wildner 
7b4315fc7SSascha Wildner /******************************************************************************
8b4315fc7SSascha Wildner  *
9b4315fc7SSascha Wildner  * 1. Copyright Notice
10b4315fc7SSascha Wildner  *
11*383048acSSascha Wildner  * Some or all of this work - Copyright (c) 1999 - 2021, Intel Corp.
1220294b7eSSascha Wildner  * All rights reserved.
1320294b7eSSascha Wildner  *
14b4315fc7SSascha Wildner  * 2. License
15b4315fc7SSascha Wildner  *
16b4315fc7SSascha Wildner  * 2.1. This is your license from Intel Corp. under its intellectual property
17b4315fc7SSascha Wildner  * rights. You may have additional license terms from the party that provided
18b4315fc7SSascha Wildner  * you this software, covering your right to use that party's intellectual
19b4315fc7SSascha Wildner  * property rights.
20b4315fc7SSascha Wildner  *
21b4315fc7SSascha Wildner  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22b4315fc7SSascha Wildner  * copy of the source code appearing in this file ("Covered Code") an
23b4315fc7SSascha Wildner  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24b4315fc7SSascha Wildner  * base code distributed originally by Intel ("Original Intel Code") to copy,
25b4315fc7SSascha Wildner  * make derivatives, distribute, use and display any portion of the Covered
26b4315fc7SSascha Wildner  * Code in any form, with the right to sublicense such rights; and
27b4315fc7SSascha Wildner  *
28b4315fc7SSascha Wildner  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29b4315fc7SSascha Wildner  * license (with the right to sublicense), under only those claims of Intel
30b4315fc7SSascha Wildner  * patents that are infringed by the Original Intel Code, to make, use, sell,
31b4315fc7SSascha Wildner  * offer to sell, and import the Covered Code and derivative works thereof
32b4315fc7SSascha Wildner  * solely to the minimum extent necessary to exercise the above copyright
33b4315fc7SSascha Wildner  * license, and in no event shall the patent license extend to any additions
34b4315fc7SSascha Wildner  * to or modifications of the Original Intel Code. No other license or right
35b4315fc7SSascha Wildner  * is granted directly or by implication, estoppel or otherwise;
36b4315fc7SSascha Wildner  *
37b4315fc7SSascha Wildner  * The above copyright and patent license is granted only if the following
38b4315fc7SSascha Wildner  * conditions are met:
39b4315fc7SSascha Wildner  *
40b4315fc7SSascha Wildner  * 3. Conditions
41b4315fc7SSascha Wildner  *
42b4315fc7SSascha Wildner  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43b4315fc7SSascha Wildner  * Redistribution of source code of any substantial portion of the Covered
44b4315fc7SSascha Wildner  * Code or modification with rights to further distribute source must include
45b4315fc7SSascha Wildner  * the above Copyright Notice, the above License, this list of Conditions,
46b4315fc7SSascha Wildner  * and the following Disclaimer and Export Compliance provision. In addition,
47b4315fc7SSascha Wildner  * Licensee must cause all Covered Code to which Licensee contributes to
48b4315fc7SSascha Wildner  * contain a file documenting the changes Licensee made to create that Covered
49b4315fc7SSascha Wildner  * Code and the date of any change. Licensee must include in that file the
50b4315fc7SSascha Wildner  * documentation of any changes made by any predecessor Licensee. Licensee
51b4315fc7SSascha Wildner  * must include a prominent statement that the modification is derived,
52b4315fc7SSascha Wildner  * directly or indirectly, from Original Intel Code.
53b4315fc7SSascha Wildner  *
54b4315fc7SSascha Wildner  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55b4315fc7SSascha Wildner  * Redistribution of source code of any substantial portion of the Covered
56b4315fc7SSascha Wildner  * Code or modification without rights to further distribute source must
57b4315fc7SSascha Wildner  * include the following Disclaimer and Export Compliance provision in the
58b4315fc7SSascha Wildner  * documentation and/or other materials provided with distribution. In
59b4315fc7SSascha Wildner  * addition, Licensee may not authorize further sublicense of source of any
60b4315fc7SSascha Wildner  * portion of the Covered Code, and must include terms to the effect that the
61b4315fc7SSascha Wildner  * license from Licensee to its licensee is limited to the intellectual
62b4315fc7SSascha Wildner  * property embodied in the software Licensee provides to its licensee, and
63b4315fc7SSascha Wildner  * not to intellectual property embodied in modifications its licensee may
64b4315fc7SSascha Wildner  * make.
65b4315fc7SSascha Wildner  *
66b4315fc7SSascha Wildner  * 3.3. Redistribution of Executable. Redistribution in executable form of any
67b4315fc7SSascha Wildner  * substantial portion of the Covered Code or modification must reproduce the
68b4315fc7SSascha Wildner  * above Copyright Notice, and the following Disclaimer and Export Compliance
69b4315fc7SSascha Wildner  * provision in the documentation and/or other materials provided with the
70b4315fc7SSascha Wildner  * distribution.
71b4315fc7SSascha Wildner  *
72b4315fc7SSascha Wildner  * 3.4. Intel retains all right, title, and interest in and to the Original
73b4315fc7SSascha Wildner  * Intel Code.
74b4315fc7SSascha Wildner  *
75b4315fc7SSascha Wildner  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76b4315fc7SSascha Wildner  * Intel shall be used in advertising or otherwise to promote the sale, use or
77b4315fc7SSascha Wildner  * other dealings in products derived from or relating to the Covered Code
78b4315fc7SSascha Wildner  * without prior written authorization from Intel.
79b4315fc7SSascha Wildner  *
80b4315fc7SSascha Wildner  * 4. Disclaimer and Export Compliance
81b4315fc7SSascha Wildner  *
82b4315fc7SSascha Wildner  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83b4315fc7SSascha Wildner  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84b4315fc7SSascha Wildner  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85b4315fc7SSascha Wildner  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86b4315fc7SSascha Wildner  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87b4315fc7SSascha Wildner  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88b4315fc7SSascha Wildner  * PARTICULAR PURPOSE.
89b4315fc7SSascha Wildner  *
90b4315fc7SSascha Wildner  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91b4315fc7SSascha Wildner  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92b4315fc7SSascha Wildner  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93b4315fc7SSascha Wildner  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94b4315fc7SSascha Wildner  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95b4315fc7SSascha Wildner  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96b4315fc7SSascha Wildner  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97b4315fc7SSascha Wildner  * LIMITED REMEDY.
98b4315fc7SSascha Wildner  *
99b4315fc7SSascha Wildner  * 4.3. Licensee shall not export, either directly or indirectly, any of this
100b4315fc7SSascha Wildner  * software or system incorporating such software without first obtaining any
101b4315fc7SSascha Wildner  * required license or other approval from the U. S. Department of Commerce or
102b4315fc7SSascha Wildner  * any other agency or department of the United States Government. In the
103b4315fc7SSascha Wildner  * event Licensee exports any such software from the United States or
104b4315fc7SSascha Wildner  * re-exports any such software from a foreign destination, Licensee shall
105b4315fc7SSascha Wildner  * ensure that the distribution and export/re-export of the software is in
106b4315fc7SSascha Wildner  * compliance with all laws, regulations, orders, or other restrictions of the
107b4315fc7SSascha Wildner  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108b4315fc7SSascha Wildner  * any of its subsidiaries will export/re-export any technical data, process,
109b4315fc7SSascha Wildner  * software, or service, directly or indirectly, to any country for which the
110b4315fc7SSascha Wildner  * United States government or any agency thereof requires an export license,
111b4315fc7SSascha Wildner  * other governmental approval, or letter of assurance, without first obtaining
112b4315fc7SSascha Wildner  * such license, approval or letter.
113b4315fc7SSascha Wildner  *
114b4315fc7SSascha Wildner  *****************************************************************************
115b4315fc7SSascha Wildner  *
116b4315fc7SSascha Wildner  * Alternatively, you may choose to be licensed under the terms of the
117b4315fc7SSascha Wildner  * following license:
118b4315fc7SSascha Wildner  *
11920294b7eSSascha Wildner  * Redistribution and use in source and binary forms, with or without
12020294b7eSSascha Wildner  * modification, are permitted provided that the following conditions
12120294b7eSSascha Wildner  * are met:
12220294b7eSSascha Wildner  * 1. Redistributions of source code must retain the above copyright
12320294b7eSSascha Wildner  *    notice, this list of conditions, and the following disclaimer,
12420294b7eSSascha Wildner  *    without modification.
12520294b7eSSascha Wildner  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
12620294b7eSSascha Wildner  *    substantially similar to the "NO WARRANTY" disclaimer below
12720294b7eSSascha Wildner  *    ("Disclaimer") and any redistribution must be conditioned upon
12820294b7eSSascha Wildner  *    including a substantially similar Disclaimer requirement for further
12920294b7eSSascha Wildner  *    binary redistribution.
13020294b7eSSascha Wildner  * 3. Neither the names of the above-listed copyright holders nor the names
13120294b7eSSascha Wildner  *    of any contributors may be used to endorse or promote products derived
13220294b7eSSascha Wildner  *    from this software without specific prior written permission.
13320294b7eSSascha Wildner  *
134b4315fc7SSascha Wildner  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135b4315fc7SSascha Wildner  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136b4315fc7SSascha Wildner  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137b4315fc7SSascha Wildner  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138b4315fc7SSascha Wildner  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139b4315fc7SSascha Wildner  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140b4315fc7SSascha Wildner  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141b4315fc7SSascha Wildner  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142b4315fc7SSascha Wildner  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143b4315fc7SSascha Wildner  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144b4315fc7SSascha Wildner  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145b4315fc7SSascha Wildner  *
146b4315fc7SSascha Wildner  * Alternatively, you may choose to be licensed under the terms of the
14720294b7eSSascha Wildner  * GNU General Public License ("GPL") version 2 as published by the Free
14820294b7eSSascha Wildner  * Software Foundation.
14920294b7eSSascha Wildner  *
150b4315fc7SSascha Wildner  *****************************************************************************/
15120294b7eSSascha Wildner 
15220294b7eSSascha Wildner #include "acpi.h"
15320294b7eSSascha Wildner #include "accommon.h"
15420294b7eSSascha Wildner #include "acdebug.h"
15520294b7eSSascha Wildner #include "acnamesp.h"
15620294b7eSSascha Wildner #include "acpredef.h"
15700ffa116SSascha Wildner #include "acinterp.h"
15820294b7eSSascha Wildner 
15920294b7eSSascha Wildner #ifdef ACPI_DEBUGGER
16020294b7eSSascha Wildner 
16120294b7eSSascha Wildner #define _COMPONENT          ACPI_CA_DEBUGGER
16220294b7eSSascha Wildner         ACPI_MODULE_NAME    ("dbtest")
16320294b7eSSascha Wildner 
16420294b7eSSascha Wildner 
16520294b7eSSascha Wildner /* Local prototypes */
16620294b7eSSascha Wildner 
16720294b7eSSascha Wildner static void
16820294b7eSSascha Wildner AcpiDbTestAllObjects (
16920294b7eSSascha Wildner     void);
17020294b7eSSascha Wildner 
17120294b7eSSascha Wildner static ACPI_STATUS
17220294b7eSSascha Wildner AcpiDbTestOneObject (
17320294b7eSSascha Wildner     ACPI_HANDLE             ObjHandle,
17420294b7eSSascha Wildner     UINT32                  NestingLevel,
17520294b7eSSascha Wildner     void                    *Context,
17620294b7eSSascha Wildner     void                    **ReturnValue);
17720294b7eSSascha Wildner 
17820294b7eSSascha Wildner static ACPI_STATUS
17920294b7eSSascha Wildner AcpiDbTestIntegerType (
18020294b7eSSascha Wildner     ACPI_NAMESPACE_NODE     *Node,
18120294b7eSSascha Wildner     UINT32                  BitLength);
18220294b7eSSascha Wildner 
18320294b7eSSascha Wildner static ACPI_STATUS
18420294b7eSSascha Wildner AcpiDbTestBufferType (
18520294b7eSSascha Wildner     ACPI_NAMESPACE_NODE     *Node,
18620294b7eSSascha Wildner     UINT32                  BitLength);
18720294b7eSSascha Wildner 
18820294b7eSSascha Wildner static ACPI_STATUS
18920294b7eSSascha Wildner AcpiDbTestStringType (
19020294b7eSSascha Wildner     ACPI_NAMESPACE_NODE     *Node,
19120294b7eSSascha Wildner     UINT32                  ByteLength);
19220294b7eSSascha Wildner 
19320294b7eSSascha Wildner static ACPI_STATUS
1947bcb6cafSSascha Wildner AcpiDbTestPackageType (
1957bcb6cafSSascha Wildner     ACPI_NAMESPACE_NODE     *Node);
1967bcb6cafSSascha Wildner 
1977bcb6cafSSascha Wildner static ACPI_STATUS
19800ffa116SSascha Wildner AcpiDbTestFieldUnitType (
19900ffa116SSascha Wildner     ACPI_OPERAND_OBJECT     *ObjDesc);
20000ffa116SSascha Wildner 
20100ffa116SSascha Wildner static ACPI_STATUS
20220294b7eSSascha Wildner AcpiDbReadFromObject (
20320294b7eSSascha Wildner     ACPI_NAMESPACE_NODE     *Node,
20420294b7eSSascha Wildner     ACPI_OBJECT_TYPE        ExpectedType,
20520294b7eSSascha Wildner     ACPI_OBJECT             **Value);
20620294b7eSSascha Wildner 
20720294b7eSSascha Wildner static ACPI_STATUS
20820294b7eSSascha Wildner AcpiDbWriteToObject (
20920294b7eSSascha Wildner     ACPI_NAMESPACE_NODE     *Node,
21020294b7eSSascha Wildner     ACPI_OBJECT             *Value);
21120294b7eSSascha Wildner 
21220294b7eSSascha Wildner static void
21320294b7eSSascha Wildner AcpiDbEvaluateAllPredefinedNames (
21420294b7eSSascha Wildner     char                    *CountArg);
21520294b7eSSascha Wildner 
21620294b7eSSascha Wildner static ACPI_STATUS
21720294b7eSSascha Wildner AcpiDbEvaluateOnePredefinedName (
21820294b7eSSascha Wildner     ACPI_HANDLE             ObjHandle,
21920294b7eSSascha Wildner     UINT32                  NestingLevel,
22020294b7eSSascha Wildner     void                    *Context,
22120294b7eSSascha Wildner     void                    **ReturnValue);
22220294b7eSSascha Wildner 
22320294b7eSSascha Wildner /*
22420294b7eSSascha Wildner  * Test subcommands
22520294b7eSSascha Wildner  */
22620294b7eSSascha Wildner static ACPI_DB_ARGUMENT_INFO    AcpiDbTestTypes [] =
22720294b7eSSascha Wildner {
22820294b7eSSascha Wildner     {"OBJECTS"},
22920294b7eSSascha Wildner     {"PREDEFINED"},
23020294b7eSSascha Wildner     {NULL}           /* Must be null terminated */
23120294b7eSSascha Wildner };
23220294b7eSSascha Wildner 
23320294b7eSSascha Wildner #define CMD_TEST_OBJECTS        0
23420294b7eSSascha Wildner #define CMD_TEST_PREDEFINED     1
23520294b7eSSascha Wildner 
23620294b7eSSascha Wildner #define BUFFER_FILL_VALUE       0xFF
23720294b7eSSascha Wildner 
23820294b7eSSascha Wildner /*
23920294b7eSSascha Wildner  * Support for the special debugger read/write control methods.
24020294b7eSSascha Wildner  * These methods are installed into the current namespace and are
24120294b7eSSascha Wildner  * used to read and write the various namespace objects. The point
24220294b7eSSascha Wildner  * is to force the AML interpreter do all of the work.
24320294b7eSSascha Wildner  */
24420294b7eSSascha Wildner #define ACPI_DB_READ_METHOD     "\\_T98"
24520294b7eSSascha Wildner #define ACPI_DB_WRITE_METHOD    "\\_T99"
24620294b7eSSascha Wildner 
24720294b7eSSascha Wildner static ACPI_HANDLE          ReadHandle = NULL;
24820294b7eSSascha Wildner static ACPI_HANDLE          WriteHandle = NULL;
24920294b7eSSascha Wildner 
25000ffa116SSascha Wildner /* ASL Definitions of the debugger read/write control methods. AML below. */
25120294b7eSSascha Wildner 
25220294b7eSSascha Wildner #if 0
25320294b7eSSascha Wildner DefinitionBlock ("ssdt.aml", "SSDT", 2, "Intel", "DEBUG", 0x00000001)
25420294b7eSSascha Wildner {
25520294b7eSSascha Wildner     Method (_T98, 1, NotSerialized)     /* Read */
25620294b7eSSascha Wildner     {
25720294b7eSSascha Wildner         Return (DeRefOf (Arg0))
25820294b7eSSascha Wildner     }
25920294b7eSSascha Wildner }
26020294b7eSSascha Wildner DefinitionBlock ("ssdt2.aml", "SSDT", 2, "Intel", "DEBUG", 0x00000001)
26120294b7eSSascha Wildner {
26220294b7eSSascha Wildner     Method (_T99, 2, NotSerialized)     /* Write */
26320294b7eSSascha Wildner     {
26420294b7eSSascha Wildner         Store (Arg1, Arg0)
26520294b7eSSascha Wildner     }
26620294b7eSSascha Wildner }
26720294b7eSSascha Wildner #endif
26820294b7eSSascha Wildner 
26920294b7eSSascha Wildner static unsigned char ReadMethodCode[] =
27020294b7eSSascha Wildner {
27120294b7eSSascha Wildner     0x53,0x53,0x44,0x54,0x2E,0x00,0x00,0x00,  /* 00000000    "SSDT...." */
27220294b7eSSascha Wildner     0x02,0xC9,0x49,0x6E,0x74,0x65,0x6C,0x00,  /* 00000008    "..Intel." */
27320294b7eSSascha Wildner     0x44,0x45,0x42,0x55,0x47,0x00,0x00,0x00,  /* 00000010    "DEBUG..." */
27420294b7eSSascha Wildner     0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
27520294b7eSSascha Wildner     0x18,0x12,0x13,0x20,0x14,0x09,0x5F,0x54,  /* 00000020    "... .._T" */
27620294b7eSSascha Wildner     0x39,0x38,0x01,0xA4,0x83,0x68             /* 00000028    "98...h"   */
27720294b7eSSascha Wildner };
27820294b7eSSascha Wildner 
27920294b7eSSascha Wildner static unsigned char WriteMethodCode[] =
28020294b7eSSascha Wildner {
28120294b7eSSascha Wildner     0x53,0x53,0x44,0x54,0x2E,0x00,0x00,0x00,  /* 00000000    "SSDT...." */
28220294b7eSSascha Wildner     0x02,0x15,0x49,0x6E,0x74,0x65,0x6C,0x00,  /* 00000008    "..Intel." */
28320294b7eSSascha Wildner     0x44,0x45,0x42,0x55,0x47,0x00,0x00,0x00,  /* 00000010    "DEBUG..." */
28420294b7eSSascha Wildner     0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
28520294b7eSSascha Wildner     0x18,0x12,0x13,0x20,0x14,0x09,0x5F,0x54,  /* 00000020    "... .._T" */
28620294b7eSSascha Wildner     0x39,0x39,0x02,0x70,0x69,0x68             /* 00000028    "99.pih"   */
28720294b7eSSascha Wildner };
28820294b7eSSascha Wildner 
28920294b7eSSascha Wildner 
29020294b7eSSascha Wildner /*******************************************************************************
29120294b7eSSascha Wildner  *
29220294b7eSSascha Wildner  * FUNCTION:    AcpiDbExecuteTest
29320294b7eSSascha Wildner  *
29420294b7eSSascha Wildner  * PARAMETERS:  TypeArg         - Subcommand
29520294b7eSSascha Wildner  *
29620294b7eSSascha Wildner  * RETURN:      None
29720294b7eSSascha Wildner  *
29820294b7eSSascha Wildner  * DESCRIPTION: Execute various debug tests.
29920294b7eSSascha Wildner  *
30020294b7eSSascha Wildner  * Note: Code is prepared for future expansion of the TEST command.
30120294b7eSSascha Wildner  *
30220294b7eSSascha Wildner  ******************************************************************************/
30320294b7eSSascha Wildner 
30420294b7eSSascha Wildner void
AcpiDbExecuteTest(char * TypeArg)30520294b7eSSascha Wildner AcpiDbExecuteTest (
30620294b7eSSascha Wildner     char                    *TypeArg)
30720294b7eSSascha Wildner {
30820294b7eSSascha Wildner     UINT32                  Temp;
30920294b7eSSascha Wildner 
31020294b7eSSascha Wildner 
31120294b7eSSascha Wildner     AcpiUtStrupr (TypeArg);
31220294b7eSSascha Wildner     Temp = AcpiDbMatchArgument (TypeArg, AcpiDbTestTypes);
31320294b7eSSascha Wildner     if (Temp == ACPI_TYPE_NOT_FOUND)
31420294b7eSSascha Wildner     {
31520294b7eSSascha Wildner         AcpiOsPrintf ("Invalid or unsupported argument\n");
31620294b7eSSascha Wildner         return;
31720294b7eSSascha Wildner     }
31820294b7eSSascha Wildner 
31920294b7eSSascha Wildner     switch (Temp)
32020294b7eSSascha Wildner     {
32120294b7eSSascha Wildner     case CMD_TEST_OBJECTS:
32220294b7eSSascha Wildner 
32320294b7eSSascha Wildner         AcpiDbTestAllObjects ();
32420294b7eSSascha Wildner         break;
32520294b7eSSascha Wildner 
32620294b7eSSascha Wildner     case CMD_TEST_PREDEFINED:
32720294b7eSSascha Wildner 
32820294b7eSSascha Wildner         AcpiDbEvaluateAllPredefinedNames (NULL);
32920294b7eSSascha Wildner         break;
33020294b7eSSascha Wildner 
33120294b7eSSascha Wildner     default:
33220294b7eSSascha Wildner         break;
33320294b7eSSascha Wildner     }
33420294b7eSSascha Wildner }
33520294b7eSSascha Wildner 
33620294b7eSSascha Wildner 
33720294b7eSSascha Wildner /*******************************************************************************
33820294b7eSSascha Wildner  *
33920294b7eSSascha Wildner  * FUNCTION:    AcpiDbTestAllObjects
34020294b7eSSascha Wildner  *
34120294b7eSSascha Wildner  * PARAMETERS:  None
34220294b7eSSascha Wildner  *
34320294b7eSSascha Wildner  * RETURN:      None
34420294b7eSSascha Wildner  *
34520294b7eSSascha Wildner  * DESCRIPTION: This test implements the OBJECTS subcommand. It exercises the
34620294b7eSSascha Wildner  *              namespace by reading/writing/comparing all data objects such
34720294b7eSSascha Wildner  *              as integers, strings, buffers, fields, buffer fields, etc.
34820294b7eSSascha Wildner  *
34920294b7eSSascha Wildner  ******************************************************************************/
35020294b7eSSascha Wildner 
35120294b7eSSascha Wildner static void
AcpiDbTestAllObjects(void)35220294b7eSSascha Wildner AcpiDbTestAllObjects (
35320294b7eSSascha Wildner     void)
35420294b7eSSascha Wildner {
35520294b7eSSascha Wildner     ACPI_STATUS             Status;
35620294b7eSSascha Wildner 
35720294b7eSSascha Wildner 
35820294b7eSSascha Wildner     /* Install the debugger read-object control method if necessary */
35920294b7eSSascha Wildner 
36020294b7eSSascha Wildner     if (!ReadHandle)
36120294b7eSSascha Wildner     {
36220294b7eSSascha Wildner         Status = AcpiInstallMethod (ReadMethodCode);
36320294b7eSSascha Wildner         if (ACPI_FAILURE (Status))
36420294b7eSSascha Wildner         {
36520294b7eSSascha Wildner             AcpiOsPrintf ("%s, Could not install debugger read method\n",
36620294b7eSSascha Wildner                 AcpiFormatException (Status));
36720294b7eSSascha Wildner             return;
36820294b7eSSascha Wildner         }
36920294b7eSSascha Wildner 
37020294b7eSSascha Wildner         Status = AcpiGetHandle (NULL, ACPI_DB_READ_METHOD, &ReadHandle);
37120294b7eSSascha Wildner         if (ACPI_FAILURE (Status))
37220294b7eSSascha Wildner         {
37320294b7eSSascha Wildner             AcpiOsPrintf ("Could not obtain handle for debug method %s\n",
37420294b7eSSascha Wildner                 ACPI_DB_READ_METHOD);
37520294b7eSSascha Wildner             return;
37620294b7eSSascha Wildner         }
37720294b7eSSascha Wildner     }
37820294b7eSSascha Wildner 
37920294b7eSSascha Wildner     /* Install the debugger write-object control method if necessary */
38020294b7eSSascha Wildner 
38120294b7eSSascha Wildner     if (!WriteHandle)
38220294b7eSSascha Wildner     {
38320294b7eSSascha Wildner         Status = AcpiInstallMethod (WriteMethodCode);
38420294b7eSSascha Wildner         if (ACPI_FAILURE (Status))
38520294b7eSSascha Wildner         {
38620294b7eSSascha Wildner             AcpiOsPrintf ("%s, Could not install debugger write method\n",
38720294b7eSSascha Wildner                 AcpiFormatException (Status));
38820294b7eSSascha Wildner             return;
38920294b7eSSascha Wildner         }
39020294b7eSSascha Wildner 
39120294b7eSSascha Wildner         Status = AcpiGetHandle (NULL, ACPI_DB_WRITE_METHOD, &WriteHandle);
39220294b7eSSascha Wildner         if (ACPI_FAILURE (Status))
39320294b7eSSascha Wildner         {
39420294b7eSSascha Wildner             AcpiOsPrintf ("Could not obtain handle for debug method %s\n",
39520294b7eSSascha Wildner                 ACPI_DB_WRITE_METHOD);
39620294b7eSSascha Wildner             return;
39720294b7eSSascha Wildner         }
39820294b7eSSascha Wildner     }
39920294b7eSSascha Wildner 
40020294b7eSSascha Wildner     /* Walk the entire namespace, testing each supported named data object */
40120294b7eSSascha Wildner 
40220294b7eSSascha Wildner     (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
40320294b7eSSascha Wildner         ACPI_UINT32_MAX, AcpiDbTestOneObject, NULL, NULL, NULL);
40420294b7eSSascha Wildner }
40520294b7eSSascha Wildner 
40620294b7eSSascha Wildner 
40720294b7eSSascha Wildner /*******************************************************************************
40820294b7eSSascha Wildner  *
40920294b7eSSascha Wildner  * FUNCTION:    AcpiDbTestOneObject
41020294b7eSSascha Wildner  *
41120294b7eSSascha Wildner  * PARAMETERS:  ACPI_WALK_CALLBACK
41220294b7eSSascha Wildner  *
41320294b7eSSascha Wildner  * RETURN:      Status
41420294b7eSSascha Wildner  *
41520294b7eSSascha Wildner  * DESCRIPTION: Test one namespace object. Supported types are Integer,
41600ffa116SSascha Wildner  *              String, Buffer, Package, BufferField, and FieldUnit.
41700ffa116SSascha Wildner  *              All other object types are simply ignored.
41820294b7eSSascha Wildner  *
41920294b7eSSascha Wildner  ******************************************************************************/
42020294b7eSSascha Wildner 
42120294b7eSSascha Wildner static ACPI_STATUS
AcpiDbTestOneObject(ACPI_HANDLE ObjHandle,UINT32 NestingLevel,void * Context,void ** ReturnValue)42220294b7eSSascha Wildner AcpiDbTestOneObject (
42320294b7eSSascha Wildner     ACPI_HANDLE             ObjHandle,
42420294b7eSSascha Wildner     UINT32                  NestingLevel,
42520294b7eSSascha Wildner     void                    *Context,
42620294b7eSSascha Wildner     void                    **ReturnValue)
42720294b7eSSascha Wildner {
42820294b7eSSascha Wildner     ACPI_NAMESPACE_NODE     *Node;
42920294b7eSSascha Wildner     ACPI_OPERAND_OBJECT     *ObjDesc;
43020294b7eSSascha Wildner     ACPI_OBJECT_TYPE        LocalType;
43120294b7eSSascha Wildner     UINT32                  BitLength = 0;
43220294b7eSSascha Wildner     UINT32                  ByteLength = 0;
43320294b7eSSascha Wildner     ACPI_STATUS             Status = AE_OK;
43420294b7eSSascha Wildner 
43520294b7eSSascha Wildner 
43620294b7eSSascha Wildner     Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjHandle);
43720294b7eSSascha Wildner     ObjDesc = Node->Object;
43820294b7eSSascha Wildner 
43920294b7eSSascha Wildner     /*
44020294b7eSSascha Wildner      * For the supported types, get the actual bit length or
44120294b7eSSascha Wildner      * byte length. Map the type to one of Integer/String/Buffer.
44220294b7eSSascha Wildner      */
44320294b7eSSascha Wildner     switch (Node->Type)
44420294b7eSSascha Wildner     {
44520294b7eSSascha Wildner     case ACPI_TYPE_INTEGER:
44620294b7eSSascha Wildner 
44720294b7eSSascha Wildner         /* Integer width is either 32 or 64 */
44820294b7eSSascha Wildner 
44920294b7eSSascha Wildner         LocalType = ACPI_TYPE_INTEGER;
45020294b7eSSascha Wildner         BitLength = AcpiGbl_IntegerBitWidth;
45120294b7eSSascha Wildner         break;
45220294b7eSSascha Wildner 
45320294b7eSSascha Wildner     case ACPI_TYPE_STRING:
45420294b7eSSascha Wildner 
45520294b7eSSascha Wildner         LocalType = ACPI_TYPE_STRING;
45620294b7eSSascha Wildner         ByteLength = ObjDesc->String.Length;
45720294b7eSSascha Wildner         break;
45820294b7eSSascha Wildner 
45920294b7eSSascha Wildner     case ACPI_TYPE_BUFFER:
46020294b7eSSascha Wildner 
46120294b7eSSascha Wildner         LocalType = ACPI_TYPE_BUFFER;
46220294b7eSSascha Wildner         ByteLength = ObjDesc->Buffer.Length;
46320294b7eSSascha Wildner         BitLength = ByteLength * 8;
46420294b7eSSascha Wildner         break;
46520294b7eSSascha Wildner 
4667bcb6cafSSascha Wildner     case ACPI_TYPE_PACKAGE:
4677bcb6cafSSascha Wildner 
4687bcb6cafSSascha Wildner         LocalType = ACPI_TYPE_PACKAGE;
4697bcb6cafSSascha Wildner         break;
4707bcb6cafSSascha Wildner 
47120294b7eSSascha Wildner     case ACPI_TYPE_FIELD_UNIT:
47220294b7eSSascha Wildner     case ACPI_TYPE_LOCAL_REGION_FIELD:
47320294b7eSSascha Wildner     case ACPI_TYPE_LOCAL_INDEX_FIELD:
47420294b7eSSascha Wildner     case ACPI_TYPE_LOCAL_BANK_FIELD:
47520294b7eSSascha Wildner 
47600ffa116SSascha Wildner         LocalType = ACPI_TYPE_FIELD_UNIT;
47700ffa116SSascha Wildner         break;
47800ffa116SSascha Wildner 
47900ffa116SSascha Wildner     case ACPI_TYPE_BUFFER_FIELD:
48020294b7eSSascha Wildner         /*
48100ffa116SSascha Wildner          * The returned object will be a Buffer if the field length
48220294b7eSSascha Wildner          * is larger than the size of an Integer (32 or 64 bits
48320294b7eSSascha Wildner          * depending on the DSDT version).
48420294b7eSSascha Wildner          */
48500ffa116SSascha Wildner         LocalType = ACPI_TYPE_INTEGER;
48600ffa116SSascha Wildner         if (ObjDesc)
48700ffa116SSascha Wildner         {
48820294b7eSSascha Wildner             BitLength = ObjDesc->CommonField.BitLength;
48920294b7eSSascha Wildner             ByteLength = ACPI_ROUND_BITS_UP_TO_BYTES (BitLength);
49020294b7eSSascha Wildner             if (BitLength > AcpiGbl_IntegerBitWidth)
49120294b7eSSascha Wildner             {
49220294b7eSSascha Wildner                 LocalType = ACPI_TYPE_BUFFER;
49320294b7eSSascha Wildner             }
49420294b7eSSascha Wildner         }
49520294b7eSSascha Wildner         break;
49620294b7eSSascha Wildner 
49720294b7eSSascha Wildner default:
49820294b7eSSascha Wildner 
49900ffa116SSascha Wildner         /* Ignore all non-data types - Methods, Devices, Scopes, etc. */
50020294b7eSSascha Wildner 
50120294b7eSSascha Wildner         return (AE_OK);
50220294b7eSSascha Wildner     }
50320294b7eSSascha Wildner 
50420294b7eSSascha Wildner     /* Emit the common prefix: Type:Name */
50520294b7eSSascha Wildner 
50620294b7eSSascha Wildner     AcpiOsPrintf ("%14s: %4.4s",
50720294b7eSSascha Wildner         AcpiUtGetTypeName (Node->Type), Node->Name.Ascii);
5087bcb6cafSSascha Wildner 
50920294b7eSSascha Wildner     if (!ObjDesc)
51020294b7eSSascha Wildner     {
51100ffa116SSascha Wildner         AcpiOsPrintf (" No attached sub-object, ignoring\n");
51220294b7eSSascha Wildner         return (AE_OK);
51320294b7eSSascha Wildner     }
51420294b7eSSascha Wildner 
51520294b7eSSascha Wildner     /* At this point, we have resolved the object to one of the major types */
51620294b7eSSascha Wildner 
51720294b7eSSascha Wildner     switch (LocalType)
51820294b7eSSascha Wildner     {
51920294b7eSSascha Wildner     case ACPI_TYPE_INTEGER:
52020294b7eSSascha Wildner 
52120294b7eSSascha Wildner         Status = AcpiDbTestIntegerType (Node, BitLength);
52220294b7eSSascha Wildner         break;
52320294b7eSSascha Wildner 
52420294b7eSSascha Wildner     case ACPI_TYPE_STRING:
52520294b7eSSascha Wildner 
52620294b7eSSascha Wildner         Status = AcpiDbTestStringType (Node, ByteLength);
52720294b7eSSascha Wildner         break;
52820294b7eSSascha Wildner 
52920294b7eSSascha Wildner     case ACPI_TYPE_BUFFER:
53020294b7eSSascha Wildner 
53120294b7eSSascha Wildner         Status = AcpiDbTestBufferType (Node, BitLength);
53220294b7eSSascha Wildner         break;
53320294b7eSSascha Wildner 
5347bcb6cafSSascha Wildner     case ACPI_TYPE_PACKAGE:
5357bcb6cafSSascha Wildner 
5367bcb6cafSSascha Wildner         Status = AcpiDbTestPackageType (Node);
5377bcb6cafSSascha Wildner         break;
5387bcb6cafSSascha Wildner 
53900ffa116SSascha Wildner     case ACPI_TYPE_FIELD_UNIT:
54000ffa116SSascha Wildner 
54100ffa116SSascha Wildner         Status = AcpiDbTestFieldUnitType (ObjDesc);
54200ffa116SSascha Wildner         break;
54300ffa116SSascha Wildner 
54420294b7eSSascha Wildner     default:
54520294b7eSSascha Wildner 
54620294b7eSSascha Wildner         AcpiOsPrintf (" Ignoring, type not implemented (%2.2X)",
54720294b7eSSascha Wildner             LocalType);
54820294b7eSSascha Wildner         break;
54920294b7eSSascha Wildner     }
55020294b7eSSascha Wildner 
5517bcb6cafSSascha Wildner     /* Exit on error, but don't abort the namespace walk */
5527bcb6cafSSascha Wildner 
5537bcb6cafSSascha Wildner     if (ACPI_FAILURE (Status))
5547bcb6cafSSascha Wildner     {
5557bcb6cafSSascha Wildner         Status = AE_OK;
5567bcb6cafSSascha Wildner     }
5577bcb6cafSSascha Wildner 
55820294b7eSSascha Wildner     AcpiOsPrintf ("\n");
55920294b7eSSascha Wildner     return (Status);
56020294b7eSSascha Wildner }
56120294b7eSSascha Wildner 
56220294b7eSSascha Wildner 
56320294b7eSSascha Wildner /*******************************************************************************
56420294b7eSSascha Wildner  *
56520294b7eSSascha Wildner  * FUNCTION:    AcpiDbTestIntegerType
56620294b7eSSascha Wildner  *
56720294b7eSSascha Wildner  * PARAMETERS:  Node                - Parent NS node for the object
56820294b7eSSascha Wildner  *              BitLength           - Actual length of the object. Used for
56920294b7eSSascha Wildner  *                                    support of arbitrary length FieldUnit
57020294b7eSSascha Wildner  *                                    and BufferField objects.
57120294b7eSSascha Wildner  *
57220294b7eSSascha Wildner  * RETURN:      Status
57320294b7eSSascha Wildner  *
57420294b7eSSascha Wildner  * DESCRIPTION: Test read/write for an Integer-valued object. Performs a
57520294b7eSSascha Wildner  *              write/read/compare of an arbitrary new value, then performs
57620294b7eSSascha Wildner  *              a write/read/compare of the original value.
57720294b7eSSascha Wildner  *
57820294b7eSSascha Wildner  ******************************************************************************/
57920294b7eSSascha Wildner 
58020294b7eSSascha Wildner static ACPI_STATUS
AcpiDbTestIntegerType(ACPI_NAMESPACE_NODE * Node,UINT32 BitLength)58120294b7eSSascha Wildner AcpiDbTestIntegerType (
58220294b7eSSascha Wildner     ACPI_NAMESPACE_NODE     *Node,
58320294b7eSSascha Wildner     UINT32                  BitLength)
58420294b7eSSascha Wildner {
58520294b7eSSascha Wildner     ACPI_OBJECT             *Temp1 = NULL;
58620294b7eSSascha Wildner     ACPI_OBJECT             *Temp2 = NULL;
58720294b7eSSascha Wildner     ACPI_OBJECT             *Temp3 = NULL;
58820294b7eSSascha Wildner     ACPI_OBJECT             WriteValue;
58920294b7eSSascha Wildner     UINT64                  ValueToWrite;
59020294b7eSSascha Wildner     ACPI_STATUS             Status;
59120294b7eSSascha Wildner 
59220294b7eSSascha Wildner 
59320294b7eSSascha Wildner     if (BitLength > 64)
59420294b7eSSascha Wildner     {
59520294b7eSSascha Wildner         AcpiOsPrintf (" Invalid length for an Integer: %u", BitLength);
59620294b7eSSascha Wildner         return (AE_OK);
59720294b7eSSascha Wildner     }
59820294b7eSSascha Wildner 
59920294b7eSSascha Wildner     /* Read the original value */
60020294b7eSSascha Wildner 
60120294b7eSSascha Wildner     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_INTEGER, &Temp1);
60220294b7eSSascha Wildner     if (ACPI_FAILURE (Status))
60320294b7eSSascha Wildner     {
60420294b7eSSascha Wildner         return (Status);
60520294b7eSSascha Wildner     }
60620294b7eSSascha Wildner 
60700ffa116SSascha Wildner     AcpiOsPrintf (ACPI_DEBUG_LENGTH_FORMAT " %8.8X%8.8X",
60820294b7eSSascha Wildner         BitLength, ACPI_ROUND_BITS_UP_TO_BYTES (BitLength),
60920294b7eSSascha Wildner         ACPI_FORMAT_UINT64 (Temp1->Integer.Value));
61020294b7eSSascha Wildner 
61120294b7eSSascha Wildner     ValueToWrite = ACPI_UINT64_MAX >> (64 - BitLength);
61220294b7eSSascha Wildner     if (Temp1->Integer.Value == ValueToWrite)
61320294b7eSSascha Wildner     {
61420294b7eSSascha Wildner         ValueToWrite = 0;
61520294b7eSSascha Wildner     }
61620294b7eSSascha Wildner     /* Write a new value */
61720294b7eSSascha Wildner 
61820294b7eSSascha Wildner     WriteValue.Type = ACPI_TYPE_INTEGER;
61920294b7eSSascha Wildner     WriteValue.Integer.Value = ValueToWrite;
62020294b7eSSascha Wildner     Status = AcpiDbWriteToObject (Node, &WriteValue);
62120294b7eSSascha Wildner     if (ACPI_FAILURE (Status))
62220294b7eSSascha Wildner     {
62320294b7eSSascha Wildner         goto Exit;
62420294b7eSSascha Wildner     }
62520294b7eSSascha Wildner 
62620294b7eSSascha Wildner     /* Ensure that we can read back the new value */
62720294b7eSSascha Wildner 
62820294b7eSSascha Wildner     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_INTEGER, &Temp2);
62920294b7eSSascha Wildner     if (ACPI_FAILURE (Status))
63020294b7eSSascha Wildner     {
63120294b7eSSascha Wildner         goto Exit;
63220294b7eSSascha Wildner     }
63320294b7eSSascha Wildner 
63420294b7eSSascha Wildner     if (Temp2->Integer.Value != ValueToWrite)
63520294b7eSSascha Wildner     {
63620294b7eSSascha Wildner         AcpiOsPrintf (" MISMATCH 2: %8.8X%8.8X, expecting %8.8X%8.8X",
63720294b7eSSascha Wildner             ACPI_FORMAT_UINT64 (Temp2->Integer.Value),
63820294b7eSSascha Wildner             ACPI_FORMAT_UINT64 (ValueToWrite));
63920294b7eSSascha Wildner     }
64020294b7eSSascha Wildner 
64120294b7eSSascha Wildner     /* Write back the original value */
64220294b7eSSascha Wildner 
64320294b7eSSascha Wildner     WriteValue.Integer.Value = Temp1->Integer.Value;
64420294b7eSSascha Wildner     Status = AcpiDbWriteToObject (Node, &WriteValue);
64520294b7eSSascha Wildner     if (ACPI_FAILURE (Status))
64620294b7eSSascha Wildner     {
64720294b7eSSascha Wildner         goto Exit;
64820294b7eSSascha Wildner     }
64920294b7eSSascha Wildner 
65020294b7eSSascha Wildner     /* Ensure that we can read back the original value */
65120294b7eSSascha Wildner 
65220294b7eSSascha Wildner     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_INTEGER, &Temp3);
65320294b7eSSascha Wildner     if (ACPI_FAILURE (Status))
65420294b7eSSascha Wildner     {
65520294b7eSSascha Wildner         goto Exit;
65620294b7eSSascha Wildner     }
65720294b7eSSascha Wildner 
65820294b7eSSascha Wildner     if (Temp3->Integer.Value != Temp1->Integer.Value)
65920294b7eSSascha Wildner     {
66020294b7eSSascha Wildner         AcpiOsPrintf (" MISMATCH 3: %8.8X%8.8X, expecting %8.8X%8.8X",
66120294b7eSSascha Wildner             ACPI_FORMAT_UINT64 (Temp3->Integer.Value),
66220294b7eSSascha Wildner             ACPI_FORMAT_UINT64 (Temp1->Integer.Value));
66320294b7eSSascha Wildner     }
66420294b7eSSascha Wildner 
66520294b7eSSascha Wildner Exit:
66620294b7eSSascha Wildner     if (Temp1) {AcpiOsFree (Temp1);}
66720294b7eSSascha Wildner     if (Temp2) {AcpiOsFree (Temp2);}
66820294b7eSSascha Wildner     if (Temp3) {AcpiOsFree (Temp3);}
66920294b7eSSascha Wildner     return (AE_OK);
67020294b7eSSascha Wildner }
67120294b7eSSascha Wildner 
67220294b7eSSascha Wildner 
67320294b7eSSascha Wildner /*******************************************************************************
67420294b7eSSascha Wildner  *
67520294b7eSSascha Wildner  * FUNCTION:    AcpiDbTestBufferType
67620294b7eSSascha Wildner  *
67720294b7eSSascha Wildner  * PARAMETERS:  Node                - Parent NS node for the object
67820294b7eSSascha Wildner  *              BitLength           - Actual length of the object.
67920294b7eSSascha Wildner  *
68020294b7eSSascha Wildner  * RETURN:      Status
68120294b7eSSascha Wildner  *
68220294b7eSSascha Wildner  * DESCRIPTION: Test read/write for an Buffer-valued object. Performs a
68320294b7eSSascha Wildner  *              write/read/compare of an arbitrary new value, then performs
68420294b7eSSascha Wildner  *              a write/read/compare of the original value.
68520294b7eSSascha Wildner  *
68620294b7eSSascha Wildner  ******************************************************************************/
68720294b7eSSascha Wildner 
68820294b7eSSascha Wildner static ACPI_STATUS
AcpiDbTestBufferType(ACPI_NAMESPACE_NODE * Node,UINT32 BitLength)68920294b7eSSascha Wildner AcpiDbTestBufferType (
69020294b7eSSascha Wildner     ACPI_NAMESPACE_NODE     *Node,
69120294b7eSSascha Wildner     UINT32                  BitLength)
69220294b7eSSascha Wildner {
69320294b7eSSascha Wildner     ACPI_OBJECT             *Temp1 = NULL;
69420294b7eSSascha Wildner     ACPI_OBJECT             *Temp2 = NULL;
69520294b7eSSascha Wildner     ACPI_OBJECT             *Temp3 = NULL;
69620294b7eSSascha Wildner     UINT8                   *Buffer;
69720294b7eSSascha Wildner     ACPI_OBJECT             WriteValue;
69820294b7eSSascha Wildner     ACPI_STATUS             Status;
69920294b7eSSascha Wildner     UINT32                  ByteLength;
70020294b7eSSascha Wildner     UINT32                  i;
70120294b7eSSascha Wildner     UINT8                   ExtraBits;
70220294b7eSSascha Wildner 
70320294b7eSSascha Wildner 
70420294b7eSSascha Wildner     ByteLength = ACPI_ROUND_BITS_UP_TO_BYTES (BitLength);
70520294b7eSSascha Wildner     if (ByteLength == 0)
70620294b7eSSascha Wildner     {
70720294b7eSSascha Wildner         AcpiOsPrintf (" Ignoring zero length buffer");
70820294b7eSSascha Wildner         return (AE_OK);
70920294b7eSSascha Wildner     }
71020294b7eSSascha Wildner 
71120294b7eSSascha Wildner     /* Allocate a local buffer */
71220294b7eSSascha Wildner 
71320294b7eSSascha Wildner     Buffer = ACPI_ALLOCATE_ZEROED (ByteLength);
71420294b7eSSascha Wildner     if (!Buffer)
71520294b7eSSascha Wildner     {
71620294b7eSSascha Wildner         return (AE_NO_MEMORY);
71720294b7eSSascha Wildner     }
71820294b7eSSascha Wildner 
71920294b7eSSascha Wildner     /* Read the original value */
72020294b7eSSascha Wildner 
72120294b7eSSascha Wildner     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_BUFFER, &Temp1);
72220294b7eSSascha Wildner     if (ACPI_FAILURE (Status))
72320294b7eSSascha Wildner     {
72420294b7eSSascha Wildner         goto Exit;
72520294b7eSSascha Wildner     }
72620294b7eSSascha Wildner 
72720294b7eSSascha Wildner     /* Emit a few bytes of the buffer */
72820294b7eSSascha Wildner 
72900ffa116SSascha Wildner     AcpiOsPrintf (ACPI_DEBUG_LENGTH_FORMAT, BitLength, Temp1->Buffer.Length);
73000ffa116SSascha Wildner     for (i = 0; ((i < 8) && (i < ByteLength)); i++)
73120294b7eSSascha Wildner     {
73220294b7eSSascha Wildner         AcpiOsPrintf (" %2.2X", Temp1->Buffer.Pointer[i]);
73320294b7eSSascha Wildner     }
73420294b7eSSascha Wildner     AcpiOsPrintf ("...  ");
73520294b7eSSascha Wildner 
73620294b7eSSascha Wildner     /*
73720294b7eSSascha Wildner      * Write a new value.
73820294b7eSSascha Wildner      *
73920294b7eSSascha Wildner      * Handle possible extra bits at the end of the buffer. Can
74020294b7eSSascha Wildner      * happen for FieldUnits larger than an integer, but the bit
74120294b7eSSascha Wildner      * count is not an integral number of bytes. Zero out the
74220294b7eSSascha Wildner      * unused bits.
74320294b7eSSascha Wildner      */
74425ca8c79SSascha Wildner     memset (Buffer, BUFFER_FILL_VALUE, ByteLength);
74520294b7eSSascha Wildner     ExtraBits = BitLength % 8;
74620294b7eSSascha Wildner     if (ExtraBits)
74720294b7eSSascha Wildner     {
74820294b7eSSascha Wildner         Buffer [ByteLength - 1] = ACPI_MASK_BITS_ABOVE (ExtraBits);
74920294b7eSSascha Wildner     }
75020294b7eSSascha Wildner 
75120294b7eSSascha Wildner     WriteValue.Type = ACPI_TYPE_BUFFER;
75220294b7eSSascha Wildner     WriteValue.Buffer.Length = ByteLength;
75320294b7eSSascha Wildner     WriteValue.Buffer.Pointer = Buffer;
75420294b7eSSascha Wildner 
75520294b7eSSascha Wildner     Status = AcpiDbWriteToObject (Node, &WriteValue);
75620294b7eSSascha Wildner     if (ACPI_FAILURE (Status))
75720294b7eSSascha Wildner     {
75820294b7eSSascha Wildner         goto Exit;
75920294b7eSSascha Wildner     }
76020294b7eSSascha Wildner 
76120294b7eSSascha Wildner     /* Ensure that we can read back the new value */
76220294b7eSSascha Wildner 
76320294b7eSSascha Wildner     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_BUFFER, &Temp2);
76420294b7eSSascha Wildner     if (ACPI_FAILURE (Status))
76520294b7eSSascha Wildner     {
76620294b7eSSascha Wildner         goto Exit;
76720294b7eSSascha Wildner     }
76820294b7eSSascha Wildner 
76925ca8c79SSascha Wildner     if (memcmp (Temp2->Buffer.Pointer, Buffer, ByteLength))
77020294b7eSSascha Wildner     {
77120294b7eSSascha Wildner         AcpiOsPrintf (" MISMATCH 2: New buffer value");
77220294b7eSSascha Wildner     }
77320294b7eSSascha Wildner 
77420294b7eSSascha Wildner     /* Write back the original value */
77520294b7eSSascha Wildner 
77620294b7eSSascha Wildner     WriteValue.Buffer.Length = ByteLength;
77720294b7eSSascha Wildner     WriteValue.Buffer.Pointer = Temp1->Buffer.Pointer;
77820294b7eSSascha Wildner 
77920294b7eSSascha Wildner     Status = AcpiDbWriteToObject (Node, &WriteValue);
78020294b7eSSascha Wildner     if (ACPI_FAILURE (Status))
78120294b7eSSascha Wildner     {
78220294b7eSSascha Wildner         goto Exit;
78320294b7eSSascha Wildner     }
78420294b7eSSascha Wildner 
78520294b7eSSascha Wildner     /* Ensure that we can read back the original value */
78620294b7eSSascha Wildner 
78720294b7eSSascha Wildner     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_BUFFER, &Temp3);
78820294b7eSSascha Wildner     if (ACPI_FAILURE (Status))
78920294b7eSSascha Wildner     {
79020294b7eSSascha Wildner         goto Exit;
79120294b7eSSascha Wildner     }
79220294b7eSSascha Wildner 
7933cc0afc6SSascha Wildner     if (memcmp (Temp1->Buffer.Pointer,
7943cc0afc6SSascha Wildner             Temp3->Buffer.Pointer, ByteLength))
79520294b7eSSascha Wildner     {
79620294b7eSSascha Wildner         AcpiOsPrintf (" MISMATCH 3: While restoring original buffer");
79720294b7eSSascha Wildner     }
79820294b7eSSascha Wildner 
79920294b7eSSascha Wildner Exit:
80020294b7eSSascha Wildner     ACPI_FREE (Buffer);
80120294b7eSSascha Wildner     if (Temp1) {AcpiOsFree (Temp1);}
80220294b7eSSascha Wildner     if (Temp2) {AcpiOsFree (Temp2);}
80320294b7eSSascha Wildner     if (Temp3) {AcpiOsFree (Temp3);}
80420294b7eSSascha Wildner     return (Status);
80520294b7eSSascha Wildner }
80620294b7eSSascha Wildner 
80720294b7eSSascha Wildner 
80820294b7eSSascha Wildner /*******************************************************************************
80920294b7eSSascha Wildner  *
81020294b7eSSascha Wildner  * FUNCTION:    AcpiDbTestStringType
81120294b7eSSascha Wildner  *
81220294b7eSSascha Wildner  * PARAMETERS:  Node                - Parent NS node for the object
81320294b7eSSascha Wildner  *              ByteLength          - Actual length of the object.
81420294b7eSSascha Wildner  *
81520294b7eSSascha Wildner  * RETURN:      Status
81620294b7eSSascha Wildner  *
81720294b7eSSascha Wildner  * DESCRIPTION: Test read/write for an String-valued object. Performs a
81820294b7eSSascha Wildner  *              write/read/compare of an arbitrary new value, then performs
81920294b7eSSascha Wildner  *              a write/read/compare of the original value.
82020294b7eSSascha Wildner  *
82120294b7eSSascha Wildner  ******************************************************************************/
82220294b7eSSascha Wildner 
82320294b7eSSascha Wildner static ACPI_STATUS
AcpiDbTestStringType(ACPI_NAMESPACE_NODE * Node,UINT32 ByteLength)82420294b7eSSascha Wildner AcpiDbTestStringType (
82520294b7eSSascha Wildner     ACPI_NAMESPACE_NODE     *Node,
82620294b7eSSascha Wildner     UINT32                  ByteLength)
82720294b7eSSascha Wildner {
82820294b7eSSascha Wildner     ACPI_OBJECT             *Temp1 = NULL;
82920294b7eSSascha Wildner     ACPI_OBJECT             *Temp2 = NULL;
83020294b7eSSascha Wildner     ACPI_OBJECT             *Temp3 = NULL;
83120294b7eSSascha Wildner     char                    *ValueToWrite = "Test String from AML Debugger";
83220294b7eSSascha Wildner     ACPI_OBJECT             WriteValue;
83320294b7eSSascha Wildner     ACPI_STATUS             Status;
83420294b7eSSascha Wildner 
83520294b7eSSascha Wildner 
83620294b7eSSascha Wildner     /* Read the original value */
83720294b7eSSascha Wildner 
83820294b7eSSascha Wildner     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_STRING, &Temp1);
83920294b7eSSascha Wildner     if (ACPI_FAILURE (Status))
84020294b7eSSascha Wildner     {
84120294b7eSSascha Wildner         return (Status);
84220294b7eSSascha Wildner     }
84320294b7eSSascha Wildner 
84400ffa116SSascha Wildner     AcpiOsPrintf (ACPI_DEBUG_LENGTH_FORMAT " \"%s\"", (Temp1->String.Length * 8),
84520294b7eSSascha Wildner         Temp1->String.Length, Temp1->String.Pointer);
84620294b7eSSascha Wildner 
84720294b7eSSascha Wildner     /* Write a new value */
84820294b7eSSascha Wildner 
84920294b7eSSascha Wildner     WriteValue.Type = ACPI_TYPE_STRING;
85025ca8c79SSascha Wildner     WriteValue.String.Length = strlen (ValueToWrite);
85120294b7eSSascha Wildner     WriteValue.String.Pointer = ValueToWrite;
85220294b7eSSascha Wildner 
85320294b7eSSascha Wildner     Status = AcpiDbWriteToObject (Node, &WriteValue);
85420294b7eSSascha Wildner     if (ACPI_FAILURE (Status))
85520294b7eSSascha Wildner     {
85620294b7eSSascha Wildner         goto Exit;
85720294b7eSSascha Wildner     }
85820294b7eSSascha Wildner 
85920294b7eSSascha Wildner     /* Ensure that we can read back the new value */
86020294b7eSSascha Wildner 
86120294b7eSSascha Wildner     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_STRING, &Temp2);
86220294b7eSSascha Wildner     if (ACPI_FAILURE (Status))
86320294b7eSSascha Wildner     {
86420294b7eSSascha Wildner         goto Exit;
86520294b7eSSascha Wildner     }
86620294b7eSSascha Wildner 
86725ca8c79SSascha Wildner     if (strcmp (Temp2->String.Pointer, ValueToWrite))
86820294b7eSSascha Wildner     {
86920294b7eSSascha Wildner         AcpiOsPrintf (" MISMATCH 2: %s, expecting %s",
87020294b7eSSascha Wildner             Temp2->String.Pointer, ValueToWrite);
87120294b7eSSascha Wildner     }
87220294b7eSSascha Wildner 
87320294b7eSSascha Wildner     /* Write back the original value */
87420294b7eSSascha Wildner 
87525ca8c79SSascha Wildner     WriteValue.String.Length = strlen (Temp1->String.Pointer);
87620294b7eSSascha Wildner     WriteValue.String.Pointer = Temp1->String.Pointer;
87720294b7eSSascha Wildner 
87820294b7eSSascha Wildner     Status = AcpiDbWriteToObject (Node, &WriteValue);
87920294b7eSSascha Wildner     if (ACPI_FAILURE (Status))
88020294b7eSSascha Wildner     {
88120294b7eSSascha Wildner         goto Exit;
88220294b7eSSascha Wildner     }
88320294b7eSSascha Wildner 
88420294b7eSSascha Wildner     /* Ensure that we can read back the original value */
88520294b7eSSascha Wildner 
88620294b7eSSascha Wildner     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_STRING, &Temp3);
88720294b7eSSascha Wildner     if (ACPI_FAILURE (Status))
88820294b7eSSascha Wildner     {
88920294b7eSSascha Wildner         goto Exit;
89020294b7eSSascha Wildner     }
89120294b7eSSascha Wildner 
89225ca8c79SSascha Wildner     if (strcmp (Temp1->String.Pointer, Temp3->String.Pointer))
89320294b7eSSascha Wildner     {
89420294b7eSSascha Wildner         AcpiOsPrintf (" MISMATCH 3: %s, expecting %s",
89520294b7eSSascha Wildner             Temp3->String.Pointer, Temp1->String.Pointer);
89620294b7eSSascha Wildner     }
89720294b7eSSascha Wildner 
89820294b7eSSascha Wildner Exit:
89920294b7eSSascha Wildner     if (Temp1) {AcpiOsFree (Temp1);}
90020294b7eSSascha Wildner     if (Temp2) {AcpiOsFree (Temp2);}
90120294b7eSSascha Wildner     if (Temp3) {AcpiOsFree (Temp3);}
90220294b7eSSascha Wildner     return (Status);
90320294b7eSSascha Wildner }
90420294b7eSSascha Wildner 
90520294b7eSSascha Wildner 
90620294b7eSSascha Wildner /*******************************************************************************
90720294b7eSSascha Wildner  *
9087bcb6cafSSascha Wildner  * FUNCTION:    AcpiDbTestPackageType
9097bcb6cafSSascha Wildner  *
9107bcb6cafSSascha Wildner  * PARAMETERS:  Node                - Parent NS node for the object
9117bcb6cafSSascha Wildner  *
9127bcb6cafSSascha Wildner  * RETURN:      Status
9137bcb6cafSSascha Wildner  *
9147bcb6cafSSascha Wildner  * DESCRIPTION: Test read for a Package object.
9157bcb6cafSSascha Wildner  *
9167bcb6cafSSascha Wildner  ******************************************************************************/
9177bcb6cafSSascha Wildner 
9187bcb6cafSSascha Wildner static ACPI_STATUS
AcpiDbTestPackageType(ACPI_NAMESPACE_NODE * Node)9197bcb6cafSSascha Wildner AcpiDbTestPackageType (
9207bcb6cafSSascha Wildner     ACPI_NAMESPACE_NODE     *Node)
9217bcb6cafSSascha Wildner {
9227bcb6cafSSascha Wildner     ACPI_OBJECT             *Temp1 = NULL;
9237bcb6cafSSascha Wildner     ACPI_STATUS             Status;
9247bcb6cafSSascha Wildner 
9257bcb6cafSSascha Wildner 
9267bcb6cafSSascha Wildner     /* Read the original value */
9277bcb6cafSSascha Wildner 
9287bcb6cafSSascha Wildner     Status = AcpiDbReadFromObject (Node, ACPI_TYPE_PACKAGE, &Temp1);
9297bcb6cafSSascha Wildner     if (ACPI_FAILURE (Status))
9307bcb6cafSSascha Wildner     {
9317bcb6cafSSascha Wildner         return (Status);
9327bcb6cafSSascha Wildner     }
9337bcb6cafSSascha Wildner 
93400ffa116SSascha Wildner     AcpiOsPrintf (" %.2X Elements", Temp1->Package.Count);
9357bcb6cafSSascha Wildner     AcpiOsFree (Temp1);
9367bcb6cafSSascha Wildner     return (Status);
9377bcb6cafSSascha Wildner }
9387bcb6cafSSascha Wildner 
9397bcb6cafSSascha Wildner 
9407bcb6cafSSascha Wildner /*******************************************************************************
9417bcb6cafSSascha Wildner  *
94200ffa116SSascha Wildner  * FUNCTION:    AcpiDbTestFieldUnitType
94300ffa116SSascha Wildner  *
94400ffa116SSascha Wildner  * PARAMETERS:  ObjDesc                 - A field unit object
94500ffa116SSascha Wildner  *
94600ffa116SSascha Wildner  * RETURN:      Status
94700ffa116SSascha Wildner  *
94800ffa116SSascha Wildner  * DESCRIPTION: Test read/write on a named field unit.
94900ffa116SSascha Wildner  *
95000ffa116SSascha Wildner  ******************************************************************************/
95100ffa116SSascha Wildner 
95200ffa116SSascha Wildner static ACPI_STATUS
AcpiDbTestFieldUnitType(ACPI_OPERAND_OBJECT * ObjDesc)95300ffa116SSascha Wildner AcpiDbTestFieldUnitType (
95400ffa116SSascha Wildner     ACPI_OPERAND_OBJECT     *ObjDesc)
95500ffa116SSascha Wildner {
95600ffa116SSascha Wildner     ACPI_OPERAND_OBJECT     *RegionObj;
95700ffa116SSascha Wildner     UINT32                  BitLength = 0;
95800ffa116SSascha Wildner     UINT32                  ByteLength = 0;
95900ffa116SSascha Wildner     ACPI_STATUS             Status = AE_OK;
96000ffa116SSascha Wildner     ACPI_OPERAND_OBJECT     *RetBufferDesc;
96100ffa116SSascha Wildner 
96200ffa116SSascha Wildner 
96300ffa116SSascha Wildner     /* Supported spaces are memory/io/pci_config */
96400ffa116SSascha Wildner 
96500ffa116SSascha Wildner     RegionObj = ObjDesc->Field.RegionObj;
96600ffa116SSascha Wildner     switch (RegionObj->Region.SpaceId)
96700ffa116SSascha Wildner     {
96800ffa116SSascha Wildner     case ACPI_ADR_SPACE_SYSTEM_MEMORY:
96900ffa116SSascha Wildner     case ACPI_ADR_SPACE_SYSTEM_IO:
97000ffa116SSascha Wildner     case ACPI_ADR_SPACE_PCI_CONFIG:
97100ffa116SSascha Wildner 
97200ffa116SSascha Wildner         /* Need the interpreter to execute */
97300ffa116SSascha Wildner 
97400ffa116SSascha Wildner         AcpiUtAcquireMutex (ACPI_MTX_INTERPRETER);
97500ffa116SSascha Wildner         AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
97600ffa116SSascha Wildner 
97700ffa116SSascha Wildner         /* Exercise read-then-write */
97800ffa116SSascha Wildner 
97900ffa116SSascha Wildner         Status = AcpiExReadDataFromField (NULL, ObjDesc, &RetBufferDesc);
98000ffa116SSascha Wildner         if (Status == AE_OK)
98100ffa116SSascha Wildner         {
98200ffa116SSascha Wildner             AcpiExWriteDataToField (RetBufferDesc, ObjDesc, NULL);
98300ffa116SSascha Wildner             AcpiUtRemoveReference (RetBufferDesc);
98400ffa116SSascha Wildner         }
98500ffa116SSascha Wildner 
98600ffa116SSascha Wildner         AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
98700ffa116SSascha Wildner         AcpiUtReleaseMutex (ACPI_MTX_INTERPRETER);
98800ffa116SSascha Wildner 
98900ffa116SSascha Wildner         BitLength = ObjDesc->CommonField.BitLength;
99000ffa116SSascha Wildner         ByteLength = ACPI_ROUND_BITS_UP_TO_BYTES (BitLength);
99100ffa116SSascha Wildner 
99200ffa116SSascha Wildner         AcpiOsPrintf (ACPI_DEBUG_LENGTH_FORMAT " [%s]", BitLength,
99300ffa116SSascha Wildner             ByteLength, AcpiUtGetRegionName (RegionObj->Region.SpaceId));
99400ffa116SSascha Wildner         return (Status);
99500ffa116SSascha Wildner 
99600ffa116SSascha Wildner     default:
99700ffa116SSascha Wildner 
99800ffa116SSascha Wildner         AcpiOsPrintf (
99900ffa116SSascha Wildner             "      %s address space is not supported in this command [%4.4s]",
100000ffa116SSascha Wildner             AcpiUtGetRegionName (RegionObj->Region.SpaceId),
100100ffa116SSascha Wildner             RegionObj->Region.Node->Name.Ascii);
100200ffa116SSascha Wildner         return (AE_OK);
100300ffa116SSascha Wildner     }
100400ffa116SSascha Wildner }
100500ffa116SSascha Wildner 
100600ffa116SSascha Wildner 
100700ffa116SSascha Wildner /*******************************************************************************
100800ffa116SSascha Wildner  *
100920294b7eSSascha Wildner  * FUNCTION:    AcpiDbReadFromObject
101020294b7eSSascha Wildner  *
101120294b7eSSascha Wildner  * PARAMETERS:  Node                - Parent NS node for the object
101220294b7eSSascha Wildner  *              ExpectedType        - Object type expected from the read
101320294b7eSSascha Wildner  *              Value               - Where the value read is returned
101420294b7eSSascha Wildner  *
101520294b7eSSascha Wildner  * RETURN:      Status
101620294b7eSSascha Wildner  *
101720294b7eSSascha Wildner  * DESCRIPTION: Performs a read from the specified object by invoking the
101820294b7eSSascha Wildner  *              special debugger control method that reads the object. Thus,
101920294b7eSSascha Wildner  *              the AML interpreter is doing all of the work, increasing the
102020294b7eSSascha Wildner  *              validity of the test.
102120294b7eSSascha Wildner  *
102220294b7eSSascha Wildner  ******************************************************************************/
102320294b7eSSascha Wildner 
102420294b7eSSascha Wildner static ACPI_STATUS
AcpiDbReadFromObject(ACPI_NAMESPACE_NODE * Node,ACPI_OBJECT_TYPE ExpectedType,ACPI_OBJECT ** Value)102520294b7eSSascha Wildner AcpiDbReadFromObject (
102620294b7eSSascha Wildner     ACPI_NAMESPACE_NODE     *Node,
102720294b7eSSascha Wildner     ACPI_OBJECT_TYPE        ExpectedType,
102820294b7eSSascha Wildner     ACPI_OBJECT             **Value)
102920294b7eSSascha Wildner {
103020294b7eSSascha Wildner     ACPI_OBJECT             *RetValue;
103120294b7eSSascha Wildner     ACPI_OBJECT_LIST        ParamObjects;
103220294b7eSSascha Wildner     ACPI_OBJECT             Params[2];
103320294b7eSSascha Wildner     ACPI_BUFFER             ReturnObj;
103420294b7eSSascha Wildner     ACPI_STATUS             Status;
103520294b7eSSascha Wildner 
103620294b7eSSascha Wildner 
103720294b7eSSascha Wildner     Params[0].Type = ACPI_TYPE_LOCAL_REFERENCE;
103820294b7eSSascha Wildner     Params[0].Reference.ActualType = Node->Type;
103920294b7eSSascha Wildner     Params[0].Reference.Handle = ACPI_CAST_PTR (ACPI_HANDLE, Node);
104020294b7eSSascha Wildner 
104120294b7eSSascha Wildner     ParamObjects.Count = 1;
104220294b7eSSascha Wildner     ParamObjects.Pointer = Params;
104320294b7eSSascha Wildner 
104420294b7eSSascha Wildner     ReturnObj.Length  = ACPI_ALLOCATE_BUFFER;
104520294b7eSSascha Wildner 
104620294b7eSSascha Wildner     AcpiGbl_MethodExecuting = TRUE;
10473cc0afc6SSascha Wildner     Status = AcpiEvaluateObject (ReadHandle, NULL,
10483cc0afc6SSascha Wildner         &ParamObjects, &ReturnObj);
104920294b7eSSascha Wildner 
10507bcb6cafSSascha Wildner     AcpiGbl_MethodExecuting = FALSE;
105120294b7eSSascha Wildner     if (ACPI_FAILURE (Status))
105220294b7eSSascha Wildner     {
105320294b7eSSascha Wildner         AcpiOsPrintf ("Could not read from object, %s",
105420294b7eSSascha Wildner             AcpiFormatException (Status));
105520294b7eSSascha Wildner         return (Status);
105620294b7eSSascha Wildner     }
105720294b7eSSascha Wildner 
105820294b7eSSascha Wildner     RetValue = (ACPI_OBJECT *) ReturnObj.Pointer;
105920294b7eSSascha Wildner 
106020294b7eSSascha Wildner     switch (RetValue->Type)
106120294b7eSSascha Wildner     {
106220294b7eSSascha Wildner     case ACPI_TYPE_INTEGER:
106320294b7eSSascha Wildner     case ACPI_TYPE_BUFFER:
106420294b7eSSascha Wildner     case ACPI_TYPE_STRING:
10657bcb6cafSSascha Wildner     case ACPI_TYPE_PACKAGE:
106620294b7eSSascha Wildner         /*
106720294b7eSSascha Wildner          * Did we receive the type we wanted? Most important for the
106820294b7eSSascha Wildner          * Integer/Buffer case (when a field is larger than an Integer,
106920294b7eSSascha Wildner          * it should return a Buffer).
107020294b7eSSascha Wildner          */
107120294b7eSSascha Wildner         if (RetValue->Type != ExpectedType)
107220294b7eSSascha Wildner         {
107320294b7eSSascha Wildner             AcpiOsPrintf (" Type mismatch:  Expected %s, Received %s",
107420294b7eSSascha Wildner                 AcpiUtGetTypeName (ExpectedType),
107520294b7eSSascha Wildner                 AcpiUtGetTypeName (RetValue->Type));
107620294b7eSSascha Wildner 
10777bcb6cafSSascha Wildner             AcpiOsFree (ReturnObj.Pointer);
107820294b7eSSascha Wildner             return (AE_TYPE);
107920294b7eSSascha Wildner         }
108020294b7eSSascha Wildner 
108120294b7eSSascha Wildner         *Value = RetValue;
108220294b7eSSascha Wildner         break;
108320294b7eSSascha Wildner 
108420294b7eSSascha Wildner     default:
108520294b7eSSascha Wildner 
108620294b7eSSascha Wildner         AcpiOsPrintf (" Unsupported return object type, %s",
108720294b7eSSascha Wildner             AcpiUtGetTypeName (RetValue->Type));
108820294b7eSSascha Wildner 
10893cc0afc6SSascha Wildner         AcpiOsFree (ReturnObj.Pointer);
109020294b7eSSascha Wildner         return (AE_TYPE);
109120294b7eSSascha Wildner     }
109220294b7eSSascha Wildner 
109320294b7eSSascha Wildner     return (Status);
109420294b7eSSascha Wildner }
109520294b7eSSascha Wildner 
109620294b7eSSascha Wildner 
109720294b7eSSascha Wildner /*******************************************************************************
109820294b7eSSascha Wildner  *
109920294b7eSSascha Wildner  * FUNCTION:    AcpiDbWriteToObject
110020294b7eSSascha Wildner  *
110120294b7eSSascha Wildner  * PARAMETERS:  Node                - Parent NS node for the object
110220294b7eSSascha Wildner  *              Value               - Value to be written
110320294b7eSSascha Wildner  *
110420294b7eSSascha Wildner  * RETURN:      Status
110520294b7eSSascha Wildner  *
110620294b7eSSascha Wildner  * DESCRIPTION: Performs a write to the specified object by invoking the
110720294b7eSSascha Wildner  *              special debugger control method that writes the object. Thus,
110820294b7eSSascha Wildner  *              the AML interpreter is doing all of the work, increasing the
110920294b7eSSascha Wildner  *              validity of the test.
111020294b7eSSascha Wildner  *
111120294b7eSSascha Wildner  ******************************************************************************/
111220294b7eSSascha Wildner 
111320294b7eSSascha Wildner static ACPI_STATUS
AcpiDbWriteToObject(ACPI_NAMESPACE_NODE * Node,ACPI_OBJECT * Value)111420294b7eSSascha Wildner AcpiDbWriteToObject (
111520294b7eSSascha Wildner     ACPI_NAMESPACE_NODE     *Node,
111620294b7eSSascha Wildner     ACPI_OBJECT             *Value)
111720294b7eSSascha Wildner {
111820294b7eSSascha Wildner     ACPI_OBJECT_LIST        ParamObjects;
111920294b7eSSascha Wildner     ACPI_OBJECT             Params[2];
112020294b7eSSascha Wildner     ACPI_STATUS             Status;
112120294b7eSSascha Wildner 
112220294b7eSSascha Wildner 
112320294b7eSSascha Wildner     Params[0].Type = ACPI_TYPE_LOCAL_REFERENCE;
112420294b7eSSascha Wildner     Params[0].Reference.ActualType = Node->Type;
112520294b7eSSascha Wildner     Params[0].Reference.Handle = ACPI_CAST_PTR (ACPI_HANDLE, Node);
112620294b7eSSascha Wildner 
112720294b7eSSascha Wildner     /* Copy the incoming user parameter */
112820294b7eSSascha Wildner 
112925ca8c79SSascha Wildner     memcpy (&Params[1], Value, sizeof (ACPI_OBJECT));
113020294b7eSSascha Wildner 
113120294b7eSSascha Wildner     ParamObjects.Count = 2;
113220294b7eSSascha Wildner     ParamObjects.Pointer = Params;
113320294b7eSSascha Wildner 
113420294b7eSSascha Wildner     AcpiGbl_MethodExecuting = TRUE;
113520294b7eSSascha Wildner     Status = AcpiEvaluateObject (WriteHandle, NULL, &ParamObjects, NULL);
113620294b7eSSascha Wildner     AcpiGbl_MethodExecuting = FALSE;
113720294b7eSSascha Wildner 
113820294b7eSSascha Wildner     if (ACPI_FAILURE (Status))
113920294b7eSSascha Wildner     {
114020294b7eSSascha Wildner         AcpiOsPrintf ("Could not write to object, %s",
114120294b7eSSascha Wildner             AcpiFormatException (Status));
114220294b7eSSascha Wildner     }
114320294b7eSSascha Wildner 
114420294b7eSSascha Wildner     return (Status);
114520294b7eSSascha Wildner }
114620294b7eSSascha Wildner 
114720294b7eSSascha Wildner 
114820294b7eSSascha Wildner /*******************************************************************************
114920294b7eSSascha Wildner  *
115020294b7eSSascha Wildner  * FUNCTION:    AcpiDbEvaluateAllPredefinedNames
115120294b7eSSascha Wildner  *
115220294b7eSSascha Wildner  * PARAMETERS:  CountArg            - Max number of methods to execute
115320294b7eSSascha Wildner  *
115420294b7eSSascha Wildner  * RETURN:      None
115520294b7eSSascha Wildner  *
115620294b7eSSascha Wildner  * DESCRIPTION: Namespace batch execution. Execute predefined names in the
115720294b7eSSascha Wildner  *              namespace, up to the max count, if specified.
115820294b7eSSascha Wildner  *
115920294b7eSSascha Wildner  ******************************************************************************/
116020294b7eSSascha Wildner 
116120294b7eSSascha Wildner static void
AcpiDbEvaluateAllPredefinedNames(char * CountArg)116220294b7eSSascha Wildner AcpiDbEvaluateAllPredefinedNames (
116320294b7eSSascha Wildner     char                    *CountArg)
116420294b7eSSascha Wildner {
116520294b7eSSascha Wildner     ACPI_DB_EXECUTE_WALK    Info;
116620294b7eSSascha Wildner 
116720294b7eSSascha Wildner 
116820294b7eSSascha Wildner     Info.Count = 0;
116920294b7eSSascha Wildner     Info.MaxCount = ACPI_UINT32_MAX;
117020294b7eSSascha Wildner 
117120294b7eSSascha Wildner     if (CountArg)
117220294b7eSSascha Wildner     {
117325ca8c79SSascha Wildner         Info.MaxCount = strtoul (CountArg, NULL, 0);
117420294b7eSSascha Wildner     }
117520294b7eSSascha Wildner 
117620294b7eSSascha Wildner     /* Search all nodes in namespace */
117720294b7eSSascha Wildner 
11783cc0afc6SSascha Wildner     (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
11793cc0afc6SSascha Wildner         ACPI_UINT32_MAX, AcpiDbEvaluateOnePredefinedName, NULL,
11803cc0afc6SSascha Wildner         (void *) &Info, NULL);
118120294b7eSSascha Wildner 
1182820c5b08SSascha Wildner     AcpiOsPrintf (
1183820c5b08SSascha Wildner         "Evaluated %u predefined names in the namespace\n", Info.Count);
118420294b7eSSascha Wildner }
118520294b7eSSascha Wildner 
118620294b7eSSascha Wildner 
118720294b7eSSascha Wildner /*******************************************************************************
118820294b7eSSascha Wildner  *
118920294b7eSSascha Wildner  * FUNCTION:    AcpiDbEvaluateOnePredefinedName
119020294b7eSSascha Wildner  *
119120294b7eSSascha Wildner  * PARAMETERS:  Callback from WalkNamespace
119220294b7eSSascha Wildner  *
119320294b7eSSascha Wildner  * RETURN:      Status
119420294b7eSSascha Wildner  *
119520294b7eSSascha Wildner  * DESCRIPTION: Batch execution module. Currently only executes predefined
119620294b7eSSascha Wildner  *              ACPI names.
119720294b7eSSascha Wildner  *
119820294b7eSSascha Wildner  ******************************************************************************/
119920294b7eSSascha Wildner 
120020294b7eSSascha Wildner static ACPI_STATUS
AcpiDbEvaluateOnePredefinedName(ACPI_HANDLE ObjHandle,UINT32 NestingLevel,void * Context,void ** ReturnValue)120120294b7eSSascha Wildner AcpiDbEvaluateOnePredefinedName (
120220294b7eSSascha Wildner     ACPI_HANDLE             ObjHandle,
120320294b7eSSascha Wildner     UINT32                  NestingLevel,
120420294b7eSSascha Wildner     void                    *Context,
120520294b7eSSascha Wildner     void                    **ReturnValue)
120620294b7eSSascha Wildner {
120720294b7eSSascha Wildner     ACPI_NAMESPACE_NODE         *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
120820294b7eSSascha Wildner     ACPI_DB_EXECUTE_WALK        *Info = (ACPI_DB_EXECUTE_WALK *) Context;
120920294b7eSSascha Wildner     char                        *Pathname;
121020294b7eSSascha Wildner     const ACPI_PREDEFINED_INFO  *Predefined;
121120294b7eSSascha Wildner     ACPI_DEVICE_INFO            *ObjInfo;
121220294b7eSSascha Wildner     ACPI_OBJECT_LIST            ParamObjects;
121320294b7eSSascha Wildner     ACPI_OBJECT                 Params[ACPI_METHOD_NUM_ARGS];
121420294b7eSSascha Wildner     ACPI_OBJECT                 *ThisParam;
121520294b7eSSascha Wildner     ACPI_BUFFER                 ReturnObj;
121620294b7eSSascha Wildner     ACPI_STATUS                 Status;
121720294b7eSSascha Wildner     UINT16                      ArgTypeList;
121820294b7eSSascha Wildner     UINT8                       ArgCount;
121920294b7eSSascha Wildner     UINT8                       ArgType;
122020294b7eSSascha Wildner     UINT32                      i;
122120294b7eSSascha Wildner 
122220294b7eSSascha Wildner 
122320294b7eSSascha Wildner     /* The name must be a predefined ACPI name */
122420294b7eSSascha Wildner 
122520294b7eSSascha Wildner     Predefined = AcpiUtMatchPredefinedMethod (Node->Name.Ascii);
122620294b7eSSascha Wildner     if (!Predefined)
122720294b7eSSascha Wildner     {
122820294b7eSSascha Wildner         return (AE_OK);
122920294b7eSSascha Wildner     }
123020294b7eSSascha Wildner 
123120294b7eSSascha Wildner     if (Node->Type == ACPI_TYPE_LOCAL_SCOPE)
123220294b7eSSascha Wildner     {
123320294b7eSSascha Wildner         return (AE_OK);
123420294b7eSSascha Wildner     }
123520294b7eSSascha Wildner 
1236820c5b08SSascha Wildner     Pathname = AcpiNsGetNormalizedPathname (Node, TRUE);
123720294b7eSSascha Wildner     if (!Pathname)
123820294b7eSSascha Wildner     {
123920294b7eSSascha Wildner         return (AE_OK);
124020294b7eSSascha Wildner     }
124120294b7eSSascha Wildner 
124220294b7eSSascha Wildner     /* Get the object info for number of method parameters */
124320294b7eSSascha Wildner 
124420294b7eSSascha Wildner     Status = AcpiGetObjectInfo (ObjHandle, &ObjInfo);
124520294b7eSSascha Wildner     if (ACPI_FAILURE (Status))
124620294b7eSSascha Wildner     {
12475f39c7e7SSascha Wildner         ACPI_FREE (Pathname);
124820294b7eSSascha Wildner         return (Status);
124920294b7eSSascha Wildner     }
125020294b7eSSascha Wildner 
125120294b7eSSascha Wildner     ParamObjects.Count = 0;
125220294b7eSSascha Wildner     ParamObjects.Pointer = NULL;
125320294b7eSSascha Wildner 
125420294b7eSSascha Wildner     if (ObjInfo->Type == ACPI_TYPE_METHOD)
125520294b7eSSascha Wildner     {
125620294b7eSSascha Wildner         /* Setup default parameters (with proper types) */
125720294b7eSSascha Wildner 
125820294b7eSSascha Wildner         ArgTypeList = Predefined->Info.ArgumentList;
125920294b7eSSascha Wildner         ArgCount = METHOD_GET_ARG_COUNT (ArgTypeList);
126020294b7eSSascha Wildner 
126120294b7eSSascha Wildner         /*
126220294b7eSSascha Wildner          * Setup the ACPI-required number of arguments, regardless of what
126320294b7eSSascha Wildner          * the actual method defines. If there is a difference, then the
126420294b7eSSascha Wildner          * method is wrong and a warning will be issued during execution.
126520294b7eSSascha Wildner          */
126620294b7eSSascha Wildner         ThisParam = Params;
126720294b7eSSascha Wildner         for (i = 0; i < ArgCount; i++)
126820294b7eSSascha Wildner         {
126920294b7eSSascha Wildner             ArgType = METHOD_GET_NEXT_TYPE (ArgTypeList);
127020294b7eSSascha Wildner             ThisParam->Type = ArgType;
127120294b7eSSascha Wildner 
127220294b7eSSascha Wildner             switch (ArgType)
127320294b7eSSascha Wildner             {
127420294b7eSSascha Wildner             case ACPI_TYPE_INTEGER:
127520294b7eSSascha Wildner 
127620294b7eSSascha Wildner                 ThisParam->Integer.Value = 1;
127720294b7eSSascha Wildner                 break;
127820294b7eSSascha Wildner 
127920294b7eSSascha Wildner             case ACPI_TYPE_STRING:
128020294b7eSSascha Wildner 
12813cc0afc6SSascha Wildner                 ThisParam->String.Pointer =
12823cc0afc6SSascha Wildner                     "This is the default argument string";
12833cc0afc6SSascha Wildner                 ThisParam->String.Length =
12843cc0afc6SSascha Wildner                     strlen (ThisParam->String.Pointer);
128520294b7eSSascha Wildner                 break;
128620294b7eSSascha Wildner 
128720294b7eSSascha Wildner             case ACPI_TYPE_BUFFER:
128820294b7eSSascha Wildner 
128920294b7eSSascha Wildner                 ThisParam->Buffer.Pointer = (UINT8 *) Params; /* just a garbage buffer */
129020294b7eSSascha Wildner                 ThisParam->Buffer.Length = 48;
129120294b7eSSascha Wildner                 break;
129220294b7eSSascha Wildner 
129320294b7eSSascha Wildner              case ACPI_TYPE_PACKAGE:
129420294b7eSSascha Wildner 
129520294b7eSSascha Wildner                 ThisParam->Package.Elements = NULL;
129620294b7eSSascha Wildner                 ThisParam->Package.Count = 0;
129720294b7eSSascha Wildner                 break;
129820294b7eSSascha Wildner 
129920294b7eSSascha Wildner            default:
130020294b7eSSascha Wildner 
130120294b7eSSascha Wildner                 AcpiOsPrintf ("%s: Unsupported argument type: %u\n",
130220294b7eSSascha Wildner                     Pathname, ArgType);
130320294b7eSSascha Wildner                 break;
130420294b7eSSascha Wildner             }
130520294b7eSSascha Wildner 
130620294b7eSSascha Wildner             ThisParam++;
130720294b7eSSascha Wildner         }
130820294b7eSSascha Wildner 
130920294b7eSSascha Wildner         ParamObjects.Count = ArgCount;
131020294b7eSSascha Wildner         ParamObjects.Pointer = Params;
131120294b7eSSascha Wildner     }
131220294b7eSSascha Wildner 
131320294b7eSSascha Wildner     ACPI_FREE (ObjInfo);
131420294b7eSSascha Wildner     ReturnObj.Pointer = NULL;
131520294b7eSSascha Wildner     ReturnObj.Length = ACPI_ALLOCATE_BUFFER;
131620294b7eSSascha Wildner 
131720294b7eSSascha Wildner     /* Do the actual method execution */
131820294b7eSSascha Wildner 
131920294b7eSSascha Wildner     AcpiGbl_MethodExecuting = TRUE;
132020294b7eSSascha Wildner 
132120294b7eSSascha Wildner     Status = AcpiEvaluateObject (Node, NULL, &ParamObjects, &ReturnObj);
132220294b7eSSascha Wildner 
13233cc0afc6SSascha Wildner     AcpiOsPrintf ("%-32s returned %s\n",
13243cc0afc6SSascha Wildner         Pathname, AcpiFormatException (Status));
132520294b7eSSascha Wildner     AcpiGbl_MethodExecuting = FALSE;
132620294b7eSSascha Wildner     ACPI_FREE (Pathname);
132720294b7eSSascha Wildner 
132820294b7eSSascha Wildner     /* Ignore status from method execution */
132920294b7eSSascha Wildner 
133020294b7eSSascha Wildner     Status = AE_OK;
133120294b7eSSascha Wildner 
133220294b7eSSascha Wildner     /* Update count, check if we have executed enough methods */
133320294b7eSSascha Wildner 
133420294b7eSSascha Wildner     Info->Count++;
133520294b7eSSascha Wildner     if (Info->Count >= Info->MaxCount)
133620294b7eSSascha Wildner     {
133720294b7eSSascha Wildner         Status = AE_CTRL_TERMINATE;
133820294b7eSSascha Wildner     }
133920294b7eSSascha Wildner 
134020294b7eSSascha Wildner     return (Status);
134120294b7eSSascha Wildner }
134220294b7eSSascha Wildner 
134320294b7eSSascha Wildner #endif /* ACPI_DEBUGGER */
1344