1*7851SDana.Myers@Sun.COM /****************************************************************************** 2*7851SDana.Myers@Sun.COM * 3*7851SDana.Myers@Sun.COM * Module Name: exconvrt - Object conversion routines 4*7851SDana.Myers@Sun.COM * $Revision: 1.75 $ 5*7851SDana.Myers@Sun.COM * 6*7851SDana.Myers@Sun.COM *****************************************************************************/ 7*7851SDana.Myers@Sun.COM 8*7851SDana.Myers@Sun.COM /****************************************************************************** 9*7851SDana.Myers@Sun.COM * 10*7851SDana.Myers@Sun.COM * 1. Copyright Notice 11*7851SDana.Myers@Sun.COM * 12*7851SDana.Myers@Sun.COM * Some or all of this work - Copyright (c) 1999 - 2008, Intel Corp. 13*7851SDana.Myers@Sun.COM * All rights reserved. 14*7851SDana.Myers@Sun.COM * 15*7851SDana.Myers@Sun.COM * 2. License 16*7851SDana.Myers@Sun.COM * 17*7851SDana.Myers@Sun.COM * 2.1. This is your license from Intel Corp. under its intellectual property 18*7851SDana.Myers@Sun.COM * rights. You may have additional license terms from the party that provided 19*7851SDana.Myers@Sun.COM * you this software, covering your right to use that party's intellectual 20*7851SDana.Myers@Sun.COM * property rights. 21*7851SDana.Myers@Sun.COM * 22*7851SDana.Myers@Sun.COM * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 23*7851SDana.Myers@Sun.COM * copy of the source code appearing in this file ("Covered Code") an 24*7851SDana.Myers@Sun.COM * irrevocable, perpetual, worldwide license under Intel's copyrights in the 25*7851SDana.Myers@Sun.COM * base code distributed originally by Intel ("Original Intel Code") to copy, 26*7851SDana.Myers@Sun.COM * make derivatives, distribute, use and display any portion of the Covered 27*7851SDana.Myers@Sun.COM * Code in any form, with the right to sublicense such rights; and 28*7851SDana.Myers@Sun.COM * 29*7851SDana.Myers@Sun.COM * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 30*7851SDana.Myers@Sun.COM * license (with the right to sublicense), under only those claims of Intel 31*7851SDana.Myers@Sun.COM * patents that are infringed by the Original Intel Code, to make, use, sell, 32*7851SDana.Myers@Sun.COM * offer to sell, and import the Covered Code and derivative works thereof 33*7851SDana.Myers@Sun.COM * solely to the minimum extent necessary to exercise the above copyright 34*7851SDana.Myers@Sun.COM * license, and in no event shall the patent license extend to any additions 35*7851SDana.Myers@Sun.COM * to or modifications of the Original Intel Code. No other license or right 36*7851SDana.Myers@Sun.COM * is granted directly or by implication, estoppel or otherwise; 37*7851SDana.Myers@Sun.COM * 38*7851SDana.Myers@Sun.COM * The above copyright and patent license is granted only if the following 39*7851SDana.Myers@Sun.COM * conditions are met: 40*7851SDana.Myers@Sun.COM * 41*7851SDana.Myers@Sun.COM * 3. Conditions 42*7851SDana.Myers@Sun.COM * 43*7851SDana.Myers@Sun.COM * 3.1. Redistribution of Source with Rights to Further Distribute Source. 44*7851SDana.Myers@Sun.COM * Redistribution of source code of any substantial portion of the Covered 45*7851SDana.Myers@Sun.COM * Code or modification with rights to further distribute source must include 46*7851SDana.Myers@Sun.COM * the above Copyright Notice, the above License, this list of Conditions, 47*7851SDana.Myers@Sun.COM * and the following Disclaimer and Export Compliance provision. In addition, 48*7851SDana.Myers@Sun.COM * Licensee must cause all Covered Code to which Licensee contributes to 49*7851SDana.Myers@Sun.COM * contain a file documenting the changes Licensee made to create that Covered 50*7851SDana.Myers@Sun.COM * Code and the date of any change. Licensee must include in that file the 51*7851SDana.Myers@Sun.COM * documentation of any changes made by any predecessor Licensee. Licensee 52*7851SDana.Myers@Sun.COM * must include a prominent statement that the modification is derived, 53*7851SDana.Myers@Sun.COM * directly or indirectly, from Original Intel Code. 54*7851SDana.Myers@Sun.COM * 55*7851SDana.Myers@Sun.COM * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 56*7851SDana.Myers@Sun.COM * Redistribution of source code of any substantial portion of the Covered 57*7851SDana.Myers@Sun.COM * Code or modification without rights to further distribute source must 58*7851SDana.Myers@Sun.COM * include the following Disclaimer and Export Compliance provision in the 59*7851SDana.Myers@Sun.COM * documentation and/or other materials provided with distribution. In 60*7851SDana.Myers@Sun.COM * addition, Licensee may not authorize further sublicense of source of any 61*7851SDana.Myers@Sun.COM * portion of the Covered Code, and must include terms to the effect that the 62*7851SDana.Myers@Sun.COM * license from Licensee to its licensee is limited to the intellectual 63*7851SDana.Myers@Sun.COM * property embodied in the software Licensee provides to its licensee, and 64*7851SDana.Myers@Sun.COM * not to intellectual property embodied in modifications its licensee may 65*7851SDana.Myers@Sun.COM * make. 66*7851SDana.Myers@Sun.COM * 67*7851SDana.Myers@Sun.COM * 3.3. Redistribution of Executable. Redistribution in executable form of any 68*7851SDana.Myers@Sun.COM * substantial portion of the Covered Code or modification must reproduce the 69*7851SDana.Myers@Sun.COM * above Copyright Notice, and the following Disclaimer and Export Compliance 70*7851SDana.Myers@Sun.COM * provision in the documentation and/or other materials provided with the 71*7851SDana.Myers@Sun.COM * distribution. 72*7851SDana.Myers@Sun.COM * 73*7851SDana.Myers@Sun.COM * 3.4. Intel retains all right, title, and interest in and to the Original 74*7851SDana.Myers@Sun.COM * Intel Code. 75*7851SDana.Myers@Sun.COM * 76*7851SDana.Myers@Sun.COM * 3.5. Neither the name Intel nor any other trademark owned or controlled by 77*7851SDana.Myers@Sun.COM * Intel shall be used in advertising or otherwise to promote the sale, use or 78*7851SDana.Myers@Sun.COM * other dealings in products derived from or relating to the Covered Code 79*7851SDana.Myers@Sun.COM * without prior written authorization from Intel. 80*7851SDana.Myers@Sun.COM * 81*7851SDana.Myers@Sun.COM * 4. Disclaimer and Export Compliance 82*7851SDana.Myers@Sun.COM * 83*7851SDana.Myers@Sun.COM * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 84*7851SDana.Myers@Sun.COM * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 85*7851SDana.Myers@Sun.COM * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 86*7851SDana.Myers@Sun.COM * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 87*7851SDana.Myers@Sun.COM * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 88*7851SDana.Myers@Sun.COM * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 89*7851SDana.Myers@Sun.COM * PARTICULAR PURPOSE. 90*7851SDana.Myers@Sun.COM * 91*7851SDana.Myers@Sun.COM * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 92*7851SDana.Myers@Sun.COM * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 93*7851SDana.Myers@Sun.COM * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 94*7851SDana.Myers@Sun.COM * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 95*7851SDana.Myers@Sun.COM * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 96*7851SDana.Myers@Sun.COM * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 97*7851SDana.Myers@Sun.COM * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 98*7851SDana.Myers@Sun.COM * LIMITED REMEDY. 99*7851SDana.Myers@Sun.COM * 100*7851SDana.Myers@Sun.COM * 4.3. Licensee shall not export, either directly or indirectly, any of this 101*7851SDana.Myers@Sun.COM * software or system incorporating such software without first obtaining any 102*7851SDana.Myers@Sun.COM * required license or other approval from the U. S. Department of Commerce or 103*7851SDana.Myers@Sun.COM * any other agency or department of the United States Government. In the 104*7851SDana.Myers@Sun.COM * event Licensee exports any such software from the United States or 105*7851SDana.Myers@Sun.COM * re-exports any such software from a foreign destination, Licensee shall 106*7851SDana.Myers@Sun.COM * ensure that the distribution and export/re-export of the software is in 107*7851SDana.Myers@Sun.COM * compliance with all laws, regulations, orders, or other restrictions of the 108*7851SDana.Myers@Sun.COM * U.S. Export Administration Regulations. Licensee agrees that neither it nor 109*7851SDana.Myers@Sun.COM * any of its subsidiaries will export/re-export any technical data, process, 110*7851SDana.Myers@Sun.COM * software, or service, directly or indirectly, to any country for which the 111*7851SDana.Myers@Sun.COM * United States government or any agency thereof requires an export license, 112*7851SDana.Myers@Sun.COM * other governmental approval, or letter of assurance, without first obtaining 113*7851SDana.Myers@Sun.COM * such license, approval or letter. 114*7851SDana.Myers@Sun.COM * 115*7851SDana.Myers@Sun.COM *****************************************************************************/ 116*7851SDana.Myers@Sun.COM 117*7851SDana.Myers@Sun.COM 118*7851SDana.Myers@Sun.COM #define __EXCONVRT_C__ 119*7851SDana.Myers@Sun.COM 120*7851SDana.Myers@Sun.COM #include "acpi.h" 121*7851SDana.Myers@Sun.COM #include "acinterp.h" 122*7851SDana.Myers@Sun.COM #include "amlcode.h" 123*7851SDana.Myers@Sun.COM 124*7851SDana.Myers@Sun.COM 125*7851SDana.Myers@Sun.COM #define _COMPONENT ACPI_EXECUTER 126*7851SDana.Myers@Sun.COM ACPI_MODULE_NAME ("exconvrt") 127*7851SDana.Myers@Sun.COM 128*7851SDana.Myers@Sun.COM /* Local prototypes */ 129*7851SDana.Myers@Sun.COM 130*7851SDana.Myers@Sun.COM static UINT32 131*7851SDana.Myers@Sun.COM AcpiExConvertToAscii ( 132*7851SDana.Myers@Sun.COM ACPI_INTEGER Integer, 133*7851SDana.Myers@Sun.COM UINT16 Base, 134*7851SDana.Myers@Sun.COM UINT8 *String, 135*7851SDana.Myers@Sun.COM UINT8 MaxLength); 136*7851SDana.Myers@Sun.COM 137*7851SDana.Myers@Sun.COM 138*7851SDana.Myers@Sun.COM /******************************************************************************* 139*7851SDana.Myers@Sun.COM * 140*7851SDana.Myers@Sun.COM * FUNCTION: AcpiExConvertToInteger 141*7851SDana.Myers@Sun.COM * 142*7851SDana.Myers@Sun.COM * PARAMETERS: ObjDesc - Object to be converted. Must be an 143*7851SDana.Myers@Sun.COM * Integer, Buffer, or String 144*7851SDana.Myers@Sun.COM * ResultDesc - Where the new Integer object is returned 145*7851SDana.Myers@Sun.COM * Flags - Used for string conversion 146*7851SDana.Myers@Sun.COM * 147*7851SDana.Myers@Sun.COM * RETURN: Status 148*7851SDana.Myers@Sun.COM * 149*7851SDana.Myers@Sun.COM * DESCRIPTION: Convert an ACPI Object to an integer. 150*7851SDana.Myers@Sun.COM * 151*7851SDana.Myers@Sun.COM ******************************************************************************/ 152*7851SDana.Myers@Sun.COM 153*7851SDana.Myers@Sun.COM ACPI_STATUS 154*7851SDana.Myers@Sun.COM AcpiExConvertToInteger ( 155*7851SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *ObjDesc, 156*7851SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **ResultDesc, 157*7851SDana.Myers@Sun.COM UINT32 Flags) 158*7851SDana.Myers@Sun.COM { 159*7851SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *ReturnDesc; 160*7851SDana.Myers@Sun.COM UINT8 *Pointer; 161*7851SDana.Myers@Sun.COM ACPI_INTEGER Result; 162*7851SDana.Myers@Sun.COM UINT32 i; 163*7851SDana.Myers@Sun.COM UINT32 Count; 164*7851SDana.Myers@Sun.COM ACPI_STATUS Status; 165*7851SDana.Myers@Sun.COM 166*7851SDana.Myers@Sun.COM 167*7851SDana.Myers@Sun.COM ACPI_FUNCTION_TRACE_PTR (ExConvertToInteger, ObjDesc); 168*7851SDana.Myers@Sun.COM 169*7851SDana.Myers@Sun.COM 170*7851SDana.Myers@Sun.COM switch (ACPI_GET_OBJECT_TYPE (ObjDesc)) 171*7851SDana.Myers@Sun.COM { 172*7851SDana.Myers@Sun.COM case ACPI_TYPE_INTEGER: 173*7851SDana.Myers@Sun.COM 174*7851SDana.Myers@Sun.COM /* No conversion necessary */ 175*7851SDana.Myers@Sun.COM 176*7851SDana.Myers@Sun.COM *ResultDesc = ObjDesc; 177*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_OK); 178*7851SDana.Myers@Sun.COM 179*7851SDana.Myers@Sun.COM case ACPI_TYPE_BUFFER: 180*7851SDana.Myers@Sun.COM case ACPI_TYPE_STRING: 181*7851SDana.Myers@Sun.COM 182*7851SDana.Myers@Sun.COM /* Note: Takes advantage of common buffer/string fields */ 183*7851SDana.Myers@Sun.COM 184*7851SDana.Myers@Sun.COM Pointer = ObjDesc->Buffer.Pointer; 185*7851SDana.Myers@Sun.COM Count = ObjDesc->Buffer.Length; 186*7851SDana.Myers@Sun.COM break; 187*7851SDana.Myers@Sun.COM 188*7851SDana.Myers@Sun.COM default: 189*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_TYPE); 190*7851SDana.Myers@Sun.COM } 191*7851SDana.Myers@Sun.COM 192*7851SDana.Myers@Sun.COM /* 193*7851SDana.Myers@Sun.COM * Convert the buffer/string to an integer. Note that both buffers and 194*7851SDana.Myers@Sun.COM * strings are treated as raw data - we don't convert ascii to hex for 195*7851SDana.Myers@Sun.COM * strings. 196*7851SDana.Myers@Sun.COM * 197*7851SDana.Myers@Sun.COM * There are two terminating conditions for the loop: 198*7851SDana.Myers@Sun.COM * 1) The size of an integer has been reached, or 199*7851SDana.Myers@Sun.COM * 2) The end of the buffer or string has been reached 200*7851SDana.Myers@Sun.COM */ 201*7851SDana.Myers@Sun.COM Result = 0; 202*7851SDana.Myers@Sun.COM 203*7851SDana.Myers@Sun.COM /* String conversion is different than Buffer conversion */ 204*7851SDana.Myers@Sun.COM 205*7851SDana.Myers@Sun.COM switch (ACPI_GET_OBJECT_TYPE (ObjDesc)) 206*7851SDana.Myers@Sun.COM { 207*7851SDana.Myers@Sun.COM case ACPI_TYPE_STRING: 208*7851SDana.Myers@Sun.COM 209*7851SDana.Myers@Sun.COM /* 210*7851SDana.Myers@Sun.COM * Convert string to an integer - for most cases, the string must be 211*7851SDana.Myers@Sun.COM * hexadecimal as per the ACPI specification. The only exception (as 212*7851SDana.Myers@Sun.COM * of ACPI 3.0) is that the ToInteger() operator allows both decimal 213*7851SDana.Myers@Sun.COM * and hexadecimal strings (hex prefixed with "0x"). 214*7851SDana.Myers@Sun.COM */ 215*7851SDana.Myers@Sun.COM Status = AcpiUtStrtoul64 ((char *) Pointer, Flags, &Result); 216*7851SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 217*7851SDana.Myers@Sun.COM { 218*7851SDana.Myers@Sun.COM return_ACPI_STATUS (Status); 219*7851SDana.Myers@Sun.COM } 220*7851SDana.Myers@Sun.COM break; 221*7851SDana.Myers@Sun.COM 222*7851SDana.Myers@Sun.COM 223*7851SDana.Myers@Sun.COM case ACPI_TYPE_BUFFER: 224*7851SDana.Myers@Sun.COM 225*7851SDana.Myers@Sun.COM /* Check for zero-length buffer */ 226*7851SDana.Myers@Sun.COM 227*7851SDana.Myers@Sun.COM if (!Count) 228*7851SDana.Myers@Sun.COM { 229*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_AML_BUFFER_LIMIT); 230*7851SDana.Myers@Sun.COM } 231*7851SDana.Myers@Sun.COM 232*7851SDana.Myers@Sun.COM /* Transfer no more than an integer's worth of data */ 233*7851SDana.Myers@Sun.COM 234*7851SDana.Myers@Sun.COM if (Count > AcpiGbl_IntegerByteWidth) 235*7851SDana.Myers@Sun.COM { 236*7851SDana.Myers@Sun.COM Count = AcpiGbl_IntegerByteWidth; 237*7851SDana.Myers@Sun.COM } 238*7851SDana.Myers@Sun.COM 239*7851SDana.Myers@Sun.COM /* 240*7851SDana.Myers@Sun.COM * Convert buffer to an integer - we simply grab enough raw data 241*7851SDana.Myers@Sun.COM * from the buffer to fill an integer 242*7851SDana.Myers@Sun.COM */ 243*7851SDana.Myers@Sun.COM for (i = 0; i < Count; i++) 244*7851SDana.Myers@Sun.COM { 245*7851SDana.Myers@Sun.COM /* 246*7851SDana.Myers@Sun.COM * Get next byte and shift it into the Result. 247*7851SDana.Myers@Sun.COM * Little endian is used, meaning that the first byte of the buffer 248*7851SDana.Myers@Sun.COM * is the LSB of the integer 249*7851SDana.Myers@Sun.COM */ 250*7851SDana.Myers@Sun.COM Result |= (((ACPI_INTEGER) Pointer[i]) << (i * 8)); 251*7851SDana.Myers@Sun.COM } 252*7851SDana.Myers@Sun.COM break; 253*7851SDana.Myers@Sun.COM 254*7851SDana.Myers@Sun.COM 255*7851SDana.Myers@Sun.COM default: 256*7851SDana.Myers@Sun.COM 257*7851SDana.Myers@Sun.COM /* No other types can get here */ 258*7851SDana.Myers@Sun.COM break; 259*7851SDana.Myers@Sun.COM } 260*7851SDana.Myers@Sun.COM 261*7851SDana.Myers@Sun.COM /* Create a new integer */ 262*7851SDana.Myers@Sun.COM 263*7851SDana.Myers@Sun.COM ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER); 264*7851SDana.Myers@Sun.COM if (!ReturnDesc) 265*7851SDana.Myers@Sun.COM { 266*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_NO_MEMORY); 267*7851SDana.Myers@Sun.COM } 268*7851SDana.Myers@Sun.COM 269*7851SDana.Myers@Sun.COM ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Converted value: %8.8X%8.8X\n", 270*7851SDana.Myers@Sun.COM ACPI_FORMAT_UINT64 (Result))); 271*7851SDana.Myers@Sun.COM 272*7851SDana.Myers@Sun.COM /* Save the Result */ 273*7851SDana.Myers@Sun.COM 274*7851SDana.Myers@Sun.COM ReturnDesc->Integer.Value = Result; 275*7851SDana.Myers@Sun.COM AcpiExTruncateFor32bitTable (ReturnDesc); 276*7851SDana.Myers@Sun.COM *ResultDesc = ReturnDesc; 277*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_OK); 278*7851SDana.Myers@Sun.COM } 279*7851SDana.Myers@Sun.COM 280*7851SDana.Myers@Sun.COM 281*7851SDana.Myers@Sun.COM /******************************************************************************* 282*7851SDana.Myers@Sun.COM * 283*7851SDana.Myers@Sun.COM * FUNCTION: AcpiExConvertToBuffer 284*7851SDana.Myers@Sun.COM * 285*7851SDana.Myers@Sun.COM * PARAMETERS: ObjDesc - Object to be converted. Must be an 286*7851SDana.Myers@Sun.COM * Integer, Buffer, or String 287*7851SDana.Myers@Sun.COM * ResultDesc - Where the new buffer object is returned 288*7851SDana.Myers@Sun.COM * 289*7851SDana.Myers@Sun.COM * RETURN: Status 290*7851SDana.Myers@Sun.COM * 291*7851SDana.Myers@Sun.COM * DESCRIPTION: Convert an ACPI Object to a Buffer 292*7851SDana.Myers@Sun.COM * 293*7851SDana.Myers@Sun.COM ******************************************************************************/ 294*7851SDana.Myers@Sun.COM 295*7851SDana.Myers@Sun.COM ACPI_STATUS 296*7851SDana.Myers@Sun.COM AcpiExConvertToBuffer ( 297*7851SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *ObjDesc, 298*7851SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **ResultDesc) 299*7851SDana.Myers@Sun.COM { 300*7851SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *ReturnDesc; 301*7851SDana.Myers@Sun.COM UINT8 *NewBuf; 302*7851SDana.Myers@Sun.COM 303*7851SDana.Myers@Sun.COM 304*7851SDana.Myers@Sun.COM ACPI_FUNCTION_TRACE_PTR (ExConvertToBuffer, ObjDesc); 305*7851SDana.Myers@Sun.COM 306*7851SDana.Myers@Sun.COM 307*7851SDana.Myers@Sun.COM switch (ACPI_GET_OBJECT_TYPE (ObjDesc)) 308*7851SDana.Myers@Sun.COM { 309*7851SDana.Myers@Sun.COM case ACPI_TYPE_BUFFER: 310*7851SDana.Myers@Sun.COM 311*7851SDana.Myers@Sun.COM /* No conversion necessary */ 312*7851SDana.Myers@Sun.COM 313*7851SDana.Myers@Sun.COM *ResultDesc = ObjDesc; 314*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_OK); 315*7851SDana.Myers@Sun.COM 316*7851SDana.Myers@Sun.COM 317*7851SDana.Myers@Sun.COM case ACPI_TYPE_INTEGER: 318*7851SDana.Myers@Sun.COM 319*7851SDana.Myers@Sun.COM /* 320*7851SDana.Myers@Sun.COM * Create a new Buffer object. 321*7851SDana.Myers@Sun.COM * Need enough space for one integer 322*7851SDana.Myers@Sun.COM */ 323*7851SDana.Myers@Sun.COM ReturnDesc = AcpiUtCreateBufferObject (AcpiGbl_IntegerByteWidth); 324*7851SDana.Myers@Sun.COM if (!ReturnDesc) 325*7851SDana.Myers@Sun.COM { 326*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_NO_MEMORY); 327*7851SDana.Myers@Sun.COM } 328*7851SDana.Myers@Sun.COM 329*7851SDana.Myers@Sun.COM /* Copy the integer to the buffer, LSB first */ 330*7851SDana.Myers@Sun.COM 331*7851SDana.Myers@Sun.COM NewBuf = ReturnDesc->Buffer.Pointer; 332*7851SDana.Myers@Sun.COM ACPI_MEMCPY (NewBuf, 333*7851SDana.Myers@Sun.COM &ObjDesc->Integer.Value, 334*7851SDana.Myers@Sun.COM AcpiGbl_IntegerByteWidth); 335*7851SDana.Myers@Sun.COM break; 336*7851SDana.Myers@Sun.COM 337*7851SDana.Myers@Sun.COM 338*7851SDana.Myers@Sun.COM case ACPI_TYPE_STRING: 339*7851SDana.Myers@Sun.COM 340*7851SDana.Myers@Sun.COM /* 341*7851SDana.Myers@Sun.COM * Create a new Buffer object 342*7851SDana.Myers@Sun.COM * Size will be the string length 343*7851SDana.Myers@Sun.COM * 344*7851SDana.Myers@Sun.COM * NOTE: Add one to the string length to include the null terminator. 345*7851SDana.Myers@Sun.COM * The ACPI spec is unclear on this subject, but there is existing 346*7851SDana.Myers@Sun.COM * ASL/AML code that depends on the null being transferred to the new 347*7851SDana.Myers@Sun.COM * buffer. 348*7851SDana.Myers@Sun.COM */ 349*7851SDana.Myers@Sun.COM ReturnDesc = AcpiUtCreateBufferObject ( 350*7851SDana.Myers@Sun.COM (ACPI_SIZE) ObjDesc->String.Length + 1); 351*7851SDana.Myers@Sun.COM if (!ReturnDesc) 352*7851SDana.Myers@Sun.COM { 353*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_NO_MEMORY); 354*7851SDana.Myers@Sun.COM } 355*7851SDana.Myers@Sun.COM 356*7851SDana.Myers@Sun.COM /* Copy the string to the buffer */ 357*7851SDana.Myers@Sun.COM 358*7851SDana.Myers@Sun.COM NewBuf = ReturnDesc->Buffer.Pointer; 359*7851SDana.Myers@Sun.COM ACPI_STRNCPY ((char *) NewBuf, (char *) ObjDesc->String.Pointer, 360*7851SDana.Myers@Sun.COM ObjDesc->String.Length); 361*7851SDana.Myers@Sun.COM break; 362*7851SDana.Myers@Sun.COM 363*7851SDana.Myers@Sun.COM 364*7851SDana.Myers@Sun.COM default: 365*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_TYPE); 366*7851SDana.Myers@Sun.COM } 367*7851SDana.Myers@Sun.COM 368*7851SDana.Myers@Sun.COM /* Mark buffer initialized */ 369*7851SDana.Myers@Sun.COM 370*7851SDana.Myers@Sun.COM ReturnDesc->Common.Flags |= AOPOBJ_DATA_VALID; 371*7851SDana.Myers@Sun.COM *ResultDesc = ReturnDesc; 372*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_OK); 373*7851SDana.Myers@Sun.COM } 374*7851SDana.Myers@Sun.COM 375*7851SDana.Myers@Sun.COM 376*7851SDana.Myers@Sun.COM /******************************************************************************* 377*7851SDana.Myers@Sun.COM * 378*7851SDana.Myers@Sun.COM * FUNCTION: AcpiExConvertToAscii 379*7851SDana.Myers@Sun.COM * 380*7851SDana.Myers@Sun.COM * PARAMETERS: Integer - Value to be converted 381*7851SDana.Myers@Sun.COM * Base - ACPI_STRING_DECIMAL or ACPI_STRING_HEX 382*7851SDana.Myers@Sun.COM * String - Where the string is returned 383*7851SDana.Myers@Sun.COM * DataWidth - Size of data item to be converted, in bytes 384*7851SDana.Myers@Sun.COM * 385*7851SDana.Myers@Sun.COM * RETURN: Actual string length 386*7851SDana.Myers@Sun.COM * 387*7851SDana.Myers@Sun.COM * DESCRIPTION: Convert an ACPI Integer to a hex or decimal string 388*7851SDana.Myers@Sun.COM * 389*7851SDana.Myers@Sun.COM ******************************************************************************/ 390*7851SDana.Myers@Sun.COM 391*7851SDana.Myers@Sun.COM static UINT32 392*7851SDana.Myers@Sun.COM AcpiExConvertToAscii ( 393*7851SDana.Myers@Sun.COM ACPI_INTEGER Integer, 394*7851SDana.Myers@Sun.COM UINT16 Base, 395*7851SDana.Myers@Sun.COM UINT8 *String, 396*7851SDana.Myers@Sun.COM UINT8 DataWidth) 397*7851SDana.Myers@Sun.COM { 398*7851SDana.Myers@Sun.COM ACPI_INTEGER Digit; 399*7851SDana.Myers@Sun.COM UINT32 i; 400*7851SDana.Myers@Sun.COM UINT32 j; 401*7851SDana.Myers@Sun.COM UINT32 k = 0; 402*7851SDana.Myers@Sun.COM UINT32 HexLength; 403*7851SDana.Myers@Sun.COM UINT32 DecimalLength; 404*7851SDana.Myers@Sun.COM UINT32 Remainder; 405*7851SDana.Myers@Sun.COM BOOLEAN SupressZeros; 406*7851SDana.Myers@Sun.COM 407*7851SDana.Myers@Sun.COM 408*7851SDana.Myers@Sun.COM ACPI_FUNCTION_ENTRY (); 409*7851SDana.Myers@Sun.COM 410*7851SDana.Myers@Sun.COM 411*7851SDana.Myers@Sun.COM switch (Base) 412*7851SDana.Myers@Sun.COM { 413*7851SDana.Myers@Sun.COM case 10: 414*7851SDana.Myers@Sun.COM 415*7851SDana.Myers@Sun.COM /* Setup max length for the decimal number */ 416*7851SDana.Myers@Sun.COM 417*7851SDana.Myers@Sun.COM switch (DataWidth) 418*7851SDana.Myers@Sun.COM { 419*7851SDana.Myers@Sun.COM case 1: 420*7851SDana.Myers@Sun.COM DecimalLength = ACPI_MAX8_DECIMAL_DIGITS; 421*7851SDana.Myers@Sun.COM break; 422*7851SDana.Myers@Sun.COM 423*7851SDana.Myers@Sun.COM case 4: 424*7851SDana.Myers@Sun.COM DecimalLength = ACPI_MAX32_DECIMAL_DIGITS; 425*7851SDana.Myers@Sun.COM break; 426*7851SDana.Myers@Sun.COM 427*7851SDana.Myers@Sun.COM case 8: 428*7851SDana.Myers@Sun.COM default: 429*7851SDana.Myers@Sun.COM DecimalLength = ACPI_MAX64_DECIMAL_DIGITS; 430*7851SDana.Myers@Sun.COM break; 431*7851SDana.Myers@Sun.COM } 432*7851SDana.Myers@Sun.COM 433*7851SDana.Myers@Sun.COM SupressZeros = TRUE; /* No leading zeros */ 434*7851SDana.Myers@Sun.COM Remainder = 0; 435*7851SDana.Myers@Sun.COM 436*7851SDana.Myers@Sun.COM for (i = DecimalLength; i > 0; i--) 437*7851SDana.Myers@Sun.COM { 438*7851SDana.Myers@Sun.COM /* Divide by nth factor of 10 */ 439*7851SDana.Myers@Sun.COM 440*7851SDana.Myers@Sun.COM Digit = Integer; 441*7851SDana.Myers@Sun.COM for (j = 0; j < i; j++) 442*7851SDana.Myers@Sun.COM { 443*7851SDana.Myers@Sun.COM (void) AcpiUtShortDivide (Digit, 10, &Digit, &Remainder); 444*7851SDana.Myers@Sun.COM } 445*7851SDana.Myers@Sun.COM 446*7851SDana.Myers@Sun.COM /* Handle leading zeros */ 447*7851SDana.Myers@Sun.COM 448*7851SDana.Myers@Sun.COM if (Remainder != 0) 449*7851SDana.Myers@Sun.COM { 450*7851SDana.Myers@Sun.COM SupressZeros = FALSE; 451*7851SDana.Myers@Sun.COM } 452*7851SDana.Myers@Sun.COM 453*7851SDana.Myers@Sun.COM if (!SupressZeros) 454*7851SDana.Myers@Sun.COM { 455*7851SDana.Myers@Sun.COM String[k] = (UINT8) (ACPI_ASCII_ZERO + Remainder); 456*7851SDana.Myers@Sun.COM k++; 457*7851SDana.Myers@Sun.COM } 458*7851SDana.Myers@Sun.COM } 459*7851SDana.Myers@Sun.COM break; 460*7851SDana.Myers@Sun.COM 461*7851SDana.Myers@Sun.COM case 16: 462*7851SDana.Myers@Sun.COM 463*7851SDana.Myers@Sun.COM /* HexLength: 2 ascii hex chars per data byte */ 464*7851SDana.Myers@Sun.COM 465*7851SDana.Myers@Sun.COM HexLength = ACPI_MUL_2 (DataWidth); 466*7851SDana.Myers@Sun.COM for (i = 0, j = (HexLength-1); i < HexLength; i++, j--) 467*7851SDana.Myers@Sun.COM { 468*7851SDana.Myers@Sun.COM /* Get one hex digit, most significant digits first */ 469*7851SDana.Myers@Sun.COM 470*7851SDana.Myers@Sun.COM String[k] = (UINT8) AcpiUtHexToAsciiChar (Integer, ACPI_MUL_4 (j)); 471*7851SDana.Myers@Sun.COM k++; 472*7851SDana.Myers@Sun.COM } 473*7851SDana.Myers@Sun.COM break; 474*7851SDana.Myers@Sun.COM 475*7851SDana.Myers@Sun.COM default: 476*7851SDana.Myers@Sun.COM return (0); 477*7851SDana.Myers@Sun.COM } 478*7851SDana.Myers@Sun.COM 479*7851SDana.Myers@Sun.COM /* 480*7851SDana.Myers@Sun.COM * Since leading zeros are suppressed, we must check for the case where 481*7851SDana.Myers@Sun.COM * the integer equals 0 482*7851SDana.Myers@Sun.COM * 483*7851SDana.Myers@Sun.COM * Finally, null terminate the string and return the length 484*7851SDana.Myers@Sun.COM */ 485*7851SDana.Myers@Sun.COM if (!k) 486*7851SDana.Myers@Sun.COM { 487*7851SDana.Myers@Sun.COM String [0] = ACPI_ASCII_ZERO; 488*7851SDana.Myers@Sun.COM k = 1; 489*7851SDana.Myers@Sun.COM } 490*7851SDana.Myers@Sun.COM 491*7851SDana.Myers@Sun.COM String [k] = 0; 492*7851SDana.Myers@Sun.COM return ((UINT32) k); 493*7851SDana.Myers@Sun.COM } 494*7851SDana.Myers@Sun.COM 495*7851SDana.Myers@Sun.COM 496*7851SDana.Myers@Sun.COM /******************************************************************************* 497*7851SDana.Myers@Sun.COM * 498*7851SDana.Myers@Sun.COM * FUNCTION: AcpiExConvertToString 499*7851SDana.Myers@Sun.COM * 500*7851SDana.Myers@Sun.COM * PARAMETERS: ObjDesc - Object to be converted. Must be an 501*7851SDana.Myers@Sun.COM * Integer, Buffer, or String 502*7851SDana.Myers@Sun.COM * ResultDesc - Where the string object is returned 503*7851SDana.Myers@Sun.COM * Type - String flags (base and conversion type) 504*7851SDana.Myers@Sun.COM * 505*7851SDana.Myers@Sun.COM * RETURN: Status 506*7851SDana.Myers@Sun.COM * 507*7851SDana.Myers@Sun.COM * DESCRIPTION: Convert an ACPI Object to a string 508*7851SDana.Myers@Sun.COM * 509*7851SDana.Myers@Sun.COM ******************************************************************************/ 510*7851SDana.Myers@Sun.COM 511*7851SDana.Myers@Sun.COM ACPI_STATUS 512*7851SDana.Myers@Sun.COM AcpiExConvertToString ( 513*7851SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *ObjDesc, 514*7851SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **ResultDesc, 515*7851SDana.Myers@Sun.COM UINT32 Type) 516*7851SDana.Myers@Sun.COM { 517*7851SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *ReturnDesc; 518*7851SDana.Myers@Sun.COM UINT8 *NewBuf; 519*7851SDana.Myers@Sun.COM UINT32 i; 520*7851SDana.Myers@Sun.COM UINT32 StringLength = 0; 521*7851SDana.Myers@Sun.COM UINT16 Base = 16; 522*7851SDana.Myers@Sun.COM UINT8 Separator = ','; 523*7851SDana.Myers@Sun.COM 524*7851SDana.Myers@Sun.COM 525*7851SDana.Myers@Sun.COM ACPI_FUNCTION_TRACE_PTR (ExConvertToString, ObjDesc); 526*7851SDana.Myers@Sun.COM 527*7851SDana.Myers@Sun.COM 528*7851SDana.Myers@Sun.COM switch (ACPI_GET_OBJECT_TYPE (ObjDesc)) 529*7851SDana.Myers@Sun.COM { 530*7851SDana.Myers@Sun.COM case ACPI_TYPE_STRING: 531*7851SDana.Myers@Sun.COM 532*7851SDana.Myers@Sun.COM /* No conversion necessary */ 533*7851SDana.Myers@Sun.COM 534*7851SDana.Myers@Sun.COM *ResultDesc = ObjDesc; 535*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_OK); 536*7851SDana.Myers@Sun.COM 537*7851SDana.Myers@Sun.COM 538*7851SDana.Myers@Sun.COM case ACPI_TYPE_INTEGER: 539*7851SDana.Myers@Sun.COM 540*7851SDana.Myers@Sun.COM switch (Type) 541*7851SDana.Myers@Sun.COM { 542*7851SDana.Myers@Sun.COM case ACPI_EXPLICIT_CONVERT_DECIMAL: 543*7851SDana.Myers@Sun.COM 544*7851SDana.Myers@Sun.COM /* Make room for maximum decimal number */ 545*7851SDana.Myers@Sun.COM 546*7851SDana.Myers@Sun.COM StringLength = ACPI_MAX_DECIMAL_DIGITS; 547*7851SDana.Myers@Sun.COM Base = 10; 548*7851SDana.Myers@Sun.COM break; 549*7851SDana.Myers@Sun.COM 550*7851SDana.Myers@Sun.COM default: 551*7851SDana.Myers@Sun.COM 552*7851SDana.Myers@Sun.COM /* Two hex string characters for each integer byte */ 553*7851SDana.Myers@Sun.COM 554*7851SDana.Myers@Sun.COM StringLength = ACPI_MUL_2 (AcpiGbl_IntegerByteWidth); 555*7851SDana.Myers@Sun.COM break; 556*7851SDana.Myers@Sun.COM } 557*7851SDana.Myers@Sun.COM 558*7851SDana.Myers@Sun.COM /* 559*7851SDana.Myers@Sun.COM * Create a new String 560*7851SDana.Myers@Sun.COM * Need enough space for one ASCII integer (plus null terminator) 561*7851SDana.Myers@Sun.COM */ 562*7851SDana.Myers@Sun.COM ReturnDesc = AcpiUtCreateStringObject ((ACPI_SIZE) StringLength); 563*7851SDana.Myers@Sun.COM if (!ReturnDesc) 564*7851SDana.Myers@Sun.COM { 565*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_NO_MEMORY); 566*7851SDana.Myers@Sun.COM } 567*7851SDana.Myers@Sun.COM 568*7851SDana.Myers@Sun.COM NewBuf = ReturnDesc->Buffer.Pointer; 569*7851SDana.Myers@Sun.COM 570*7851SDana.Myers@Sun.COM /* Convert integer to string */ 571*7851SDana.Myers@Sun.COM 572*7851SDana.Myers@Sun.COM StringLength = AcpiExConvertToAscii (ObjDesc->Integer.Value, Base, 573*7851SDana.Myers@Sun.COM NewBuf, AcpiGbl_IntegerByteWidth); 574*7851SDana.Myers@Sun.COM 575*7851SDana.Myers@Sun.COM /* Null terminate at the correct place */ 576*7851SDana.Myers@Sun.COM 577*7851SDana.Myers@Sun.COM ReturnDesc->String.Length = StringLength; 578*7851SDana.Myers@Sun.COM NewBuf [StringLength] = 0; 579*7851SDana.Myers@Sun.COM break; 580*7851SDana.Myers@Sun.COM 581*7851SDana.Myers@Sun.COM 582*7851SDana.Myers@Sun.COM case ACPI_TYPE_BUFFER: 583*7851SDana.Myers@Sun.COM 584*7851SDana.Myers@Sun.COM /* Setup string length, base, and separator */ 585*7851SDana.Myers@Sun.COM 586*7851SDana.Myers@Sun.COM switch (Type) 587*7851SDana.Myers@Sun.COM { 588*7851SDana.Myers@Sun.COM case ACPI_EXPLICIT_CONVERT_DECIMAL: /* Used by ToDecimalString */ 589*7851SDana.Myers@Sun.COM /* 590*7851SDana.Myers@Sun.COM * From ACPI: "If Data is a buffer, it is converted to a string of 591*7851SDana.Myers@Sun.COM * decimal values separated by commas." 592*7851SDana.Myers@Sun.COM */ 593*7851SDana.Myers@Sun.COM Base = 10; 594*7851SDana.Myers@Sun.COM 595*7851SDana.Myers@Sun.COM /* 596*7851SDana.Myers@Sun.COM * Calculate the final string length. Individual string values 597*7851SDana.Myers@Sun.COM * are variable length (include separator for each) 598*7851SDana.Myers@Sun.COM */ 599*7851SDana.Myers@Sun.COM for (i = 0; i < ObjDesc->Buffer.Length; i++) 600*7851SDana.Myers@Sun.COM { 601*7851SDana.Myers@Sun.COM if (ObjDesc->Buffer.Pointer[i] >= 100) 602*7851SDana.Myers@Sun.COM { 603*7851SDana.Myers@Sun.COM StringLength += 4; 604*7851SDana.Myers@Sun.COM } 605*7851SDana.Myers@Sun.COM else if (ObjDesc->Buffer.Pointer[i] >= 10) 606*7851SDana.Myers@Sun.COM { 607*7851SDana.Myers@Sun.COM StringLength += 3; 608*7851SDana.Myers@Sun.COM } 609*7851SDana.Myers@Sun.COM else 610*7851SDana.Myers@Sun.COM { 611*7851SDana.Myers@Sun.COM StringLength += 2; 612*7851SDana.Myers@Sun.COM } 613*7851SDana.Myers@Sun.COM } 614*7851SDana.Myers@Sun.COM break; 615*7851SDana.Myers@Sun.COM 616*7851SDana.Myers@Sun.COM case ACPI_IMPLICIT_CONVERT_HEX: 617*7851SDana.Myers@Sun.COM /* 618*7851SDana.Myers@Sun.COM * From the ACPI spec: 619*7851SDana.Myers@Sun.COM *"The entire contents of the buffer are converted to a string of 620*7851SDana.Myers@Sun.COM * two-character hexadecimal numbers, each separated by a space." 621*7851SDana.Myers@Sun.COM */ 622*7851SDana.Myers@Sun.COM Separator = ' '; 623*7851SDana.Myers@Sun.COM StringLength = (ObjDesc->Buffer.Length * 3); 624*7851SDana.Myers@Sun.COM break; 625*7851SDana.Myers@Sun.COM 626*7851SDana.Myers@Sun.COM case ACPI_EXPLICIT_CONVERT_HEX: /* Used by ToHexString */ 627*7851SDana.Myers@Sun.COM /* 628*7851SDana.Myers@Sun.COM * From ACPI: "If Data is a buffer, it is converted to a string of 629*7851SDana.Myers@Sun.COM * hexadecimal values separated by commas." 630*7851SDana.Myers@Sun.COM */ 631*7851SDana.Myers@Sun.COM StringLength = (ObjDesc->Buffer.Length * 3); 632*7851SDana.Myers@Sun.COM break; 633*7851SDana.Myers@Sun.COM 634*7851SDana.Myers@Sun.COM default: 635*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_BAD_PARAMETER); 636*7851SDana.Myers@Sun.COM } 637*7851SDana.Myers@Sun.COM 638*7851SDana.Myers@Sun.COM /* 639*7851SDana.Myers@Sun.COM * Create a new string object and string buffer 640*7851SDana.Myers@Sun.COM * (-1 because of extra separator included in StringLength from above) 641*7851SDana.Myers@Sun.COM */ 642*7851SDana.Myers@Sun.COM ReturnDesc = AcpiUtCreateStringObject ((ACPI_SIZE) (StringLength - 1)); 643*7851SDana.Myers@Sun.COM if (!ReturnDesc) 644*7851SDana.Myers@Sun.COM { 645*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_NO_MEMORY); 646*7851SDana.Myers@Sun.COM } 647*7851SDana.Myers@Sun.COM 648*7851SDana.Myers@Sun.COM NewBuf = ReturnDesc->Buffer.Pointer; 649*7851SDana.Myers@Sun.COM 650*7851SDana.Myers@Sun.COM /* 651*7851SDana.Myers@Sun.COM * Convert buffer bytes to hex or decimal values 652*7851SDana.Myers@Sun.COM * (separated by commas or spaces) 653*7851SDana.Myers@Sun.COM */ 654*7851SDana.Myers@Sun.COM for (i = 0; i < ObjDesc->Buffer.Length; i++) 655*7851SDana.Myers@Sun.COM { 656*7851SDana.Myers@Sun.COM NewBuf += AcpiExConvertToAscii ( 657*7851SDana.Myers@Sun.COM (ACPI_INTEGER) ObjDesc->Buffer.Pointer[i], Base, 658*7851SDana.Myers@Sun.COM NewBuf, 1); 659*7851SDana.Myers@Sun.COM *NewBuf++ = Separator; /* each separated by a comma or space */ 660*7851SDana.Myers@Sun.COM } 661*7851SDana.Myers@Sun.COM 662*7851SDana.Myers@Sun.COM /* 663*7851SDana.Myers@Sun.COM * Null terminate the string 664*7851SDana.Myers@Sun.COM * (overwrites final comma/space from above) 665*7851SDana.Myers@Sun.COM */ 666*7851SDana.Myers@Sun.COM NewBuf--; 667*7851SDana.Myers@Sun.COM *NewBuf = 0; 668*7851SDana.Myers@Sun.COM break; 669*7851SDana.Myers@Sun.COM 670*7851SDana.Myers@Sun.COM default: 671*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_TYPE); 672*7851SDana.Myers@Sun.COM } 673*7851SDana.Myers@Sun.COM 674*7851SDana.Myers@Sun.COM *ResultDesc = ReturnDesc; 675*7851SDana.Myers@Sun.COM return_ACPI_STATUS (AE_OK); 676*7851SDana.Myers@Sun.COM } 677*7851SDana.Myers@Sun.COM 678*7851SDana.Myers@Sun.COM 679*7851SDana.Myers@Sun.COM /******************************************************************************* 680*7851SDana.Myers@Sun.COM * 681*7851SDana.Myers@Sun.COM * FUNCTION: AcpiExConvertToTargetType 682*7851SDana.Myers@Sun.COM * 683*7851SDana.Myers@Sun.COM * PARAMETERS: DestinationType - Current type of the destination 684*7851SDana.Myers@Sun.COM * SourceDesc - Source object to be converted. 685*7851SDana.Myers@Sun.COM * ResultDesc - Where the converted object is returned 686*7851SDana.Myers@Sun.COM * WalkState - Current method state 687*7851SDana.Myers@Sun.COM * 688*7851SDana.Myers@Sun.COM * RETURN: Status 689*7851SDana.Myers@Sun.COM * 690*7851SDana.Myers@Sun.COM * DESCRIPTION: Implements "implicit conversion" rules for storing an object. 691*7851SDana.Myers@Sun.COM * 692*7851SDana.Myers@Sun.COM ******************************************************************************/ 693*7851SDana.Myers@Sun.COM 694*7851SDana.Myers@Sun.COM ACPI_STATUS 695*7851SDana.Myers@Sun.COM AcpiExConvertToTargetType ( 696*7851SDana.Myers@Sun.COM ACPI_OBJECT_TYPE DestinationType, 697*7851SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *SourceDesc, 698*7851SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **ResultDesc, 699*7851SDana.Myers@Sun.COM ACPI_WALK_STATE *WalkState) 700*7851SDana.Myers@Sun.COM { 701*7851SDana.Myers@Sun.COM ACPI_STATUS Status = AE_OK; 702*7851SDana.Myers@Sun.COM 703*7851SDana.Myers@Sun.COM 704*7851SDana.Myers@Sun.COM ACPI_FUNCTION_TRACE (ExConvertToTargetType); 705*7851SDana.Myers@Sun.COM 706*7851SDana.Myers@Sun.COM 707*7851SDana.Myers@Sun.COM /* Default behavior */ 708*7851SDana.Myers@Sun.COM 709*7851SDana.Myers@Sun.COM *ResultDesc = SourceDesc; 710*7851SDana.Myers@Sun.COM 711*7851SDana.Myers@Sun.COM /* 712*7851SDana.Myers@Sun.COM * If required by the target, 713*7851SDana.Myers@Sun.COM * perform implicit conversion on the source before we store it. 714*7851SDana.Myers@Sun.COM */ 715*7851SDana.Myers@Sun.COM switch (GET_CURRENT_ARG_TYPE (WalkState->OpInfo->RuntimeArgs)) 716*7851SDana.Myers@Sun.COM { 717*7851SDana.Myers@Sun.COM case ARGI_SIMPLE_TARGET: 718*7851SDana.Myers@Sun.COM case ARGI_FIXED_TARGET: 719*7851SDana.Myers@Sun.COM case ARGI_INTEGER_REF: /* Handles Increment, Decrement cases */ 720*7851SDana.Myers@Sun.COM 721*7851SDana.Myers@Sun.COM switch (DestinationType) 722*7851SDana.Myers@Sun.COM { 723*7851SDana.Myers@Sun.COM case ACPI_TYPE_LOCAL_REGION_FIELD: 724*7851SDana.Myers@Sun.COM /* 725*7851SDana.Myers@Sun.COM * Named field can always handle conversions 726*7851SDana.Myers@Sun.COM */ 727*7851SDana.Myers@Sun.COM break; 728*7851SDana.Myers@Sun.COM 729*7851SDana.Myers@Sun.COM default: 730*7851SDana.Myers@Sun.COM /* No conversion allowed for these types */ 731*7851SDana.Myers@Sun.COM 732*7851SDana.Myers@Sun.COM if (DestinationType != ACPI_GET_OBJECT_TYPE (SourceDesc)) 733*7851SDana.Myers@Sun.COM { 734*7851SDana.Myers@Sun.COM ACPI_DEBUG_PRINT ((ACPI_DB_INFO, 735*7851SDana.Myers@Sun.COM "Explicit operator, will store (%s) over existing type (%s)\n", 736*7851SDana.Myers@Sun.COM AcpiUtGetObjectTypeName (SourceDesc), 737*7851SDana.Myers@Sun.COM AcpiUtGetTypeName (DestinationType))); 738*7851SDana.Myers@Sun.COM Status = AE_TYPE; 739*7851SDana.Myers@Sun.COM } 740*7851SDana.Myers@Sun.COM } 741*7851SDana.Myers@Sun.COM break; 742*7851SDana.Myers@Sun.COM 743*7851SDana.Myers@Sun.COM 744*7851SDana.Myers@Sun.COM case ARGI_TARGETREF: 745*7851SDana.Myers@Sun.COM 746*7851SDana.Myers@Sun.COM switch (DestinationType) 747*7851SDana.Myers@Sun.COM { 748*7851SDana.Myers@Sun.COM case ACPI_TYPE_INTEGER: 749*7851SDana.Myers@Sun.COM case ACPI_TYPE_BUFFER_FIELD: 750*7851SDana.Myers@Sun.COM case ACPI_TYPE_LOCAL_BANK_FIELD: 751*7851SDana.Myers@Sun.COM case ACPI_TYPE_LOCAL_INDEX_FIELD: 752*7851SDana.Myers@Sun.COM /* 753*7851SDana.Myers@Sun.COM * These types require an Integer operand. We can convert 754*7851SDana.Myers@Sun.COM * a Buffer or a String to an Integer if necessary. 755*7851SDana.Myers@Sun.COM */ 756*7851SDana.Myers@Sun.COM Status = AcpiExConvertToInteger (SourceDesc, ResultDesc, 757*7851SDana.Myers@Sun.COM 16); 758*7851SDana.Myers@Sun.COM break; 759*7851SDana.Myers@Sun.COM 760*7851SDana.Myers@Sun.COM 761*7851SDana.Myers@Sun.COM case ACPI_TYPE_STRING: 762*7851SDana.Myers@Sun.COM /* 763*7851SDana.Myers@Sun.COM * The operand must be a String. We can convert an 764*7851SDana.Myers@Sun.COM * Integer or Buffer if necessary 765*7851SDana.Myers@Sun.COM */ 766*7851SDana.Myers@Sun.COM Status = AcpiExConvertToString (SourceDesc, ResultDesc, 767*7851SDana.Myers@Sun.COM ACPI_IMPLICIT_CONVERT_HEX); 768*7851SDana.Myers@Sun.COM break; 769*7851SDana.Myers@Sun.COM 770*7851SDana.Myers@Sun.COM 771*7851SDana.Myers@Sun.COM case ACPI_TYPE_BUFFER: 772*7851SDana.Myers@Sun.COM /* 773*7851SDana.Myers@Sun.COM * The operand must be a Buffer. We can convert an 774*7851SDana.Myers@Sun.COM * Integer or String if necessary 775*7851SDana.Myers@Sun.COM */ 776*7851SDana.Myers@Sun.COM Status = AcpiExConvertToBuffer (SourceDesc, ResultDesc); 777*7851SDana.Myers@Sun.COM break; 778*7851SDana.Myers@Sun.COM 779*7851SDana.Myers@Sun.COM 780*7851SDana.Myers@Sun.COM default: 781*7851SDana.Myers@Sun.COM ACPI_ERROR ((AE_INFO, "Bad destination type during conversion: %X", 782*7851SDana.Myers@Sun.COM DestinationType)); 783*7851SDana.Myers@Sun.COM Status = AE_AML_INTERNAL; 784*7851SDana.Myers@Sun.COM break; 785*7851SDana.Myers@Sun.COM } 786*7851SDana.Myers@Sun.COM break; 787*7851SDana.Myers@Sun.COM 788*7851SDana.Myers@Sun.COM 789*7851SDana.Myers@Sun.COM case ARGI_REFERENCE: 790*7851SDana.Myers@Sun.COM /* 791*7851SDana.Myers@Sun.COM * CreateXxxxField cases - we are storing the field object into the name 792*7851SDana.Myers@Sun.COM */ 793*7851SDana.Myers@Sun.COM break; 794*7851SDana.Myers@Sun.COM 795*7851SDana.Myers@Sun.COM 796*7851SDana.Myers@Sun.COM default: 797*7851SDana.Myers@Sun.COM ACPI_ERROR ((AE_INFO, 798*7851SDana.Myers@Sun.COM "Unknown Target type ID 0x%X AmlOpcode %X DestType %s", 799*7851SDana.Myers@Sun.COM GET_CURRENT_ARG_TYPE (WalkState->OpInfo->RuntimeArgs), 800*7851SDana.Myers@Sun.COM WalkState->Opcode, AcpiUtGetTypeName (DestinationType))); 801*7851SDana.Myers@Sun.COM Status = AE_AML_INTERNAL; 802*7851SDana.Myers@Sun.COM } 803*7851SDana.Myers@Sun.COM 804*7851SDana.Myers@Sun.COM /* 805*7851SDana.Myers@Sun.COM * Source-to-Target conversion semantics: 806*7851SDana.Myers@Sun.COM * 807*7851SDana.Myers@Sun.COM * If conversion to the target type cannot be performed, then simply 808*7851SDana.Myers@Sun.COM * overwrite the target with the new object and type. 809*7851SDana.Myers@Sun.COM */ 810*7851SDana.Myers@Sun.COM if (Status == AE_TYPE) 811*7851SDana.Myers@Sun.COM { 812*7851SDana.Myers@Sun.COM Status = AE_OK; 813*7851SDana.Myers@Sun.COM } 814*7851SDana.Myers@Sun.COM 815*7851SDana.Myers@Sun.COM return_ACPI_STATUS (Status); 816*7851SDana.Myers@Sun.COM } 817*7851SDana.Myers@Sun.COM 818*7851SDana.Myers@Sun.COM 819