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 70d84335fSJung-uk Kim /****************************************************************************** 80d84335fSJung-uk Kim * 90d84335fSJung-uk Kim * 1. Copyright Notice 100d84335fSJung-uk Kim * 110d84335fSJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2017, Intel Corp. 12a88e22b7SJung-uk Kim * All rights reserved. 13a88e22b7SJung-uk Kim * 140d84335fSJung-uk Kim * 2. License 150d84335fSJung-uk Kim * 160d84335fSJung-uk Kim * 2.1. This is your license from Intel Corp. under its intellectual property 170d84335fSJung-uk Kim * rights. You may have additional license terms from the party that provided 180d84335fSJung-uk Kim * you this software, covering your right to use that party's intellectual 190d84335fSJung-uk Kim * property rights. 200d84335fSJung-uk Kim * 210d84335fSJung-uk Kim * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 220d84335fSJung-uk Kim * copy of the source code appearing in this file ("Covered Code") an 230d84335fSJung-uk Kim * irrevocable, perpetual, worldwide license under Intel's copyrights in the 240d84335fSJung-uk Kim * base code distributed originally by Intel ("Original Intel Code") to copy, 250d84335fSJung-uk Kim * make derivatives, distribute, use and display any portion of the Covered 260d84335fSJung-uk Kim * Code in any form, with the right to sublicense such rights; and 270d84335fSJung-uk Kim * 280d84335fSJung-uk Kim * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 290d84335fSJung-uk Kim * license (with the right to sublicense), under only those claims of Intel 300d84335fSJung-uk Kim * patents that are infringed by the Original Intel Code, to make, use, sell, 310d84335fSJung-uk Kim * offer to sell, and import the Covered Code and derivative works thereof 320d84335fSJung-uk Kim * solely to the minimum extent necessary to exercise the above copyright 330d84335fSJung-uk Kim * license, and in no event shall the patent license extend to any additions 340d84335fSJung-uk Kim * to or modifications of the Original Intel Code. No other license or right 350d84335fSJung-uk Kim * is granted directly or by implication, estoppel or otherwise; 360d84335fSJung-uk Kim * 370d84335fSJung-uk Kim * The above copyright and patent license is granted only if the following 380d84335fSJung-uk Kim * conditions are met: 390d84335fSJung-uk Kim * 400d84335fSJung-uk Kim * 3. Conditions 410d84335fSJung-uk Kim * 420d84335fSJung-uk Kim * 3.1. Redistribution of Source with Rights to Further Distribute Source. 430d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 440d84335fSJung-uk Kim * Code or modification with rights to further distribute source must include 450d84335fSJung-uk Kim * the above Copyright Notice, the above License, this list of Conditions, 460d84335fSJung-uk Kim * and the following Disclaimer and Export Compliance provision. In addition, 470d84335fSJung-uk Kim * Licensee must cause all Covered Code to which Licensee contributes to 480d84335fSJung-uk Kim * contain a file documenting the changes Licensee made to create that Covered 490d84335fSJung-uk Kim * Code and the date of any change. Licensee must include in that file the 500d84335fSJung-uk Kim * documentation of any changes made by any predecessor Licensee. Licensee 510d84335fSJung-uk Kim * must include a prominent statement that the modification is derived, 520d84335fSJung-uk Kim * directly or indirectly, from Original Intel Code. 530d84335fSJung-uk Kim * 540d84335fSJung-uk Kim * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 550d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 560d84335fSJung-uk Kim * Code or modification without rights to further distribute source must 570d84335fSJung-uk Kim * include the following Disclaimer and Export Compliance provision in the 580d84335fSJung-uk Kim * documentation and/or other materials provided with distribution. In 590d84335fSJung-uk Kim * addition, Licensee may not authorize further sublicense of source of any 600d84335fSJung-uk Kim * portion of the Covered Code, and must include terms to the effect that the 610d84335fSJung-uk Kim * license from Licensee to its licensee is limited to the intellectual 620d84335fSJung-uk Kim * property embodied in the software Licensee provides to its licensee, and 630d84335fSJung-uk Kim * not to intellectual property embodied in modifications its licensee may 640d84335fSJung-uk Kim * make. 650d84335fSJung-uk Kim * 660d84335fSJung-uk Kim * 3.3. Redistribution of Executable. Redistribution in executable form of any 670d84335fSJung-uk Kim * substantial portion of the Covered Code or modification must reproduce the 680d84335fSJung-uk Kim * above Copyright Notice, and the following Disclaimer and Export Compliance 690d84335fSJung-uk Kim * provision in the documentation and/or other materials provided with the 700d84335fSJung-uk Kim * distribution. 710d84335fSJung-uk Kim * 720d84335fSJung-uk Kim * 3.4. Intel retains all right, title, and interest in and to the Original 730d84335fSJung-uk Kim * Intel Code. 740d84335fSJung-uk Kim * 750d84335fSJung-uk Kim * 3.5. Neither the name Intel nor any other trademark owned or controlled by 760d84335fSJung-uk Kim * Intel shall be used in advertising or otherwise to promote the sale, use or 770d84335fSJung-uk Kim * other dealings in products derived from or relating to the Covered Code 780d84335fSJung-uk Kim * without prior written authorization from Intel. 790d84335fSJung-uk Kim * 800d84335fSJung-uk Kim * 4. Disclaimer and Export Compliance 810d84335fSJung-uk Kim * 820d84335fSJung-uk Kim * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 830d84335fSJung-uk Kim * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 840d84335fSJung-uk Kim * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 850d84335fSJung-uk Kim * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 860d84335fSJung-uk Kim * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 870d84335fSJung-uk Kim * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 880d84335fSJung-uk Kim * PARTICULAR PURPOSE. 890d84335fSJung-uk Kim * 900d84335fSJung-uk Kim * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 910d84335fSJung-uk Kim * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 920d84335fSJung-uk Kim * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 930d84335fSJung-uk Kim * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 940d84335fSJung-uk Kim * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 950d84335fSJung-uk Kim * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 960d84335fSJung-uk Kim * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 970d84335fSJung-uk Kim * LIMITED REMEDY. 980d84335fSJung-uk Kim * 990d84335fSJung-uk Kim * 4.3. Licensee shall not export, either directly or indirectly, any of this 1000d84335fSJung-uk Kim * software or system incorporating such software without first obtaining any 1010d84335fSJung-uk Kim * required license or other approval from the U. S. Department of Commerce or 1020d84335fSJung-uk Kim * any other agency or department of the United States Government. In the 1030d84335fSJung-uk Kim * event Licensee exports any such software from the United States or 1040d84335fSJung-uk Kim * re-exports any such software from a foreign destination, Licensee shall 1050d84335fSJung-uk Kim * ensure that the distribution and export/re-export of the software is in 1060d84335fSJung-uk Kim * compliance with all laws, regulations, orders, or other restrictions of the 1070d84335fSJung-uk Kim * U.S. Export Administration Regulations. Licensee agrees that neither it nor 1080d84335fSJung-uk Kim * any of its subsidiaries will export/re-export any technical data, process, 1090d84335fSJung-uk Kim * software, or service, directly or indirectly, to any country for which the 1100d84335fSJung-uk Kim * United States government or any agency thereof requires an export license, 1110d84335fSJung-uk Kim * other governmental approval, or letter of assurance, without first obtaining 1120d84335fSJung-uk Kim * such license, approval or letter. 1130d84335fSJung-uk Kim * 1140d84335fSJung-uk Kim ***************************************************************************** 1150d84335fSJung-uk Kim * 1160d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the 1170d84335fSJung-uk Kim * following license: 1180d84335fSJung-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 * 1340d84335fSJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1350d84335fSJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1360d84335fSJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1370d84335fSJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 1380d84335fSJung-uk Kim * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 1390d84335fSJung-uk Kim * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 1400d84335fSJung-uk Kim * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 1410d84335fSJung-uk Kim * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 1420d84335fSJung-uk Kim * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 1430d84335fSJung-uk Kim * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 1440d84335fSJung-uk Kim * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 1450d84335fSJung-uk Kim * 1460d84335fSJung-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 * 1500d84335fSJung-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 632a88e22b7SJung-uk Kim 633*2f6a1a81SJung-uk Kim Value = AcpiUtImplicitStrtoul64 (Field->Value); 634a88e22b7SJung-uk Kim 635a88e22b7SJung-uk Kim switch (Info->Opcode) 636a88e22b7SJung-uk Kim { 637a88e22b7SJung-uk Kim case ACPI_DMT_FLAG0: 638a88e22b7SJung-uk Kim case ACPI_DMT_FLAG1: 639a88e22b7SJung-uk Kim case ACPI_DMT_FLAG2: 640a88e22b7SJung-uk Kim case ACPI_DMT_FLAG3: 641a88e22b7SJung-uk Kim case ACPI_DMT_FLAG4: 642a88e22b7SJung-uk Kim case ACPI_DMT_FLAG5: 643a88e22b7SJung-uk Kim case ACPI_DMT_FLAG6: 644a88e22b7SJung-uk Kim case ACPI_DMT_FLAG7: 645a88e22b7SJung-uk Kim 646a88e22b7SJung-uk Kim BitPosition = Info->Opcode; 647a88e22b7SJung-uk Kim BitLength = 1; 648a88e22b7SJung-uk Kim break; 649a88e22b7SJung-uk Kim 650a88e22b7SJung-uk Kim case ACPI_DMT_FLAGS0: 651a88e22b7SJung-uk Kim 652a88e22b7SJung-uk Kim BitPosition = 0; 653a88e22b7SJung-uk Kim BitLength = 2; 654a88e22b7SJung-uk Kim break; 655a88e22b7SJung-uk Kim 656a88e22b7SJung-uk Kim 6573f0275a0SJung-uk Kim case ACPI_DMT_FLAGS1: 6583f0275a0SJung-uk Kim 6593f0275a0SJung-uk Kim BitPosition = 1; 6603f0275a0SJung-uk Kim BitLength = 2; 6613f0275a0SJung-uk Kim break; 6623f0275a0SJung-uk Kim 6633f0275a0SJung-uk Kim 664a88e22b7SJung-uk Kim case ACPI_DMT_FLAGS2: 665a88e22b7SJung-uk Kim 666a88e22b7SJung-uk Kim BitPosition = 2; 667a88e22b7SJung-uk Kim BitLength = 2; 668a88e22b7SJung-uk Kim break; 669a88e22b7SJung-uk Kim 6703f0275a0SJung-uk Kim case ACPI_DMT_FLAGS4: 6713f0275a0SJung-uk Kim 6723f0275a0SJung-uk Kim BitPosition = 4; 6733f0275a0SJung-uk Kim BitLength = 2; 6743f0275a0SJung-uk Kim break; 6753f0275a0SJung-uk Kim 676af051161SJung-uk Kim case ACPI_DMT_FLAGS4_0: 677af051161SJung-uk Kim 678af051161SJung-uk Kim BitPosition = 0; 679af051161SJung-uk Kim BitLength = 4; 680af051161SJung-uk Kim break; 681af051161SJung-uk Kim 682af051161SJung-uk Kim case ACPI_DMT_FLAGS4_4: 683af051161SJung-uk Kim 684af051161SJung-uk Kim BitPosition = 4; 685af051161SJung-uk Kim BitLength = 4; 686af051161SJung-uk Kim break; 687af051161SJung-uk Kim 688af051161SJung-uk Kim case ACPI_DMT_FLAGS4_8: 689af051161SJung-uk Kim 690af051161SJung-uk Kim BitPosition = 8; 691af051161SJung-uk Kim BitLength = 4; 692af051161SJung-uk Kim break; 693af051161SJung-uk Kim 694af051161SJung-uk Kim case ACPI_DMT_FLAGS4_12: 695af051161SJung-uk Kim 696af051161SJung-uk Kim BitPosition = 12; 697af051161SJung-uk Kim BitLength = 4; 698af051161SJung-uk Kim break; 699af051161SJung-uk Kim 700af051161SJung-uk Kim case ACPI_DMT_FLAGS16_16: 701af051161SJung-uk Kim 702af051161SJung-uk Kim BitPosition = 16; 703af051161SJung-uk Kim BitLength = 16; 704af051161SJung-uk Kim break; 705af051161SJung-uk Kim 706a88e22b7SJung-uk Kim default: 707a88e22b7SJung-uk Kim 708a88e22b7SJung-uk Kim DtFatal (ASL_MSG_COMPILER_INTERNAL, Field, "Invalid flag opcode"); 709a88e22b7SJung-uk Kim break; 710a88e22b7SJung-uk Kim } 711a88e22b7SJung-uk Kim 712a88e22b7SJung-uk Kim /* Check range of the input flag value */ 713a88e22b7SJung-uk Kim 714a88e22b7SJung-uk Kim if (Value >= ((UINT64) 1 << BitLength)) 715a88e22b7SJung-uk Kim { 716a88e22b7SJung-uk Kim sprintf (MsgBuffer, "Maximum %u bit", BitLength); 717a88e22b7SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_FLAG_VALUE, Field, MsgBuffer); 718a88e22b7SJung-uk Kim Value = 0; 719a88e22b7SJung-uk Kim } 720a88e22b7SJung-uk Kim 721a88e22b7SJung-uk Kim *Buffer |= (UINT8) (Value << BitPosition); 722a88e22b7SJung-uk Kim } 723