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