1a88e22b7SJung-uk Kim /****************************************************************************** 2a88e22b7SJung-uk Kim * 3a88e22b7SJung-uk Kim * Module Name: dtfield.c - Code generation for individual source fields 4a88e22b7SJung-uk Kim * 5a88e22b7SJung-uk Kim *****************************************************************************/ 6a88e22b7SJung-uk Kim 7*0d84335fSJung-uk Kim /****************************************************************************** 8*0d84335fSJung-uk Kim * 9*0d84335fSJung-uk Kim * 1. Copyright Notice 10*0d84335fSJung-uk Kim * 11*0d84335fSJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2017, Intel Corp. 12a88e22b7SJung-uk Kim * All rights reserved. 13a88e22b7SJung-uk Kim * 14*0d84335fSJung-uk Kim * 2. License 15*0d84335fSJung-uk Kim * 16*0d84335fSJung-uk Kim * 2.1. This is your license from Intel Corp. under its intellectual property 17*0d84335fSJung-uk Kim * rights. You may have additional license terms from the party that provided 18*0d84335fSJung-uk Kim * you this software, covering your right to use that party's intellectual 19*0d84335fSJung-uk Kim * property rights. 20*0d84335fSJung-uk Kim * 21*0d84335fSJung-uk Kim * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 22*0d84335fSJung-uk Kim * copy of the source code appearing in this file ("Covered Code") an 23*0d84335fSJung-uk Kim * irrevocable, perpetual, worldwide license under Intel's copyrights in the 24*0d84335fSJung-uk Kim * base code distributed originally by Intel ("Original Intel Code") to copy, 25*0d84335fSJung-uk Kim * make derivatives, distribute, use and display any portion of the Covered 26*0d84335fSJung-uk Kim * Code in any form, with the right to sublicense such rights; and 27*0d84335fSJung-uk Kim * 28*0d84335fSJung-uk Kim * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 29*0d84335fSJung-uk Kim * license (with the right to sublicense), under only those claims of Intel 30*0d84335fSJung-uk Kim * patents that are infringed by the Original Intel Code, to make, use, sell, 31*0d84335fSJung-uk Kim * offer to sell, and import the Covered Code and derivative works thereof 32*0d84335fSJung-uk Kim * solely to the minimum extent necessary to exercise the above copyright 33*0d84335fSJung-uk Kim * license, and in no event shall the patent license extend to any additions 34*0d84335fSJung-uk Kim * to or modifications of the Original Intel Code. No other license or right 35*0d84335fSJung-uk Kim * is granted directly or by implication, estoppel or otherwise; 36*0d84335fSJung-uk Kim * 37*0d84335fSJung-uk Kim * The above copyright and patent license is granted only if the following 38*0d84335fSJung-uk Kim * conditions are met: 39*0d84335fSJung-uk Kim * 40*0d84335fSJung-uk Kim * 3. Conditions 41*0d84335fSJung-uk Kim * 42*0d84335fSJung-uk Kim * 3.1. Redistribution of Source with Rights to Further Distribute Source. 43*0d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 44*0d84335fSJung-uk Kim * Code or modification with rights to further distribute source must include 45*0d84335fSJung-uk Kim * the above Copyright Notice, the above License, this list of Conditions, 46*0d84335fSJung-uk Kim * and the following Disclaimer and Export Compliance provision. In addition, 47*0d84335fSJung-uk Kim * Licensee must cause all Covered Code to which Licensee contributes to 48*0d84335fSJung-uk Kim * contain a file documenting the changes Licensee made to create that Covered 49*0d84335fSJung-uk Kim * Code and the date of any change. Licensee must include in that file the 50*0d84335fSJung-uk Kim * documentation of any changes made by any predecessor Licensee. Licensee 51*0d84335fSJung-uk Kim * must include a prominent statement that the modification is derived, 52*0d84335fSJung-uk Kim * directly or indirectly, from Original Intel Code. 53*0d84335fSJung-uk Kim * 54*0d84335fSJung-uk Kim * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 55*0d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 56*0d84335fSJung-uk Kim * Code or modification without rights to further distribute source must 57*0d84335fSJung-uk Kim * include the following Disclaimer and Export Compliance provision in the 58*0d84335fSJung-uk Kim * documentation and/or other materials provided with distribution. In 59*0d84335fSJung-uk Kim * addition, Licensee may not authorize further sublicense of source of any 60*0d84335fSJung-uk Kim * portion of the Covered Code, and must include terms to the effect that the 61*0d84335fSJung-uk Kim * license from Licensee to its licensee is limited to the intellectual 62*0d84335fSJung-uk Kim * property embodied in the software Licensee provides to its licensee, and 63*0d84335fSJung-uk Kim * not to intellectual property embodied in modifications its licensee may 64*0d84335fSJung-uk Kim * make. 65*0d84335fSJung-uk Kim * 66*0d84335fSJung-uk Kim * 3.3. Redistribution of Executable. Redistribution in executable form of any 67*0d84335fSJung-uk Kim * substantial portion of the Covered Code or modification must reproduce the 68*0d84335fSJung-uk Kim * above Copyright Notice, and the following Disclaimer and Export Compliance 69*0d84335fSJung-uk Kim * provision in the documentation and/or other materials provided with the 70*0d84335fSJung-uk Kim * distribution. 71*0d84335fSJung-uk Kim * 72*0d84335fSJung-uk Kim * 3.4. Intel retains all right, title, and interest in and to the Original 73*0d84335fSJung-uk Kim * Intel Code. 74*0d84335fSJung-uk Kim * 75*0d84335fSJung-uk Kim * 3.5. Neither the name Intel nor any other trademark owned or controlled by 76*0d84335fSJung-uk Kim * Intel shall be used in advertising or otherwise to promote the sale, use or 77*0d84335fSJung-uk Kim * other dealings in products derived from or relating to the Covered Code 78*0d84335fSJung-uk Kim * without prior written authorization from Intel. 79*0d84335fSJung-uk Kim * 80*0d84335fSJung-uk Kim * 4. Disclaimer and Export Compliance 81*0d84335fSJung-uk Kim * 82*0d84335fSJung-uk Kim * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 83*0d84335fSJung-uk Kim * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 84*0d84335fSJung-uk Kim * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 85*0d84335fSJung-uk Kim * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 86*0d84335fSJung-uk Kim * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 87*0d84335fSJung-uk Kim * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 88*0d84335fSJung-uk Kim * PARTICULAR PURPOSE. 89*0d84335fSJung-uk Kim * 90*0d84335fSJung-uk Kim * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 91*0d84335fSJung-uk Kim * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 92*0d84335fSJung-uk Kim * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 93*0d84335fSJung-uk Kim * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 94*0d84335fSJung-uk Kim * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 95*0d84335fSJung-uk Kim * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 96*0d84335fSJung-uk Kim * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 97*0d84335fSJung-uk Kim * LIMITED REMEDY. 98*0d84335fSJung-uk Kim * 99*0d84335fSJung-uk Kim * 4.3. Licensee shall not export, either directly or indirectly, any of this 100*0d84335fSJung-uk Kim * software or system incorporating such software without first obtaining any 101*0d84335fSJung-uk Kim * required license or other approval from the U. S. Department of Commerce or 102*0d84335fSJung-uk Kim * any other agency or department of the United States Government. In the 103*0d84335fSJung-uk Kim * event Licensee exports any such software from the United States or 104*0d84335fSJung-uk Kim * re-exports any such software from a foreign destination, Licensee shall 105*0d84335fSJung-uk Kim * ensure that the distribution and export/re-export of the software is in 106*0d84335fSJung-uk Kim * compliance with all laws, regulations, orders, or other restrictions of the 107*0d84335fSJung-uk Kim * U.S. Export Administration Regulations. Licensee agrees that neither it nor 108*0d84335fSJung-uk Kim * any of its subsidiaries will export/re-export any technical data, process, 109*0d84335fSJung-uk Kim * software, or service, directly or indirectly, to any country for which the 110*0d84335fSJung-uk Kim * United States government or any agency thereof requires an export license, 111*0d84335fSJung-uk Kim * other governmental approval, or letter of assurance, without first obtaining 112*0d84335fSJung-uk Kim * such license, approval or letter. 113*0d84335fSJung-uk Kim * 114*0d84335fSJung-uk Kim ***************************************************************************** 115*0d84335fSJung-uk Kim * 116*0d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the 117*0d84335fSJung-uk Kim * following license: 118*0d84335fSJung-uk Kim * 119d244b227SJung-uk Kim * Redistribution and use in source and binary forms, with or without 120d244b227SJung-uk Kim * modification, are permitted provided that the following conditions 121d244b227SJung-uk Kim * are met: 122d244b227SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 123d244b227SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 124d244b227SJung-uk Kim * without modification. 125d244b227SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 126d244b227SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 127d244b227SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 128d244b227SJung-uk Kim * including a substantially similar Disclaimer requirement for further 129d244b227SJung-uk Kim * binary redistribution. 130d244b227SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 131d244b227SJung-uk Kim * of any contributors may be used to endorse or promote products derived 132d244b227SJung-uk Kim * from this software without specific prior written permission. 133a88e22b7SJung-uk Kim * 134*0d84335fSJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 135*0d84335fSJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 136*0d84335fSJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 137*0d84335fSJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 138*0d84335fSJung-uk Kim * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 139*0d84335fSJung-uk Kim * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 140*0d84335fSJung-uk Kim * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 141*0d84335fSJung-uk Kim * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 142*0d84335fSJung-uk Kim * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 143*0d84335fSJung-uk Kim * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 144*0d84335fSJung-uk Kim * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 145*0d84335fSJung-uk Kim * 146*0d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the 147d244b227SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 148d244b227SJung-uk Kim * Software Foundation. 149a88e22b7SJung-uk Kim * 150*0d84335fSJung-uk Kim *****************************************************************************/ 151a88e22b7SJung-uk Kim 152a88e22b7SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h> 153a88e22b7SJung-uk Kim #include <contrib/dev/acpica/compiler/dtcompiler.h> 154a88e22b7SJung-uk Kim 155a88e22b7SJung-uk Kim #define _COMPONENT DT_COMPILER 156a88e22b7SJung-uk Kim ACPI_MODULE_NAME ("dtfield") 157a88e22b7SJung-uk Kim 158a88e22b7SJung-uk Kim 159a88e22b7SJung-uk Kim /* Local prototypes */ 160a88e22b7SJung-uk Kim 161a88e22b7SJung-uk Kim static void 162a88e22b7SJung-uk Kim DtCompileString ( 163a88e22b7SJung-uk Kim UINT8 *Buffer, 164a88e22b7SJung-uk Kim DT_FIELD *Field, 165a88e22b7SJung-uk Kim UINT32 ByteLength); 166a88e22b7SJung-uk Kim 167d244b227SJung-uk Kim static void 168d244b227SJung-uk Kim DtCompileUnicode ( 169d244b227SJung-uk Kim UINT8 *Buffer, 170d244b227SJung-uk Kim DT_FIELD *Field, 171d244b227SJung-uk Kim UINT32 ByteLength); 172d244b227SJung-uk Kim 173d244b227SJung-uk Kim static ACPI_STATUS 174d244b227SJung-uk Kim DtCompileUuid ( 175d244b227SJung-uk Kim UINT8 *Buffer, 176d244b227SJung-uk Kim DT_FIELD *Field, 177d244b227SJung-uk Kim UINT32 ByteLength); 178d244b227SJung-uk Kim 179a88e22b7SJung-uk Kim static char * 180a88e22b7SJung-uk Kim DtNormalizeBuffer ( 181a88e22b7SJung-uk Kim char *Buffer, 182a88e22b7SJung-uk Kim UINT32 *Count); 183a88e22b7SJung-uk Kim 184a88e22b7SJung-uk Kim 185a88e22b7SJung-uk Kim /****************************************************************************** 186a88e22b7SJung-uk Kim * 187a88e22b7SJung-uk Kim * FUNCTION: DtCompileOneField 188a88e22b7SJung-uk Kim * 189a88e22b7SJung-uk Kim * PARAMETERS: Buffer - Output buffer 190a88e22b7SJung-uk Kim * Field - Field to be compiled 191a88e22b7SJung-uk Kim * ByteLength - Byte length of the field 192a88e22b7SJung-uk Kim * Type - Field type 193a88e22b7SJung-uk Kim * 194a88e22b7SJung-uk Kim * RETURN: None 195a88e22b7SJung-uk Kim * 196a88e22b7SJung-uk Kim * DESCRIPTION: Compile a field value to binary 197a88e22b7SJung-uk Kim * 198a88e22b7SJung-uk Kim *****************************************************************************/ 199a88e22b7SJung-uk Kim 200a88e22b7SJung-uk Kim void 201a88e22b7SJung-uk Kim DtCompileOneField ( 202a88e22b7SJung-uk Kim UINT8 *Buffer, 203a88e22b7SJung-uk Kim DT_FIELD *Field, 204a88e22b7SJung-uk Kim UINT32 ByteLength, 205a88e22b7SJung-uk Kim UINT8 Type, 206a88e22b7SJung-uk Kim UINT8 Flags) 207a88e22b7SJung-uk Kim { 208d244b227SJung-uk Kim ACPI_STATUS Status; 209a88e22b7SJung-uk Kim 210f8146b88SJung-uk Kim 211a88e22b7SJung-uk Kim switch (Type) 212a88e22b7SJung-uk Kim { 213a88e22b7SJung-uk Kim case DT_FIELD_TYPE_INTEGER: 214a9d8d09cSJung-uk Kim 215a88e22b7SJung-uk Kim DtCompileInteger (Buffer, Field, ByteLength, Flags); 216a88e22b7SJung-uk Kim break; 217a88e22b7SJung-uk Kim 218a88e22b7SJung-uk Kim case DT_FIELD_TYPE_STRING: 219a9d8d09cSJung-uk Kim 220a88e22b7SJung-uk Kim DtCompileString (Buffer, Field, ByteLength); 221a88e22b7SJung-uk Kim break; 222a88e22b7SJung-uk Kim 223d244b227SJung-uk Kim case DT_FIELD_TYPE_UUID: 224a9d8d09cSJung-uk Kim 225d244b227SJung-uk Kim Status = DtCompileUuid (Buffer, Field, ByteLength); 226d244b227SJung-uk Kim if (ACPI_SUCCESS (Status)) 227d244b227SJung-uk Kim { 228d244b227SJung-uk Kim break; 229d244b227SJung-uk Kim } 230d244b227SJung-uk Kim 231d244b227SJung-uk Kim /* Fall through. */ 232d244b227SJung-uk Kim 233a88e22b7SJung-uk Kim case DT_FIELD_TYPE_BUFFER: 234a9d8d09cSJung-uk Kim 235a88e22b7SJung-uk Kim DtCompileBuffer (Buffer, Field->Value, Field, ByteLength); 236a88e22b7SJung-uk Kim break; 237a88e22b7SJung-uk Kim 238d244b227SJung-uk Kim case DT_FIELD_TYPE_UNICODE: 239a9d8d09cSJung-uk Kim 240d244b227SJung-uk Kim DtCompileUnicode (Buffer, Field, ByteLength); 241d244b227SJung-uk Kim break; 242d244b227SJung-uk Kim 243d244b227SJung-uk Kim case DT_FIELD_TYPE_DEVICE_PATH: 244a9d8d09cSJung-uk Kim 245d244b227SJung-uk Kim break; 246d244b227SJung-uk Kim 247a88e22b7SJung-uk Kim default: 248a9d8d09cSJung-uk Kim 249a88e22b7SJung-uk Kim DtFatal (ASL_MSG_COMPILER_INTERNAL, Field, "Invalid field type"); 250a88e22b7SJung-uk Kim break; 251a88e22b7SJung-uk Kim } 252a88e22b7SJung-uk Kim } 253a88e22b7SJung-uk Kim 254a88e22b7SJung-uk Kim 255a88e22b7SJung-uk Kim /****************************************************************************** 256a88e22b7SJung-uk Kim * 257a88e22b7SJung-uk Kim * FUNCTION: DtCompileString 258a88e22b7SJung-uk Kim * 259a88e22b7SJung-uk Kim * PARAMETERS: Buffer - Output buffer 260a88e22b7SJung-uk Kim * Field - String to be copied to buffer 261a88e22b7SJung-uk Kim * ByteLength - Maximum length of string 262a88e22b7SJung-uk Kim * 263a88e22b7SJung-uk Kim * RETURN: None 264a88e22b7SJung-uk Kim * 265a88e22b7SJung-uk Kim * DESCRIPTION: Copy string to the buffer 266a88e22b7SJung-uk Kim * 267a88e22b7SJung-uk Kim *****************************************************************************/ 268a88e22b7SJung-uk Kim 269a88e22b7SJung-uk Kim static void 270a88e22b7SJung-uk Kim DtCompileString ( 271a88e22b7SJung-uk Kim UINT8 *Buffer, 272a88e22b7SJung-uk Kim DT_FIELD *Field, 273a88e22b7SJung-uk Kim UINT32 ByteLength) 274a88e22b7SJung-uk Kim { 275a88e22b7SJung-uk Kim UINT32 Length; 276a88e22b7SJung-uk Kim 277a88e22b7SJung-uk Kim 2785ef50723SJung-uk Kim Length = strlen (Field->Value); 279a88e22b7SJung-uk Kim 280a88e22b7SJung-uk Kim /* Check if the string is too long for the field */ 281a88e22b7SJung-uk Kim 282a88e22b7SJung-uk Kim if (Length > ByteLength) 283a88e22b7SJung-uk Kim { 284a88e22b7SJung-uk Kim sprintf (MsgBuffer, "Maximum %u characters", ByteLength); 285a88e22b7SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_STRING_LENGTH, Field, MsgBuffer); 286a88e22b7SJung-uk Kim Length = ByteLength; 287a88e22b7SJung-uk Kim } 288a88e22b7SJung-uk Kim 2895ef50723SJung-uk Kim memcpy (Buffer, Field->Value, Length); 290a88e22b7SJung-uk Kim } 291a88e22b7SJung-uk Kim 292a88e22b7SJung-uk Kim 293a88e22b7SJung-uk Kim /****************************************************************************** 294a88e22b7SJung-uk Kim * 295d244b227SJung-uk Kim * FUNCTION: DtCompileUnicode 296d244b227SJung-uk Kim * 297d244b227SJung-uk Kim * PARAMETERS: Buffer - Output buffer 298d244b227SJung-uk Kim * Field - String to be copied to buffer 299d244b227SJung-uk Kim * ByteLength - Maximum length of string 300d244b227SJung-uk Kim * 301d244b227SJung-uk Kim * RETURN: None 302d244b227SJung-uk Kim * 303d244b227SJung-uk Kim * DESCRIPTION: Convert ASCII string to Unicode string 304d244b227SJung-uk Kim * 305d244b227SJung-uk Kim * Note: The Unicode string is 16 bits per character, no leading signature, 306d244b227SJung-uk Kim * with a 16-bit terminating NULL. 307d244b227SJung-uk Kim * 308d244b227SJung-uk Kim *****************************************************************************/ 309d244b227SJung-uk Kim 310d244b227SJung-uk Kim static void 311d244b227SJung-uk Kim DtCompileUnicode ( 312d244b227SJung-uk Kim UINT8 *Buffer, 313d244b227SJung-uk Kim DT_FIELD *Field, 314d244b227SJung-uk Kim UINT32 ByteLength) 315d244b227SJung-uk Kim { 316d244b227SJung-uk Kim UINT32 Count; 317d244b227SJung-uk Kim UINT32 i; 318d244b227SJung-uk Kim char *AsciiString; 319d244b227SJung-uk Kim UINT16 *UnicodeString; 320d244b227SJung-uk Kim 321d244b227SJung-uk Kim 322d244b227SJung-uk Kim AsciiString = Field->Value; 323d244b227SJung-uk Kim UnicodeString = (UINT16 *) Buffer; 3245ef50723SJung-uk Kim Count = strlen (AsciiString) + 1; 325d244b227SJung-uk Kim 326d244b227SJung-uk Kim /* Convert to Unicode string (including null terminator) */ 327d244b227SJung-uk Kim 328d244b227SJung-uk Kim for (i = 0; i < Count; i++) 329d244b227SJung-uk Kim { 330d244b227SJung-uk Kim UnicodeString[i] = (UINT16) AsciiString[i]; 331d244b227SJung-uk Kim } 332d244b227SJung-uk Kim } 333d244b227SJung-uk Kim 334d244b227SJung-uk Kim 335d244b227SJung-uk Kim /******************************************************************************* 336d244b227SJung-uk Kim * 337d244b227SJung-uk Kim * FUNCTION: DtCompileUuid 338d244b227SJung-uk Kim * 339d244b227SJung-uk Kim * PARAMETERS: Buffer - Output buffer 340d244b227SJung-uk Kim * Field - String to be copied to buffer 341d244b227SJung-uk Kim * ByteLength - Maximum length of string 342d244b227SJung-uk Kim * 343d244b227SJung-uk Kim * RETURN: None 344d244b227SJung-uk Kim * 345d244b227SJung-uk Kim * DESCRIPTION: Convert UUID string to 16-byte buffer 346d244b227SJung-uk Kim * 347d244b227SJung-uk Kim ******************************************************************************/ 348d244b227SJung-uk Kim 349d244b227SJung-uk Kim static ACPI_STATUS 350d244b227SJung-uk Kim DtCompileUuid ( 351d244b227SJung-uk Kim UINT8 *Buffer, 352d244b227SJung-uk Kim DT_FIELD *Field, 353d244b227SJung-uk Kim UINT32 ByteLength) 354d244b227SJung-uk Kim { 355d244b227SJung-uk Kim char *InString; 356d244b227SJung-uk Kim ACPI_STATUS Status; 357d244b227SJung-uk Kim 358d244b227SJung-uk Kim 359d244b227SJung-uk Kim InString = Field->Value; 360d244b227SJung-uk Kim 361d244b227SJung-uk Kim Status = AuValidateUuid (InString); 362d244b227SJung-uk Kim if (ACPI_FAILURE (Status)) 363d244b227SJung-uk Kim { 364d244b227SJung-uk Kim sprintf (MsgBuffer, "%s", Field->Value); 365d244b227SJung-uk Kim DtNameError (ASL_ERROR, ASL_MSG_INVALID_UUID, Field, MsgBuffer); 366d244b227SJung-uk Kim } 367d244b227SJung-uk Kim else 368d244b227SJung-uk Kim { 369313a0c13SJung-uk Kim AcpiUtConvertStringToUuid (InString, Buffer); 370d244b227SJung-uk Kim } 371d244b227SJung-uk Kim 372d244b227SJung-uk Kim return (Status); 373d244b227SJung-uk Kim } 374d244b227SJung-uk Kim 375d244b227SJung-uk Kim 376d244b227SJung-uk Kim /****************************************************************************** 377d244b227SJung-uk Kim * 378a88e22b7SJung-uk Kim * FUNCTION: DtCompileInteger 379a88e22b7SJung-uk Kim * 380a88e22b7SJung-uk Kim * PARAMETERS: Buffer - Output buffer 381a88e22b7SJung-uk Kim * Field - Field obj with Integer to be compiled 382a88e22b7SJung-uk Kim * ByteLength - Byte length of the integer 3830b94ba42SJung-uk Kim * Flags - Additional compile info 384a88e22b7SJung-uk Kim * 385a88e22b7SJung-uk Kim * RETURN: None 386a88e22b7SJung-uk Kim * 3870b94ba42SJung-uk Kim * DESCRIPTION: Compile an integer. Supports integer expressions with C-style 3880b94ba42SJung-uk Kim * operators. 389a88e22b7SJung-uk Kim * 390a88e22b7SJung-uk Kim *****************************************************************************/ 391a88e22b7SJung-uk Kim 392a88e22b7SJung-uk Kim void 393a88e22b7SJung-uk Kim DtCompileInteger ( 394a88e22b7SJung-uk Kim UINT8 *Buffer, 395a88e22b7SJung-uk Kim DT_FIELD *Field, 396a88e22b7SJung-uk Kim UINT32 ByteLength, 397a88e22b7SJung-uk Kim UINT8 Flags) 398a88e22b7SJung-uk Kim { 3990b94ba42SJung-uk Kim UINT64 Value; 400a88e22b7SJung-uk Kim UINT64 MaxValue; 401d052a1ccSJung-uk Kim ACPI_STATUS Status; 402a88e22b7SJung-uk Kim 403a88e22b7SJung-uk Kim 4040b94ba42SJung-uk Kim /* Output buffer byte length must be in range 1-8 */ 405a88e22b7SJung-uk Kim 406a88e22b7SJung-uk Kim if ((ByteLength > 8) || (ByteLength == 0)) 407a88e22b7SJung-uk Kim { 408a88e22b7SJung-uk Kim DtFatal (ASL_MSG_COMPILER_INTERNAL, Field, 409a88e22b7SJung-uk Kim "Invalid internal Byte length"); 410a88e22b7SJung-uk Kim return; 411a88e22b7SJung-uk Kim } 412a88e22b7SJung-uk Kim 4130b94ba42SJung-uk Kim /* Resolve integer expression to a single integer value */ 414a88e22b7SJung-uk Kim 415d052a1ccSJung-uk Kim Status = DtResolveIntegerExpression (Field, &Value); 416d052a1ccSJung-uk Kim if (ACPI_FAILURE (Status)) 417d052a1ccSJung-uk Kim { 418d052a1ccSJung-uk Kim return; 419d052a1ccSJung-uk Kim } 420a88e22b7SJung-uk Kim 421313a0c13SJung-uk Kim /* 422313a0c13SJung-uk Kim * Ensure that reserved fields are set properly. Note: uses 423313a0c13SJung-uk Kim * the DT_NON_ZERO flag to indicate that the reserved value 424313a0c13SJung-uk Kim * must be exactly one. Otherwise, the value must be zero. 425313a0c13SJung-uk Kim * This is sufficient for now. 426313a0c13SJung-uk Kim */ 427a88e22b7SJung-uk Kim 428313a0c13SJung-uk Kim /* TBD: Should use a flag rather than compare "Reserved" */ 429313a0c13SJung-uk Kim 4305ef50723SJung-uk Kim if (!strcmp (Field->Name, "Reserved")) 431313a0c13SJung-uk Kim { 432313a0c13SJung-uk Kim if (Flags & DT_NON_ZERO) 433313a0c13SJung-uk Kim { 434313a0c13SJung-uk Kim if (Value != 1) 435a88e22b7SJung-uk Kim { 436a88e22b7SJung-uk Kim DtError (ASL_WARNING, ASL_MSG_RESERVED_VALUE, Field, 437313a0c13SJung-uk Kim "Must be one, setting to one"); 438313a0c13SJung-uk Kim Value = 1; 439313a0c13SJung-uk Kim } 440313a0c13SJung-uk Kim } 441313a0c13SJung-uk Kim else if (Value != 0) 442313a0c13SJung-uk Kim { 443313a0c13SJung-uk Kim DtError (ASL_WARNING, ASL_MSG_RESERVED_VALUE, Field, 444313a0c13SJung-uk Kim "Must be zero, setting to zero"); 445a88e22b7SJung-uk Kim Value = 0; 446a88e22b7SJung-uk Kim } 447313a0c13SJung-uk Kim } 448a88e22b7SJung-uk Kim 449a88e22b7SJung-uk Kim /* Check if the value must be non-zero */ 450a88e22b7SJung-uk Kim 451313a0c13SJung-uk Kim else if ((Flags & DT_NON_ZERO) && (Value == 0)) 452a88e22b7SJung-uk Kim { 453a88e22b7SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_ZERO_VALUE, Field, NULL); 454a88e22b7SJung-uk Kim } 455a88e22b7SJung-uk Kim 456a88e22b7SJung-uk Kim /* 457a88e22b7SJung-uk Kim * Generate the maximum value for the data type (ByteLength) 458a88e22b7SJung-uk Kim * Note: construct chosen for maximum portability 459a88e22b7SJung-uk Kim */ 460a88e22b7SJung-uk Kim MaxValue = ((UINT64) (-1)) >> (64 - (ByteLength * 8)); 461a88e22b7SJung-uk Kim 462a88e22b7SJung-uk Kim /* Validate that the input value is within range of the target */ 463a88e22b7SJung-uk Kim 464a88e22b7SJung-uk Kim if (Value > MaxValue) 465a88e22b7SJung-uk Kim { 466313a0c13SJung-uk Kim sprintf (MsgBuffer, "%8.8X%8.8X - max %u bytes", 467313a0c13SJung-uk Kim ACPI_FORMAT_UINT64 (Value), ByteLength); 468a88e22b7SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_INTEGER_SIZE, Field, MsgBuffer); 469a88e22b7SJung-uk Kim } 470a88e22b7SJung-uk Kim 4715ef50723SJung-uk Kim memcpy (Buffer, &Value, ByteLength); 472a88e22b7SJung-uk Kim return; 473a88e22b7SJung-uk Kim } 474a88e22b7SJung-uk Kim 475a88e22b7SJung-uk Kim 476a88e22b7SJung-uk Kim /****************************************************************************** 477a88e22b7SJung-uk Kim * 478a88e22b7SJung-uk Kim * FUNCTION: DtNormalizeBuffer 479a88e22b7SJung-uk Kim * 480a88e22b7SJung-uk Kim * PARAMETERS: Buffer - Input buffer 481493deb39SJung-uk Kim * Count - Output the count of hex numbers in 482a88e22b7SJung-uk Kim * the Buffer 483a88e22b7SJung-uk Kim * 484493deb39SJung-uk Kim * RETURN: The normalized buffer, must be freed by caller 485a88e22b7SJung-uk Kim * 486a88e22b7SJung-uk Kim * DESCRIPTION: [1A,2B,3C,4D] or 1A, 2B, 3C, 4D will be normalized 487a88e22b7SJung-uk Kim * to 1A 2B 3C 4D 488a88e22b7SJung-uk Kim * 489a88e22b7SJung-uk Kim *****************************************************************************/ 490a88e22b7SJung-uk Kim 491a88e22b7SJung-uk Kim static char * 492a88e22b7SJung-uk Kim DtNormalizeBuffer ( 493a88e22b7SJung-uk Kim char *Buffer, 494a88e22b7SJung-uk Kim UINT32 *Count) 495a88e22b7SJung-uk Kim { 496a88e22b7SJung-uk Kim char *NewBuffer; 497a88e22b7SJung-uk Kim char *TmpBuffer; 498a88e22b7SJung-uk Kim UINT32 BufferCount = 0; 499a88e22b7SJung-uk Kim BOOLEAN Separator = TRUE; 500a88e22b7SJung-uk Kim char c; 501a88e22b7SJung-uk Kim 502a88e22b7SJung-uk Kim 5035ef50723SJung-uk Kim NewBuffer = UtLocalCalloc (strlen (Buffer) + 1); 504a88e22b7SJung-uk Kim TmpBuffer = NewBuffer; 505a88e22b7SJung-uk Kim 506a88e22b7SJung-uk Kim while ((c = *Buffer++)) 507a88e22b7SJung-uk Kim { 508a88e22b7SJung-uk Kim switch (c) 509a88e22b7SJung-uk Kim { 510a88e22b7SJung-uk Kim /* Valid separators */ 511a88e22b7SJung-uk Kim 512a88e22b7SJung-uk Kim case '[': 513a88e22b7SJung-uk Kim case ']': 514a88e22b7SJung-uk Kim case ' ': 515a88e22b7SJung-uk Kim case ',': 516a9d8d09cSJung-uk Kim 517a88e22b7SJung-uk Kim Separator = TRUE; 518a88e22b7SJung-uk Kim break; 519a88e22b7SJung-uk Kim 520a88e22b7SJung-uk Kim default: 521a9d8d09cSJung-uk Kim 522a88e22b7SJung-uk Kim if (Separator) 523a88e22b7SJung-uk Kim { 524a88e22b7SJung-uk Kim /* Insert blank as the standard separator */ 525a88e22b7SJung-uk Kim 526a88e22b7SJung-uk Kim if (NewBuffer[0]) 527a88e22b7SJung-uk Kim { 528a88e22b7SJung-uk Kim *TmpBuffer++ = ' '; 529a88e22b7SJung-uk Kim BufferCount++; 530a88e22b7SJung-uk Kim } 531a88e22b7SJung-uk Kim 532a88e22b7SJung-uk Kim Separator = FALSE; 533a88e22b7SJung-uk Kim } 534a88e22b7SJung-uk Kim 535a88e22b7SJung-uk Kim *TmpBuffer++ = c; 536a88e22b7SJung-uk Kim break; 537a88e22b7SJung-uk Kim } 538a88e22b7SJung-uk Kim } 539a88e22b7SJung-uk Kim 540a88e22b7SJung-uk Kim *Count = BufferCount + 1; 541a88e22b7SJung-uk Kim return (NewBuffer); 542a88e22b7SJung-uk Kim } 543a88e22b7SJung-uk Kim 544a88e22b7SJung-uk Kim 545a88e22b7SJung-uk Kim /****************************************************************************** 546a88e22b7SJung-uk Kim * 547a88e22b7SJung-uk Kim * FUNCTION: DtCompileBuffer 548a88e22b7SJung-uk Kim * 549a88e22b7SJung-uk Kim * PARAMETERS: Buffer - Output buffer 550a88e22b7SJung-uk Kim * StringValue - Integer list to be compiled 551a88e22b7SJung-uk Kim * Field - Current field object 552a88e22b7SJung-uk Kim * ByteLength - Byte length of the integer list 553a88e22b7SJung-uk Kim * 554a88e22b7SJung-uk Kim * RETURN: Count of remaining data in the input list 555a88e22b7SJung-uk Kim * 556a88e22b7SJung-uk Kim * DESCRIPTION: Compile and pack an integer list, for example 557a88e22b7SJung-uk Kim * "AA 1F 20 3B" ==> Buffer[] = {0xAA,0x1F,0x20,0x3B} 558a88e22b7SJung-uk Kim * 559a88e22b7SJung-uk Kim *****************************************************************************/ 560a88e22b7SJung-uk Kim 561a88e22b7SJung-uk Kim UINT32 562a88e22b7SJung-uk Kim DtCompileBuffer ( 563a88e22b7SJung-uk Kim UINT8 *Buffer, 564a88e22b7SJung-uk Kim char *StringValue, 565a88e22b7SJung-uk Kim DT_FIELD *Field, 566a88e22b7SJung-uk Kim UINT32 ByteLength) 567a88e22b7SJung-uk Kim { 568493deb39SJung-uk Kim char *Substring; 569a88e22b7SJung-uk Kim ACPI_STATUS Status; 570a88e22b7SJung-uk Kim UINT32 Count; 571493deb39SJung-uk Kim UINT32 i; 572a88e22b7SJung-uk Kim 573a88e22b7SJung-uk Kim 574a88e22b7SJung-uk Kim /* Allow several different types of value separators */ 575a88e22b7SJung-uk Kim 576a88e22b7SJung-uk Kim StringValue = DtNormalizeBuffer (StringValue, &Count); 577493deb39SJung-uk Kim Substring = StringValue; 578a88e22b7SJung-uk Kim 579493deb39SJung-uk Kim /* Each element of StringValue is now three chars (2 hex + 1 space) */ 580493deb39SJung-uk Kim 581493deb39SJung-uk Kim for (i = 0; i < Count; i++, Substring += 3) 582a88e22b7SJung-uk Kim { 583493deb39SJung-uk Kim /* Check for byte value too long */ 584a88e22b7SJung-uk Kim 585493deb39SJung-uk Kim if (*(&Substring[2]) && 586493deb39SJung-uk Kim (*(&Substring[2]) != ' ')) 587a88e22b7SJung-uk Kim { 588493deb39SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_BUFFER_ELEMENT, Field, Substring); 5898d744e47SJung-uk Kim goto Exit; 590a88e22b7SJung-uk Kim } 591a88e22b7SJung-uk Kim 592493deb39SJung-uk Kim /* Convert two ASCII characters to one hex byte */ 593493deb39SJung-uk Kim 594493deb39SJung-uk Kim Status = AcpiUtAsciiToHexByte (Substring, &Buffer[i]); 595493deb39SJung-uk Kim if (ACPI_FAILURE (Status)) 596493deb39SJung-uk Kim { 597493deb39SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_BUFFER_ELEMENT, Field, Substring); 598493deb39SJung-uk Kim goto Exit; 599493deb39SJung-uk Kim } 600a88e22b7SJung-uk Kim } 601a88e22b7SJung-uk Kim 6028d744e47SJung-uk Kim Exit: 603a88e22b7SJung-uk Kim ACPI_FREE (StringValue); 604a88e22b7SJung-uk Kim return (ByteLength - Count); 605a88e22b7SJung-uk Kim } 606a88e22b7SJung-uk Kim 607a88e22b7SJung-uk Kim 608a88e22b7SJung-uk Kim /****************************************************************************** 609a88e22b7SJung-uk Kim * 610a88e22b7SJung-uk Kim * FUNCTION: DtCompileFlag 611a88e22b7SJung-uk Kim * 612a88e22b7SJung-uk Kim * PARAMETERS: Buffer - Output buffer 613a88e22b7SJung-uk Kim * Field - Field to be compiled 614a88e22b7SJung-uk Kim * Info - Flag info 615a88e22b7SJung-uk Kim * 616493deb39SJung-uk Kim * RETURN: None 617a88e22b7SJung-uk Kim * 618493deb39SJung-uk Kim * DESCRIPTION: Compile a flag field. Handles flags up to 64 bits. 619a88e22b7SJung-uk Kim * 620a88e22b7SJung-uk Kim *****************************************************************************/ 621a88e22b7SJung-uk Kim 622a88e22b7SJung-uk Kim void 623a88e22b7SJung-uk Kim DtCompileFlag ( 624a88e22b7SJung-uk Kim UINT8 *Buffer, 625a88e22b7SJung-uk Kim DT_FIELD *Field, 626a88e22b7SJung-uk Kim ACPI_DMTABLE_INFO *Info) 627a88e22b7SJung-uk Kim { 628a88e22b7SJung-uk Kim UINT64 Value = 0; 629a88e22b7SJung-uk Kim UINT32 BitLength = 1; 630a88e22b7SJung-uk Kim UINT8 BitPosition = 0; 631a88e22b7SJung-uk Kim ACPI_STATUS Status; 632a88e22b7SJung-uk Kim 633a88e22b7SJung-uk Kim 634493deb39SJung-uk Kim Status = AcpiUtStrtoul64 (Field->Value, 635493deb39SJung-uk Kim (ACPI_STRTOUL_64BIT | ACPI_STRTOUL_BASE16), &Value); 636a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 637a88e22b7SJung-uk Kim { 638a88e22b7SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_INVALID_HEX_INTEGER, Field, NULL); 639a88e22b7SJung-uk Kim } 640a88e22b7SJung-uk Kim 641a88e22b7SJung-uk Kim switch (Info->Opcode) 642a88e22b7SJung-uk Kim { 643a88e22b7SJung-uk Kim case ACPI_DMT_FLAG0: 644a88e22b7SJung-uk Kim case ACPI_DMT_FLAG1: 645a88e22b7SJung-uk Kim case ACPI_DMT_FLAG2: 646a88e22b7SJung-uk Kim case ACPI_DMT_FLAG3: 647a88e22b7SJung-uk Kim case ACPI_DMT_FLAG4: 648a88e22b7SJung-uk Kim case ACPI_DMT_FLAG5: 649a88e22b7SJung-uk Kim case ACPI_DMT_FLAG6: 650a88e22b7SJung-uk Kim case ACPI_DMT_FLAG7: 651a88e22b7SJung-uk Kim 652a88e22b7SJung-uk Kim BitPosition = Info->Opcode; 653a88e22b7SJung-uk Kim BitLength = 1; 654a88e22b7SJung-uk Kim break; 655a88e22b7SJung-uk Kim 656a88e22b7SJung-uk Kim case ACPI_DMT_FLAGS0: 657a88e22b7SJung-uk Kim 658a88e22b7SJung-uk Kim BitPosition = 0; 659a88e22b7SJung-uk Kim BitLength = 2; 660a88e22b7SJung-uk Kim break; 661a88e22b7SJung-uk Kim 662a88e22b7SJung-uk Kim 6633f0275a0SJung-uk Kim case ACPI_DMT_FLAGS1: 6643f0275a0SJung-uk Kim 6653f0275a0SJung-uk Kim BitPosition = 1; 6663f0275a0SJung-uk Kim BitLength = 2; 6673f0275a0SJung-uk Kim break; 6683f0275a0SJung-uk Kim 6693f0275a0SJung-uk Kim 670a88e22b7SJung-uk Kim case ACPI_DMT_FLAGS2: 671a88e22b7SJung-uk Kim 672a88e22b7SJung-uk Kim BitPosition = 2; 673a88e22b7SJung-uk Kim BitLength = 2; 674a88e22b7SJung-uk Kim break; 675a88e22b7SJung-uk Kim 6763f0275a0SJung-uk Kim case ACPI_DMT_FLAGS4: 6773f0275a0SJung-uk Kim 6783f0275a0SJung-uk Kim BitPosition = 4; 6793f0275a0SJung-uk Kim BitLength = 2; 6803f0275a0SJung-uk Kim break; 6813f0275a0SJung-uk Kim 682a88e22b7SJung-uk Kim default: 683a88e22b7SJung-uk Kim 684a88e22b7SJung-uk Kim DtFatal (ASL_MSG_COMPILER_INTERNAL, Field, "Invalid flag opcode"); 685a88e22b7SJung-uk Kim break; 686a88e22b7SJung-uk Kim } 687a88e22b7SJung-uk Kim 688a88e22b7SJung-uk Kim /* Check range of the input flag value */ 689a88e22b7SJung-uk Kim 690a88e22b7SJung-uk Kim if (Value >= ((UINT64) 1 << BitLength)) 691a88e22b7SJung-uk Kim { 692a88e22b7SJung-uk Kim sprintf (MsgBuffer, "Maximum %u bit", BitLength); 693a88e22b7SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_FLAG_VALUE, Field, MsgBuffer); 694a88e22b7SJung-uk Kim Value = 0; 695a88e22b7SJung-uk Kim } 696a88e22b7SJung-uk Kim 697a88e22b7SJung-uk Kim *Buffer |= (UINT8) (Value << BitPosition); 698a88e22b7SJung-uk Kim } 699