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 * 11804fe266SJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2024, 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 154a88e22b7SJung-uk Kim #define _COMPONENT DT_COMPILER 155a88e22b7SJung-uk Kim ACPI_MODULE_NAME ("dtfield") 156a88e22b7SJung-uk Kim 157a88e22b7SJung-uk Kim 158a88e22b7SJung-uk Kim /* Local prototypes */ 159a88e22b7SJung-uk Kim 160a88e22b7SJung-uk Kim static void 161a88e22b7SJung-uk Kim DtCompileString ( 162a88e22b7SJung-uk Kim UINT8 *Buffer, 163a88e22b7SJung-uk Kim DT_FIELD *Field, 164a88e22b7SJung-uk Kim UINT32 ByteLength); 165a88e22b7SJung-uk Kim 166d244b227SJung-uk Kim static void 167d244b227SJung-uk Kim DtCompileUnicode ( 168d244b227SJung-uk Kim UINT8 *Buffer, 169d244b227SJung-uk Kim DT_FIELD *Field, 170d244b227SJung-uk Kim UINT32 ByteLength); 171d244b227SJung-uk Kim 172d244b227SJung-uk Kim static ACPI_STATUS 173d244b227SJung-uk Kim DtCompileUuid ( 174d244b227SJung-uk Kim UINT8 *Buffer, 175d244b227SJung-uk Kim DT_FIELD *Field, 176d244b227SJung-uk Kim UINT32 ByteLength); 177d244b227SJung-uk Kim 178a88e22b7SJung-uk Kim static char * 179a88e22b7SJung-uk Kim DtNormalizeBuffer ( 180a88e22b7SJung-uk Kim char *Buffer, 181a88e22b7SJung-uk Kim UINT32 *Count); 182a88e22b7SJung-uk Kim 183a88e22b7SJung-uk Kim 184a88e22b7SJung-uk Kim /****************************************************************************** 185a88e22b7SJung-uk Kim * 186a88e22b7SJung-uk Kim * FUNCTION: DtCompileOneField 187a88e22b7SJung-uk Kim * 188a88e22b7SJung-uk Kim * PARAMETERS: Buffer - Output buffer 189a88e22b7SJung-uk Kim * Field - Field to be compiled 190a88e22b7SJung-uk Kim * ByteLength - Byte length of the field 191a88e22b7SJung-uk Kim * Type - Field type 192a88e22b7SJung-uk Kim * 193a88e22b7SJung-uk Kim * RETURN: None 194a88e22b7SJung-uk Kim * 195a88e22b7SJung-uk Kim * DESCRIPTION: Compile a field value to binary 196a88e22b7SJung-uk Kim * 197a88e22b7SJung-uk Kim *****************************************************************************/ 198a88e22b7SJung-uk Kim 199a88e22b7SJung-uk Kim void 200a88e22b7SJung-uk Kim DtCompileOneField ( 201a88e22b7SJung-uk Kim UINT8 *Buffer, 202a88e22b7SJung-uk Kim DT_FIELD *Field, 203a88e22b7SJung-uk Kim UINT32 ByteLength, 204a88e22b7SJung-uk Kim UINT8 Type, 205a88e22b7SJung-uk Kim UINT8 Flags) 206a88e22b7SJung-uk Kim { 207d244b227SJung-uk Kim ACPI_STATUS Status; 208a88e22b7SJung-uk Kim 209f8146b88SJung-uk Kim 210a88e22b7SJung-uk Kim switch (Type) 211a88e22b7SJung-uk Kim { 212a88e22b7SJung-uk Kim case DT_FIELD_TYPE_INTEGER: 213a9d8d09cSJung-uk Kim 214a88e22b7SJung-uk Kim DtCompileInteger (Buffer, Field, ByteLength, Flags); 215a88e22b7SJung-uk Kim break; 216a88e22b7SJung-uk Kim 217a88e22b7SJung-uk Kim case DT_FIELD_TYPE_STRING: 218a9d8d09cSJung-uk Kim 219a88e22b7SJung-uk Kim DtCompileString (Buffer, Field, ByteLength); 220a88e22b7SJung-uk Kim break; 221a88e22b7SJung-uk Kim 222d244b227SJung-uk Kim case DT_FIELD_TYPE_UUID: 223a9d8d09cSJung-uk Kim 224d244b227SJung-uk Kim Status = DtCompileUuid (Buffer, Field, ByteLength); 225d244b227SJung-uk Kim if (ACPI_SUCCESS (Status)) 226d244b227SJung-uk Kim { 227d244b227SJung-uk Kim break; 228d244b227SJung-uk Kim } 229d244b227SJung-uk Kim 230385fb5d9SJung-uk Kim ACPI_FALLTHROUGH; 231d244b227SJung-uk Kim 232a88e22b7SJung-uk Kim case DT_FIELD_TYPE_BUFFER: 233a9d8d09cSJung-uk Kim 234a88e22b7SJung-uk Kim DtCompileBuffer (Buffer, Field->Value, Field, ByteLength); 235a88e22b7SJung-uk Kim break; 236a88e22b7SJung-uk Kim 237d244b227SJung-uk Kim case DT_FIELD_TYPE_UNICODE: 238a9d8d09cSJung-uk Kim 239d244b227SJung-uk Kim DtCompileUnicode (Buffer, Field, ByteLength); 240d244b227SJung-uk Kim break; 241d244b227SJung-uk Kim 242d244b227SJung-uk Kim case DT_FIELD_TYPE_DEVICE_PATH: 243a9d8d09cSJung-uk Kim 244d244b227SJung-uk Kim break; 245d244b227SJung-uk Kim 246a88e22b7SJung-uk Kim default: 247a9d8d09cSJung-uk Kim 248a88e22b7SJung-uk Kim DtFatal (ASL_MSG_COMPILER_INTERNAL, Field, "Invalid field type"); 249a88e22b7SJung-uk Kim break; 250a88e22b7SJung-uk Kim } 251a88e22b7SJung-uk Kim } 252a88e22b7SJung-uk Kim 253a88e22b7SJung-uk Kim 254a88e22b7SJung-uk Kim /****************************************************************************** 255a88e22b7SJung-uk Kim * 256a88e22b7SJung-uk Kim * FUNCTION: DtCompileString 257a88e22b7SJung-uk Kim * 258a88e22b7SJung-uk Kim * PARAMETERS: Buffer - Output buffer 259a88e22b7SJung-uk Kim * Field - String to be copied to buffer 260a88e22b7SJung-uk Kim * ByteLength - Maximum length of string 261a88e22b7SJung-uk Kim * 262a88e22b7SJung-uk Kim * RETURN: None 263a88e22b7SJung-uk Kim * 264a88e22b7SJung-uk Kim * DESCRIPTION: Copy string to the buffer 265a88e22b7SJung-uk Kim * 266a88e22b7SJung-uk Kim *****************************************************************************/ 267a88e22b7SJung-uk Kim 268a88e22b7SJung-uk Kim static void 269a88e22b7SJung-uk Kim DtCompileString ( 270a88e22b7SJung-uk Kim UINT8 *Buffer, 271a88e22b7SJung-uk Kim DT_FIELD *Field, 272a88e22b7SJung-uk Kim UINT32 ByteLength) 273a88e22b7SJung-uk Kim { 274a88e22b7SJung-uk Kim UINT32 Length; 275a88e22b7SJung-uk Kim 276a88e22b7SJung-uk Kim 2775ef50723SJung-uk Kim Length = strlen (Field->Value); 278a88e22b7SJung-uk Kim 279a88e22b7SJung-uk Kim /* Check if the string is too long for the field */ 280a88e22b7SJung-uk Kim 281a88e22b7SJung-uk Kim if (Length > ByteLength) 282a88e22b7SJung-uk Kim { 283a009b7dcSJung-uk Kim sprintf (AslGbl_MsgBuffer, 284*92f570c3SJung-uk Kim "Maximum %u characters, found %u characters [%.*s]", 285*92f570c3SJung-uk Kim ByteLength, Length, (ASL_MSG_BUFFER_SIZE / 2), Field->Value); 2866f1f1a63SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_STRING_LENGTH, Field, AslGbl_MsgBuffer); 287a88e22b7SJung-uk Kim Length = ByteLength; 288a88e22b7SJung-uk Kim } 289a88e22b7SJung-uk Kim 2905ef50723SJung-uk Kim memcpy (Buffer, Field->Value, Length); 291a88e22b7SJung-uk Kim } 292a88e22b7SJung-uk Kim 293a88e22b7SJung-uk Kim 294a88e22b7SJung-uk Kim /****************************************************************************** 295a88e22b7SJung-uk Kim * 296d244b227SJung-uk Kim * FUNCTION: DtCompileUnicode 297d244b227SJung-uk Kim * 298d244b227SJung-uk Kim * PARAMETERS: Buffer - Output buffer 299d244b227SJung-uk Kim * Field - String to be copied to buffer 300d244b227SJung-uk Kim * ByteLength - Maximum length of string 301d244b227SJung-uk Kim * 302d244b227SJung-uk Kim * RETURN: None 303d244b227SJung-uk Kim * 304d244b227SJung-uk Kim * DESCRIPTION: Convert ASCII string to Unicode string 305d244b227SJung-uk Kim * 306d244b227SJung-uk Kim * Note: The Unicode string is 16 bits per character, no leading signature, 307d244b227SJung-uk Kim * with a 16-bit terminating NULL. 308d244b227SJung-uk Kim * 309d244b227SJung-uk Kim *****************************************************************************/ 310d244b227SJung-uk Kim 311d244b227SJung-uk Kim static void 312d244b227SJung-uk Kim DtCompileUnicode ( 313d244b227SJung-uk Kim UINT8 *Buffer, 314d244b227SJung-uk Kim DT_FIELD *Field, 315d244b227SJung-uk Kim UINT32 ByteLength) 316d244b227SJung-uk Kim { 317d244b227SJung-uk Kim UINT32 Count; 318d244b227SJung-uk Kim UINT32 i; 319d244b227SJung-uk Kim char *AsciiString; 320d244b227SJung-uk Kim UINT16 *UnicodeString; 321d244b227SJung-uk Kim 322d244b227SJung-uk Kim 323d244b227SJung-uk Kim AsciiString = Field->Value; 324d244b227SJung-uk Kim UnicodeString = (UINT16 *) Buffer; 3255ef50723SJung-uk Kim Count = strlen (AsciiString) + 1; 326d244b227SJung-uk Kim 327d244b227SJung-uk Kim /* Convert to Unicode string (including null terminator) */ 328d244b227SJung-uk Kim 329d244b227SJung-uk Kim for (i = 0; i < Count; i++) 330d244b227SJung-uk Kim { 331d244b227SJung-uk Kim UnicodeString[i] = (UINT16) AsciiString[i]; 332d244b227SJung-uk Kim } 333d244b227SJung-uk Kim } 334d244b227SJung-uk Kim 335d244b227SJung-uk Kim 336d244b227SJung-uk Kim /******************************************************************************* 337d244b227SJung-uk Kim * 338d244b227SJung-uk Kim * FUNCTION: DtCompileUuid 339d244b227SJung-uk Kim * 340d244b227SJung-uk Kim * PARAMETERS: Buffer - Output buffer 341d244b227SJung-uk Kim * Field - String to be copied to buffer 342d244b227SJung-uk Kim * ByteLength - Maximum length of string 343d244b227SJung-uk Kim * 344d244b227SJung-uk Kim * RETURN: None 345d244b227SJung-uk Kim * 346d244b227SJung-uk Kim * DESCRIPTION: Convert UUID string to 16-byte buffer 347d244b227SJung-uk Kim * 348d244b227SJung-uk Kim ******************************************************************************/ 349d244b227SJung-uk Kim 350d244b227SJung-uk Kim static ACPI_STATUS 351d244b227SJung-uk Kim DtCompileUuid ( 352d244b227SJung-uk Kim UINT8 *Buffer, 353d244b227SJung-uk Kim DT_FIELD *Field, 354d244b227SJung-uk Kim UINT32 ByteLength) 355d244b227SJung-uk Kim { 356d244b227SJung-uk Kim char *InString; 357d244b227SJung-uk Kim ACPI_STATUS Status; 358d244b227SJung-uk Kim 359d244b227SJung-uk Kim 360d244b227SJung-uk Kim InString = Field->Value; 361d244b227SJung-uk Kim 362d244b227SJung-uk Kim Status = AuValidateUuid (InString); 363d244b227SJung-uk Kim if (ACPI_FAILURE (Status)) 364d244b227SJung-uk Kim { 3656f1f1a63SJung-uk Kim sprintf (AslGbl_MsgBuffer, "%s", Field->Value); 3666f1f1a63SJung-uk Kim DtNameError (ASL_ERROR, ASL_MSG_INVALID_UUID, Field, AslGbl_MsgBuffer); 367d244b227SJung-uk Kim } 368d244b227SJung-uk Kim else 369d244b227SJung-uk Kim { 370313a0c13SJung-uk Kim AcpiUtConvertStringToUuid (InString, Buffer); 371d244b227SJung-uk Kim } 372d244b227SJung-uk Kim 373d244b227SJung-uk Kim return (Status); 374d244b227SJung-uk Kim } 375d244b227SJung-uk Kim 376d244b227SJung-uk Kim 377d244b227SJung-uk Kim /****************************************************************************** 378d244b227SJung-uk Kim * 379a88e22b7SJung-uk Kim * FUNCTION: DtCompileInteger 380a88e22b7SJung-uk Kim * 381a88e22b7SJung-uk Kim * PARAMETERS: Buffer - Output buffer 382a88e22b7SJung-uk Kim * Field - Field obj with Integer to be compiled 383a88e22b7SJung-uk Kim * ByteLength - Byte length of the integer 3840b94ba42SJung-uk Kim * Flags - Additional compile info 385a88e22b7SJung-uk Kim * 386a88e22b7SJung-uk Kim * RETURN: None 387a88e22b7SJung-uk Kim * 3880b94ba42SJung-uk Kim * DESCRIPTION: Compile an integer. Supports integer expressions with C-style 3890b94ba42SJung-uk Kim * operators. 390a88e22b7SJung-uk Kim * 391a88e22b7SJung-uk Kim *****************************************************************************/ 392a88e22b7SJung-uk Kim 393a88e22b7SJung-uk Kim void 394a88e22b7SJung-uk Kim DtCompileInteger ( 395a88e22b7SJung-uk Kim UINT8 *Buffer, 396a88e22b7SJung-uk Kim DT_FIELD *Field, 397a88e22b7SJung-uk Kim UINT32 ByteLength, 398a88e22b7SJung-uk Kim UINT8 Flags) 399a88e22b7SJung-uk Kim { 4000b94ba42SJung-uk Kim UINT64 Value; 401a88e22b7SJung-uk Kim UINT64 MaxValue; 402d052a1ccSJung-uk Kim ACPI_STATUS Status; 403a88e22b7SJung-uk Kim 404a88e22b7SJung-uk Kim 4050b94ba42SJung-uk Kim /* Output buffer byte length must be in range 1-8 */ 406a88e22b7SJung-uk Kim 407a88e22b7SJung-uk Kim if ((ByteLength > 8) || (ByteLength == 0)) 408a88e22b7SJung-uk Kim { 409a88e22b7SJung-uk Kim DtFatal (ASL_MSG_COMPILER_INTERNAL, Field, 410a88e22b7SJung-uk Kim "Invalid internal Byte length"); 411a88e22b7SJung-uk Kim return; 412a88e22b7SJung-uk Kim } 413a88e22b7SJung-uk Kim 4140b94ba42SJung-uk Kim /* Resolve integer expression to a single integer value */ 415a88e22b7SJung-uk Kim 416d052a1ccSJung-uk Kim Status = DtResolveIntegerExpression (Field, &Value); 417d052a1ccSJung-uk Kim if (ACPI_FAILURE (Status)) 418d052a1ccSJung-uk Kim { 419d052a1ccSJung-uk Kim return; 420d052a1ccSJung-uk Kim } 421a88e22b7SJung-uk Kim 422313a0c13SJung-uk Kim /* 423313a0c13SJung-uk Kim * Ensure that reserved fields are set properly. Note: uses 424313a0c13SJung-uk Kim * the DT_NON_ZERO flag to indicate that the reserved value 425313a0c13SJung-uk Kim * must be exactly one. Otherwise, the value must be zero. 426313a0c13SJung-uk Kim * This is sufficient for now. 427313a0c13SJung-uk Kim */ 428a88e22b7SJung-uk Kim 429313a0c13SJung-uk Kim /* TBD: Should use a flag rather than compare "Reserved" */ 430313a0c13SJung-uk Kim 4315ef50723SJung-uk Kim if (!strcmp (Field->Name, "Reserved")) 432313a0c13SJung-uk Kim { 433313a0c13SJung-uk Kim if (Flags & DT_NON_ZERO) 434313a0c13SJung-uk Kim { 435313a0c13SJung-uk Kim if (Value != 1) 436a88e22b7SJung-uk Kim { 43797c0b5abSJung-uk Kim DtError (ASL_ERROR, ASL_MSG_RESERVED_FIELD, Field, 438313a0c13SJung-uk Kim "Must be one, setting to one"); 439313a0c13SJung-uk Kim Value = 1; 440313a0c13SJung-uk Kim } 441313a0c13SJung-uk Kim } 442313a0c13SJung-uk Kim else if (Value != 0) 443313a0c13SJung-uk Kim { 44497c0b5abSJung-uk Kim DtError (ASL_ERROR, ASL_MSG_RESERVED_FIELD, Field, 445313a0c13SJung-uk Kim "Must be zero, setting to zero"); 446a88e22b7SJung-uk Kim Value = 0; 447a88e22b7SJung-uk Kim } 448313a0c13SJung-uk Kim } 449a88e22b7SJung-uk Kim 450a88e22b7SJung-uk Kim /* Check if the value must be non-zero */ 451a88e22b7SJung-uk Kim 452313a0c13SJung-uk Kim else if ((Flags & DT_NON_ZERO) && (Value == 0)) 453a88e22b7SJung-uk Kim { 454a88e22b7SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_ZERO_VALUE, Field, NULL); 455a88e22b7SJung-uk Kim } 456a88e22b7SJung-uk Kim 457a88e22b7SJung-uk Kim /* 458a88e22b7SJung-uk Kim * Generate the maximum value for the data type (ByteLength) 459a88e22b7SJung-uk Kim * Note: construct chosen for maximum portability 460a88e22b7SJung-uk Kim */ 461a88e22b7SJung-uk Kim MaxValue = ((UINT64) (-1)) >> (64 - (ByteLength * 8)); 462a88e22b7SJung-uk Kim 463a88e22b7SJung-uk Kim /* Validate that the input value is within range of the target */ 464a88e22b7SJung-uk Kim 465a88e22b7SJung-uk Kim if (Value > MaxValue) 466a88e22b7SJung-uk Kim { 4676f1f1a63SJung-uk Kim sprintf (AslGbl_MsgBuffer, "%8.8X%8.8X - max %u bytes", 468313a0c13SJung-uk Kim ACPI_FORMAT_UINT64 (Value), ByteLength); 4696f1f1a63SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_INTEGER_SIZE, Field, AslGbl_MsgBuffer); 470a88e22b7SJung-uk Kim } 471a88e22b7SJung-uk Kim 4725ef50723SJung-uk Kim memcpy (Buffer, &Value, ByteLength); 473a88e22b7SJung-uk Kim return; 474a88e22b7SJung-uk Kim } 475a88e22b7SJung-uk Kim 476a88e22b7SJung-uk Kim 477a88e22b7SJung-uk Kim /****************************************************************************** 478a88e22b7SJung-uk Kim * 479a88e22b7SJung-uk Kim * FUNCTION: DtNormalizeBuffer 480a88e22b7SJung-uk Kim * 481a88e22b7SJung-uk Kim * PARAMETERS: Buffer - Input buffer 482493deb39SJung-uk Kim * Count - Output the count of hex numbers in 483a88e22b7SJung-uk Kim * the Buffer 484a88e22b7SJung-uk Kim * 485493deb39SJung-uk Kim * RETURN: The normalized buffer, must be freed by caller 486a88e22b7SJung-uk Kim * 487a88e22b7SJung-uk Kim * DESCRIPTION: [1A,2B,3C,4D] or 1A, 2B, 3C, 4D will be normalized 488a88e22b7SJung-uk Kim * to 1A 2B 3C 4D 489a88e22b7SJung-uk Kim * 490a88e22b7SJung-uk Kim *****************************************************************************/ 491a88e22b7SJung-uk Kim 492a88e22b7SJung-uk Kim static char * 493a88e22b7SJung-uk Kim DtNormalizeBuffer ( 494a88e22b7SJung-uk Kim char *Buffer, 495a88e22b7SJung-uk Kim UINT32 *Count) 496a88e22b7SJung-uk Kim { 497a88e22b7SJung-uk Kim char *NewBuffer; 498a88e22b7SJung-uk Kim char *TmpBuffer; 499a88e22b7SJung-uk Kim UINT32 BufferCount = 0; 500a88e22b7SJung-uk Kim BOOLEAN Separator = TRUE; 501a88e22b7SJung-uk Kim char c; 502a88e22b7SJung-uk Kim 503a88e22b7SJung-uk Kim 5045ef50723SJung-uk Kim NewBuffer = UtLocalCalloc (strlen (Buffer) + 1); 505a88e22b7SJung-uk Kim TmpBuffer = NewBuffer; 506a88e22b7SJung-uk Kim 507a88e22b7SJung-uk Kim while ((c = *Buffer++)) 508a88e22b7SJung-uk Kim { 509a88e22b7SJung-uk Kim switch (c) 510a88e22b7SJung-uk Kim { 511a88e22b7SJung-uk Kim /* Valid separators */ 512a88e22b7SJung-uk Kim 513a88e22b7SJung-uk Kim case '[': 514a88e22b7SJung-uk Kim case ']': 515a88e22b7SJung-uk Kim case ' ': 516a88e22b7SJung-uk Kim case ',': 517a9d8d09cSJung-uk Kim 518a88e22b7SJung-uk Kim Separator = TRUE; 519a88e22b7SJung-uk Kim break; 520a88e22b7SJung-uk Kim 521a88e22b7SJung-uk Kim default: 522a9d8d09cSJung-uk Kim 523a88e22b7SJung-uk Kim if (Separator) 524a88e22b7SJung-uk Kim { 525a88e22b7SJung-uk Kim /* Insert blank as the standard separator */ 526a88e22b7SJung-uk Kim 527a88e22b7SJung-uk Kim if (NewBuffer[0]) 528a88e22b7SJung-uk Kim { 529a88e22b7SJung-uk Kim *TmpBuffer++ = ' '; 530a88e22b7SJung-uk Kim BufferCount++; 531a88e22b7SJung-uk Kim } 532a88e22b7SJung-uk Kim 533a88e22b7SJung-uk Kim Separator = FALSE; 534a88e22b7SJung-uk Kim } 535a88e22b7SJung-uk Kim 536a88e22b7SJung-uk Kim *TmpBuffer++ = c; 537a88e22b7SJung-uk Kim break; 538a88e22b7SJung-uk Kim } 539a88e22b7SJung-uk Kim } 540a88e22b7SJung-uk Kim 541a88e22b7SJung-uk Kim *Count = BufferCount + 1; 542a88e22b7SJung-uk Kim return (NewBuffer); 543a88e22b7SJung-uk Kim } 544a88e22b7SJung-uk Kim 545a88e22b7SJung-uk Kim 546a88e22b7SJung-uk Kim /****************************************************************************** 547a88e22b7SJung-uk Kim * 548a88e22b7SJung-uk Kim * FUNCTION: DtCompileBuffer 549a88e22b7SJung-uk Kim * 550a88e22b7SJung-uk Kim * PARAMETERS: Buffer - Output buffer 551a88e22b7SJung-uk Kim * StringValue - Integer list to be compiled 552a88e22b7SJung-uk Kim * Field - Current field object 553a88e22b7SJung-uk Kim * ByteLength - Byte length of the integer list 554a88e22b7SJung-uk Kim * 555a88e22b7SJung-uk Kim * RETURN: Count of remaining data in the input list 556a88e22b7SJung-uk Kim * 557a88e22b7SJung-uk Kim * DESCRIPTION: Compile and pack an integer list, for example 558a88e22b7SJung-uk Kim * "AA 1F 20 3B" ==> Buffer[] = {0xAA,0x1F,0x20,0x3B} 559a88e22b7SJung-uk Kim * 560a88e22b7SJung-uk Kim *****************************************************************************/ 561a88e22b7SJung-uk Kim 562a88e22b7SJung-uk Kim UINT32 563a88e22b7SJung-uk Kim DtCompileBuffer ( 564a88e22b7SJung-uk Kim UINT8 *Buffer, 565a88e22b7SJung-uk Kim char *StringValue, 566a88e22b7SJung-uk Kim DT_FIELD *Field, 567a88e22b7SJung-uk Kim UINT32 ByteLength) 568a88e22b7SJung-uk Kim { 569493deb39SJung-uk Kim char *Substring; 570a88e22b7SJung-uk Kim ACPI_STATUS Status; 571a88e22b7SJung-uk Kim UINT32 Count; 572493deb39SJung-uk Kim UINT32 i; 573a88e22b7SJung-uk Kim 574a88e22b7SJung-uk Kim 575a88e22b7SJung-uk Kim /* Allow several different types of value separators */ 576a88e22b7SJung-uk Kim 577a88e22b7SJung-uk Kim StringValue = DtNormalizeBuffer (StringValue, &Count); 578493deb39SJung-uk Kim Substring = StringValue; 579a009b7dcSJung-uk Kim if (Count != ByteLength) 580a009b7dcSJung-uk Kim { 581a009b7dcSJung-uk Kim sprintf(AslGbl_MsgBuffer, 582a009b7dcSJung-uk Kim "Found %u values, must match expected count: %u", 583a009b7dcSJung-uk Kim Count, ByteLength); 584a009b7dcSJung-uk Kim DtError (ASL_ERROR, ASL_MSG_BUFFER_LIST, Field, AslGbl_MsgBuffer); 585a009b7dcSJung-uk Kim goto Exit; 586a009b7dcSJung-uk Kim } 587a88e22b7SJung-uk Kim 588493deb39SJung-uk Kim /* Each element of StringValue is now three chars (2 hex + 1 space) */ 589493deb39SJung-uk Kim 590493deb39SJung-uk Kim for (i = 0; i < Count; i++, Substring += 3) 591a88e22b7SJung-uk Kim { 592493deb39SJung-uk Kim /* Check for byte value too long */ 593a88e22b7SJung-uk Kim 594493deb39SJung-uk Kim if (*(&Substring[2]) && 595493deb39SJung-uk Kim (*(&Substring[2]) != ' ')) 596a88e22b7SJung-uk Kim { 597493deb39SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_BUFFER_ELEMENT, Field, Substring); 5988d744e47SJung-uk Kim goto Exit; 599a88e22b7SJung-uk Kim } 600a88e22b7SJung-uk Kim 601493deb39SJung-uk Kim /* Convert two ASCII characters to one hex byte */ 602493deb39SJung-uk Kim 603493deb39SJung-uk Kim Status = AcpiUtAsciiToHexByte (Substring, &Buffer[i]); 604493deb39SJung-uk Kim if (ACPI_FAILURE (Status)) 605493deb39SJung-uk Kim { 606493deb39SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_BUFFER_ELEMENT, Field, Substring); 607493deb39SJung-uk Kim goto Exit; 608493deb39SJung-uk Kim } 609a88e22b7SJung-uk Kim } 610a88e22b7SJung-uk Kim 6118d744e47SJung-uk Kim Exit: 612a88e22b7SJung-uk Kim ACPI_FREE (StringValue); 613a88e22b7SJung-uk Kim return (ByteLength - Count); 614a88e22b7SJung-uk Kim } 615a88e22b7SJung-uk Kim 616a88e22b7SJung-uk Kim 617a88e22b7SJung-uk Kim /****************************************************************************** 618a88e22b7SJung-uk Kim * 619a88e22b7SJung-uk Kim * FUNCTION: DtCompileFlag 620a88e22b7SJung-uk Kim * 621a88e22b7SJung-uk Kim * PARAMETERS: Buffer - Output buffer 622a88e22b7SJung-uk Kim * Field - Field to be compiled 623a88e22b7SJung-uk Kim * Info - Flag info 624a88e22b7SJung-uk Kim * 625493deb39SJung-uk Kim * RETURN: None 626a88e22b7SJung-uk Kim * 627493deb39SJung-uk Kim * DESCRIPTION: Compile a flag field. Handles flags up to 64 bits. 628a88e22b7SJung-uk Kim * 629a88e22b7SJung-uk Kim *****************************************************************************/ 630a88e22b7SJung-uk Kim 631a88e22b7SJung-uk Kim void 632a88e22b7SJung-uk Kim DtCompileFlag ( 633a88e22b7SJung-uk Kim UINT8 *Buffer, 634a88e22b7SJung-uk Kim DT_FIELD *Field, 635a88e22b7SJung-uk Kim ACPI_DMTABLE_INFO *Info) 636a88e22b7SJung-uk Kim { 637a88e22b7SJung-uk Kim UINT64 Value = 0; 638a88e22b7SJung-uk Kim UINT32 BitLength = 1; 639a88e22b7SJung-uk Kim UINT8 BitPosition = 0; 640a88e22b7SJung-uk Kim 641a88e22b7SJung-uk Kim 6422f6a1a81SJung-uk Kim Value = AcpiUtImplicitStrtoul64 (Field->Value); 643a88e22b7SJung-uk Kim 644a88e22b7SJung-uk Kim switch (Info->Opcode) 645a88e22b7SJung-uk Kim { 646a88e22b7SJung-uk Kim case ACPI_DMT_FLAG0: 647a88e22b7SJung-uk Kim case ACPI_DMT_FLAG1: 648a88e22b7SJung-uk Kim case ACPI_DMT_FLAG2: 649a88e22b7SJung-uk Kim case ACPI_DMT_FLAG3: 650a88e22b7SJung-uk Kim case ACPI_DMT_FLAG4: 651a88e22b7SJung-uk Kim case ACPI_DMT_FLAG5: 652a88e22b7SJung-uk Kim case ACPI_DMT_FLAG6: 653a88e22b7SJung-uk Kim case ACPI_DMT_FLAG7: 654a88e22b7SJung-uk Kim 655a88e22b7SJung-uk Kim BitPosition = Info->Opcode; 656a88e22b7SJung-uk Kim BitLength = 1; 657a88e22b7SJung-uk Kim break; 658a88e22b7SJung-uk Kim 659a88e22b7SJung-uk Kim case ACPI_DMT_FLAGS0: 660a88e22b7SJung-uk Kim 661a88e22b7SJung-uk Kim BitPosition = 0; 662a88e22b7SJung-uk Kim BitLength = 2; 663a88e22b7SJung-uk Kim break; 664a88e22b7SJung-uk Kim 665a88e22b7SJung-uk Kim 6663f0275a0SJung-uk Kim case ACPI_DMT_FLAGS1: 6673f0275a0SJung-uk Kim 6683f0275a0SJung-uk Kim BitPosition = 1; 6693f0275a0SJung-uk Kim BitLength = 2; 6703f0275a0SJung-uk Kim break; 6713f0275a0SJung-uk Kim 6723f0275a0SJung-uk Kim 673a88e22b7SJung-uk Kim case ACPI_DMT_FLAGS2: 674a88e22b7SJung-uk Kim 675a88e22b7SJung-uk Kim BitPosition = 2; 676a88e22b7SJung-uk Kim BitLength = 2; 677a88e22b7SJung-uk Kim break; 678a88e22b7SJung-uk Kim 679ab71bbb7SJung-uk Kim case ACPI_DMT_FLAGS8_2: 680ab71bbb7SJung-uk Kim 681ab71bbb7SJung-uk Kim BitPosition = 2; 682ab71bbb7SJung-uk Kim BitLength = 8; 683ab71bbb7SJung-uk Kim break; 684ab71bbb7SJung-uk Kim 6853f0275a0SJung-uk Kim case ACPI_DMT_FLAGS4: 6863f0275a0SJung-uk Kim 6873f0275a0SJung-uk Kim BitPosition = 4; 6883f0275a0SJung-uk Kim BitLength = 2; 6893f0275a0SJung-uk Kim break; 6903f0275a0SJung-uk Kim 691af051161SJung-uk Kim case ACPI_DMT_FLAGS4_0: 692af051161SJung-uk Kim 693af051161SJung-uk Kim BitPosition = 0; 694af051161SJung-uk Kim BitLength = 4; 695af051161SJung-uk Kim break; 696af051161SJung-uk Kim 697af051161SJung-uk Kim case ACPI_DMT_FLAGS4_4: 698af051161SJung-uk Kim 699af051161SJung-uk Kim BitPosition = 4; 700af051161SJung-uk Kim BitLength = 4; 701af051161SJung-uk Kim break; 702af051161SJung-uk Kim 703af051161SJung-uk Kim case ACPI_DMT_FLAGS4_8: 704af051161SJung-uk Kim 705af051161SJung-uk Kim BitPosition = 8; 706af051161SJung-uk Kim BitLength = 4; 707af051161SJung-uk Kim break; 708af051161SJung-uk Kim 709af051161SJung-uk Kim case ACPI_DMT_FLAGS4_12: 710af051161SJung-uk Kim 711af051161SJung-uk Kim BitPosition = 12; 712af051161SJung-uk Kim BitLength = 4; 713af051161SJung-uk Kim break; 714af051161SJung-uk Kim 715af051161SJung-uk Kim case ACPI_DMT_FLAGS16_16: 716af051161SJung-uk Kim 717af051161SJung-uk Kim BitPosition = 16; 718af051161SJung-uk Kim BitLength = 16; 719af051161SJung-uk Kim break; 720af051161SJung-uk Kim 721a88e22b7SJung-uk Kim default: 722a88e22b7SJung-uk Kim 723a88e22b7SJung-uk Kim DtFatal (ASL_MSG_COMPILER_INTERNAL, Field, "Invalid flag opcode"); 724a88e22b7SJung-uk Kim break; 725a88e22b7SJung-uk Kim } 726a88e22b7SJung-uk Kim 727a88e22b7SJung-uk Kim /* Check range of the input flag value */ 728a88e22b7SJung-uk Kim 729a88e22b7SJung-uk Kim if (Value >= ((UINT64) 1 << BitLength)) 730a88e22b7SJung-uk Kim { 7316f1f1a63SJung-uk Kim sprintf (AslGbl_MsgBuffer, "Maximum %u bit", BitLength); 7326f1f1a63SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_FLAG_VALUE, Field, AslGbl_MsgBuffer); 733a88e22b7SJung-uk Kim Value = 0; 734a88e22b7SJung-uk Kim } 735a88e22b7SJung-uk Kim 736a88e22b7SJung-uk Kim *Buffer |= (UINT8) (Value << BitPosition); 737a88e22b7SJung-uk Kim } 738a009b7dcSJung-uk Kim 739a009b7dcSJung-uk Kim 740a009b7dcSJung-uk Kim /****************************************************************************** 741a009b7dcSJung-uk Kim * 742a009b7dcSJung-uk Kim * FUNCTION: DtCreateField 743a009b7dcSJung-uk Kim * 744a009b7dcSJung-uk Kim * PARAMETERS: Name 745a009b7dcSJung-uk Kim * Value 746a009b7dcSJung-uk Kim * Line 747a009b7dcSJung-uk Kim * Offset 748a009b7dcSJung-uk Kim * Column 749a009b7dcSJung-uk Kim * NameColumn 750a009b7dcSJung-uk Kim * 751a009b7dcSJung-uk Kim * RETURN: None 752a009b7dcSJung-uk Kim * 753a009b7dcSJung-uk Kim * DESCRIPTION: Create a field 754a009b7dcSJung-uk Kim * 755a009b7dcSJung-uk Kim *****************************************************************************/ 756a009b7dcSJung-uk Kim 757a009b7dcSJung-uk Kim void 758a009b7dcSJung-uk Kim DtCreateField ( 759a009b7dcSJung-uk Kim DT_TABLE_UNIT *FieldKey, 760a009b7dcSJung-uk Kim DT_TABLE_UNIT *FieldValue, 761a009b7dcSJung-uk Kim UINT32 Offset) 762a009b7dcSJung-uk Kim { 763a009b7dcSJung-uk Kim DT_FIELD *Field = UtFieldCacheCalloc (); 764a009b7dcSJung-uk Kim 765a009b7dcSJung-uk Kim 766a009b7dcSJung-uk Kim Field->StringLength = 0; 767a009b7dcSJung-uk Kim if (FieldKey->Value) 768a009b7dcSJung-uk Kim { 769a009b7dcSJung-uk Kim Field->Name = 770a009b7dcSJung-uk Kim strcpy (UtLocalCacheCalloc (strlen (FieldKey->Value) + 1), FieldKey->Value); 771a009b7dcSJung-uk Kim } 772a009b7dcSJung-uk Kim 773a009b7dcSJung-uk Kim if (FieldValue->Value) 774a009b7dcSJung-uk Kim { 775a009b7dcSJung-uk Kim Field->StringLength = strlen (FieldValue->Value); 776a009b7dcSJung-uk Kim Field->Value = 777a009b7dcSJung-uk Kim strcpy (UtLocalCacheCalloc (Field->StringLength + 1), FieldValue->Value); 778a009b7dcSJung-uk Kim } 779a009b7dcSJung-uk Kim 780a009b7dcSJung-uk Kim Field->Line = FieldValue->Line; 781a009b7dcSJung-uk Kim Field->ByteOffset = Offset; 782a009b7dcSJung-uk Kim Field->NameColumn = FieldKey->Column; 783a009b7dcSJung-uk Kim Field->Column = FieldValue->Column; 784a009b7dcSJung-uk Kim DtLinkField (Field); 785a009b7dcSJung-uk Kim 786a009b7dcSJung-uk Kim DtDumpFieldList (AslGbl_FieldList); 787a009b7dcSJung-uk Kim } 788a009b7dcSJung-uk Kim 789a009b7dcSJung-uk Kim 790a009b7dcSJung-uk Kim /****************************************************************************** 791a009b7dcSJung-uk Kim * 792a009b7dcSJung-uk Kim * FUNCTION: DtCreateTableUnit 793a009b7dcSJung-uk Kim * 794a009b7dcSJung-uk Kim * PARAMETERS: Data 795a009b7dcSJung-uk Kim * Line 796a009b7dcSJung-uk Kim * Column 797a009b7dcSJung-uk Kim * 798a009b7dcSJung-uk Kim * RETURN: a table unit 799a009b7dcSJung-uk Kim * 800a009b7dcSJung-uk Kim * DESCRIPTION: Create a table unit 801a009b7dcSJung-uk Kim * 802a009b7dcSJung-uk Kim *****************************************************************************/ 803a009b7dcSJung-uk Kim 804a009b7dcSJung-uk Kim DT_TABLE_UNIT * 805a009b7dcSJung-uk Kim DtCreateTableUnit ( 806a009b7dcSJung-uk Kim char *Data, 807a009b7dcSJung-uk Kim UINT32 Line, 808a009b7dcSJung-uk Kim UINT32 Column) 809a009b7dcSJung-uk Kim { 810a009b7dcSJung-uk Kim DT_TABLE_UNIT *Unit = (DT_TABLE_UNIT *) UtFieldCacheCalloc (); 811a009b7dcSJung-uk Kim 812a009b7dcSJung-uk Kim 813a009b7dcSJung-uk Kim Unit->Value = Data; 814a009b7dcSJung-uk Kim Unit->Line = Line; 815a009b7dcSJung-uk Kim Unit->Column = Column; 816a009b7dcSJung-uk Kim return (Unit); 817a009b7dcSJung-uk Kim } 818a009b7dcSJung-uk Kim 819a009b7dcSJung-uk Kim 820a009b7dcSJung-uk Kim /****************************************************************************** 821a009b7dcSJung-uk Kim * 822a009b7dcSJung-uk Kim * FUNCTION: DtLinkField 823a009b7dcSJung-uk Kim * 824a009b7dcSJung-uk Kim * PARAMETERS: Field - New field object to link 825a009b7dcSJung-uk Kim * 826a009b7dcSJung-uk Kim * RETURN: None 827a009b7dcSJung-uk Kim * 828a009b7dcSJung-uk Kim * DESCRIPTION: Link one field name and value to the list 829a009b7dcSJung-uk Kim * 830a009b7dcSJung-uk Kim *****************************************************************************/ 831a009b7dcSJung-uk Kim 832a009b7dcSJung-uk Kim void 833a009b7dcSJung-uk Kim DtLinkField ( 834a009b7dcSJung-uk Kim DT_FIELD *Field) 835a009b7dcSJung-uk Kim { 836a009b7dcSJung-uk Kim DT_FIELD *Prev; 837a009b7dcSJung-uk Kim DT_FIELD *Next; 838a009b7dcSJung-uk Kim 839a009b7dcSJung-uk Kim 840a009b7dcSJung-uk Kim Prev = Next = AslGbl_FieldList; 841a009b7dcSJung-uk Kim 842a009b7dcSJung-uk Kim while (Next) 843a009b7dcSJung-uk Kim { 844a009b7dcSJung-uk Kim Prev = Next; 845a009b7dcSJung-uk Kim Next = Next->Next; 846a009b7dcSJung-uk Kim } 847a009b7dcSJung-uk Kim 848a009b7dcSJung-uk Kim if (Prev) 849a009b7dcSJung-uk Kim { 850a009b7dcSJung-uk Kim Prev->Next = Field; 851a009b7dcSJung-uk Kim } 852a009b7dcSJung-uk Kim else 853a009b7dcSJung-uk Kim { 854a009b7dcSJung-uk Kim AslGbl_FieldList = Field; 855a009b7dcSJung-uk Kim } 856a009b7dcSJung-uk Kim } 857