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