[PATCH 01/11] acpica: new ACPICA sources
Keng-Yu Lin
kengyu at canonical.com
Thu Apr 12 02:22:24 UTC 2012
On Thu, Apr 12, 2012 at 7:50 AM, Colin King <colin.king at canonical.com> wrote:
> From: Colin Ian King <colin.king at canonical.com>
>
> Signed-off-by: Colin Ian King <colin.king at canonical.com>
> ---
> src/acpica/source/compiler/aslrestype2s.c | 1259 ++++++++++++++++++++
> src/acpica/source/compiler/aslsupport.l | 854 +++++++++++++
> src/acpica/source/compiler/preprocess.h | 345 ++++++
> src/acpica/source/compiler/prexpress.c | 377 ++++++
> src/acpica/source/compiler/prmacros.c | 646 ++++++++++
> src/acpica/source/compiler/prparser.l | 225 ++++
> src/acpica/source/compiler/prparser.y | 356 ++++++
> src/acpica/source/compiler/prscan.c | 844 +++++++++++++
> src/acpica/source/compiler/prutils.c | 540 +++++++++
> .../source/components/disassembler/dmresrcl2.c | 772 ++++++++++++
> src/acpica/source/components/hardware/hwesleep.c | 349 ++++++
> src/acpica/source/components/hardware/hwxfsleep.c | 550 +++++++++
> src/acpica/source/components/resources/rsserial.c | 497 ++++++++
> src/acpica/source/components/utilities/utaddress.c | 394 ++++++
> src/acpica/source/include/actbl3.h | 722 +++++++++++
> 15 files changed, 8730 insertions(+)
> create mode 100644 src/acpica/source/compiler/aslrestype2s.c
> create mode 100644 src/acpica/source/compiler/aslsupport.l
> create mode 100644 src/acpica/source/compiler/preprocess.h
> create mode 100644 src/acpica/source/compiler/prexpress.c
> create mode 100644 src/acpica/source/compiler/prmacros.c
> create mode 100644 src/acpica/source/compiler/prparser.l
> create mode 100644 src/acpica/source/compiler/prparser.y
> create mode 100644 src/acpica/source/compiler/prscan.c
> create mode 100644 src/acpica/source/compiler/prutils.c
> create mode 100644 src/acpica/source/components/disassembler/dmresrcl2.c
> create mode 100644 src/acpica/source/components/hardware/hwesleep.c
> create mode 100644 src/acpica/source/components/hardware/hwxfsleep.c
> create mode 100644 src/acpica/source/components/resources/rsserial.c
> create mode 100644 src/acpica/source/components/utilities/utaddress.c
> create mode 100644 src/acpica/source/include/actbl3.h
>
> diff --git a/src/acpica/source/compiler/aslrestype2s.c b/src/acpica/source/compiler/aslrestype2s.c
> new file mode 100644
> index 0000000..a9d24cd
> --- /dev/null
> +++ b/src/acpica/source/compiler/aslrestype2s.c
> @@ -0,0 +1,1259 @@
> +/******************************************************************************
> + *
> + * Module Name: aslrestype2s - Serial Large resource descriptors
> + *
> + *****************************************************************************/
> +
> +/******************************************************************************
> + *
> + * 1. Copyright Notice
> + *
> + * Some or all of this work - Copyright (c) 1999 - 2012, Intel Corp.
> + * All rights reserved.
> + *
> + * 2. License
> + *
> + * 2.1. This is your license from Intel Corp. under its intellectual property
> + * rights. You may have additional license terms from the party that provided
> + * you this software, covering your right to use that party's intellectual
> + * property rights.
> + *
> + * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
> + * copy of the source code appearing in this file ("Covered Code") an
> + * irrevocable, perpetual, worldwide license under Intel's copyrights in the
> + * base code distributed originally by Intel ("Original Intel Code") to copy,
> + * make derivatives, distribute, use and display any portion of the Covered
> + * Code in any form, with the right to sublicense such rights; and
> + *
> + * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
> + * license (with the right to sublicense), under only those claims of Intel
> + * patents that are infringed by the Original Intel Code, to make, use, sell,
> + * offer to sell, and import the Covered Code and derivative works thereof
> + * solely to the minimum extent necessary to exercise the above copyright
> + * license, and in no event shall the patent license extend to any additions
> + * to or modifications of the Original Intel Code. No other license or right
> + * is granted directly or by implication, estoppel or otherwise;
> + *
> + * The above copyright and patent license is granted only if the following
> + * conditions are met:
> + *
> + * 3. Conditions
> + *
> + * 3.1. Redistribution of Source with Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification with rights to further distribute source must include
> + * the above Copyright Notice, the above License, this list of Conditions,
> + * and the following Disclaimer and Export Compliance provision. In addition,
> + * Licensee must cause all Covered Code to which Licensee contributes to
> + * contain a file documenting the changes Licensee made to create that Covered
> + * Code and the date of any change. Licensee must include in that file the
> + * documentation of any changes made by any predecessor Licensee. Licensee
> + * must include a prominent statement that the modification is derived,
> + * directly or indirectly, from Original Intel Code.
> + *
> + * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification without rights to further distribute source must
> + * include the following Disclaimer and Export Compliance provision in the
> + * documentation and/or other materials provided with distribution. In
> + * addition, Licensee may not authorize further sublicense of source of any
> + * portion of the Covered Code, and must include terms to the effect that the
> + * license from Licensee to its licensee is limited to the intellectual
> + * property embodied in the software Licensee provides to its licensee, and
> + * not to intellectual property embodied in modifications its licensee may
> + * make.
> + *
> + * 3.3. Redistribution of Executable. Redistribution in executable form of any
> + * substantial portion of the Covered Code or modification must reproduce the
> + * above Copyright Notice, and the following Disclaimer and Export Compliance
> + * provision in the documentation and/or other materials provided with the
> + * distribution.
> + *
> + * 3.4. Intel retains all right, title, and interest in and to the Original
> + * Intel Code.
> + *
> + * 3.5. Neither the name Intel nor any other trademark owned or controlled by
> + * Intel shall be used in advertising or otherwise to promote the sale, use or
> + * other dealings in products derived from or relating to the Covered Code
> + * without prior written authorization from Intel.
> + *
> + * 4. Disclaimer and Export Compliance
> + *
> + * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
> + * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
> + * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
> + * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
> + * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
> + * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
> + * PARTICULAR PURPOSE.
> + *
> + * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
> + * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
> + * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
> + * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
> + * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
> + * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
> + * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
> + * LIMITED REMEDY.
> + *
> + * 4.3. Licensee shall not export, either directly or indirectly, any of this
> + * software or system incorporating such software without first obtaining any
> + * required license or other approval from the U. S. Department of Commerce or
> + * any other agency or department of the United States Government. In the
> + * event Licensee exports any such software from the United States or
> + * re-exports any such software from a foreign destination, Licensee shall
> + * ensure that the distribution and export/re-export of the software is in
> + * compliance with all laws, regulations, orders, or other restrictions of the
> + * U.S. Export Administration Regulations. Licensee agrees that neither it nor
> + * any of its subsidiaries will export/re-export any technical data, process,
> + * software, or service, directly or indirectly, to any country for which the
> + * United States government or any agency thereof requires an export license,
> + * other governmental approval, or letter of assurance, without first obtaining
> + * such license, approval or letter.
> + *
> + *****************************************************************************/
> +
> +
> +#include "aslcompiler.h"
> +#include "aslcompiler.y.h"
> +#include "amlcode.h"
> +
> +#define _COMPONENT ACPI_COMPILER
> + ACPI_MODULE_NAME ("aslrestype2s")
> +
> +
> +static UINT16
> +RsGetBufferDataLength (
> + ACPI_PARSE_OBJECT *InitializerOp);
> +
> +static UINT16
> +RsGetInterruptDataLength (
> + ACPI_PARSE_OBJECT *InitializerOp);
> +
> +static BOOLEAN
> +RsGetVendorData (
> + ACPI_PARSE_OBJECT *InitializerOp,
> + UINT8 *VendorData,
> + ACPI_SIZE DescriptorOffset);
> +
> +/*
> + * This module contains descriptors for serial buses and GPIO:
> + *
> + * GpioInt
> + * GpioIo
> + * I2cSerialBus
> + * SpiSerialBus
> + * UartSerialBus
> + */
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: RsGetBufferDataLength
> + *
> + * PARAMETERS: InitializerOp - Current parse op, start of the resource
> + * descriptor
> + *
> + * RETURN: Length of the data buffer
> + *
> + * DESCRIPTION: Get the length of a RawDataBuffer, used for vendor data.
> + *
> + ******************************************************************************/
> +
> +static UINT16
> +RsGetBufferDataLength (
> + ACPI_PARSE_OBJECT *InitializerOp)
> +{
> + UINT16 ExtraDataSize = 0;
> + ACPI_PARSE_OBJECT *DataList;
> +
> +
> + /* Find the byte-initializer list */
> +
> + while (InitializerOp)
> + {
> + if (InitializerOp->Asl.ParseOpcode == PARSEOP_DATABUFFER)
> + {
> + /* First child is the optional length (ignore it here) */
> +
> + DataList = InitializerOp->Asl.Child;
> + DataList = ASL_GET_PEER_NODE (DataList);
> +
> + /* Count the data items (each one is a byte of data) */
> +
> + while (DataList)
> + {
> + ExtraDataSize++;
> + DataList = ASL_GET_PEER_NODE (DataList);
> + }
> +
> + return (ExtraDataSize);
> + }
> +
> + InitializerOp = ASL_GET_PEER_NODE (InitializerOp);
> + }
> +
> + return (ExtraDataSize);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: RsGetInterruptDataLength
> + *
> + * PARAMETERS: InitializerOp - Current parse op, start of the resource
> + * descriptor
> + *
> + * RETURN: Length of the interrupt data list
> + *
> + * DESCRIPTION: Get the length of a list of interrupt DWORDs for the GPIO
> + * descriptors.
> + *
> + ******************************************************************************/
> +
> +static UINT16
> +RsGetInterruptDataLength (
> + ACPI_PARSE_OBJECT *InitializerOp)
> +{
> + UINT16 InterruptLength;
> + UINT32 i;
> +
> +
> + /* Count the interrupt numbers */
> +
> + InterruptLength = 0;
> + for (i = 0; InitializerOp; i++)
> + {
> + InitializerOp = ASL_GET_PEER_NODE (InitializerOp);
> +
> + /* Interrupt list starts at offset 10 (Gpio descriptors) */
> +
> + if (i >= 10)
> + {
> + InterruptLength += 2;
> + }
> + }
> +
> + return (InterruptLength);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: RsGetVendorData
> + *
> + * PARAMETERS: InitializerOp - Current parse op, start of the resource
> + * descriptor.
> + * VendorData - Where the vendor data is returned
> + * DescriptorOffset - Where vendor data begins in descriptor
> + *
> + * RETURN: TRUE if valid vendor data was returned, FALSE otherwise.
> + *
> + * DESCRIPTION: Extract the vendor data and construct a vendor data buffer.
> + *
> + ******************************************************************************/
> +
> +static BOOLEAN
> +RsGetVendorData (
> + ACPI_PARSE_OBJECT *InitializerOp,
> + UINT8 *VendorData,
> + ACPI_SIZE DescriptorOffset)
> +{
> + ACPI_PARSE_OBJECT *BufferOp;
> + UINT32 SpecifiedLength = ACPI_UINT32_MAX;
> + UINT16 ActualLength = 0;
> +
> +
> + /* Vendor Data field is always optional */
> +
> + if (InitializerOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
> + {
> + return (FALSE);
> + }
> +
> + BufferOp = InitializerOp->Asl.Child;
> + if (!BufferOp)
> + {
> + AslError (ASL_ERROR, ASL_MSG_SYNTAX, InitializerOp, "");
> + return (FALSE);
> + }
> +
> + /* First child is the optional buffer length (WORD) */
> +
> + if (BufferOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
> + {
> + SpecifiedLength = (UINT16) BufferOp->Asl.Value.Integer;
> + }
> +
> + /* Insert field tag _VEN */
> +
> + RsCreateByteField (InitializerOp, ACPI_RESTAG_VENDORDATA,
> + (UINT16) DescriptorOffset);
> +
> + /* Walk the list of buffer initializers (each is one byte) */
> +
> + BufferOp = RsCompleteNodeAndGetNext (BufferOp);
> + if (BufferOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
> + {
> + while (BufferOp)
> + {
> + *VendorData = (UINT8) BufferOp->Asl.Value.Integer;
> + VendorData++;
> + ActualLength++;
> + BufferOp = RsCompleteNodeAndGetNext (BufferOp);
> + }
> + }
> +
> + /* Length validation. Buffer cannot be of zero length */
> +
> + if ((SpecifiedLength == 0) ||
> + ((SpecifiedLength == ACPI_UINT32_MAX) && (ActualLength == 0)))
> + {
> + AslError (ASL_ERROR, ASL_MSG_BUFFER_LENGTH, InitializerOp, NULL);
> + return (FALSE);
> + }
> +
> + if (SpecifiedLength != ACPI_UINT32_MAX)
> + {
> + /* ActualLength > SpecifiedLength -> error */
> +
> + if (ActualLength > SpecifiedLength)
> + {
> + AslError (ASL_ERROR, ASL_MSG_LIST_LENGTH_LONG, InitializerOp, NULL);
> + return (FALSE);
> + }
> +
> + /* ActualLength < SpecifiedLength -> remark */
> +
> + else if (ActualLength < SpecifiedLength)
> + {
> + AslError (ASL_REMARK, ASL_MSG_LIST_LENGTH_SHORT, InitializerOp, NULL);
> + return (FALSE);
> + }
> + }
> +
> + return (TRUE);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: RsDoGpioIntDescriptor
> + *
> + * PARAMETERS: Op - Parent resource descriptor parse node
> + * CurrentByteOffset - Offset into the resource template AML
> + * buffer (to track references to the desc)
> + *
> + * RETURN: Completed resource node
> + *
> + * DESCRIPTION: Construct a long "GpioInt" descriptor
> + *
> + ******************************************************************************/
> +
> +ASL_RESOURCE_NODE *
> +RsDoGpioIntDescriptor (
> + ACPI_PARSE_OBJECT *Op,
> + UINT32 CurrentByteOffset)
> +{
> + AML_RESOURCE *Descriptor;
> + ACPI_PARSE_OBJECT *InitializerOp;
> + ASL_RESOURCE_NODE *Rnode;
> + char *ResourceSource = NULL;
> + UINT8 *VendorData = NULL;
> + UINT16 *InterruptList = NULL;
> + UINT16 ResSourceLength;
> + UINT16 VendorLength;
> + UINT16 InterruptLength;
> + UINT16 DescriptorSize;
> + UINT32 i;
> +
> +
> + InitializerOp = Op->Asl.Child;
> +
> + /*
> + * Calculate lengths for fields that have variable length:
> + * 1) Resource Source string
> + * 2) Vendor Data buffer
> + * 3) PIN (interrupt) list
> + */
> + ResSourceLength = RsGetStringDataLength (InitializerOp);
> + VendorLength = RsGetBufferDataLength (InitializerOp);
> + InterruptLength = RsGetInterruptDataLength (InitializerOp);
> +
> + DescriptorSize = ACPI_AML_SIZE_LARGE (AML_RESOURCE_GPIO) +
> + ResSourceLength + VendorLength + InterruptLength;
> +
> + /* Allocate the local resource node and initialize */
> +
> + Rnode = RsAllocateResourceNode (DescriptorSize + sizeof (AML_RESOURCE_LARGE_HEADER));
> +
> + Descriptor = Rnode->Buffer;
> + Descriptor->Gpio.ResourceLength = DescriptorSize;
> + Descriptor->Gpio.DescriptorType = ACPI_RESOURCE_NAME_GPIO;
> + Descriptor->Gpio.RevisionId = AML_RESOURCE_GPIO_REVISION;
> + Descriptor->Gpio.ConnectionType = AML_RESOURCE_GPIO_TYPE_INT;
> +
> + /* Build pointers to optional areas */
> +
> + InterruptList = ACPI_ADD_PTR (UINT16, Descriptor, sizeof (AML_RESOURCE_GPIO));
> + ResourceSource = ACPI_ADD_PTR (char, InterruptList, InterruptLength);
> + VendorData = ACPI_ADD_PTR (UINT8, ResourceSource, ResSourceLength);
> +
> + /* Setup offsets within the descriptor */
> +
> + Descriptor->Gpio.PinTableOffset = (UINT16)
> + ACPI_PTR_DIFF (InterruptList, Descriptor);
> +
> + Descriptor->Gpio.ResSourceOffset = (UINT16)
> + ACPI_PTR_DIFF (ResourceSource, Descriptor);
> +
> + DbgPrint (ASL_DEBUG_OUTPUT,
> + "%16s - Actual: %.2X, Base: %.2X, ResLen: %.2X, VendLen: %.2X, IntLen: %.2X\n",
> + "GpioInt", Descriptor->Gpio.ResourceLength, (UINT16) sizeof (AML_RESOURCE_GPIO),
> + ResSourceLength, VendorLength, InterruptLength);
> +
> + /* Process all child initialization nodes */
> +
> + for (i = 0; InitializerOp; i++)
> + {
> + switch (i)
> + {
> + case 0: /* Interrupt Mode - edge/level [Flag] (_MOD) */
> +
> + RsSetFlagBits16 (&Descriptor->Gpio.IntFlags, InitializerOp, 0, 0);
> + RsCreateBitField (InitializerOp, ACPI_RESTAG_MODE,
> + CurrentByteOffset + ASL_RESDESC_OFFSET (Gpio.IntFlags), 0);
> + break;
> +
> + case 1: /* Interrupt Polarity - Active high/low [Flags] (_POL) */
> +
> + RsSetFlagBits16 (&Descriptor->Gpio.IntFlags, InitializerOp, 1, 0);
> + RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_POLARITY,
> + CurrentByteOffset + ASL_RESDESC_OFFSET (Gpio.IntFlags), 1, 2);
> + break;
> +
> + case 2: /* Share Type - Default: exclusive (0) [Flags] (_SHR) */
> +
> + RsSetFlagBits16 (&Descriptor->Gpio.IntFlags, InitializerOp, 3, 0);
> + RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_INTERRUPTSHARE,
> + CurrentByteOffset + ASL_RESDESC_OFFSET (Gpio.IntFlags), 3, 2);
> + break;
> +
> + case 3: /* Pin Config [BYTE] (_PPI) */
> +
> + Descriptor->Gpio.PinConfig = (UINT8) InitializerOp->Asl.Value.Integer;
> + RsCreateByteField (InitializerOp, ACPI_RESTAG_PINCONFIG,
> + CurrentByteOffset + ASL_RESDESC_OFFSET (Gpio.PinConfig));
> + break;
> +
> + case 4: /* Debounce Timeout [WORD] (_DBT) */
> +
> + Descriptor->Gpio.DebounceTimeout = (UINT16) InitializerOp->Asl.Value.Integer;
> + RsCreateWordField (InitializerOp, ACPI_RESTAG_DEBOUNCETIME,
> + CurrentByteOffset + ASL_RESDESC_OFFSET (Gpio.DebounceTimeout));
> + break;
> +
> + case 5: /* ResSource [Optional Field - STRING] */
> +
> + if (ResSourceLength)
> + {
> + /* Copy string to the descriptor */
> +
> + strcpy (ResourceSource,
> + InitializerOp->Asl.Value.String);
> + }
> + break;
> +
> + case 6: /* Resource Index */
> +
> + if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
> + {
> + Descriptor->Gpio.ResSourceIndex = (UINT8) InitializerOp->Asl.Value.Integer;
> + }
> + break;
> +
> + case 7: /* Resource Usage (consumer/producer) */
> +
> + RsSetFlagBits16 (&Descriptor->Gpio.Flags, InitializerOp, 0, 1);
> + break;
> +
> + case 8: /* Resource Tag (Descriptor Name) */
> +
> + UtAttachNamepathToOwner (Op, InitializerOp);
> + break;
> +
> + case 9: /* Vendor Data (Optional - Buffer of BYTEs) (_VEN) */
> +
> + /*
> + * Always set the VendorOffset even if there is no Vendor Data.
> + * This field is required in order to calculate the length
> + * of the ResourceSource at runtime.
> + */
> + Descriptor->Gpio.VendorOffset = (UINT16)
> + ACPI_PTR_DIFF (VendorData, Descriptor);
> +
> + if (RsGetVendorData (InitializerOp, VendorData,
> + (CurrentByteOffset + Descriptor->Gpio.VendorOffset)))
> + {
> + Descriptor->Gpio.VendorLength = VendorLength;
> + }
> + break;
> +
> + default:
> + /*
> + * PINs come through here, repeatedly. Each PIN must be a DWORD.
> + * NOTE: there is no "length" field for this, so from ACPI spec:
> + * The number of pins in the table can be calculated from:
> + * PinCount = (Resource Source Name Offset - Pin Table Offset) / 2
> + * (implies resource source must immediately follow the pin list.)
> + * Name: _PIN
> + */
> + *InterruptList = (UINT16) InitializerOp->Asl.Value.Integer;
> + InterruptList++;
> +
> + /* Case 10: First interrupt number in list */
> +
> + if (i == 10)
> + {
> + if (InitializerOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
> + {
> + /* Must be at least one interrupt */
> +
> + AslError (ASL_ERROR, ASL_MSG_EX_INTERRUPT_LIST_MIN,
> + InitializerOp, NULL);
> + }
> +
> + /* Check now for duplicates in list */
> +
> + RsCheckListForDuplicates (InitializerOp);
> +
> + /* Create a named field at the start of the list */
> +
> + RsCreateDwordField (InitializerOp, ACPI_RESTAG_PIN,
> + CurrentByteOffset + Descriptor->Gpio.PinTableOffset);
> + }
> + break;
> + }
> +
> + InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
> + }
> +
> + return (Rnode);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: RsDoGpioIoDescriptor
> + *
> + * PARAMETERS: Op - Parent resource descriptor parse node
> + * CurrentByteOffset - Offset into the resource template AML
> + * buffer (to track references to the desc)
> + *
> + * RETURN: Completed resource node
> + *
> + * DESCRIPTION: Construct a long "GpioIo" descriptor
> + *
> + ******************************************************************************/
> +
> +ASL_RESOURCE_NODE *
> +RsDoGpioIoDescriptor (
> + ACPI_PARSE_OBJECT *Op,
> + UINT32 CurrentByteOffset)
> +{
> + AML_RESOURCE *Descriptor;
> + ACPI_PARSE_OBJECT *InitializerOp;
> + ASL_RESOURCE_NODE *Rnode;
> + char *ResourceSource = NULL;
> + UINT8 *VendorData = NULL;
> + UINT16 *InterruptList = NULL;
> + UINT16 ResSourceLength;
> + UINT16 VendorLength;
> + UINT16 InterruptLength;
> + UINT16 DescriptorSize;
> + UINT32 i;
> +
> +
> + InitializerOp = Op->Asl.Child;
> +
> + /*
> + * Calculate lengths for fields that have variable length:
> + * 1) Resource Source string
> + * 2) Vendor Data buffer
> + * 3) PIN (interrupt) list
> + */
> + ResSourceLength = RsGetStringDataLength (InitializerOp);
> + VendorLength = RsGetBufferDataLength (InitializerOp);
> + InterruptLength = RsGetInterruptDataLength (InitializerOp);
> +
> + DescriptorSize = ACPI_AML_SIZE_LARGE (AML_RESOURCE_GPIO) +
> + ResSourceLength + VendorLength + InterruptLength;
> +
> + /* Allocate the local resource node and initialize */
> +
> + Rnode = RsAllocateResourceNode (DescriptorSize + sizeof (AML_RESOURCE_LARGE_HEADER));
> +
> + Descriptor = Rnode->Buffer;
> + Descriptor->Gpio.ResourceLength = DescriptorSize;
> + Descriptor->Gpio.DescriptorType = ACPI_RESOURCE_NAME_GPIO;
> + Descriptor->Gpio.RevisionId = AML_RESOURCE_GPIO_REVISION;
> + Descriptor->Gpio.ConnectionType = AML_RESOURCE_GPIO_TYPE_IO;
> +
> + /* Build pointers to optional areas */
> +
> + InterruptList = ACPI_ADD_PTR (UINT16, Descriptor, sizeof (AML_RESOURCE_GPIO));
> + ResourceSource = ACPI_ADD_PTR (char, InterruptList, InterruptLength);
> + VendorData = ACPI_ADD_PTR (UINT8, ResourceSource, ResSourceLength);
> +
> + /* Setup offsets within the descriptor */
> +
> + Descriptor->Gpio.PinTableOffset = (UINT16)
> + ACPI_PTR_DIFF (InterruptList, Descriptor);
> +
> + Descriptor->Gpio.ResSourceOffset = (UINT16)
> + ACPI_PTR_DIFF (ResourceSource, Descriptor);
> +
> + DbgPrint (ASL_DEBUG_OUTPUT,
> + "%16s - Actual: %.2X, Base: %.2X, ResLen: %.2X, VendLen: %.2X, IntLen: %.2X\n",
> + "GpioIo", Descriptor->Gpio.ResourceLength, (UINT16) sizeof (AML_RESOURCE_GPIO),
> + ResSourceLength, VendorLength, InterruptLength);
> +
> + /* Process all child initialization nodes */
> +
> + for (i = 0; InitializerOp; i++)
> + {
> + switch (i)
> + {
> + case 0: /* Share Type [Flags] (_SHR) */
> +
> + RsSetFlagBits16 (&Descriptor->Gpio.IntFlags, InitializerOp, 3, 0);
> + RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTSHARE,
> + CurrentByteOffset + ASL_RESDESC_OFFSET (Gpio.IntFlags), 3);
> + break;
> +
> + case 1: /* Pin Config [BYTE] (_PPI) */
> +
> + Descriptor->Gpio.PinConfig = (UINT8) InitializerOp->Asl.Value.Integer;
> + RsCreateByteField (InitializerOp, ACPI_RESTAG_PINCONFIG,
> + CurrentByteOffset + ASL_RESDESC_OFFSET (Gpio.PinConfig));
> + break;
> +
> + case 2: /* Debounce Timeout [WORD] (_DBT) */
> +
> + Descriptor->Gpio.DebounceTimeout = (UINT16) InitializerOp->Asl.Value.Integer;
> + RsCreateWordField (InitializerOp, ACPI_RESTAG_DEBOUNCETIME,
> + CurrentByteOffset + ASL_RESDESC_OFFSET (Gpio.DebounceTimeout));
> + break;
> +
> + case 3: /* Drive Strength [WORD] (_DRS) */
> +
> + Descriptor->Gpio.DriveStrength = (UINT16) InitializerOp->Asl.Value.Integer;
> + RsCreateWordField (InitializerOp, ACPI_RESTAG_DRIVESTRENGTH,
> + CurrentByteOffset + ASL_RESDESC_OFFSET (Gpio.DriveStrength));
> + break;
> +
> + case 4: /* I/O Restriction [Flag] (_IOR) */
> +
> + RsSetFlagBits16 (&Descriptor->Gpio.IntFlags, InitializerOp, 0, 0);
> + RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_IORESTRICTION,
> + CurrentByteOffset + ASL_RESDESC_OFFSET (Gpio.IntFlags), 0, 2);
> + break;
> +
> + case 5: /* ResSource [Optional Field - STRING] */
> +
> + if (ResSourceLength)
> + {
> + /* Copy string to the descriptor */
> +
> + strcpy (ResourceSource,
> + InitializerOp->Asl.Value.String);
> + }
> + break;
> +
> + case 6: /* Resource Index */
> +
> + if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
> + {
> + Descriptor->Gpio.ResSourceIndex = (UINT8) InitializerOp->Asl.Value.Integer;
> + }
> + break;
> +
> + case 7: /* Resource Usage (consumer/producer) */
> +
> + RsSetFlagBits16 (&Descriptor->Gpio.Flags, InitializerOp, 0, 1);
> + break;
> +
> + case 8: /* Resource Tag (Descriptor Name) */
> +
> + UtAttachNamepathToOwner (Op, InitializerOp);
> + break;
> +
> + case 9: /* Vendor Data (Optional - Buffer of BYTEs) (_VEN) */
> +
> + /*
> + * Always set the VendorOffset even if there is no Vendor Data.
> + * This field is required in order to calculate the length
> + * of the ResourceSource at runtime.
> + */
> + Descriptor->Gpio.VendorOffset = (UINT16)
> + ACPI_PTR_DIFF (VendorData, Descriptor);
> +
> + if (RsGetVendorData (InitializerOp, VendorData,
> + (CurrentByteOffset + Descriptor->Gpio.VendorOffset)))
> + {
> + Descriptor->Gpio.VendorLength = VendorLength;
> + }
> + break;
> +
> + default:
> + /*
> + * PINs come through here, repeatedly. Each PIN must be a DWORD.
> + * NOTE: there is no "length" field for this, so from ACPI spec:
> + * The number of pins in the table can be calculated from:
> + * PinCount = (Resource Source Name Offset - Pin Table Offset) / 2
> + * (implies resource source must immediately follow the pin list.)
> + * Name: _PIN
> + */
> + *InterruptList = (UINT16) InitializerOp->Asl.Value.Integer;
> + InterruptList++;
> +
> + /* Case 10: First interrupt number in list */
> +
> + if (i == 10)
> + {
> + if (InitializerOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
> + {
> + /* Must be at least one interrupt */
> +
> + AslError (ASL_ERROR, ASL_MSG_EX_INTERRUPT_LIST_MIN,
> + InitializerOp, NULL);
> + }
> +
> + /* Check now for duplicates in list */
> +
> + RsCheckListForDuplicates (InitializerOp);
> +
> + /* Create a named field at the start of the list */
> +
> + RsCreateDwordField (InitializerOp, ACPI_RESTAG_PIN,
> + CurrentByteOffset + Descriptor->Gpio.PinTableOffset);
> + }
> + break;
> + }
> +
> + InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
> + }
> +
> + return (Rnode);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: RsDoI2cSerialBusDescriptor
> + *
> + * PARAMETERS: Op - Parent resource descriptor parse node
> + * CurrentByteOffset - Offset into the resource template AML
> + * buffer (to track references to the desc)
> + *
> + * RETURN: Completed resource node
> + *
> + * DESCRIPTION: Construct a long "I2cSerialBus" descriptor
> + *
> + ******************************************************************************/
> +
> +ASL_RESOURCE_NODE *
> +RsDoI2cSerialBusDescriptor (
> + ACPI_PARSE_OBJECT *Op,
> + UINT32 CurrentByteOffset)
> +{
> + AML_RESOURCE *Descriptor;
> + ACPI_PARSE_OBJECT *InitializerOp;
> + ASL_RESOURCE_NODE *Rnode;
> + char *ResourceSource = NULL;
> + UINT8 *VendorData = NULL;
> + UINT16 ResSourceLength;
> + UINT16 VendorLength;
> + UINT16 DescriptorSize;
> + UINT32 i;
> +
> +
> + InitializerOp = Op->Asl.Child;
> +
> + /*
> + * Calculate lengths for fields that have variable length:
> + * 1) Resource Source string
> + * 2) Vendor Data buffer
> + */
> + ResSourceLength = RsGetStringDataLength (InitializerOp);
> + VendorLength = RsGetBufferDataLength (InitializerOp);
> +
> + DescriptorSize = ACPI_AML_SIZE_LARGE (AML_RESOURCE_I2C_SERIALBUS) +
> + ResSourceLength + VendorLength;
> +
> + /* Allocate the local resource node and initialize */
> +
> + Rnode = RsAllocateResourceNode (DescriptorSize + sizeof (AML_RESOURCE_LARGE_HEADER));
> +
> + Descriptor = Rnode->Buffer;
> + Descriptor->I2cSerialBus.ResourceLength = DescriptorSize;
> + Descriptor->I2cSerialBus.DescriptorType = ACPI_RESOURCE_NAME_SERIAL_BUS;
> + Descriptor->I2cSerialBus.RevisionId = AML_RESOURCE_I2C_REVISION;
> + Descriptor->I2cSerialBus.TypeRevisionId = AML_RESOURCE_I2C_TYPE_REVISION;
> + Descriptor->I2cSerialBus.Type = AML_RESOURCE_I2C_SERIALBUSTYPE;
> + Descriptor->I2cSerialBus.TypeDataLength = AML_RESOURCE_I2C_MIN_DATA_LEN + VendorLength;
> +
> + /* Build pointers to optional areas */
> +
> + VendorData = ACPI_ADD_PTR (UINT8, Descriptor, sizeof (AML_RESOURCE_I2C_SERIALBUS));
> + ResourceSource = ACPI_ADD_PTR (char, VendorData, VendorLength);
> +
> + DbgPrint (ASL_DEBUG_OUTPUT,
> + "%16s - Actual: %.2X, Base: %.2X, ResLen: %.2X, VendLen: %.2X, TypLen: %.2X\n",
> + "I2cSerialBus", Descriptor->I2cSerialBus.ResourceLength,
> + (UINT16) sizeof (AML_RESOURCE_I2C_SERIALBUS), ResSourceLength,
> + VendorLength, Descriptor->I2cSerialBus.TypeDataLength);
> +
> + /* Process all child initialization nodes */
> +
> + for (i = 0; InitializerOp; i++)
> + {
> + switch (i)
> + {
> + case 0: /* Slave Address [WORD] (_ADR) */
> +
> + Descriptor->I2cSerialBus.SlaveAddress = (UINT16) InitializerOp->Asl.Value.Integer;
> + RsCreateWordField (InitializerOp, ACPI_RESTAG_ADDRESS,
> + CurrentByteOffset + ASL_RESDESC_OFFSET (I2cSerialBus.SlaveAddress));
> + break;
> +
> + case 1: /* Slave Mode [Flag] (_SLV) */
> +
> + RsSetFlagBits (&Descriptor->I2cSerialBus.Flags, InitializerOp, 0, 0);
> + RsCreateBitField (InitializerOp, ACPI_RESTAG_SLAVEMODE,
> + CurrentByteOffset + ASL_RESDESC_OFFSET (I2cSerialBus.Flags), 0);
> + break;
> +
> + case 2: /* Connection Speed [DWORD] (_SPE) */
> +
> + Descriptor->I2cSerialBus.ConnectionSpeed = (UINT32) InitializerOp->Asl.Value.Integer;
> + RsCreateDwordField (InitializerOp, ACPI_RESTAG_SPEED,
> + CurrentByteOffset + ASL_RESDESC_OFFSET (I2cSerialBus.ConnectionSpeed));
> + break;
> +
> + case 3: /* Addressing Mode [Flag] (_MOD) */
> +
> + RsSetFlagBits16 (&Descriptor->I2cSerialBus.TypeSpecificFlags, InitializerOp, 0, 0);
> + RsCreateBitField (InitializerOp, ACPI_RESTAG_MODE,
> + CurrentByteOffset + ASL_RESDESC_OFFSET (I2cSerialBus.TypeSpecificFlags), 0);
> + break;
> +
> + case 4: /* ResSource [Optional Field - STRING] */
> +
> + if (ResSourceLength)
> + {
> + /* Copy string to the descriptor */
> +
> + strcpy (ResourceSource,
> + InitializerOp->Asl.Value.String);
> + }
> + break;
> +
> + case 5: /* Resource Index */
> +
> + if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
> + {
> + Descriptor->I2cSerialBus.ResSourceIndex = (UINT8) InitializerOp->Asl.Value.Integer;
> + }
> + break;
> +
> + case 6: /* Resource Usage (consumer/producer) */
> +
> + RsSetFlagBits (&Descriptor->I2cSerialBus.Flags, InitializerOp, 1, 1);
> + break;
> +
> + case 7: /* Resource Tag (Descriptor Name) */
> +
> + UtAttachNamepathToOwner (Op, InitializerOp);
> + break;
> +
> + case 8: /* Vendor Data (Optional - Buffer of BYTEs) (_VEN) */
> +
> + RsGetVendorData (InitializerOp, VendorData,
> + CurrentByteOffset + sizeof (AML_RESOURCE_I2C_SERIALBUS));
> + break;
> +
> + default: /* Ignore any extra nodes */
> + break;
> + }
> +
> + InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
> + }
> +
> + return (Rnode);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: RsDoSpiSerialBusDescriptor
> + *
> + * PARAMETERS: Op - Parent resource descriptor parse node
> + * CurrentByteOffset - Offset into the resource template AML
> + * buffer (to track references to the desc)
> + *
> + * RETURN: Completed resource node
> + *
> + * DESCRIPTION: Construct a long "SPI Serial Bus" descriptor
> + *
> + ******************************************************************************/
> +
> +ASL_RESOURCE_NODE *
> +RsDoSpiSerialBusDescriptor (
> + ACPI_PARSE_OBJECT *Op,
> + UINT32 CurrentByteOffset)
> +{
> + AML_RESOURCE *Descriptor;
> + ACPI_PARSE_OBJECT *InitializerOp;
> + ASL_RESOURCE_NODE *Rnode;
> + char *ResourceSource = NULL;
> + UINT8 *VendorData = NULL;
> + UINT16 ResSourceLength;
> + UINT16 VendorLength;
> + UINT16 DescriptorSize;
> + UINT32 i;
> +
> +
> + InitializerOp = Op->Asl.Child;
> +
> + /*
> + * Calculate lengths for fields that have variable length:
> + * 1) Resource Source string
> + * 2) Vendor Data buffer
> + */
> + ResSourceLength = RsGetStringDataLength (InitializerOp);
> + VendorLength = RsGetBufferDataLength (InitializerOp);
> +
> + DescriptorSize = ACPI_AML_SIZE_LARGE (AML_RESOURCE_SPI_SERIALBUS) +
> + ResSourceLength + VendorLength;
> +
> + /* Allocate the local resource node and initialize */
> +
> + Rnode = RsAllocateResourceNode (DescriptorSize + sizeof (AML_RESOURCE_LARGE_HEADER));
> +
> + Descriptor = Rnode->Buffer;
> + Descriptor->SpiSerialBus.ResourceLength = DescriptorSize;
> + Descriptor->SpiSerialBus.DescriptorType = ACPI_RESOURCE_NAME_SERIAL_BUS;
> + Descriptor->SpiSerialBus.RevisionId = AML_RESOURCE_SPI_REVISION;
> + Descriptor->SpiSerialBus.TypeRevisionId = AML_RESOURCE_SPI_TYPE_REVISION;
> + Descriptor->SpiSerialBus.Type = AML_RESOURCE_SPI_SERIALBUSTYPE;
> + Descriptor->SpiSerialBus.TypeDataLength = AML_RESOURCE_SPI_MIN_DATA_LEN + VendorLength;
> +
> + /* Build pointers to optional areas */
> +
> + VendorData = ACPI_ADD_PTR (UINT8, Descriptor, sizeof (AML_RESOURCE_SPI_SERIALBUS));
> + ResourceSource = ACPI_ADD_PTR (char, VendorData, VendorLength);
> +
> + DbgPrint (ASL_DEBUG_OUTPUT,
> + "%16s - Actual: %.2X, Base: %.2X, ResLen: %.2X, VendLen: %.2X, TypLen: %.2X\n",
> + "SpiSerialBus", Descriptor->SpiSerialBus.ResourceLength,
> + (UINT16) sizeof (AML_RESOURCE_SPI_SERIALBUS), ResSourceLength,
> + VendorLength, Descriptor->SpiSerialBus.TypeDataLength);
> +
> + /* Process all child initialization nodes */
> +
> + for (i = 0; InitializerOp; i++)
> + {
> + switch (i)
> + {
> + case 0: /* Device Selection [WORD] (_ADR) */
> +
> + Descriptor->SpiSerialBus.DeviceSelection = (UINT16) InitializerOp->Asl.Value.Integer;
> + RsCreateWordField (InitializerOp, ACPI_RESTAG_ADDRESS,
> + CurrentByteOffset + ASL_RESDESC_OFFSET (SpiSerialBus.DeviceSelection));
> + break;
> +
> + case 1: /* Device Polarity [Flag] (_DPL) */
> +
> + RsSetFlagBits16 (&Descriptor->SpiSerialBus.TypeSpecificFlags, InitializerOp, 1, 0);
> + RsCreateBitField (InitializerOp, ACPI_RESTAG_DEVICEPOLARITY,
> + CurrentByteOffset + ASL_RESDESC_OFFSET (SpiSerialBus.TypeSpecificFlags), 1);
> + break;
> +
> + case 2: /* Wire Mode [Flag] (_MOD) */
> +
> + RsSetFlagBits16 (&Descriptor->SpiSerialBus.TypeSpecificFlags, InitializerOp, 0, 0);
> + RsCreateBitField (InitializerOp, ACPI_RESTAG_MODE,
> + CurrentByteOffset + ASL_RESDESC_OFFSET (SpiSerialBus.TypeSpecificFlags), 0);
> + break;
> +
> + case 3: /* Device Bit Length [BYTE] (_LEN) */
> +
> + Descriptor->SpiSerialBus.DataBitLength = (UINT8) InitializerOp->Asl.Value.Integer;
> + RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
> + CurrentByteOffset + ASL_RESDESC_OFFSET (SpiSerialBus.DataBitLength));
> + break;
> +
> + case 4: /* Slave Mode [Flag] (_SLV) */
> +
> + RsSetFlagBits (&Descriptor->SpiSerialBus.Flags, InitializerOp, 0, 0);
> + RsCreateBitField (InitializerOp, ACPI_RESTAG_SLAVEMODE,
> + CurrentByteOffset + ASL_RESDESC_OFFSET (SpiSerialBus.Flags), 0);
> + break;
> +
> + case 5: /* Connection Speed [DWORD] (_SPE) */
> +
> + Descriptor->SpiSerialBus.ConnectionSpeed = (UINT32) InitializerOp->Asl.Value.Integer;
> + RsCreateDwordField (InitializerOp, ACPI_RESTAG_SPEED,
> + CurrentByteOffset + ASL_RESDESC_OFFSET (SpiSerialBus.ConnectionSpeed));
> + break;
> +
> + case 6: /* Clock Polarity [BYTE] (_POL) */
> +
> + Descriptor->SpiSerialBus.ClockPolarity = (UINT8) InitializerOp->Asl.Value.Integer;
> + RsCreateByteField (InitializerOp, ACPI_RESTAG_POLARITY,
> + CurrentByteOffset + ASL_RESDESC_OFFSET (SpiSerialBus.ClockPolarity));
> + break;
> +
> + case 7: /* Clock Phase [BYTE] (_PHA) */
> +
> + Descriptor->SpiSerialBus.ClockPhase = (UINT8) InitializerOp->Asl.Value.Integer;
> + RsCreateByteField (InitializerOp, ACPI_RESTAG_PHASE,
> + CurrentByteOffset + ASL_RESDESC_OFFSET (SpiSerialBus.ClockPhase));
> + break;
> +
> + case 8: /* ResSource [Optional Field - STRING] */
> +
> + if (ResSourceLength)
> + {
> + /* Copy string to the descriptor */
> +
> + strcpy (ResourceSource,
> + InitializerOp->Asl.Value.String);
> + }
> + break;
> +
> + case 9: /* Resource Index */
> +
> + if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
> + {
> + Descriptor->SpiSerialBus.ResSourceIndex = (UINT8) InitializerOp->Asl.Value.Integer;
> + }
> + break;
> +
> + case 10: /* Resource Usage (consumer/producer) */
> +
> + RsSetFlagBits (&Descriptor->SpiSerialBus.Flags, InitializerOp, 1, 1);
> + break;
> +
> + case 11: /* Resource Tag (Descriptor Name) */
> +
> + UtAttachNamepathToOwner (Op, InitializerOp);
> + break;
> +
> + case 12: /* Vendor Data (Optional - Buffer of BYTEs) (_VEN) */
> +
> + RsGetVendorData (InitializerOp, VendorData,
> + CurrentByteOffset + sizeof (AML_RESOURCE_SPI_SERIALBUS));
> + break;
> +
> + default: /* Ignore any extra nodes */
> + break;
> + }
> +
> + InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
> + }
> +
> + return (Rnode);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: RsDoUartSerialBusDescriptor
> + *
> + * PARAMETERS: Op - Parent resource descriptor parse node
> + * CurrentByteOffset - Offset into the resource template AML
> + * buffer (to track references to the desc)
> + *
> + * RETURN: Completed resource node
> + *
> + * DESCRIPTION: Construct a long "UART Serial Bus" descriptor
> + *
> + ******************************************************************************/
> +
> +ASL_RESOURCE_NODE *
> +RsDoUartSerialBusDescriptor (
> + ACPI_PARSE_OBJECT *Op,
> + UINT32 CurrentByteOffset)
> +{
> + AML_RESOURCE *Descriptor;
> + ACPI_PARSE_OBJECT *InitializerOp;
> + ASL_RESOURCE_NODE *Rnode;
> + char *ResourceSource = NULL;
> + UINT8 *VendorData = NULL;
> + UINT16 ResSourceLength;
> + UINT16 VendorLength;
> + UINT16 DescriptorSize;
> + UINT32 i;
> +
> +
> + InitializerOp = Op->Asl.Child;
> +
> + /*
> + * Calculate lengths for fields that have variable length:
> + * 1) Resource Source string
> + * 2) Vendor Data buffer
> + */
> + ResSourceLength = RsGetStringDataLength (InitializerOp);
> + VendorLength = RsGetBufferDataLength (InitializerOp);
> +
> + DescriptorSize = ACPI_AML_SIZE_LARGE (AML_RESOURCE_UART_SERIALBUS) +
> + ResSourceLength + VendorLength;
> +
> + /* Allocate the local resource node and initialize */
> +
> + Rnode = RsAllocateResourceNode (DescriptorSize + sizeof (AML_RESOURCE_LARGE_HEADER));
> +
> + Descriptor = Rnode->Buffer;
> + Descriptor->UartSerialBus.ResourceLength = DescriptorSize;
> + Descriptor->UartSerialBus.DescriptorType = ACPI_RESOURCE_NAME_SERIAL_BUS;
> + Descriptor->UartSerialBus.RevisionId = AML_RESOURCE_UART_REVISION;
> + Descriptor->UartSerialBus.TypeRevisionId = AML_RESOURCE_UART_TYPE_REVISION;
> + Descriptor->UartSerialBus.Type = AML_RESOURCE_UART_SERIALBUSTYPE;
> + Descriptor->UartSerialBus.TypeDataLength = AML_RESOURCE_UART_MIN_DATA_LEN + VendorLength;
> +
> + /* Build pointers to optional areas */
> +
> + VendorData = ACPI_ADD_PTR (UINT8, Descriptor, sizeof (AML_RESOURCE_UART_SERIALBUS));
> + ResourceSource = ACPI_ADD_PTR (char, VendorData, VendorLength);
> +
> + DbgPrint (ASL_DEBUG_OUTPUT,
> + "%16s - Actual: %.2X, Base: %.2X, ResLen: %.2X, VendLen: %.2X, TypLen: %.2X\n",
> + "UartSerialBus", Descriptor->UartSerialBus.ResourceLength,
> + (UINT16) sizeof (AML_RESOURCE_UART_SERIALBUS), ResSourceLength,
> + VendorLength, Descriptor->UartSerialBus.TypeDataLength);
> +
> + /* Process all child initialization nodes */
> +
> + for (i = 0; InitializerOp; i++)
> + {
> + switch (i)
> + {
> + case 0: /* Connection Speed (Baud Rate) [DWORD] (_SPE) */
> +
> + Descriptor->UartSerialBus.DefaultBaudRate = (UINT32) InitializerOp->Asl.Value.Integer;
> + RsCreateDwordField (InitializerOp, ACPI_RESTAG_SPEED,
> + CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.DefaultBaudRate));
> + break;
> +
> + case 1: /* Bits Per Byte [Flags] (_LEN) */
> +
> + RsSetFlagBits16 (&Descriptor->UartSerialBus.TypeSpecificFlags, InitializerOp, 4, 3);
> + RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_LENGTH,
> + CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.TypeSpecificFlags), 4, 3);
> + break;
> +
> + case 2: /* Stop Bits [Flags] (_STB) */
> +
> + RsSetFlagBits16 (&Descriptor->UartSerialBus.TypeSpecificFlags, InitializerOp, 2, 1);
> + RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_STOPBITS,
> + CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.TypeSpecificFlags), 2, 2);
> + break;
> +
> + case 3: /* Lines In Use [BYTE] (_LIN) */
> +
> + Descriptor->UartSerialBus.LinesEnabled = (UINT8) InitializerOp->Asl.Value.Integer;
> + RsCreateByteField (InitializerOp, ACPI_RESTAG_LINE,
> + CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.LinesEnabled));
> + break;
> +
> + case 4: /* Endianness [Flag] (_END) */
> +
> + RsSetFlagBits16 (&Descriptor->UartSerialBus.TypeSpecificFlags, InitializerOp, 7, 0);
> + RsCreateBitField (InitializerOp, ACPI_RESTAG_ENDIANNESS,
> + CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.TypeSpecificFlags), 7);
> + break;
> +
> + case 5: /* Parity [BYTE] (_PAR) */
> +
> + Descriptor->UartSerialBus.Parity = (UINT8) InitializerOp->Asl.Value.Integer;
> + RsCreateByteField (InitializerOp, ACPI_RESTAG_PARITY,
> + CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.Parity));
> + break;
> +
> + case 6: /* Flow Control [Flags] (_FLC) */
> +
> + RsSetFlagBits16 (&Descriptor->UartSerialBus.TypeSpecificFlags, InitializerOp, 0, 0);
> + RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_FLOWCONTROL,
> + CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.TypeSpecificFlags), 0, 2);
> + break;
> +
> + case 7: /* Rx Buffer Size [WORD] (_RXL) */
> +
> + Descriptor->UartSerialBus.RxFifoSize = (UINT16) InitializerOp->Asl.Value.Integer;
> + RsCreateWordField (InitializerOp, ACPI_RESTAG_LENGTH_RX,
> + CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.RxFifoSize));
> + break;
> +
> + case 8: /* Tx Buffer Size [WORD] (_TXL) */
> +
> + Descriptor->UartSerialBus.TxFifoSize = (UINT16) InitializerOp->Asl.Value.Integer;
> + RsCreateWordField (InitializerOp, ACPI_RESTAG_LENGTH_TX,
> + CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.TxFifoSize));
> + break;
> +
> + case 9: /* ResSource [Optional Field - STRING] */
> +
> + if (ResSourceLength)
> + {
> + /* Copy string to the descriptor */
> +
> + strcpy (ResourceSource,
> + InitializerOp->Asl.Value.String);
> + }
> + break;
> +
> + case 10: /* Resource Index */
> +
> + if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
> + {
> + Descriptor->UartSerialBus.ResSourceIndex = (UINT8) InitializerOp->Asl.Value.Integer;
> + }
> + break;
> +
> + case 11: /* Resource Usage (consumer/producer) */
> +
> + RsSetFlagBits (&Descriptor->UartSerialBus.Flags, InitializerOp, 1, 1);
> +
> + /*
> + * Slave Mode [Flag] (_SLV)
> + *
> + * Note: There is no SlaveMode argument to the UartSerialBus macro, but
> + * we add this name anyway to allow the flag to be set by ASL in the
> + * rare case where there is a slave mode associated with the UART.
> + */
> + RsCreateBitField (InitializerOp, ACPI_RESTAG_SLAVEMODE,
> + CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.Flags), 0);
> + break;
> +
> + case 12: /* Resource Tag (Descriptor Name) */
> +
> + UtAttachNamepathToOwner (Op, InitializerOp);
> + break;
> +
> + case 13: /* Vendor Data (Optional - Buffer of BYTEs) (_VEN) */
> +
> + RsGetVendorData (InitializerOp, VendorData,
> + CurrentByteOffset + sizeof (AML_RESOURCE_UART_SERIALBUS));
> + break;
> +
> + default: /* Ignore any extra nodes */
> + break;
> + }
> +
> + InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
> + }
> +
> + return (Rnode);
> +}
> diff --git a/src/acpica/source/compiler/aslsupport.l b/src/acpica/source/compiler/aslsupport.l
> new file mode 100644
> index 0000000..cdaf2b8
> --- /dev/null
> +++ b/src/acpica/source/compiler/aslsupport.l
> @@ -0,0 +1,854 @@
> +
> +/******************************************************************************
> + *
> + * Module Name: aslsupport.l - Flex/lex scanner C support routines.
> + * NOTE: Included into aslcompile.l, not compiled by itself.
> + *
> + *****************************************************************************/
> +
> +/******************************************************************************
> + *
> + * 1. Copyright Notice
> + *
> + * Some or all of this work - Copyright (c) 1999 - 2012, Intel Corp.
> + * All rights reserved.
> + *
> + * 2. License
> + *
> + * 2.1. This is your license from Intel Corp. under its intellectual property
> + * rights. You may have additional license terms from the party that provided
> + * you this software, covering your right to use that party's intellectual
> + * property rights.
> + *
> + * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
> + * copy of the source code appearing in this file ("Covered Code") an
> + * irrevocable, perpetual, worldwide license under Intel's copyrights in the
> + * base code distributed originally by Intel ("Original Intel Code") to copy,
> + * make derivatives, distribute, use and display any portion of the Covered
> + * Code in any form, with the right to sublicense such rights; and
> + *
> + * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
> + * license (with the right to sublicense), under only those claims of Intel
> + * patents that are infringed by the Original Intel Code, to make, use, sell,
> + * offer to sell, and import the Covered Code and derivative works thereof
> + * solely to the minimum extent necessary to exercise the above copyright
> + * license, and in no event shall the patent license extend to any additions
> + * to or modifications of the Original Intel Code. No other license or right
> + * is granted directly or by implication, estoppel or otherwise;
> + *
> + * The above copyright and patent license is granted only if the following
> + * conditions are met:
> + *
> + * 3. Conditions
> + *
> + * 3.1. Redistribution of Source with Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification with rights to further distribute source must include
> + * the above Copyright Notice, the above License, this list of Conditions,
> + * and the following Disclaimer and Export Compliance provision. In addition,
> + * Licensee must cause all Covered Code to which Licensee contributes to
> + * contain a file documenting the changes Licensee made to create that Covered
> + * Code and the date of any change. Licensee must include in that file the
> + * documentation of any changes made by any predecessor Licensee. Licensee
> + * must include a prominent statement that the modification is derived,
> + * directly or indirectly, from Original Intel Code.
> + *
> + * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification without rights to further distribute source must
> + * include the following Disclaimer and Export Compliance provision in the
> + * documentation and/or other materials provided with distribution. In
> + * addition, Licensee may not authorize further sublicense of source of any
> + * portion of the Covered Code, and must include terms to the effect that the
> + * license from Licensee to its licensee is limited to the intellectual
> + * property embodied in the software Licensee provides to its licensee, and
> + * not to intellectual property embodied in modifications its licensee may
> + * make.
> + *
> + * 3.3. Redistribution of Executable. Redistribution in executable form of any
> + * substantial portion of the Covered Code or modification must reproduce the
> + * above Copyright Notice, and the following Disclaimer and Export Compliance
> + * provision in the documentation and/or other materials provided with the
> + * distribution.
> + *
> + * 3.4. Intel retains all right, title, and interest in and to the Original
> + * Intel Code.
> + *
> + * 3.5. Neither the name Intel nor any other trademark owned or controlled by
> + * Intel shall be used in advertising or otherwise to promote the sale, use or
> + * other dealings in products derived from or relating to the Covered Code
> + * without prior written authorization from Intel.
> + *
> + * 4. Disclaimer and Export Compliance
> + *
> + * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
> + * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
> + * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
> + * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
> + * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
> + * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
> + * PARTICULAR PURPOSE.
> + *
> + * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
> + * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
> + * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
> + * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
> + * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
> + * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
> + * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
> + * LIMITED REMEDY.
> + *
> + * 4.3. Licensee shall not export, either directly or indirectly, any of this
> + * software or system incorporating such software without first obtaining any
> + * required license or other approval from the U. S. Department of Commerce or
> + * any other agency or department of the United States Government. In the
> + * event Licensee exports any such software from the United States or
> + * re-exports any such software from a foreign destination, Licensee shall
> + * ensure that the distribution and export/re-export of the software is in
> + * compliance with all laws, regulations, orders, or other restrictions of the
> + * U.S. Export Administration Regulations. Licensee agrees that neither it nor
> + * any of its subsidiaries will export/re-export any technical data, process,
> + * software, or service, directly or indirectly, to any country for which the
> + * United States government or any agency thereof requires an export license,
> + * other governmental approval, or letter of assurance, without first obtaining
> + * such license, approval or letter.
> + *
> + *****************************************************************************/
> +
> +
> +/* Configuration */
> +
> +#define ASL_SPACES_PER_TAB 4
> +
> +#define ASL_NORMAL_CHAR 0
> +#define ASL_ESCAPE_SEQUENCE 1
> +#define ASL_OCTAL_CONSTANT 2
> +#define ASL_HEX_CONSTANT 3
> +
> +
> +/* File node - used for "Include" operator file stack */
> +
> +typedef struct asl_file_node
> +{
> + FILE *File;
> + UINT32 CurrentLineNumber;
> + YY_BUFFER_STATE State;
> + char *Filename;
> + struct asl_file_node *Next;
> +
> +} ASL_FILE_NODE;
> +
> +/* File stack for the "Include" operator (NOT #include operator) */
> +
> +ASL_FILE_NODE *Gbl_IncludeFileStack = NULL;
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AslDoLineDirective
> + *
> + * PARAMETERS: None. Uses input() to access current source code line
> + *
> + * RETURN: Updates global line number and filename
> + *
> + * DESCRIPTION: Handle #line directives emitted by the preprocessor.
> + *
> + * The #line directive is emitted by the preprocesser, and is used to
> + * pass through line numbers from the original source code file to the
> + * preprocessor output file (.i). This allows any compiler-generated
> + * error messages to be displayed with the correct line number.
> + *
> + ******************************************************************************/
> +
> +static void
> +AslDoLineDirective (
> + void)
> +{
> + char c;
> + char *Token;
> + UINT32 LineNumber;
> + char *Filename;
> +
> +
> + /* Eat the entire line that contains the #line directive */
> +
> + while ((c = (char) input()) != '\n' && c != EOF)
> + {
> + AslInsertLineBuffer (c);
> + }
> + AslInsertLineBuffer (0);
> +
> + /* First argument is the actual line number */
> +
> + Token = strtok (Gbl_CurrentLineBuffer, " ");
> + if (!Token)
> + {
> + goto ResetAndExit;
> + }
> +
> + /* Convert line number. Subtract one to handle _this_ line */
> +
> + LineNumber = (UINT32) UtDoConstant (Token);
> + FlSetLineNumber (LineNumber - 1);
> +
> + /* Second argument is the optional filename (in double quotes) */
> +
> + Token = strtok (NULL, " \"");
> + if (Token)
> + {
> + Filename = ACPI_ALLOCATE_ZEROED (strlen (Token) + 1);
> + strcpy (Filename, Token);
> + FlSetFilename (Filename);
> + }
> +
> + /* Third argument is not supported at this time */
> +
> +ResetAndExit:
> + AslResetCurrentLineBuffer ();
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AslPopInputFileStack
> + *
> + * PARAMETERS: None
> + *
> + * RETURN: 0 if a node was popped, -1 otherwise
> + *
> + * DESCRIPTION: Pop the top of the input file stack and point the parser to
> + * the saved parse buffer contained in the fnode. Also, set the
> + * global line counters to the saved values. This function is
> + * called when an include file reaches EOF.
> + *
> + ******************************************************************************/
> +
> +int
> +AslPopInputFileStack (
> + void)
> +{
> + ASL_FILE_NODE *Fnode;
> +
> +
> + Fnode = Gbl_IncludeFileStack;
> + DbgPrint (ASL_PARSE_OUTPUT, "\nPop InputFile Stack, Fnode %p\n\n", Fnode);
> +
> + if (!Fnode)
> + {
> + return (-1);
> + }
> +
> + /* Close the current include file */
> +
> + fclose (yyin);
> +
> + /* Update the top-of-stack */
> +
> + Gbl_IncludeFileStack = Fnode->Next;
> +
> + /* Reset global line counter and filename */
> +
> + Gbl_Files[ASL_FILE_INPUT].Filename = Fnode->Filename;
> + Gbl_CurrentLineNumber = Fnode->CurrentLineNumber;
> +
> + /* Point the parser to the popped file */
> +
> + yy_delete_buffer (YY_CURRENT_BUFFER);
> + yy_switch_to_buffer (Fnode->State);
> +
> + /* All done with this node */
> +
> + ACPI_FREE (Fnode);
> + return (0);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AslPushInputFileStack
> + *
> + * PARAMETERS: InputFile - Open file pointer
> + * Filename - Name of the file
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Push the InputFile onto the file stack, and point the parser
> + * to this file. Called when an include file is successfully
> + * opened.
> + *
> + ******************************************************************************/
> +
> +void
> +AslPushInputFileStack (
> + FILE *InputFile,
> + char *Filename)
> +{
> + ASL_FILE_NODE *Fnode;
> + YY_BUFFER_STATE State;
> +
> +
> + /* Save the current state in an Fnode */
> +
> + Fnode = UtLocalCalloc (sizeof (ASL_FILE_NODE));
> +
> + Fnode->File = yyin;
> + Fnode->Next = Gbl_IncludeFileStack;
> + Fnode->State = YY_CURRENT_BUFFER;
> + Fnode->CurrentLineNumber = Gbl_CurrentLineNumber;
> + Fnode->Filename = Gbl_Files[ASL_FILE_INPUT].Filename;
> +
> + /* Push it on the stack */
> +
> + Gbl_IncludeFileStack = Fnode;
> +
> + /* Point the parser to this file */
> +
> + State = yy_create_buffer (InputFile, YY_BUF_SIZE);
> + yy_switch_to_buffer (State);
> +
> + DbgPrint (ASL_PARSE_OUTPUT, "\nPush InputFile Stack, returning %p\n\n", InputFile);
> +
> + /* Reset the global line count and filename */
> +
> + Gbl_Files[ASL_FILE_INPUT].Filename = Filename;
> + Gbl_CurrentLineNumber = 1;
> + yyin = InputFile;
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AslResetCurrentLineBuffer
> + *
> + * PARAMETERS: None
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Reset the Line Buffer to zero, increment global line numbers.
> + *
> + ******************************************************************************/
> +
> +void
> +AslResetCurrentLineBuffer (
> + void)
> +{
> +
> + if (Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle)
> + {
> + FlWriteFile (ASL_FILE_SOURCE_OUTPUT, Gbl_CurrentLineBuffer,
> + Gbl_LineBufPtr - Gbl_CurrentLineBuffer);
> + }
> +
> + Gbl_CurrentLineOffset += Gbl_CurrentColumn;
> + Gbl_CurrentColumn = 0;
> +
> + Gbl_CurrentLineNumber++;
> + Gbl_LogicalLineNumber++;
> + Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AslInsertLineBuffer
> + *
> + * PARAMETERS: SourceChar - One char from the input ASL source file
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Put one character of the source file into the temp line buffer
> + *
> + ******************************************************************************/
> +
> +void
> +AslInsertLineBuffer (
> + int SourceChar)
> +{
> + UINT32 i;
> + UINT32 Count = 1;
> +
> +
> + if (SourceChar == EOF)
> + {
> + return;
> + }
> +
> + Gbl_InputByteCount++;
> +
> + /* Handle tabs. Convert to spaces */
> +
> + if (SourceChar == '\t')
> + {
> + SourceChar = ' ';
> + Count = ASL_SPACES_PER_TAB -
> + (Gbl_CurrentColumn & (ASL_SPACES_PER_TAB-1));
> + }
> +
> + for (i = 0; i < Count; i++)
> + {
> + Gbl_CurrentColumn++;
> +
> + /* Insert the character into the line buffer */
> +
> + *Gbl_LineBufPtr = (UINT8) SourceChar;
> + Gbl_LineBufPtr++;
> +
> + if (Gbl_LineBufPtr > (Gbl_CurrentLineBuffer + (ASL_LINE_BUFFER_SIZE - 1)))
> + {
> +#if 0
> + /*
> + * Warning if we have split a long source line.
> + * <Probably overkill>
> + */
> + sprintf (MsgBuffer, "Max %u", ASL_LINE_BUFFER_SIZE);
> + AslCommonError (ASL_WARNING, ASL_MSG_LONG_LINE,
> + Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
> + Gbl_CurrentLineOffset, Gbl_CurrentColumn,
> + Gbl_Files[ASL_FILE_INPUT].Filename, MsgBuffer);
> +#endif
> +
> + AslResetCurrentLineBuffer ();
> + }
> + else if (SourceChar == '\n')
> + {
> + /* End of line */
> +
> + AslResetCurrentLineBuffer ();
> + }
> + }
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: count
> + *
> + * PARAMETERS: yytext - Contains the matched keyword.
> + * Type - Keyword/Character type:
> + * 0 = anything except a keyword
> + * 1 = pseudo-keywords
> + * 2 = non-executable ASL keywords
> + * 3 = executable ASL keywords
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Count keywords and put them into the line buffer
> + *
> + ******************************************************************************/
> +
> +static void
> +count (
> + int Type)
> +{
> + int i;
> +
> +
> + switch (Type)
> + {
> + case 2:
> + TotalKeywords++;
> + TotalNamedObjects++;
> + break;
> +
> + case 3:
> + TotalKeywords++;
> + TotalExecutableOpcodes++;
> + break;
> + }
> +
> + for (i = 0; (yytext[i] != 0) && (yytext[i] != EOF); i++)
> + {
> + AslInsertLineBuffer (yytext[i]);
> + *Gbl_LineBufPtr = 0;
> + }
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AslDoComment
> + *
> + * PARAMETERS: none
> + *
> + * RETURN: none
> + *
> + * DESCRIPTION: Process a standard comment.
> + *
> + ******************************************************************************/
> +
> +static char
> +AslDoComment (
> + void)
> +{
> + char c;
> + char c1 = 0;
> +
> +
> + AslInsertLineBuffer ('/');
> + AslInsertLineBuffer ('*');
> +
> +loop:
> +
> + /* Eat chars until end-of-comment */
> +
> + while ((c = (char) input()) != '*' && c != EOF)
> + {
> + AslInsertLineBuffer (c);
> + c1 = c;
> + }
> +
> + if (c == EOF)
> + {
> + goto EarlyEOF;
> + }
> +
> + /*
> + * Check for nested comment -- can help catch cases where a previous
> + * comment was accidently left unterminated
> + */
> + if ((c1 == '/') && (c == '*'))
> + {
> + AslCommonError (ASL_WARNING, ASL_MSG_NESTED_COMMENT,
> + Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
> + Gbl_InputByteCount, Gbl_CurrentColumn,
> + Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
> + }
> +
> + /* Comment is closed only if the NEXT character is a slash */
> +
> + AslInsertLineBuffer (c);
> +
> + if ((c1 = (char) input()) != '/' && c1 != EOF)
> + {
> + unput(c1);
> + goto loop;
> + }
> +
> + if (c1 == EOF)
> + {
> + goto EarlyEOF;
> + }
> +
> + AslInsertLineBuffer (c1);
> + return (TRUE);
> +
> +
> +EarlyEOF:
> + /*
> + * Premature End-Of-File
> + */
> + AslCommonError (ASL_ERROR, ASL_MSG_EARLY_EOF,
> + Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
> + Gbl_CurrentLineOffset, Gbl_CurrentColumn,
> + Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
> + return (FALSE);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AslDoCommentType2
> + *
> + * PARAMETERS: none
> + *
> + * RETURN: none
> + *
> + * DESCRIPTION: Process a new "//" comment.
> + *
> + ******************************************************************************/
> +
> +static char
> +AslDoCommentType2 (
> + void)
> +{
> + char c;
> +
> +
> + AslInsertLineBuffer ('/');
> + AslInsertLineBuffer ('/');
> +
> + while ((c = (char) input()) != '\n' && c != EOF)
> + {
> + AslInsertLineBuffer (c);
> + }
> +
> + if (c == EOF)
> + {
> + /* End of file is OK, change to newline. Let parser detect EOF later */
> +
> + c = '\n';
> + }
> +
> + AslInsertLineBuffer (c);
> + return (TRUE);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AslDoStringLiteral
> + *
> + * PARAMETERS: none
> + *
> + * RETURN: none
> + *
> + * DESCRIPTION: Process a string literal (surrounded by quotes)
> + *
> + ******************************************************************************/
> +
> +static char
> +AslDoStringLiteral (
> + void)
> +{
> + char *StringBuffer = MsgBuffer;
> + char *EndBuffer = MsgBuffer + ASL_MSG_BUFFER_SIZE;
> + char *CleanString;
> + char StringChar;
> + UINT32 State = ASL_NORMAL_CHAR;
> + UINT32 i = 0;
> + UINT8 Digit;
> + char ConvertBuffer[4];
> +
> +
> + /*
> + * Eat chars until end-of-literal.
> + * NOTE: Put back the original surrounding quotes into the
> + * source line buffer.
> + */
> + AslInsertLineBuffer ('\"');
> + while ((StringChar = (char) input()) != EOF)
> + {
> + AslInsertLineBuffer (StringChar);
> +
> +DoCharacter:
> +
> + switch (State)
> + {
> + case ASL_NORMAL_CHAR:
> +
> + switch (StringChar)
> + {
> + case '\\':
> + /*
> + * Special handling for backslash-escape sequence. We will
> + * toss the backslash and translate the escape char(s).
> + */
> + State = ASL_ESCAPE_SEQUENCE;
> + continue;
> +
> + case '\"':
> +
> + /* String terminator */
> +
> + goto CompletedString;
> + }
> + break;
> +
> +
> + case ASL_ESCAPE_SEQUENCE:
> +
> + State = ASL_NORMAL_CHAR;
> + switch (StringChar)
> + {
> + case 'a':
> + StringChar = 0x07; /* BELL */
> + break;
> +
> + case 'b':
> + StringChar = 0x08; /* BACKSPACE */
> + break;
> +
> + case 'f':
> + StringChar = 0x0C; /* FORMFEED */
> + break;
> +
> + case 'n':
> + StringChar = 0x0A; /* LINEFEED */
> + break;
> +
> + case 'r':
> + StringChar = 0x0D; /* CARRIAGE RETURN*/
> + break;
> +
> + case 't':
> + StringChar = 0x09; /* HORIZONTAL TAB */
> + break;
> +
> + case 'v':
> + StringChar = 0x0B; /* VERTICAL TAB */
> + break;
> +
> + case 'x':
> + State = ASL_HEX_CONSTANT;
> + i = 0;
> + continue;
> +
> + case '\'': /* Single Quote */
> + case '\"': /* Double Quote */
> + case '\\': /* Backslash */
> + break;
> +
> + default:
> +
> + /* Check for an octal digit (0-7) */
> +
> + if (ACPI_IS_OCTAL_DIGIT (StringChar))
> + {
> + State = ASL_OCTAL_CONSTANT;
> + ConvertBuffer[0] = StringChar;
> + i = 1;
> + continue;
> + }
> +
> + /* Unknown escape sequence issue warning, but use the character */
> +
> + AslCommonError (ASL_WARNING, ASL_MSG_INVALID_ESCAPE,
> + Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
> + Gbl_CurrentLineOffset, Gbl_CurrentColumn,
> + Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
> + break;
> + }
> + break;
> +
> +
> + case ASL_OCTAL_CONSTANT:
> +
> + /* Up to three octal digits allowed */
> +
> + if (!ACPI_IS_OCTAL_DIGIT (StringChar) ||
> + (i > 2))
> + {
> + /*
> + * Reached end of the constant. Convert the assembled ASCII
> + * string and resume processing of the next character
> + */
> + ConvertBuffer[i] = 0;
> + Digit = (UINT8) ACPI_STRTOUL (ConvertBuffer, NULL, 8);
> +
> + /* Check for NULL or non-ascii character (ignore if so) */
> +
> + if ((Digit == 0) || (Digit > ACPI_ASCII_MAX))
> + {
> + AslCommonError (ASL_WARNING, ASL_MSG_INVALID_STRING,
> + Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
> + Gbl_CurrentLineOffset, Gbl_CurrentColumn,
> + Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
> + }
> + else
> + {
> + *StringBuffer = (char) Digit;
> + StringBuffer++;
> + if (StringBuffer >= EndBuffer)
> + {
> + goto BufferOverflow;
> + }
> + }
> +
> + State = ASL_NORMAL_CHAR;
> + goto DoCharacter;
> + break;
> + }
> +
> + /* Append another digit of the constant */
> +
> + ConvertBuffer[i] = StringChar;
> + i++;
> + continue;
> +
> +
> + case ASL_HEX_CONSTANT:
> +
> + /* Up to two hex digits allowed */
> +
> + if (!ACPI_IS_XDIGIT (StringChar) ||
> + (i > 1))
> + {
> + /*
> + * Reached end of the constant. Convert the assembled ASCII
> + * string and resume processing of the next character
> + */
> + ConvertBuffer[i] = 0;
> + Digit = (UINT8) ACPI_STRTOUL (ConvertBuffer, NULL, 16);
> +
> + /* Check for NULL or non-ascii character (ignore if so) */
> +
> + if ((Digit == 0) || (Digit > ACPI_ASCII_MAX))
> + {
> + AslCommonError (ASL_WARNING, ASL_MSG_INVALID_STRING,
> + Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
> + Gbl_CurrentLineOffset, Gbl_CurrentColumn,
> + Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
> + }
> + else
> + {
> + *StringBuffer = (char) Digit;
> + StringBuffer++;
> + if (StringBuffer >= EndBuffer)
> + {
> + goto BufferOverflow;
> + }
> + }
> +
> + State = ASL_NORMAL_CHAR;
> + goto DoCharacter;
> + break;
> + }
> +
> + /* Append another digit of the constant */
> +
> + ConvertBuffer[i] = StringChar;
> + i++;
> + continue;
> + }
> +
> + /* Save the finished character */
> +
> + *StringBuffer = StringChar;
> + StringBuffer++;
> + if (StringBuffer >= EndBuffer)
> + {
> + goto BufferOverflow;
> + }
> + }
> +
> + /*
> + * Premature End-Of-File
> + */
> + AslCommonError (ASL_ERROR, ASL_MSG_EARLY_EOF,
> + Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
> + Gbl_CurrentLineOffset, Gbl_CurrentColumn,
> + Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
> + return (FALSE);
> +
> +
> +CompletedString:
> + /*
> + * Null terminate the input string and copy string to a new buffer
> + */
> + *StringBuffer = 0;
> +
> + CleanString = UtGetStringBuffer (strlen (MsgBuffer) + 1);
> + if (!CleanString)
> + {
> + AslCommonError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION,
> + Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
> + Gbl_CurrentLineOffset, Gbl_CurrentColumn,
> + Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
> + return (FALSE);
> + }
> +
> + ACPI_STRCPY (CleanString, MsgBuffer);
> + AslCompilerlval.s = CleanString;
> + return (TRUE);
> +
> +
> +BufferOverflow:
> +
> + /* Literal was too long */
> +
> + AslCommonError (ASL_ERROR, ASL_MSG_STRING_LENGTH,
> + Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
> + Gbl_CurrentLineOffset, Gbl_CurrentColumn,
> + Gbl_Files[ASL_FILE_INPUT].Filename, "Max length 4096");
> + return (FALSE);
> +}
> diff --git a/src/acpica/source/compiler/preprocess.h b/src/acpica/source/compiler/preprocess.h
> new file mode 100644
> index 0000000..4281eb4
> --- /dev/null
> +++ b/src/acpica/source/compiler/preprocess.h
> @@ -0,0 +1,345 @@
> +/******************************************************************************
> + *
> + * Module Name: preprocess.h - header for iASL Preprocessor
> + *
> + *****************************************************************************/
> +
> +/******************************************************************************
> + *
> + * 1. Copyright Notice
> + *
> + * Some or all of this work - Copyright (c) 1999 - 2012, Intel Corp.
> + * All rights reserved.
> + *
> + * 2. License
> + *
> + * 2.1. This is your license from Intel Corp. under its intellectual property
> + * rights. You may have additional license terms from the party that provided
> + * you this software, covering your right to use that party's intellectual
> + * property rights.
> + *
> + * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
> + * copy of the source code appearing in this file ("Covered Code") an
> + * irrevocable, perpetual, worldwide license under Intel's copyrights in the
> + * base code distributed originally by Intel ("Original Intel Code") to copy,
> + * make derivatives, distribute, use and display any portion of the Covered
> + * Code in any form, with the right to sublicense such rights; and
> + *
> + * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
> + * license (with the right to sublicense), under only those claims of Intel
> + * patents that are infringed by the Original Intel Code, to make, use, sell,
> + * offer to sell, and import the Covered Code and derivative works thereof
> + * solely to the minimum extent necessary to exercise the above copyright
> + * license, and in no event shall the patent license extend to any additions
> + * to or modifications of the Original Intel Code. No other license or right
> + * is granted directly or by implication, estoppel or otherwise;
> + *
> + * The above copyright and patent license is granted only if the following
> + * conditions are met:
> + *
> + * 3. Conditions
> + *
> + * 3.1. Redistribution of Source with Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification with rights to further distribute source must include
> + * the above Copyright Notice, the above License, this list of Conditions,
> + * and the following Disclaimer and Export Compliance provision. In addition,
> + * Licensee must cause all Covered Code to which Licensee contributes to
> + * contain a file documenting the changes Licensee made to create that Covered
> + * Code and the date of any change. Licensee must include in that file the
> + * documentation of any changes made by any predecessor Licensee. Licensee
> + * must include a prominent statement that the modification is derived,
> + * directly or indirectly, from Original Intel Code.
> + *
> + * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification without rights to further distribute source must
> + * include the following Disclaimer and Export Compliance provision in the
> + * documentation and/or other materials provided with distribution. In
> + * addition, Licensee may not authorize further sublicense of source of any
> + * portion of the Covered Code, and must include terms to the effect that the
> + * license from Licensee to its licensee is limited to the intellectual
> + * property embodied in the software Licensee provides to its licensee, and
> + * not to intellectual property embodied in modifications its licensee may
> + * make.
> + *
> + * 3.3. Redistribution of Executable. Redistribution in executable form of any
> + * substantial portion of the Covered Code or modification must reproduce the
> + * above Copyright Notice, and the following Disclaimer and Export Compliance
> + * provision in the documentation and/or other materials provided with the
> + * distribution.
> + *
> + * 3.4. Intel retains all right, title, and interest in and to the Original
> + * Intel Code.
> + *
> + * 3.5. Neither the name Intel nor any other trademark owned or controlled by
> + * Intel shall be used in advertising or otherwise to promote the sale, use or
> + * other dealings in products derived from or relating to the Covered Code
> + * without prior written authorization from Intel.
> + *
> + * 4. Disclaimer and Export Compliance
> + *
> + * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
> + * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
> + * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
> + * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
> + * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
> + * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
> + * PARTICULAR PURPOSE.
> + *
> + * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
> + * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
> + * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
> + * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
> + * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
> + * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
> + * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
> + * LIMITED REMEDY.
> + *
> + * 4.3. Licensee shall not export, either directly or indirectly, any of this
> + * software or system incorporating such software without first obtaining any
> + * required license or other approval from the U. S. Department of Commerce or
> + * any other agency or department of the United States Government. In the
> + * event Licensee exports any such software from the United States or
> + * re-exports any such software from a foreign destination, Licensee shall
> + * ensure that the distribution and export/re-export of the software is in
> + * compliance with all laws, regulations, orders, or other restrictions of the
> + * U.S. Export Administration Regulations. Licensee agrees that neither it nor
> + * any of its subsidiaries will export/re-export any technical data, process,
> + * software, or service, directly or indirectly, to any country for which the
> + * United States government or any agency thereof requires an export license,
> + * other governmental approval, or letter of assurance, without first obtaining
> + * such license, approval or letter.
> + *
> + *****************************************************************************/
> +
> +#define __PREPROCESS_H__
> +
> +#ifndef _PREPROCESS
> +#define _PREPROCESS
> +
> +#undef PR_EXTERN
> +
> +#ifdef _DECLARE_PR_GLOBALS
> +#define PR_EXTERN
> +#define PR_INIT_GLOBAL(a,b) (a)=(b)
> +#else
> +#define PR_EXTERN extern
> +#define PR_INIT_GLOBAL(a,b) (a)
> +#endif
> +
> +
> +/*
> + * Configuration
> + */
> +#define PR_MAX_MACRO_ARGS 32 /* Max number of macro args */
> +#define PR_MAX_ARG_INSTANCES 24 /* Max instances of any one arg */
> +#define PR_LINES_PER_BLOCK 4096 /* Max input source lines per block */
> +
> +
> +/*
> + * Local defines and macros
> + */
> +#define PR_TOKEN_SEPARATORS " ,(){}\t\n"
> +#define PR_MACRO_SEPARATORS " ,(){}~!*/%+-<>=&^|\"\t\n"
> +#define PR_MACRO_ARGUMENTS " ,\t\n"
> +#define PR_EXPR_SEPARATORS " ,(){}~!*/%+-<>=&^|\"\t\n"
> +
> +#define PR_PREFIX_ID "Pr(%.4u) - " /* Used for debug output */
> +
> +#define THIS_TOKEN_OFFSET(t) ((t-Gbl_MainTokenBuffer) + 1)
> +
> +
> +/*
> + * Preprocessor structures
> + */
> +typedef struct pr_macro_arg
> +{
> + char *Name;
> + UINT32 Offset[PR_MAX_ARG_INSTANCES];
> + UINT16 UseCount;
> +
> +} PR_MACRO_ARG;
> +
> +typedef struct pr_define_info
> +{
> + struct pr_define_info *Previous;
> + struct pr_define_info *Next;
> + char *Identifier;
> + char *Replacement;
> + char *Body; /* Macro body */
> + PR_MACRO_ARG *Args; /* Macro arg list */
> + UINT16 ArgCount; /* Macro arg count */
> + BOOLEAN Persist; /* Keep for entire compiler run */
> +
> +} PR_DEFINE_INFO;
> +
> +typedef struct pr_directive_info
> +{
> + char *Name; /* Directive name */
> + UINT8 ArgCount; /* Required # of args */
> +
> +} PR_DIRECTIVE_INFO;
> +
> +typedef struct pr_operator_info
> +{
> + char *Op;
> +
> +} PR_OPERATOR_INFO;
> +
> +typedef struct pr_file_node
> +{
> + struct pr_file_node *Next;
> + FILE *File;
> + char *Filename;
> + UINT32 CurrentLineNumber;
> +
> +} PR_FILE_NODE;
> +
> +
> +/*
> + * Globals
> + */
> +PR_EXTERN char XXXEvalBuffer[ASL_LINE_BUFFER_SIZE];
> +PR_EXTERN char Gbl_MainTokenBuffer[ASL_LINE_BUFFER_SIZE];
> +PR_EXTERN char Gbl_MacroTokenBuffer[ASL_LINE_BUFFER_SIZE];
> +PR_EXTERN char Gbl_ExpressionTokenBuffer[ASL_LINE_BUFFER_SIZE];
> +
> +PR_EXTERN PR_FILE_NODE *Gbl_InputFileList;
> +PR_EXTERN PR_DEFINE_INFO PR_INIT_GLOBAL (*Gbl_DefineList, NULL);
> +PR_EXTERN UINT32 Gbl_PreprocessorLineNumber;
> +PR_EXTERN int Gbl_IfDepth;
> +PR_EXTERN BOOLEAN PR_INIT_GLOBAL (Gbl_PreprocessorError, FALSE);
> +
> +
> +/*
> + * prscan - Preprocessor entry
> + */
> +void
> +PrInitializePreprocessor (
> + void);
> +
> +void
> +PrInitializeGlobals (
> + void);
> +
> +void
> +PrTerminatePreprocessor (
> + void);
> +
> +BOOLEAN
> +PrDoPreprocess (
> + void);
> +
> +UINT64
> +PrIsDefined (
> + char *Identifier);
> +
> +UINT64
> +PrResolveDefine (
> + char *Identifier);
> +
> +int
> +PrInitLexer (
> + char *String);
> +
> +void
> +PrTerminateLexer (
> + void);
> +
> +
> +/*
> + * prmacros - Support for #defines and macros
> + */
> +void
> +PrDumpPredefinedNames (
> + void);
> +
> +PR_DEFINE_INFO *
> +PrAddDefine (
> + char *Token,
> + char *Token2,
> + BOOLEAN Persist);
> +
> +void
> +PrRemoveDefine (
> + char *DefineName);
> +
> +PR_DEFINE_INFO *
> +PrMatchDefine (
> + char *MatchString);
> +
> +void
> +PrAddMacro (
> + char *Name,
> + char **Next);
> +
> +void
> +PrDoMacroInvocation (
> + char *TokenBuffer,
> + char *MacroStart,
> + PR_DEFINE_INFO *DefineInfo,
> + char **Next);
> +
> +
> +/*
> + * prexpress - #if expression support
> + */
> +ACPI_STATUS
> +PrResolveIntegerExpression (
> + char *Line,
> + UINT64 *ReturnValue);
> +
> +char *
> +PrPrioritizeExpression (
> + char *OriginalLine);
> +
> +/*
> + * prparser - lex/yacc expression parser
> + */
> +UINT64
> +PrEvaluateExpression (
> + char *ExprString);
> +
> +
> +/*
> + * prutils - Preprocesor utilities
> + */
> +char *
> +PrGetNextToken (
> + char *Buffer,
> + char *MatchString,
> + char **Next);
> +
> +void
> +PrError (
> + UINT8 Level,
> + UINT8 MessageId,
> + UINT32 Column);
> +
> +void
> +PrReplaceData (
> + char *Buffer,
> + UINT32 LengthToRemove,
> + char *BufferToAdd,
> + UINT32 LengthToAdd);
> +
> +void
> +PrOpenIncludeFile (
> + char *Filename);
> +
> +FILE *
> +PrOpenIncludeWithPrefix (
> + char *PrefixDir,
> + char *Filename);
> +
> +void
> +PrPushInputFileStack (
> + FILE *InputFile,
> + char *Filename);
> +
> +BOOLEAN
> +PrPopInputFileStack (
> + void);
> +
> +#endif
> diff --git a/src/acpica/source/compiler/prexpress.c b/src/acpica/source/compiler/prexpress.c
> new file mode 100644
> index 0000000..f65491e
> --- /dev/null
> +++ b/src/acpica/source/compiler/prexpress.c
> @@ -0,0 +1,377 @@
> +/******************************************************************************
> + *
> + * Module Name: prexpress - Preprocessor #if expression support
> + *
> + *****************************************************************************/
> +
> +/******************************************************************************
> + *
> + * 1. Copyright Notice
> + *
> + * Some or all of this work - Copyright (c) 1999 - 2012, Intel Corp.
> + * All rights reserved.
> + *
> + * 2. License
> + *
> + * 2.1. This is your license from Intel Corp. under its intellectual property
> + * rights. You may have additional license terms from the party that provided
> + * you this software, covering your right to use that party's intellectual
> + * property rights.
> + *
> + * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
> + * copy of the source code appearing in this file ("Covered Code") an
> + * irrevocable, perpetual, worldwide license under Intel's copyrights in the
> + * base code distributed originally by Intel ("Original Intel Code") to copy,
> + * make derivatives, distribute, use and display any portion of the Covered
> + * Code in any form, with the right to sublicense such rights; and
> + *
> + * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
> + * license (with the right to sublicense), under only those claims of Intel
> + * patents that are infringed by the Original Intel Code, to make, use, sell,
> + * offer to sell, and import the Covered Code and derivative works thereof
> + * solely to the minimum extent necessary to exercise the above copyright
> + * license, and in no event shall the patent license extend to any additions
> + * to or modifications of the Original Intel Code. No other license or right
> + * is granted directly or by implication, estoppel or otherwise;
> + *
> + * The above copyright and patent license is granted only if the following
> + * conditions are met:
> + *
> + * 3. Conditions
> + *
> + * 3.1. Redistribution of Source with Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification with rights to further distribute source must include
> + * the above Copyright Notice, the above License, this list of Conditions,
> + * and the following Disclaimer and Export Compliance provision. In addition,
> + * Licensee must cause all Covered Code to which Licensee contributes to
> + * contain a file documenting the changes Licensee made to create that Covered
> + * Code and the date of any change. Licensee must include in that file the
> + * documentation of any changes made by any predecessor Licensee. Licensee
> + * must include a prominent statement that the modification is derived,
> + * directly or indirectly, from Original Intel Code.
> + *
> + * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification without rights to further distribute source must
> + * include the following Disclaimer and Export Compliance provision in the
> + * documentation and/or other materials provided with distribution. In
> + * addition, Licensee may not authorize further sublicense of source of any
> + * portion of the Covered Code, and must include terms to the effect that the
> + * license from Licensee to its licensee is limited to the intellectual
> + * property embodied in the software Licensee provides to its licensee, and
> + * not to intellectual property embodied in modifications its licensee may
> + * make.
> + *
> + * 3.3. Redistribution of Executable. Redistribution in executable form of any
> + * substantial portion of the Covered Code or modification must reproduce the
> + * above Copyright Notice, and the following Disclaimer and Export Compliance
> + * provision in the documentation and/or other materials provided with the
> + * distribution.
> + *
> + * 3.4. Intel retains all right, title, and interest in and to the Original
> + * Intel Code.
> + *
> + * 3.5. Neither the name Intel nor any other trademark owned or controlled by
> + * Intel shall be used in advertising or otherwise to promote the sale, use or
> + * other dealings in products derived from or relating to the Covered Code
> + * without prior written authorization from Intel.
> + *
> + * 4. Disclaimer and Export Compliance
> + *
> + * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
> + * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
> + * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
> + * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
> + * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
> + * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
> + * PARTICULAR PURPOSE.
> + *
> + * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
> + * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
> + * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
> + * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
> + * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
> + * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
> + * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
> + * LIMITED REMEDY.
> + *
> + * 4.3. Licensee shall not export, either directly or indirectly, any of this
> + * software or system incorporating such software without first obtaining any
> + * required license or other approval from the U. S. Department of Commerce or
> + * any other agency or department of the United States Government. In the
> + * event Licensee exports any such software from the United States or
> + * re-exports any such software from a foreign destination, Licensee shall
> + * ensure that the distribution and export/re-export of the software is in
> + * compliance with all laws, regulations, orders, or other restrictions of the
> + * U.S. Export Administration Regulations. Licensee agrees that neither it nor
> + * any of its subsidiaries will export/re-export any technical data, process,
> + * software, or service, directly or indirectly, to any country for which the
> + * United States government or any agency thereof requires an export license,
> + * other governmental approval, or letter of assurance, without first obtaining
> + * such license, approval or letter.
> + *
> + *****************************************************************************/
> +
> +#include "aslcompiler.h"
> +#include "dtcompiler.h"
> +
> +
> +#define _COMPONENT ASL_PREPROCESSOR
> + ACPI_MODULE_NAME ("prexpress")
> +
> +/* Local prototypes */
> +
> +static char *
> +PrExpandMacros (
> + char *Line);
> +
> +
> +#ifdef _UNDER_DEVELOPMENT
> +/******************************************************************************
> + *
> + * FUNCTION: PrUnTokenize
> + *
> + * PARAMETERS: Buffer - Token Buffer
> + * Next - "Next" buffer from GetNextToken
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Un-tokenized the current token buffer. The implementation is
> + * to simply set the null inserted by GetNextToken to a blank.
> + * If Next is NULL, there were no tokens found in the Buffer,
> + * so there is nothing to do.
> + *
> + *****************************************************************************/
> +
> +static void
> +PrUnTokenize (
> + char *Buffer,
> + char *Next)
> +{
> + UINT32 Length = strlen (Buffer);
> +
> +
> + if (!Next)
> + {
> + return;
> + }
> + if (Buffer[Length] != '\n')
> + {
> + Buffer[strlen(Buffer)] = ' ';
> + }
> +}
> +#endif
> +
> +
> +/******************************************************************************
> + *
> + * FUNCTION: PrExpandMacros
> + *
> + * PARAMETERS: Line - Pointer into the current line
> + *
> + * RETURN: Updated pointer into the current line
> + *
> + * DESCRIPTION: Expand any macros found in the current line buffer.
> + *
> + *****************************************************************************/
> +
> +static char *
> +PrExpandMacros (
> + char *Line)
> +{
> + char *Token;
> + char *ReplaceString;
> + PR_DEFINE_INFO *DefineInfo;
> + ACPI_SIZE TokenOffset;
> + char *Next;
> + int OffsetAdjust;
> +
> +
> + strcpy (Gbl_ExpressionTokenBuffer, Gbl_CurrentLineBuffer);
> + Token = PrGetNextToken (Gbl_ExpressionTokenBuffer, PR_EXPR_SEPARATORS, &Next);
> + OffsetAdjust = 0;
> +
> + while (Token)
> + {
> + DefineInfo = PrMatchDefine (Token);
> + if (DefineInfo)
> + {
> + if (DefineInfo->Body)
> + {
> + /* This is a macro. TBD: Is this allowed? */
> +
> + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
> + "Matched Macro: %s->%s\n",
> + Gbl_CurrentLineNumber, DefineInfo->Identifier,
> + DefineInfo->Replacement);
> +
> + PrDoMacroInvocation (Gbl_ExpressionTokenBuffer, Token,
> + DefineInfo, &Next);
> + }
> + else
> + {
> + ReplaceString = DefineInfo->Replacement;
> +
> + /* Replace the name in the original line buffer */
> +
> + TokenOffset = Token - Gbl_ExpressionTokenBuffer + OffsetAdjust;
> + PrReplaceData (
> + &Gbl_CurrentLineBuffer[TokenOffset], strlen (Token),
> + ReplaceString, strlen (ReplaceString));
> +
> + /* Adjust for length difference between old and new name length */
> +
> + OffsetAdjust += strlen (ReplaceString) - strlen (Token);
> +
> + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
> + "Matched #define within expression: %s->%s\n",
> + Gbl_CurrentLineNumber, Token,
> + *ReplaceString ? ReplaceString : "(NULL STRING)");
> + }
> + }
> +
> + Token = PrGetNextToken (NULL, PR_EXPR_SEPARATORS, &Next);
> + }
> +
> + return (Line);
> +}
> +
> +
> +/******************************************************************************
> + *
> + * FUNCTION: PrIsDefined
> + *
> + * PARAMETERS: Identifier - Name to be resolved
> + *
> + * RETURN: 64-bit boolean integer value
> + *
> + * DESCRIPTION: Returns TRUE if the name is defined, FALSE otherwise (0).
> + *
> + *****************************************************************************/
> +
> +UINT64
> +PrIsDefined (
> + char *Identifier)
> +{
> + UINT64 Value;
> + PR_DEFINE_INFO *DefineInfo;
> +
> +
> + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
> + "**** Is defined?: %s\n", Gbl_CurrentLineNumber, Identifier);
> +
> + Value = 0; /* Default is "Not defined" -- FALSE */
> +
> + DefineInfo = PrMatchDefine (Identifier);
> + if (DefineInfo)
> + {
> + Value = ACPI_UINT64_MAX; /* TRUE */
> + }
> +
> + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
> + "[#if defined %s] resolved to: %8.8X%8.8X\n",
> + Gbl_CurrentLineNumber, Identifier, ACPI_FORMAT_UINT64 (Value));
> +
> + return (Value);
> +}
> +
> +
> +/******************************************************************************
> + *
> + * FUNCTION: PrResolveDefine
> + *
> + * PARAMETERS: Identifier - Name to be resolved
> + *
> + * RETURN: A 64-bit boolean integer value
> + *
> + * DESCRIPTION: Returns TRUE if the name is defined, FALSE otherwise (0).
> + *
> + *****************************************************************************/
> +
> +UINT64
> +PrResolveDefine (
> + char *Identifier)
> +{
> + UINT64 Value;
> + PR_DEFINE_INFO *DefineInfo;
> +
> +
> + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
> + "**** Resolve #define: %s\n", Gbl_CurrentLineNumber, Identifier);
> +
> + Value = 0; /* Default is "Not defined" -- FALSE */
> +
> + DefineInfo = PrMatchDefine (Identifier);
> + if (DefineInfo)
> + {
> + Value = ACPI_UINT64_MAX; /* TRUE */
> + }
> +
> + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
> + "[#if defined %s] resolved to: %8.8X%8.8X\n",
> + Gbl_CurrentLineNumber, Identifier, ACPI_FORMAT_UINT64 (Value));
> +
> + return (Value);
> +}
> +
> +
> +/******************************************************************************
> + *
> + * FUNCTION: PrResolveIntegerExpression
> + *
> + * PARAMETERS: Line - Pointer to integer expression
> + * ReturnValue - Where the resolved 64-bit integer is
> + * returned.
> + *
> + * RETURN: Status
> + *
> + * DESCRIPTION: Resolve an integer expression to a single value. Supports
> + * both integer constants and labels.
> + *
> + *****************************************************************************/
> +
> +ACPI_STATUS
> +PrResolveIntegerExpression (
> + char *Line,
> + UINT64 *ReturnValue)
> +{
> + UINT64 Result;
> + char *ExpandedLine;
> +
> +
> + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
> + "**** Resolve #if: %s\n", Gbl_CurrentLineNumber, Line);
> +
> + /* Expand all macros within the expression first */
> +
> + ExpandedLine = PrExpandMacros (Line);
> +
> + /* Now we can evaluate the expression */
> +
> + Result = PrEvaluateExpression (ExpandedLine);
> + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
> + "**** Expression Resolved to: %8.8X%8.8X\n",
> + Gbl_CurrentLineNumber, ACPI_FORMAT_UINT64 (Result));
> +
> + *ReturnValue = Result;
> + return (AE_OK);
> +
> +#if 0
> +InvalidExpression:
> +
> + ACPI_FREE (EvalBuffer);
> + PrError (ASL_ERROR, ASL_MSG_INVALID_EXPRESSION, 0);
> + return (AE_ERROR);
> +
> +
> +NormalExit:
> +
> + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
> + "**** Expression Resolved to: %8.8X%8.8X\n",
> + Gbl_CurrentLineNumber, ACPI_FORMAT_UINT64 (Value1));
> +
> + *ReturnValue = Value1;
> + return (AE_OK);
> +#endif
> +}
> diff --git a/src/acpica/source/compiler/prmacros.c b/src/acpica/source/compiler/prmacros.c
> new file mode 100644
> index 0000000..d358f1a
> --- /dev/null
> +++ b/src/acpica/source/compiler/prmacros.c
> @@ -0,0 +1,646 @@
> +/******************************************************************************
> + *
> + * Module Name: prmacros - Preprocessor #define macro support
> + *
> + *****************************************************************************/
> +
> +/******************************************************************************
> + *
> + * 1. Copyright Notice
> + *
> + * Some or all of this work - Copyright (c) 1999 - 2012, Intel Corp.
> + * All rights reserved.
> + *
> + * 2. License
> + *
> + * 2.1. This is your license from Intel Corp. under its intellectual property
> + * rights. You may have additional license terms from the party that provided
> + * you this software, covering your right to use that party's intellectual
> + * property rights.
> + *
> + * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
> + * copy of the source code appearing in this file ("Covered Code") an
> + * irrevocable, perpetual, worldwide license under Intel's copyrights in the
> + * base code distributed originally by Intel ("Original Intel Code") to copy,
> + * make derivatives, distribute, use and display any portion of the Covered
> + * Code in any form, with the right to sublicense such rights; and
> + *
> + * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
> + * license (with the right to sublicense), under only those claims of Intel
> + * patents that are infringed by the Original Intel Code, to make, use, sell,
> + * offer to sell, and import the Covered Code and derivative works thereof
> + * solely to the minimum extent necessary to exercise the above copyright
> + * license, and in no event shall the patent license extend to any additions
> + * to or modifications of the Original Intel Code. No other license or right
> + * is granted directly or by implication, estoppel or otherwise;
> + *
> + * The above copyright and patent license is granted only if the following
> + * conditions are met:
> + *
> + * 3. Conditions
> + *
> + * 3.1. Redistribution of Source with Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification with rights to further distribute source must include
> + * the above Copyright Notice, the above License, this list of Conditions,
> + * and the following Disclaimer and Export Compliance provision. In addition,
> + * Licensee must cause all Covered Code to which Licensee contributes to
> + * contain a file documenting the changes Licensee made to create that Covered
> + * Code and the date of any change. Licensee must include in that file the
> + * documentation of any changes made by any predecessor Licensee. Licensee
> + * must include a prominent statement that the modification is derived,
> + * directly or indirectly, from Original Intel Code.
> + *
> + * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification without rights to further distribute source must
> + * include the following Disclaimer and Export Compliance provision in the
> + * documentation and/or other materials provided with distribution. In
> + * addition, Licensee may not authorize further sublicense of source of any
> + * portion of the Covered Code, and must include terms to the effect that the
> + * license from Licensee to its licensee is limited to the intellectual
> + * property embodied in the software Licensee provides to its licensee, and
> + * not to intellectual property embodied in modifications its licensee may
> + * make.
> + *
> + * 3.3. Redistribution of Executable. Redistribution in executable form of any
> + * substantial portion of the Covered Code or modification must reproduce the
> + * above Copyright Notice, and the following Disclaimer and Export Compliance
> + * provision in the documentation and/or other materials provided with the
> + * distribution.
> + *
> + * 3.4. Intel retains all right, title, and interest in and to the Original
> + * Intel Code.
> + *
> + * 3.5. Neither the name Intel nor any other trademark owned or controlled by
> + * Intel shall be used in advertising or otherwise to promote the sale, use or
> + * other dealings in products derived from or relating to the Covered Code
> + * without prior written authorization from Intel.
> + *
> + * 4. Disclaimer and Export Compliance
> + *
> + * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
> + * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
> + * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
> + * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
> + * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
> + * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
> + * PARTICULAR PURPOSE.
> + *
> + * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
> + * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
> + * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
> + * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
> + * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
> + * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
> + * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
> + * LIMITED REMEDY.
> + *
> + * 4.3. Licensee shall not export, either directly or indirectly, any of this
> + * software or system incorporating such software without first obtaining any
> + * required license or other approval from the U. S. Department of Commerce or
> + * any other agency or department of the United States Government. In the
> + * event Licensee exports any such software from the United States or
> + * re-exports any such software from a foreign destination, Licensee shall
> + * ensure that the distribution and export/re-export of the software is in
> + * compliance with all laws, regulations, orders, or other restrictions of the
> + * U.S. Export Administration Regulations. Licensee agrees that neither it nor
> + * any of its subsidiaries will export/re-export any technical data, process,
> + * software, or service, directly or indirectly, to any country for which the
> + * United States government or any agency thereof requires an export license,
> + * other governmental approval, or letter of assurance, without first obtaining
> + * such license, approval or letter.
> + *
> + *****************************************************************************/
> +
> +#include "aslcompiler.h"
> +#include "dtcompiler.h"
> +
> +
> +#define _COMPONENT ASL_PREPROCESSOR
> + ACPI_MODULE_NAME ("prmacros")
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: PrDumpPredefinedNames
> + *
> + * PARAMETERS: None
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Dump the list of #defines. Used as the preprocessor starts, to
> + * display the names that were defined on the command line.
> + * Debug information only.
> + *
> + ******************************************************************************/
> +
> +void
> +PrDumpPredefinedNames (
> + void)
> +{
> + PR_DEFINE_INFO *DefineInfo;
> +
> +
> + DefineInfo = Gbl_DefineList;
> + while (DefineInfo)
> + {
> + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
> + "Predefined #define: %s->%s\n",
> + 0, DefineInfo->Identifier, DefineInfo->Replacement);
> +
> + DefineInfo = DefineInfo->Next;
> + }
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: PrAddDefine
> + *
> + * PARAMETERS: Identifier - Name to be replaced
> + * Replacement - Replacement for Identifier
> + * Persist - Keep define across multiple compiles?
> + *
> + * RETURN: A new define_info struct. NULL on error.
> + *
> + * DESCRIPTION: Add a new #define to the global list
> + *
> + ******************************************************************************/
> +
> +PR_DEFINE_INFO *
> +PrAddDefine (
> + char *Identifier,
> + char *Replacement,
> + BOOLEAN Persist)
> +{
> + char *IdentifierString;
> + char *ReplacementString;
> + PR_DEFINE_INFO *DefineInfo;
> +
> +
> + if (!Replacement)
> + {
> + Replacement = "";
> + }
> +
> + /* Check for already-defined first */
> +
> + DefineInfo = PrMatchDefine (Identifier);
> + if (DefineInfo)
> + {
> + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID,
> + "#define: name already exists: %s\n",
> + Gbl_CurrentLineNumber, Identifier);
> +
> + /*
> + * Name already exists. This is only an error if the target name
> + * is different.
> + */
> + if (strcmp (Replacement, DefineInfo->Replacement))
> + {
> + PrError (ASL_ERROR, ASL_MSG_EXISTING_NAME,
> + THIS_TOKEN_OFFSET (Identifier));
> +
> + return (NULL);
> + }
> +
> + return (DefineInfo);
> + }
> +
> + /* Copy input strings */
> +
> + IdentifierString = UtLocalCalloc (strlen (Identifier) + 1);
> + strcpy (IdentifierString, Identifier);
> +
> + ReplacementString = UtLocalCalloc (strlen (Replacement) + 1);
> + strcpy (ReplacementString, Replacement);
> +
> + /* Init and link new define info struct */
> +
> + DefineInfo = UtLocalCalloc (sizeof (PR_DEFINE_INFO));
> + DefineInfo->Replacement = ReplacementString;
> + DefineInfo->Identifier = IdentifierString;
> + DefineInfo->Persist = Persist;
> +
> + if (Gbl_DefineList)
> + {
> + Gbl_DefineList->Previous = DefineInfo;
> + }
> +
> + DefineInfo->Next = Gbl_DefineList;
> + Gbl_DefineList = DefineInfo;
> + return (DefineInfo);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: PrRemoveDefine
> + *
> + * PARAMETERS: DefineName - Name of define to be removed
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Implements #undef. Remove a #define if found in the global
> + * list. No error if the target of the #undef does not exist,
> + * as per the C #undef definition.
> + *
> + ******************************************************************************/
> +
> +void
> +PrRemoveDefine (
> + char *DefineName)
> +{
> + PR_DEFINE_INFO *DefineInfo;
> +
> +
> + /* Match name and delete the node */
> +
> + DefineInfo = Gbl_DefineList;
> + while (DefineInfo)
> + {
> + if (!strcmp (DefineName, DefineInfo->Identifier))
> + {
> + /* Remove from linked list */
> +
> + if (DefineInfo->Previous)
> + {
> + (DefineInfo->Previous)->Next = DefineInfo->Next;
> + }
> + else
> + {
> + Gbl_DefineList = DefineInfo->Next;
> + }
> +
> + if (DefineInfo->Next)
> + {
> + (DefineInfo->Next)->Previous = DefineInfo->Previous;
> + }
> +
> + free (DefineInfo);
> + return;
> + }
> +
> + DefineInfo = DefineInfo->Next;
> + }
> +
> + /*
> + * Name was not found. By definition of #undef, this is not
> + * an error, however.
> + */
> + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
> + "#undef: could not find %s\n",
> + Gbl_CurrentLineNumber, DefineName);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: PrMatchDefine
> + *
> + * PARAMETERS: MatchString - Name associated with the #define
> + *
> + * RETURN: Matched string if found. NULL otherwise.
> + *
> + * DESCRIPTION: Find a name in global #define list
> + *
> + ******************************************************************************/
> +
> +PR_DEFINE_INFO *
> +PrMatchDefine (
> + char *MatchString)
> +{
> + PR_DEFINE_INFO *DefineInfo;
> +
> +
> + DefineInfo = Gbl_DefineList;
> + while (DefineInfo)
> + {
> + if (!strcmp (MatchString, DefineInfo->Identifier))
> + {
> + return (DefineInfo);
> + }
> +
> + DefineInfo = DefineInfo->Next;
> + }
> +
> + return (NULL);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: PrAddMacro
> + *
> + * PARAMETERS: Name - Start of the macro definition
> + * Next - "Next" buffer from GetNextToken
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Add a new macro to the list of #defines. Handles argument
> + * processing.
> + *
> + ******************************************************************************/
> +
> +void
> +PrAddMacro (
> + char *Name,
> + char **Next)
> +{
> + char *Token = NULL;
> + ACPI_SIZE TokenOffset;
> + ACPI_SIZE MacroBodyOffset;
> + PR_DEFINE_INFO *DefineInfo;
> + PR_MACRO_ARG *Args;
> + char *Body;
> + char *BodyInSource;
> + UINT32 i;
> + UINT16 UseCount = 0;
> + UINT16 ArgCount = 0;
> + UINT32 Depth = 1;
> + UINT32 EndOfArgList;
> + char BufferChar;
> +
> +
> + /* Find the end of the arguments list */
> +
> + TokenOffset = Name - Gbl_MainTokenBuffer + strlen (Name) + 1;
> + while (1)
> + {
> + BufferChar = Gbl_CurrentLineBuffer[TokenOffset];
> + if (BufferChar == '(')
> + {
> + Depth++;
> + }
> + else if (BufferChar == ')')
> + {
> + Depth--;
> + }
> + else if (BufferChar == 0)
> + {
> + PrError (ASL_ERROR, ASL_MSG_MACRO_SYNTAX, TokenOffset);
> + return;
> + }
> +
> + if (Depth == 0)
> + {
> + /* Found arg list end */
> +
> + EndOfArgList = TokenOffset;
> + break;
> + }
> +
> + TokenOffset++;
> + }
> +
> + /* At this point, we know that we have a reasonable argument list */
> +
> + Args = UtLocalCalloc (sizeof (PR_MACRO_ARG) * PR_MAX_MACRO_ARGS);
> +
> + /* Get the macro argument names */
> +
> + for (i = 0; i < PR_MAX_MACRO_ARGS; i++)
> + {
> + Token = PrGetNextToken (NULL, PR_MACRO_SEPARATORS, Next);
> + if (!Token)
> + {
> + /* This is the case for a NULL macro body */
> +
> + BodyInSource = "";
> + goto AddMacroToList;
> + }
> +
> + /* Don't go beyond the argument list */
> +
> + TokenOffset = Token - Gbl_MainTokenBuffer + strlen (Token);
> + if (TokenOffset > EndOfArgList)
> + {
> + break;
> + }
> +
> + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
> + "Macro arg: %s \n",
> + Gbl_CurrentLineNumber, Token);
> +
> + Args[i].Name = UtLocalCalloc (strlen (Token) + 1);
> + strcpy (Args[i].Name, Token);
> +
> + Args[i].UseCount = 0;
> +
> + ArgCount++;
> + if (ArgCount >= PR_MAX_MACRO_ARGS)
> + {
> + PrError (ASL_ERROR, ASL_MSG_TOO_MANY_ARGUMENTS, TokenOffset);
> + return;
> + }
> + }
> +
> + /* Get the macro body. Token now points to start of body */
> +
> + MacroBodyOffset = Token - Gbl_MainTokenBuffer;
> +
> + /* Match each method arg in the macro body for later use */
> +
> + Token = PrGetNextToken (NULL, PR_MACRO_SEPARATORS, Next);
> + while (Token)
> + {
> + /* Search the macro arg list for matching arg */
> +
> + for (i = 0; Args[i].Name && (i < PR_MAX_MACRO_ARGS); i++)
> + {
> + /*
> + * Save argument offset within macro body. This is the mechanism
> + * used to expand the macro upon invocation.
> + *
> + * Handles multiple instances of the same argument
> + */
> + if (!strcmp (Token, Args[i].Name))
> + {
> + UseCount = Args[i].UseCount;
> +
> + Args[i].Offset[UseCount] = (Token - Gbl_MainTokenBuffer) - MacroBodyOffset;
> +
> + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
> + "Macro Arg #%u: %s UseCount %u Offset %u \n",
> + Gbl_CurrentLineNumber, i, Token,
> + UseCount+1, Args[i].Offset[UseCount]);
> +
> + Args[i].UseCount++;
> + if (Args[i].UseCount >= PR_MAX_ARG_INSTANCES)
> + {
> + PrError (ASL_ERROR, ASL_MSG_TOO_MANY_ARGUMENTS,
> + THIS_TOKEN_OFFSET (Token));
> +
> + return;
> + }
> + break;
> + }
> + }
> +
> + Token = PrGetNextToken (NULL, PR_MACRO_SEPARATORS, Next);
> + }
> +
> + BodyInSource = &Gbl_CurrentLineBuffer[MacroBodyOffset];
> +
> +
> +AddMacroToList:
> +
> + /* Check if name is already defined first */
> +
> + DefineInfo = PrMatchDefine (Name);
> + if (DefineInfo)
> + {
> + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
> + "#define: macro name already exists: %s\n",
> + Gbl_CurrentLineNumber, Name);
> +
> + /* Error only if not exactly the same macro */
> +
> + if (strcmp (DefineInfo->Body, BodyInSource) ||
> + (DefineInfo->ArgCount != ArgCount))
> + {
> + PrError (ASL_ERROR, ASL_MSG_EXISTING_NAME,
> + THIS_TOKEN_OFFSET (Name));
> + }
> +
> + return;
> + }
> +
> + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
> + "Macro body: %s \n",
> + Gbl_CurrentLineNumber, BodyInSource);
> +
> + /* Add macro to the #define list */
> +
> + DefineInfo = PrAddDefine (Name, BodyInSource, FALSE);
> + if (DefineInfo)
> + {
> + Body = UtLocalCalloc (strlen (BodyInSource) + 1);
> + strcpy (Body, BodyInSource);
> +
> + DefineInfo->Body = Body;
> + DefineInfo->Args = Args;
> + DefineInfo->ArgCount = ArgCount;
> + }
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: PrDoMacroInvocation
> + *
> + * PARAMETERS: TokenBuffer - Current line buffer
> + * MacroStart - Start of the macro invocation within
> + * the token buffer
> + * DefineInfo - Info for this macro
> + * Next - "Next" buffer from GetNextToken
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Expand a macro invocation
> + *
> + ******************************************************************************/
> +
> +void
> +PrDoMacroInvocation (
> + char *TokenBuffer,
> + char *MacroStart,
> + PR_DEFINE_INFO *DefineInfo,
> + char **Next)
> +{
> + PR_MACRO_ARG *Args;
> + char *Token = NULL;
> + UINT32 TokenOffset;
> + UINT32 Length;
> + UINT32 i;
> +
> +
> + /* Take a copy of the macro body for expansion */
> +
> + strcpy (Gbl_MacroTokenBuffer, DefineInfo->Body);
> +
> + /* Replace each argument within the prototype body */
> +
> + Args = DefineInfo->Args;
> + if (!Args->Name)
> + {
> + /* This macro has no arguments */
> +
> + Token = PrGetNextToken (NULL, PR_MACRO_ARGUMENTS, Next);
> + if (!Token)
> + {
> + goto BadInvocation;
> + }
> +
> + TokenOffset = (MacroStart - TokenBuffer);
> + Length = Token - MacroStart + strlen (Token) + 1;
> +
> + PrReplaceData (
> + &Gbl_CurrentLineBuffer[TokenOffset], Length,
> + Gbl_MacroTokenBuffer, strlen (Gbl_MacroTokenBuffer));
> + return;
> + }
> +
> + while (Args->Name)
> + {
> + /* Get the next argument from macro invocation */
> +
> + Token = PrGetNextToken (NULL, PR_MACRO_SEPARATORS, Next);
> + if (!Token)
> + {
> + goto BadInvocation;
> + }
> +
> + /* Replace all instances of this argument */
> +
> + for (i = 0; i < Args->UseCount; i++)
> + {
> + /* Offset zero indicates "arg not used" */
> + /* TBD: Not really needed now, with UseCount available */
> +
> + if (Args->Offset[i] == 0)
> + {
> + break;
> + }
> +
> + PrReplaceData (
> + &Gbl_MacroTokenBuffer[Args->Offset[i]], strlen (Args->Name),
> + Token, strlen (Token));
> +
> + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
> + "ExpandArg: %s \n",
> + Gbl_CurrentLineNumber, Gbl_MacroTokenBuffer);
> + }
> +
> + Args++;
> + }
> +
> + /* TBD: need to make sure macro was not invoked with too many arguments */
> +
> + if (!Token)
> + {
> + return;
> + }
> +
> + /* Replace the entire macro invocation with the expanded macro */
> +
> + TokenOffset = (MacroStart - TokenBuffer);
> + Length = Token - MacroStart + strlen (Token) + 1;
> +
> + PrReplaceData (
> + &Gbl_CurrentLineBuffer[TokenOffset], Length,
> + Gbl_MacroTokenBuffer, strlen (Gbl_MacroTokenBuffer));
> +
> + return;
> +
> +
> +BadInvocation:
> + PrError (ASL_ERROR, ASL_MSG_INVALID_INVOCATION,
> + THIS_TOKEN_OFFSET (MacroStart));
> +
> + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
> + "Bad macro invocation: %s \n",
> + Gbl_CurrentLineNumber, Gbl_MacroTokenBuffer);
> + return;
> +}
> diff --git a/src/acpica/source/compiler/prparser.l b/src/acpica/source/compiler/prparser.l
> new file mode 100644
> index 0000000..d20ac28
> --- /dev/null
> +++ b/src/acpica/source/compiler/prparser.l
> @@ -0,0 +1,225 @@
> +%{
> +/******************************************************************************
> + *
> + * Module Name: prparser.l - Flex input file for preprocessor lexer
> + *
> + *****************************************************************************/
> +
> +/******************************************************************************
> + *
> + * 1. Copyright Notice
> + *
> + * Some or all of this work - Copyright (c) 1999 - 2012, Intel Corp.
> + * All rights reserved.
> + *
> + * 2. License
> + *
> + * 2.1. This is your license from Intel Corp. under its intellectual property
> + * rights. You may have additional license terms from the party that provided
> + * you this software, covering your right to use that party's intellectual
> + * property rights.
> + *
> + * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
> + * copy of the source code appearing in this file ("Covered Code") an
> + * irrevocable, perpetual, worldwide license under Intel's copyrights in the
> + * base code distributed originally by Intel ("Original Intel Code") to copy,
> + * make derivatives, distribute, use and display any portion of the Covered
> + * Code in any form, with the right to sublicense such rights; and
> + *
> + * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
> + * license (with the right to sublicense), under only those claims of Intel
> + * patents that are infringed by the Original Intel Code, to make, use, sell,
> + * offer to sell, and import the Covered Code and derivative works thereof
> + * solely to the minimum extent necessary to exercise the above copyright
> + * license, and in no event shall the patent license extend to any additions
> + * to or modifications of the Original Intel Code. No other license or right
> + * is granted directly or by implication, estoppel or otherwise;
> + *
> + * The above copyright and patent license is granted only if the following
> + * conditions are met:
> + *
> + * 3. Conditions
> + *
> + * 3.1. Redistribution of Source with Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification with rights to further distribute source must include
> + * the above Copyright Notice, the above License, this list of Conditions,
> + * and the following Disclaimer and Export Compliance provision. In addition,
> + * Licensee must cause all Covered Code to which Licensee contributes to
> + * contain a file documenting the changes Licensee made to create that Covered
> + * Code and the date of any change. Licensee must include in that file the
> + * documentation of any changes made by any predecessor Licensee. Licensee
> + * must include a prominent statement that the modification is derived,
> + * directly or indirectly, from Original Intel Code.
> + *
> + * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification without rights to further distribute source must
> + * include the following Disclaimer and Export Compliance provision in the
> + * documentation and/or other materials provided with distribution. In
> + * addition, Licensee may not authorize further sublicense of source of any
> + * portion of the Covered Code, and must include terms to the effect that the
> + * license from Licensee to its licensee is limited to the intellectual
> + * property embodied in the software Licensee provides to its licensee, and
> + * not to intellectual property embodied in modifications its licensee may
> + * make.
> + *
> + * 3.3. Redistribution of Executable. Redistribution in executable form of any
> + * substantial portion of the Covered Code or modification must reproduce the
> + * above Copyright Notice, and the following Disclaimer and Export Compliance
> + * provision in the documentation and/or other materials provided with the
> + * distribution.
> + *
> + * 3.4. Intel retains all right, title, and interest in and to the Original
> + * Intel Code.
> + *
> + * 3.5. Neither the name Intel nor any other trademark owned or controlled by
> + * Intel shall be used in advertising or otherwise to promote the sale, use or
> + * other dealings in products derived from or relating to the Covered Code
> + * without prior written authorization from Intel.
> + *
> + * 4. Disclaimer and Export Compliance
> + *
> + * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
> + * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
> + * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
> + * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
> + * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
> + * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
> + * PARTICULAR PURPOSE.
> + *
> + * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
> + * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
> + * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
> + * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
> + * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
> + * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
> + * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
> + * LIMITED REMEDY.
> + *
> + * 4.3. Licensee shall not export, either directly or indirectly, any of this
> + * software or system incorporating such software without first obtaining any
> + * required license or other approval from the U. S. Department of Commerce or
> + * any other agency or department of the United States Government. In the
> + * event Licensee exports any such software from the United States or
> + * re-exports any such software from a foreign destination, Licensee shall
> + * ensure that the distribution and export/re-export of the software is in
> + * compliance with all laws, regulations, orders, or other restrictions of the
> + * U.S. Export Administration Regulations. Licensee agrees that neither it nor
> + * any of its subsidiaries will export/re-export any technical data, process,
> + * software, or service, directly or indirectly, to any country for which the
> + * United States government or any agency thereof requires an export license,
> + * other governmental approval, or letter of assurance, without first obtaining
> + * such license, approval or letter.
> + *
> + *****************************************************************************/
> +
> +#include "aslcompiler.h"
> +#include "prparser.y.h"
> +
> +/* Buffer to pass strings to the parser */
> +
> +#define STRING_SETUP strcpy (StringBuffer, PrParsertext);\
> + PrParserlval.str = StringBuffer
> +
> +#define YY_NO_INPUT /* No file input, we use strings only */
> +
> +#define _COMPONENT ACPI_COMPILER
> + ACPI_MODULE_NAME ("prscanner")
> +%}
> +
> +%option noyywrap
> +%option nounput
> +
> +Number [0-9a-fA-F]+
> +HexNumber 0[xX][0-9a-fA-F]+
> +WhiteSpace [ \t\v\r]+
> +NewLine [\n]
> +Identifier [a-zA-Z][0-9a-zA-Z]*
> +
> +%%
> +
> +\( return (EXPOP_PAREN_OPEN);
> +\) return (EXPOP_PAREN_CLOSE);
> +\~ return (EXPOP_ONES_COMPLIMENT);
> +\! return (EXPOP_LOGICAL_NOT);
> +\* return (EXPOP_MULTIPLY);
> +\/ return (EXPOP_DIVIDE);
> +\% return (EXPOP_MODULO);
> +\+ return (EXPOP_ADD);
> +\- return (EXPOP_SUBTRACT);
> +">>" return (EXPOP_SHIFT_RIGHT);
> +"<<" return (EXPOP_SHIFT_LEFT);
> +\< return (EXPOP_LESS);
> +\> return (EXPOP_GREATER);
> +"<=" return (EXPOP_LESS_EQUAL);
> +">=" return (EXPOP_GREATER_EQUAL);
> +"==" return (EXPOP_EQUAL);
> +"!=" return (EXPOP_NOT_EQUAL);
> +\& return (EXPOP_AND);
> +\^ return (EXPOP_XOR);
> +\| return (EXPOP_OR);
> +"&&" return (EXPOP_LOGICAL_AND);
> +"||" return (EXPOP_LOGICAL_OR);
> +
> +"defined" return (EXPOP_DEFINE);
> +{Identifier} {STRING_SETUP; return (EXPOP_IDENTIFIER);}
> +
> +<<EOF>> return (EXPOP_EOF); /* null end-of-string */
> +
> +{Number} return (EXPOP_NUMBER);
> +{HexNumber} return (EXPOP_HEX_NUMBER);
> +{NewLine} return (EXPOP_NEW_LINE);
> +{WhiteSpace} /* Ignore */
> +
> +. return (EXPOP_EOF);
> +%%
> +
> +/*
> + * Local support functions
> + */
> +YY_BUFFER_STATE LexBuffer;
> +
> +
> +/******************************************************************************
> + *
> + * FUNCTION: PrInitLexer
> + *
> + * PARAMETERS: String - Input string to be parsed
> + *
> + * RETURN: TRUE if parser returns NULL. FALSE otherwise.
> + *
> + * DESCRIPTION: Initialization routine for lexer. The lexer needs
> + * a buffer to handle strings instead of a file.
> + *
> + *****************************************************************************/
> +
> +int
> +PrInitLexer (
> + char *String)
> +{
> +
> + LexBuffer = yy_scan_string (String);
> + return (LexBuffer == NULL);
> +}
> +
> +
> +/******************************************************************************
> + *
> + * FUNCTION: PrTerminateLexer
> + *
> + * PARAMETERS: None
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Termination routine for thelexer.
> + *
> + *****************************************************************************/
> +
> +void
> +PrTerminateLexer (
> + void)
> +{
> +
> + yy_delete_buffer (LexBuffer);
> +}
> diff --git a/src/acpica/source/compiler/prparser.y b/src/acpica/source/compiler/prparser.y
> new file mode 100644
> index 0000000..3c3e3a7
> --- /dev/null
> +++ b/src/acpica/source/compiler/prparser.y
> @@ -0,0 +1,356 @@
> +%{
> +/******************************************************************************
> + *
> + * Module Name: prparser.y - Bison input file for preprocessor parser
> + *
> + *****************************************************************************/
> +
> +/******************************************************************************
> + *
> + * 1. Copyright Notice
> + *
> + * Some or all of this work - Copyright (c) 1999 - 2012, Intel Corp.
> + * All rights reserved.
> + *
> + * 2. License
> + *
> + * 2.1. This is your license from Intel Corp. under its intellectual property
> + * rights. You may have additional license terms from the party that provided
> + * you this software, covering your right to use that party's intellectual
> + * property rights.
> + *
> + * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
> + * copy of the source code appearing in this file ("Covered Code") an
> + * irrevocable, perpetual, worldwide license under Intel's copyrights in the
> + * base code distributed originally by Intel ("Original Intel Code") to copy,
> + * make derivatives, distribute, use and display any portion of the Covered
> + * Code in any form, with the right to sublicense such rights; and
> + *
> + * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
> + * license (with the right to sublicense), under only those claims of Intel
> + * patents that are infringed by the Original Intel Code, to make, use, sell,
> + * offer to sell, and import the Covered Code and derivative works thereof
> + * solely to the minimum extent necessary to exercise the above copyright
> + * license, and in no event shall the patent license extend to any additions
> + * to or modifications of the Original Intel Code. No other license or right
> + * is granted directly or by implication, estoppel or otherwise;
> + *
> + * The above copyright and patent license is granted only if the following
> + * conditions are met:
> + *
> + * 3. Conditions
> + *
> + * 3.1. Redistribution of Source with Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification with rights to further distribute source must include
> + * the above Copyright Notice, the above License, this list of Conditions,
> + * and the following Disclaimer and Export Compliance provision. In addition,
> + * Licensee must cause all Covered Code to which Licensee contributes to
> + * contain a file documenting the changes Licensee made to create that Covered
> + * Code and the date of any change. Licensee must include in that file the
> + * documentation of any changes made by any predecessor Licensee. Licensee
> + * must include a prominent statement that the modification is derived,
> + * directly or indirectly, from Original Intel Code.
> + *
> + * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification without rights to further distribute source must
> + * include the following Disclaimer and Export Compliance provision in the
> + * documentation and/or other materials provided with distribution. In
> + * addition, Licensee may not authorize further sublicense of source of any
> + * portion of the Covered Code, and must include terms to the effect that the
> + * license from Licensee to its licensee is limited to the intellectual
> + * property embodied in the software Licensee provides to its licensee, and
> + * not to intellectual property embodied in modifications its licensee may
> + * make.
> + *
> + * 3.3. Redistribution of Executable. Redistribution in executable form of any
> + * substantial portion of the Covered Code or modification must reproduce the
> + * above Copyright Notice, and the following Disclaimer and Export Compliance
> + * provision in the documentation and/or other materials provided with the
> + * distribution.
> + *
> + * 3.4. Intel retains all right, title, and interest in and to the Original
> + * Intel Code.
> + *
> + * 3.5. Neither the name Intel nor any other trademark owned or controlled by
> + * Intel shall be used in advertising or otherwise to promote the sale, use or
> + * other dealings in products derived from or relating to the Covered Code
> + * without prior written authorization from Intel.
> + *
> + * 4. Disclaimer and Export Compliance
> + *
> + * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
> + * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
> + * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
> + * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
> + * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
> + * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
> + * PARTICULAR PURPOSE.
> + *
> + * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
> + * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
> + * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
> + * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
> + * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
> + * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
> + * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
> + * LIMITED REMEDY.
> + *
> + * 4.3. Licensee shall not export, either directly or indirectly, any of this
> + * software or system incorporating such software without first obtaining any
> + * required license or other approval from the U. S. Department of Commerce or
> + * any other agency or department of the United States Government. In the
> + * event Licensee exports any such software from the United States or
> + * re-exports any such software from a foreign destination, Licensee shall
> + * ensure that the distribution and export/re-export of the software is in
> + * compliance with all laws, regulations, orders, or other restrictions of the
> + * U.S. Export Administration Regulations. Licensee agrees that neither it nor
> + * any of its subsidiaries will export/re-export any technical data, process,
> + * software, or service, directly or indirectly, to any country for which the
> + * United States government or any agency thereof requires an export license,
> + * other governmental approval, or letter of assurance, without first obtaining
> + * such license, approval or letter.
> + *
> + *****************************************************************************/
> +
> +#include "aslcompiler.h"
> +#include "dtcompiler.h"
> +
> +#define _COMPONENT ASL_PREPROCESSOR
> + ACPI_MODULE_NAME ("prparser")
> +
> +int PrParserlex (void);
> +int PrParserparse (void);
> +void PrParsererror (char const *msg);
> +extern char *PrParsertext;
> +
> +UINT64 PrParserResult; /* Expression return value */
> +
> +/* Bison/yacc configuration */
> +
> +#define yytname PrParsername
> +#define YYDEBUG 1 /* Enable debug output */
> +#define YYERROR_VERBOSE 1 /* Verbose error messages */
> +#define YYFLAG -32768
> +
> +/* Define YYMALLOC/YYFREE to prevent redefinition errors */
> +
> +#define YYMALLOC malloc
> +#define YYFREE free
> +%}
> +
> +%union
> +{
> + UINT64 value;
> + UINT32 op;
> + char *str;
> +}
> +
> +/*! [Begin] no source code translation */
> +
> +%type <value> Expression
> +
> +%token <op> EXPOP_EOF
> +%token <op> EXPOP_NEW_LINE
> +%token <op> EXPOP_NUMBER
> +%token <op> EXPOP_HEX_NUMBER
> +%token <op> EXPOP_RESERVED1
> +%token <op> EXPOP_RESERVED2
> +%token <op> EXPOP_PAREN_OPEN
> +%token <op> EXPOP_PAREN_CLOSE
> +
> +%left <op> EXPOP_LOGICAL_OR
> +%left <op> EXPOP_LOGICAL_AND
> +%left <op> EXPOP_OR
> +%left <op> EXPOP_XOR
> +%left <op> EXPOP_AND
> +%left <op> EXPOP_EQUAL EXPOP_NOT_EQUAL
> +%left <op> EXPOP_GREATER EXPOP_LESS EXPOP_GREATER_EQUAL EXPOP_LESS_EQUAL
> +%left <op> EXPOP_SHIFT_RIGHT EXPOP_SHIFT_LEFT
> +%left <op> EXPOP_ADD EXPOP_SUBTRACT
> +%left <op> EXPOP_MULTIPLY EXPOP_DIVIDE EXPOP_MODULO
> +%right <op> EXPOP_ONES_COMPLIMENT EXPOP_LOGICAL_NOT
> +
> +/* Tokens above must be kept in synch with dtparser.y */
> +
> +%token <op> EXPOP_DEFINE
> +%token <op> EXPOP_IDENTIFIER
> +
> +%%
> +
> +/*
> + * Operator precedence rules (from K&R)
> + *
> + * 1) ( )
> + * 2) ! ~ (unary operators that are supported here)
> + * 3) * / %
> + * 4) + -
> + * 5) >> <<
> + * 6) < > <= >=
> + * 7) == !=
> + * 8) &
> + * 9) ^
> + * 10) |
> + * 11) &&
> + * 12) ||
> + */
> +
> +/*! [End] no source code translation !*/
> +
> +Value
> + : Expression EXPOP_NEW_LINE { PrParserResult=$1; return 0; } /* End of line (newline) */
> + | Expression EXPOP_EOF { PrParserResult=$1; return 0; } /* End of string (0) */
> + ;
> +
> +Expression
> +
> + /* Unary operators */
> +
> + : EXPOP_LOGICAL_NOT Expression { $$ = DtDoOperator ($2, EXPOP_LOGICAL_NOT, $2);}
> + | EXPOP_ONES_COMPLIMENT Expression { $$ = DtDoOperator ($2, EXPOP_ONES_COMPLIMENT, $2);}
> +
> + /* Binary operators */
> +
> + | Expression EXPOP_MULTIPLY Expression { $$ = DtDoOperator ($1, EXPOP_MULTIPLY, $3);}
> + | Expression EXPOP_DIVIDE Expression { $$ = DtDoOperator ($1, EXPOP_DIVIDE, $3);}
> + | Expression EXPOP_MODULO Expression { $$ = DtDoOperator ($1, EXPOP_MODULO, $3);}
> + | Expression EXPOP_ADD Expression { $$ = DtDoOperator ($1, EXPOP_ADD, $3);}
> + | Expression EXPOP_SUBTRACT Expression { $$ = DtDoOperator ($1, EXPOP_SUBTRACT, $3);}
> + | Expression EXPOP_SHIFT_RIGHT Expression { $$ = DtDoOperator ($1, EXPOP_SHIFT_RIGHT, $3);}
> + | Expression EXPOP_SHIFT_LEFT Expression { $$ = DtDoOperator ($1, EXPOP_SHIFT_LEFT, $3);}
> + | Expression EXPOP_GREATER Expression { $$ = DtDoOperator ($1, EXPOP_GREATER, $3);}
> + | Expression EXPOP_LESS Expression { $$ = DtDoOperator ($1, EXPOP_LESS, $3);}
> + | Expression EXPOP_GREATER_EQUAL Expression { $$ = DtDoOperator ($1, EXPOP_GREATER_EQUAL, $3);}
> + | Expression EXPOP_LESS_EQUAL Expression { $$ = DtDoOperator ($1, EXPOP_LESS_EQUAL, $3);}
> + | Expression EXPOP_EQUAL Expression { $$ = DtDoOperator ($1, EXPOP_EQUAL, $3);}
> + | Expression EXPOP_NOT_EQUAL Expression { $$ = DtDoOperator ($1, EXPOP_NOT_EQUAL, $3);}
> + | Expression EXPOP_AND Expression { $$ = DtDoOperator ($1, EXPOP_AND, $3);}
> + | Expression EXPOP_XOR Expression { $$ = DtDoOperator ($1, EXPOP_XOR, $3);}
> + | Expression EXPOP_OR Expression { $$ = DtDoOperator ($1, EXPOP_OR, $3);}
> + | Expression EXPOP_LOGICAL_AND Expression { $$ = DtDoOperator ($1, EXPOP_LOGICAL_AND, $3);}
> + | Expression EXPOP_LOGICAL_OR Expression { $$ = DtDoOperator ($1, EXPOP_LOGICAL_OR, $3);}
> +
> + /* Parentheses: '(' Expression ')' */
> +
> + | EXPOP_PAREN_OPEN Expression
> + EXPOP_PAREN_CLOSE { $$ = $2;}
> +
> + /* #if defined (ID) or #if defined ID */
> +
> + | EXPOP_DEFINE EXPOP_PAREN_OPEN EXPOP_IDENTIFIER
> + EXPOP_PAREN_CLOSE { $$ = PrIsDefined (PrParserlval.str);}
> +
> + | EXPOP_DEFINE EXPOP_IDENTIFIER { $$ = PrIsDefined (PrParserlval.str);}
> +
> + | EXPOP_IDENTIFIER { $$ = PrResolveDefine (PrParserlval.str);}
> +
> + /* Default base for a non-prefixed integer is 10 */
> +
> + | EXPOP_NUMBER { UtStrtoul64 (PrParsertext, 10, &$$);}
> +
> + /* Standard hex number (0x1234) */
> +
> + | EXPOP_HEX_NUMBER { UtStrtoul64 (PrParsertext, 16, &$$);}
> + ;
> +%%
> +
> +/*
> + * Local support functions, including parser entry point
> + */
> +#define PR_FIRST_PARSE_OPCODE EXPOP_EOF
> +#define PR_YYTNAME_START 3
> +
> +
> +/******************************************************************************
> + *
> + * FUNCTION: PrParsererror
> + *
> + * PARAMETERS: Message - Parser-generated error message
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Handler for parser errors
> + *
> + *****************************************************************************/
> +
> +void
> +PrParsererror (
> + char const *Message)
> +{
> + DtError (ASL_ERROR, ASL_MSG_SYNTAX,
> + NULL, (char *) Message);
> +}
> +
> +
> +/******************************************************************************
> + *
> + * FUNCTION: PrGetOpName
> + *
> + * PARAMETERS: ParseOpcode - Parser token (EXPOP_*)
> + *
> + * RETURN: Pointer to the opcode name
> + *
> + * DESCRIPTION: Get the ascii name of the parse opcode for debug output
> + *
> + *****************************************************************************/
> +
> +char *
> +PrGetOpName (
> + UINT32 ParseOpcode)
> +{
> +#ifdef ASL_YYTNAME_START
> + /*
> + * First entries (PR_YYTNAME_START) in yytname are special reserved names.
> + * Ignore first 6 characters of name (EXPOP_)
> + */
> + return ((char *) yytname
> + [(ParseOpcode - PR_FIRST_PARSE_OPCODE) + PR_YYTNAME_START] + 6);
> +#else
> + return ("[Unknown parser generator]");
> +#endif
> +}
> +
> +
> +/******************************************************************************
> + *
> + * FUNCTION: PrEvaluateExpression
> + *
> + * PARAMETERS: ExprString - Expression to be evaluated. Must be
> + * terminated by either a newline or a NUL
> + * string terminator
> + *
> + * RETURN: 64-bit value for the expression
> + *
> + * DESCRIPTION: Main entry point for the DT expression parser
> + *
> + *****************************************************************************/
> +
> +UINT64
> +PrEvaluateExpression (
> + char *ExprString)
> +{
> +
> + DbgPrint (ASL_DEBUG_OUTPUT,
> + "**** Input expression: %s\n", ExprString);
> +
> + /* Point lexer to the input string */
> +
> + if (PrInitLexer (ExprString))
> + {
> + DtError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL,
> + NULL, "Could not initialize lexer");
> + return (0);
> + }
> +
> + /* Parse/Evaluate the input string (value returned in PrParserResult) */
> +
> + PrParserparse ();
> + PrTerminateLexer ();
> +
> + DbgPrint (ASL_DEBUG_OUTPUT,
> + "**** Parser returned value: %u (%8.8X%8.8X)\n",
> + (UINT32) PrParserResult, ACPI_FORMAT_UINT64 (PrParserResult));
> +
> + return (PrParserResult);
> +}
> diff --git a/src/acpica/source/compiler/prscan.c b/src/acpica/source/compiler/prscan.c
> new file mode 100644
> index 0000000..e98e186
> --- /dev/null
> +++ b/src/acpica/source/compiler/prscan.c
> @@ -0,0 +1,844 @@
> +/******************************************************************************
> + *
> + * Module Name: prscan - Preprocessor start-up and file scan module
> + *
> + *****************************************************************************/
> +
> +/******************************************************************************
> + *
> + * 1. Copyright Notice
> + *
> + * Some or all of this work - Copyright (c) 1999 - 2012, Intel Corp.
> + * All rights reserved.
> + *
> + * 2. License
> + *
> + * 2.1. This is your license from Intel Corp. under its intellectual property
> + * rights. You may have additional license terms from the party that provided
> + * you this software, covering your right to use that party's intellectual
> + * property rights.
> + *
> + * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
> + * copy of the source code appearing in this file ("Covered Code") an
> + * irrevocable, perpetual, worldwide license under Intel's copyrights in the
> + * base code distributed originally by Intel ("Original Intel Code") to copy,
> + * make derivatives, distribute, use and display any portion of the Covered
> + * Code in any form, with the right to sublicense such rights; and
> + *
> + * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
> + * license (with the right to sublicense), under only those claims of Intel
> + * patents that are infringed by the Original Intel Code, to make, use, sell,
> + * offer to sell, and import the Covered Code and derivative works thereof
> + * solely to the minimum extent necessary to exercise the above copyright
> + * license, and in no event shall the patent license extend to any additions
> + * to or modifications of the Original Intel Code. No other license or right
> + * is granted directly or by implication, estoppel or otherwise;
> + *
> + * The above copyright and patent license is granted only if the following
> + * conditions are met:
> + *
> + * 3. Conditions
> + *
> + * 3.1. Redistribution of Source with Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification with rights to further distribute source must include
> + * the above Copyright Notice, the above License, this list of Conditions,
> + * and the following Disclaimer and Export Compliance provision. In addition,
> + * Licensee must cause all Covered Code to which Licensee contributes to
> + * contain a file documenting the changes Licensee made to create that Covered
> + * Code and the date of any change. Licensee must include in that file the
> + * documentation of any changes made by any predecessor Licensee. Licensee
> + * must include a prominent statement that the modification is derived,
> + * directly or indirectly, from Original Intel Code.
> + *
> + * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification without rights to further distribute source must
> + * include the following Disclaimer and Export Compliance provision in the
> + * documentation and/or other materials provided with distribution. In
> + * addition, Licensee may not authorize further sublicense of source of any
> + * portion of the Covered Code, and must include terms to the effect that the
> + * license from Licensee to its licensee is limited to the intellectual
> + * property embodied in the software Licensee provides to its licensee, and
> + * not to intellectual property embodied in modifications its licensee may
> + * make.
> + *
> + * 3.3. Redistribution of Executable. Redistribution in executable form of any
> + * substantial portion of the Covered Code or modification must reproduce the
> + * above Copyright Notice, and the following Disclaimer and Export Compliance
> + * provision in the documentation and/or other materials provided with the
> + * distribution.
> + *
> + * 3.4. Intel retains all right, title, and interest in and to the Original
> + * Intel Code.
> + *
> + * 3.5. Neither the name Intel nor any other trademark owned or controlled by
> + * Intel shall be used in advertising or otherwise to promote the sale, use or
> + * other dealings in products derived from or relating to the Covered Code
> + * without prior written authorization from Intel.
> + *
> + * 4. Disclaimer and Export Compliance
> + *
> + * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
> + * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
> + * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
> + * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
> + * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
> + * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
> + * PARTICULAR PURPOSE.
> + *
> + * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
> + * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
> + * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
> + * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
> + * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
> + * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
> + * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
> + * LIMITED REMEDY.
> + *
> + * 4.3. Licensee shall not export, either directly or indirectly, any of this
> + * software or system incorporating such software without first obtaining any
> + * required license or other approval from the U. S. Department of Commerce or
> + * any other agency or department of the United States Government. In the
> + * event Licensee exports any such software from the United States or
> + * re-exports any such software from a foreign destination, Licensee shall
> + * ensure that the distribution and export/re-export of the software is in
> + * compliance with all laws, regulations, orders, or other restrictions of the
> + * U.S. Export Administration Regulations. Licensee agrees that neither it nor
> + * any of its subsidiaries will export/re-export any technical data, process,
> + * software, or service, directly or indirectly, to any country for which the
> + * United States government or any agency thereof requires an export license,
> + * other governmental approval, or letter of assurance, without first obtaining
> + * such license, approval or letter.
> + *
> + *****************************************************************************/
> +
> +#define _DECLARE_PR_GLOBALS
> +
> +#include "aslcompiler.h"
> +#include "dtcompiler.h"
> +
> +/*
> + * TBDs:
> + *
> + * No nested macros, maybe never
> + * Implement ASL "Include" as well as "#include" here?
> + */
> +#define _COMPONENT ASL_PREPROCESSOR
> + ACPI_MODULE_NAME ("prscan")
> +
> +
> +/* Local prototypes */
> +
> +static void
> +PrPreprocessInputFile (
> + void);
> +
> +static void
> +PrDoDirective (
> + char *DirectiveToken,
> + char **Next,
> + BOOLEAN *IgnoringThisCodeBlock);
> +
> +static int
> +PrMatchDirective (
> + char *Directive);
> +
> +/*
> + * Supported preprocessor directives
> + */
> +static const PR_DIRECTIVE_INFO Gbl_DirectiveInfo[] =
> +{
> + {"define", 1},
> + {"elif", 0}, /* Converted to #else..#if internally */
> + {"else", 0},
> + {"endif", 0},
> + {"error", 1},
> + {"if", 1},
> + {"ifdef", 1},
> + {"ifndef", 1},
> + {"include", 0}, /* Argument is not standard format, so 0 */
> + {"line", 1},
> + {"pragma", 1},
> + {"undef", 1},
> + {"warning", 1},
> + {NULL, 0}
> +};
> +
> +enum Gbl_DirectiveIndexes
> +{
> + PR_DIRECTIVE_DEFINE = 0,
> + PR_DIRECTIVE_ELIF,
> + PR_DIRECTIVE_ELSE,
> + PR_DIRECTIVE_ENDIF,
> + PR_DIRECTIVE_ERROR,
> + PR_DIRECTIVE_IF,
> + PR_DIRECTIVE_IFDEF,
> + PR_DIRECTIVE_IFNDEF,
> + PR_DIRECTIVE_INCLUDE,
> + PR_DIRECTIVE_LINE,
> + PR_DIRECTIVE_PRAGMA,
> + PR_DIRECTIVE_UNDEF,
> + PR_DIRECTIVE_WARNING,
> +};
> +
> +#define ASL_DIRECTIVE_NOT_FOUND -1
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: PrInitializePreprocessor
> + *
> + * PARAMETERS: None
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Startup initialization for the Preprocessor.
> + *
> + ******************************************************************************/
> +
> +void
> +PrInitializePreprocessor (
> + void)
> +{
> + /* Init globals and the list of #defines */
> +
> + PrInitializeGlobals ();
> + Gbl_DefineList = NULL;
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: PrInitializeGlobals
> + *
> + * PARAMETERS: None
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Initialize globals for the Preprocessor. Used for startuup
> + * initialization and re-initialization between compiles during
> + * a multiple source file compile.
> + *
> + ******************************************************************************/
> +
> +void
> +PrInitializeGlobals (
> + void)
> +{
> + /* Init globals */
> +
> + Gbl_IfDepth = 0;
> + Gbl_InputFileList = NULL;
> + Gbl_CurrentLineNumber = 0;
> + Gbl_PreprocessorLineNumber = 1;
> + Gbl_PreprocessorError = FALSE;
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: PrTerminatePreprocessor
> + *
> + * PARAMETERS: None
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Termination of the preprocessor. Delete lists. Keep any
> + * defines that were specified on the command line, in order to
> + * support multiple compiles with a single compiler invocation.
> + *
> + ******************************************************************************/
> +
> +void
> +PrTerminatePreprocessor (
> + void)
> +{
> + PR_DEFINE_INFO *DefineInfo;
> +
> +
> + /*
> + * The persistent defines (created on the command line) are always at the
> + * end of the list. We save them.
> + */
> + while ((Gbl_DefineList) && (!Gbl_DefineList->Persist))
> + {
> + DefineInfo = Gbl_DefineList;
> + Gbl_DefineList = DefineInfo->Next;
> +
> + ACPI_FREE (DefineInfo->Replacement);
> + ACPI_FREE (DefineInfo->Identifier);
> + ACPI_FREE (DefineInfo);
> + }
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: PrDoPreprocess
> + *
> + * PARAMETERS: None
> + *
> + * RETURN: Error Status. TRUE if error, FALSE if OK.
> + *
> + * DESCRIPTION: Main entry point for the iASL Preprocessor. Input file must
> + * be already open. Handles multiple input files via the
> + * #include directive.
> + *
> + ******************************************************************************/
> +
> +BOOLEAN
> +PrDoPreprocess (
> + void)
> +{
> + BOOLEAN MoreInputFiles;
> +
> +
> + DbgPrint (ASL_DEBUG_OUTPUT, "Starting preprocessing phase\n\n");
> +
> +
> + FlSeekFile (ASL_FILE_INPUT, 0);
> + PrDumpPredefinedNames ();
> +
> + /* Main preprocessor loop, handles include files */
> +
> + do
> + {
> + PrPreprocessInputFile ();
> + MoreInputFiles = PrPopInputFileStack ();
> +
> + } while (MoreInputFiles);
> +
> +
> + /*
> + * TBD: is this necessary? (Do we abort on any preprocessing errors?)
> + */
> + if (Gbl_PreprocessorError)
> + {
> + /* TBD: can't use source_output file for preprocessor error reporting */
> +
> + Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle = NULL;
> + PrTerminatePreprocessor ();
> + return (TRUE);
> + }
> +
> + /* Point compiler input to the new preprocessor file (.i) */
> +
> + FlCloseFile (ASL_FILE_INPUT);
> + Gbl_Files[ASL_FILE_INPUT].Handle = Gbl_Files[ASL_FILE_PREPROCESSOR].Handle;
> + AslCompilerin = Gbl_Files[ASL_FILE_INPUT].Handle;
> +
> + /* Reset globals to allow compiler to run */
> +
> + FlSeekFile (ASL_FILE_INPUT, 0);
> + Gbl_CurrentLineNumber = 1;
> +
> + DbgPrint (ASL_DEBUG_OUTPUT, "Preprocessing phase complete \n\n");
> + return (FALSE);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: PrPreprocessInputFile
> + *
> + * PARAMETERS: None
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Preprocess one entire file, line-by-line.
> + *
> + * Input: Raw user ASL from ASL_FILE_INPUT
> + * Output: Preprocessed file written to ASL_FILE_PREPROCESSOR
> + *
> + ******************************************************************************/
> +
> +static void
> +PrPreprocessInputFile (
> + void)
> +{
> + UINT32 Offset;
> + char *Token;
> + char *ReplaceString;
> + PR_DEFINE_INFO *DefineInfo;
> + ACPI_SIZE TokenOffset;
> + BOOLEAN IgnoringThisCodeBlock = FALSE;
> + char *Next;
> + int OffsetAdjust;
> +
> +
> + /* Scan line-by-line. Comments and blank lines are skipped by this function */
> +
> + while ((Offset = DtGetNextLine (Gbl_Files[ASL_FILE_INPUT].Handle)) != ASL_EOF)
> + {
> + /* Need a copy of the input line for strok() */
> +
> + strcpy (Gbl_MainTokenBuffer, Gbl_CurrentLineBuffer);
> + Token = PrGetNextToken (Gbl_MainTokenBuffer, PR_TOKEN_SEPARATORS, &Next);
> + OffsetAdjust = 0;
> +
> + /* All preprocessor directives must begin with '#' */
> +
> + if (Token && (*Token == '#'))
> + {
> + if (strlen (Token) == 1)
> + {
> + Token = PrGetNextToken (NULL, PR_TOKEN_SEPARATORS, &Next);
> + }
> + else
> + {
> + Token++; /* Skip leading # */
> + }
> +
> + /* Execute the directive, do not write line to output file */
> +
> + PrDoDirective (Token, &Next, &IgnoringThisCodeBlock);
> + continue;
> + }
> +
> + /*
> + * If we are currently within the part of an IF/ELSE block that is
> + * FALSE, ignore the line and do not write it to the output file.
> + * This continues until an #else or #endif is encountered.
> + */
> + if (IgnoringThisCodeBlock == TRUE)
> + {
> + continue;
> + }
> +
> + /* Match and replace all #defined names within this source line */
> +
> + while (Token)
> + {
> + DefineInfo = PrMatchDefine (Token);
> + if (DefineInfo)
> + {
> + if (DefineInfo->Body)
> + {
> + /* This is a macro */
> +
> + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
> + "Matched Macro: %s->%s\n",
> + Gbl_CurrentLineNumber, DefineInfo->Identifier,
> + DefineInfo->Replacement);
> +
> + PrDoMacroInvocation (Gbl_MainTokenBuffer, Token,
> + DefineInfo, &Next);
> + }
> + else
> + {
> + ReplaceString = DefineInfo->Replacement;
> +
> + /* Replace the name in the original line buffer */
> +
> + TokenOffset = Token - Gbl_MainTokenBuffer + OffsetAdjust;
> + PrReplaceData (
> + &Gbl_CurrentLineBuffer[TokenOffset], strlen (Token),
> + ReplaceString, strlen (ReplaceString));
> +
> + /* Adjust for length difference between old and new name length */
> +
> + OffsetAdjust += strlen (ReplaceString) - strlen (Token);
> +
> + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
> + "Matched #define: %s->%s\n",
> + Gbl_CurrentLineNumber, Token,
> + *ReplaceString ? ReplaceString : "(NULL STRING)");
> + }
> + }
> +
> + Token = PrGetNextToken (NULL, PR_TOKEN_SEPARATORS, &Next);
> + }
> +
> +#if 0
> +/* Line prefix */
> + FlPrintFile (ASL_FILE_PREPROCESSOR, "/* %14s %.5u i:%.5u */ ",
> + Gbl_Files[ASL_FILE_INPUT].Filename,
> + Gbl_CurrentLineNumber, Gbl_PreprocessorLineNumber);
> +#endif
> +
> + /*
> + * Emit a #line directive if necessary, to keep the line numbers in
> + * the (.i) file synchronized with the original source code file, so
> + * that the correct line number appears in any error messages
> + * generated by the actual compiler.
> + */
> + if (Gbl_CurrentLineNumber > (Gbl_PreviousLineNumber + 1))
> + {
> + FlPrintFile (ASL_FILE_PREPROCESSOR, "#line %u\n",
> + Gbl_CurrentLineNumber);
> + }
> +
> + Gbl_PreviousLineNumber = Gbl_CurrentLineNumber;
> + Gbl_PreprocessorLineNumber++;
> +
> + /*
> + * Now we can write the possibly modified source line to the
> + * preprocessor (.i) file
> + */
> + FlWriteFile (ASL_FILE_PREPROCESSOR, Gbl_CurrentLineBuffer,
> + strlen (Gbl_CurrentLineBuffer));
> + }
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: PrDoDirective
> + *
> + * PARAMETERS: Directive - Pointer to directive name token
> + * Next - "Next" buffer from GetNextToken
> + * IgnoringThisCodeBlock - Where the "ignore code" flag is
> + * returned.
> + *
> + * RETURN: IgnoringThisCodeBlock: Set to TRUE if we are skipping the FALSE
> + * part of an #if or #else block. Set to FALSE when the
> + * corresponding #else or #endif is encountered.
> + *
> + * DESCRIPTION: Main processing for all preprocessor directives
> + *
> + ******************************************************************************/
> +
> +static void
> +PrDoDirective (
> + char *DirectiveToken,
> + char **Next,
> + BOOLEAN *IgnoringThisCodeBlock)
> +{
> + char *Token = Gbl_MainTokenBuffer;
> + char *Token2;
> + char *End;
> + UINT64 Value;
> + ACPI_SIZE TokenOffset;
> + int Directive;
> + ACPI_STATUS Status;
> +
> +
> + if (!DirectiveToken)
> + {
> + goto SyntaxError;
> + }
> +
> + Directive = PrMatchDirective (DirectiveToken);
> + if (Directive == ASL_DIRECTIVE_NOT_FOUND)
> + {
> + PrError (ASL_ERROR, ASL_MSG_UNKNOWN_DIRECTIVE,
> + THIS_TOKEN_OFFSET (DirectiveToken));
> +
> + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
> + "#%s: Unknown directive\n",
> + Gbl_CurrentLineNumber, DirectiveToken);
> + return;
> + }
> +
> + /* TBD: Need a faster way to do this: */
> +
> + if ((Directive == PR_DIRECTIVE_ELIF) ||
> + (Directive == PR_DIRECTIVE_ELSE) ||
> + (Directive == PR_DIRECTIVE_ENDIF))
> + {
> + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID "Begin #%s\n",
> + Gbl_CurrentLineNumber, Gbl_DirectiveInfo[Directive].Name);
> + }
> +
> + /*
> + * Need to always check for #else, #elif, #endif regardless of
> + * whether we are ignoring the current code block, since these
> + * are conditional code block terminators.
> + */
> + switch (Directive)
> + {
> + case PR_DIRECTIVE_ELIF:
> + *IgnoringThisCodeBlock = !(*IgnoringThisCodeBlock);
> + if (*IgnoringThisCodeBlock == TRUE)
> + {
> + /* Not executing the ELSE part -- all done here */
> + return;
> + }
> +
> + /* Will execute the ELSE..IF part */
> +
> + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
> + "#elif - Executing else block\n",
> + Gbl_CurrentLineNumber);
> + Directive = PR_DIRECTIVE_IF;
> + break;
> +
> + case PR_DIRECTIVE_ELSE:
> + *IgnoringThisCodeBlock = !(*IgnoringThisCodeBlock);
> + return;
> +
> + case PR_DIRECTIVE_ENDIF:
> + *IgnoringThisCodeBlock = FALSE;
> + Gbl_IfDepth--;
> + if (Gbl_IfDepth < 0)
> + {
> + PrError (ASL_ERROR, ASL_MSG_ENDIF_MISMATCH,
> + THIS_TOKEN_OFFSET (DirectiveToken));
> + Gbl_IfDepth = 0;
> + }
> + return;
> +
> + default:
> + break;
> + }
> +
> + /*
> + * At this point, if we are ignoring the current code block,
> + * do not process any more directives (i.e., ignore them also.)
> + */
> + if (*IgnoringThisCodeBlock == TRUE)
> + {
> + return;
> + }
> +
> + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID "Begin #%s\n",
> + Gbl_CurrentLineNumber, Gbl_DirectiveInfo[Directive].Name);
> +
> + /* Most directives have at least one argument */
> +
> + if (Gbl_DirectiveInfo[Directive].ArgCount == 1)
> + {
> + Token = PrGetNextToken (NULL, PR_TOKEN_SEPARATORS, Next);
> + if (!Token)
> + {
> + goto SyntaxError;
> + }
> + }
> +
> + switch (Directive)
> + {
> + case PR_DIRECTIVE_DEFINE:
> + /*
> + * By definition, if first char after the name is a paren,
> + * this is a function macro.
> + */
> + TokenOffset = Token - Gbl_MainTokenBuffer + strlen (Token);
> + if (*(&Gbl_CurrentLineBuffer[TokenOffset]) == '(')
> + {
> +#ifndef MACROS_SUPPORTED
> + AcpiOsPrintf ("%s ERROR - line %u: #define macros are not supported yet\n",
> + Gbl_CurrentLineBuffer, Gbl_CurrentLineNumber);
> + exit(1);
> +#else
> + PrAddMacro (Token, Next);
> +#endif
> + }
> + else
> + {
> + /* Use the remainder of the line for the #define */
> +
> + Token2 = *Next;
> + if (Token2)
> + {
> + while ((*Token2 == ' ') || (*Token2 == '\t'))
> + {
> + Token2++;
> + }
> + End = Token2;
> + while (*End != '\n')
> + {
> + End++;
> + }
> + *End = 0;
> + }
> + else
> + {
> + Token2 = "";
> + }
> +#if 0
> + Token2 = PrGetNextToken (NULL, "\n", /*PR_TOKEN_SEPARATORS,*/ Next);
> + if (!Token2)
> + {
> + Token2 = "";
> + }
> +#endif
> + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
> + "New #define: %s->%s\n",
> + Gbl_CurrentLineNumber, Token, Token2);
> +
> + PrAddDefine (Token, Token2, FALSE);
> + }
> + break;
> +
> + case PR_DIRECTIVE_ERROR:
> + /* TBD compiler should abort */
> + /* Note: No macro expansion */
> +
> + PrError (ASL_ERROR, ASL_MSG_ERROR_DIRECTIVE,
> + THIS_TOKEN_OFFSET (Token));
> + break;
> +
> + case PR_DIRECTIVE_IF:
> + TokenOffset = Token - Gbl_MainTokenBuffer;
> +
> + /* Need to expand #define macros in the expression string first */
> +
> + Status = PrResolveIntegerExpression (
> + &Gbl_CurrentLineBuffer[TokenOffset-1], &Value);
> + if (ACPI_FAILURE (Status))
> + {
> + return;
> + }
> +
> + if (!Value)
> + {
> + *IgnoringThisCodeBlock = TRUE;
> + }
> +
> + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
> + "Resolved #if: %8.8X%8.8X %s\n",
> + Gbl_CurrentLineNumber, ACPI_FORMAT_UINT64 (Value),
> + *IgnoringThisCodeBlock ? "<Skipping Block>" : "<Executing Block>");
> +
> + Gbl_IfDepth++;
> + break;
> +
> + case PR_DIRECTIVE_IFDEF:
> + if (!PrMatchDefine (Token))
> + {
> + *IgnoringThisCodeBlock = TRUE;
> + }
> +
> + Gbl_IfDepth++;
> + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
> + "Start #ifdef %s\n", Gbl_CurrentLineNumber,
> + *IgnoringThisCodeBlock ? "<Skipping Block>" : "<Executing Block>");
> + break;
> +
> + case PR_DIRECTIVE_IFNDEF:
> + if (PrMatchDefine (Token))
> + {
> + *IgnoringThisCodeBlock = TRUE;
> + }
> +
> + Gbl_IfDepth++;
> + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
> + "Start #ifndef %2.2X\n", Gbl_CurrentLineNumber,
> + *IgnoringThisCodeBlock, Gbl_CurrentLineNumber);
> + break;
> +
> + case PR_DIRECTIVE_INCLUDE:
> + Token = PrGetNextToken (NULL, " \"<>", Next);
> + if (!Token)
> + {
> + goto SyntaxError;
> + }
> +
> + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
> + "Start #include file %s\n", Gbl_CurrentLineNumber,
> + Token, Gbl_CurrentLineNumber);
> +
> + PrOpenIncludeFile (Token);
> + break;
> +
> + case PR_DIRECTIVE_LINE:
> + TokenOffset = Token - Gbl_MainTokenBuffer;
> +
> + Status = PrResolveIntegerExpression (
> + &Gbl_CurrentLineBuffer[TokenOffset-1], &Value);
> + if (ACPI_FAILURE (Status))
> + {
> + return;
> + }
> +
> + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
> + "User #line invocation %s\n", Gbl_CurrentLineNumber,
> + Token);
> +
> + /* Update local line numbers */
> +
> + Gbl_CurrentLineNumber = (UINT32) Value;
> + Gbl_PreviousLineNumber = 0;
> +
> + /* Emit #line into the preprocessor file */
> +
> + FlPrintFile (ASL_FILE_PREPROCESSOR, "#line %u \"%s\"\n",
> + Gbl_CurrentLineNumber, Gbl_Files[ASL_FILE_INPUT].Filename);
> + break;
> +
> + case PR_DIRECTIVE_PRAGMA:
> + /* Only "#pragma message" supported at this time */
> +
> + if (strcmp (Token, "message"))
> + {
> + PrError (ASL_ERROR, ASL_MSG_UNKNOWN_PRAGMA,
> + THIS_TOKEN_OFFSET (Token));
> + return;
> + }
> +
> + Token = PrGetNextToken (NULL, PR_TOKEN_SEPARATORS, Next);
> + if (!Token)
> + {
> + goto SyntaxError;
> + }
> +
> + TokenOffset = Token - Gbl_MainTokenBuffer;
> + AcpiOsPrintf ("%s\n", &Gbl_CurrentLineBuffer[TokenOffset]);
> + break;
> +
> + case PR_DIRECTIVE_UNDEF:
> + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
> + "#undef: %s\n", Gbl_CurrentLineNumber, Token);
> +
> + PrRemoveDefine (Token);
> + break;
> +
> + case PR_DIRECTIVE_WARNING:
> + PrError (ASL_WARNING, ASL_MSG_ERROR_DIRECTIVE,
> + THIS_TOKEN_OFFSET (Token));
> + break;
> +
> + default:
> + /* Should never get here */
> + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID
> + "Unrecognized directive: %u\n",
> + Gbl_CurrentLineNumber, Directive);
> + break;
> + }
> +
> + return;
> +
> +
> +SyntaxError:
> +
> + PrError (ASL_ERROR, ASL_MSG_DIRECTIVE_SYNTAX,
> + THIS_TOKEN_OFFSET (DirectiveToken));
> + return;
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: PrMatchDirective
> + *
> + * PARAMETERS: Directive - Pointer to directive name token
> + *
> + * RETURN: Index into command array, -1 if not found
> + *
> + * DESCRIPTION: Lookup the incoming directive in the known directives table.
> + *
> + ******************************************************************************/
> +
> +static int
> +PrMatchDirective (
> + char *Directive)
> +{
> + int i;
> +
> +
> + if (!Directive || Directive[0] == 0)
> + {
> + return (ASL_DIRECTIVE_NOT_FOUND);
> + }
> +
> + for (i = 0; Gbl_DirectiveInfo[i].Name; i++)
> + {
> + if (!strcmp (Gbl_DirectiveInfo[i].Name, Directive))
> + {
> + return (i);
> + }
> + }
> +
> + return (ASL_DIRECTIVE_NOT_FOUND); /* Command not recognized */
> +}
> diff --git a/src/acpica/source/compiler/prutils.c b/src/acpica/source/compiler/prutils.c
> new file mode 100644
> index 0000000..a5fb46a
> --- /dev/null
> +++ b/src/acpica/source/compiler/prutils.c
> @@ -0,0 +1,540 @@
> +/******************************************************************************
> + *
> + * Module Name: prutils - Preprocessor utilities
> + *
> + *****************************************************************************/
> +
> +/******************************************************************************
> + *
> + * 1. Copyright Notice
> + *
> + * Some or all of this work - Copyright (c) 1999 - 2012, Intel Corp.
> + * All rights reserved.
> + *
> + * 2. License
> + *
> + * 2.1. This is your license from Intel Corp. under its intellectual property
> + * rights. You may have additional license terms from the party that provided
> + * you this software, covering your right to use that party's intellectual
> + * property rights.
> + *
> + * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
> + * copy of the source code appearing in this file ("Covered Code") an
> + * irrevocable, perpetual, worldwide license under Intel's copyrights in the
> + * base code distributed originally by Intel ("Original Intel Code") to copy,
> + * make derivatives, distribute, use and display any portion of the Covered
> + * Code in any form, with the right to sublicense such rights; and
> + *
> + * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
> + * license (with the right to sublicense), under only those claims of Intel
> + * patents that are infringed by the Original Intel Code, to make, use, sell,
> + * offer to sell, and import the Covered Code and derivative works thereof
> + * solely to the minimum extent necessary to exercise the above copyright
> + * license, and in no event shall the patent license extend to any additions
> + * to or modifications of the Original Intel Code. No other license or right
> + * is granted directly or by implication, estoppel or otherwise;
> + *
> + * The above copyright and patent license is granted only if the following
> + * conditions are met:
> + *
> + * 3. Conditions
> + *
> + * 3.1. Redistribution of Source with Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification with rights to further distribute source must include
> + * the above Copyright Notice, the above License, this list of Conditions,
> + * and the following Disclaimer and Export Compliance provision. In addition,
> + * Licensee must cause all Covered Code to which Licensee contributes to
> + * contain a file documenting the changes Licensee made to create that Covered
> + * Code and the date of any change. Licensee must include in that file the
> + * documentation of any changes made by any predecessor Licensee. Licensee
> + * must include a prominent statement that the modification is derived,
> + * directly or indirectly, from Original Intel Code.
> + *
> + * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification without rights to further distribute source must
> + * include the following Disclaimer and Export Compliance provision in the
> + * documentation and/or other materials provided with distribution. In
> + * addition, Licensee may not authorize further sublicense of source of any
> + * portion of the Covered Code, and must include terms to the effect that the
> + * license from Licensee to its licensee is limited to the intellectual
> + * property embodied in the software Licensee provides to its licensee, and
> + * not to intellectual property embodied in modifications its licensee may
> + * make.
> + *
> + * 3.3. Redistribution of Executable. Redistribution in executable form of any
> + * substantial portion of the Covered Code or modification must reproduce the
> + * above Copyright Notice, and the following Disclaimer and Export Compliance
> + * provision in the documentation and/or other materials provided with the
> + * distribution.
> + *
> + * 3.4. Intel retains all right, title, and interest in and to the Original
> + * Intel Code.
> + *
> + * 3.5. Neither the name Intel nor any other trademark owned or controlled by
> + * Intel shall be used in advertising or otherwise to promote the sale, use or
> + * other dealings in products derived from or relating to the Covered Code
> + * without prior written authorization from Intel.
> + *
> + * 4. Disclaimer and Export Compliance
> + *
> + * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
> + * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
> + * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
> + * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
> + * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
> + * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
> + * PARTICULAR PURPOSE.
> + *
> + * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
> + * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
> + * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
> + * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
> + * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
> + * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
> + * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
> + * LIMITED REMEDY.
> + *
> + * 4.3. Licensee shall not export, either directly or indirectly, any of this
> + * software or system incorporating such software without first obtaining any
> + * required license or other approval from the U. S. Department of Commerce or
> + * any other agency or department of the United States Government. In the
> + * event Licensee exports any such software from the United States or
> + * re-exports any such software from a foreign destination, Licensee shall
> + * ensure that the distribution and export/re-export of the software is in
> + * compliance with all laws, regulations, orders, or other restrictions of the
> + * U.S. Export Administration Regulations. Licensee agrees that neither it nor
> + * any of its subsidiaries will export/re-export any technical data, process,
> + * software, or service, directly or indirectly, to any country for which the
> + * United States government or any agency thereof requires an export license,
> + * other governmental approval, or letter of assurance, without first obtaining
> + * such license, approval or letter.
> + *
> + *****************************************************************************/
> +
> +#include "aslcompiler.h"
> +#include "dtcompiler.h"
> +
> +
> +#define _COMPONENT ASL_PREPROCESSOR
> + ACPI_MODULE_NAME ("prutils")
> +
> +
> +/******************************************************************************
> + *
> + * FUNCTION: PrGetNextToken
> + *
> + * PARAMETERS: Buffer - Current line buffer
> + * MatchString - String with valid token delimiters
> + * Next - Set to next possible token in buffer
> + *
> + * RETURN: Next token (null-terminated). Modifies the input line.
> + * Remainder of line is stored in *Next.
> + *
> + * DESCRIPTION: Local implementation of strtok() with local storage for the
> + * next pointer. Not only thread-safe, but allows multiple
> + * parsing of substrings such as expressions.
> + *
> + *****************************************************************************/
> +
> +char *
> +PrGetNextToken (
> + char *Buffer,
> + char *MatchString,
> + char **Next)
> +{
> + char *TokenStart;
> +
> +
> + if (!Buffer)
> + {
> + /* Use Next if it is valid */
> +
> + Buffer = *Next;
> + if (!(*Next))
> + {
> + return (NULL);
> + }
> + }
> +
> + /* Skip any leading delimiters */
> +
> + while (*Buffer)
> + {
> + if (strchr (MatchString, *Buffer))
> + {
> + Buffer++;
> + }
> + else
> + {
> + break;
> + }
> + }
> +
> + /* Anything left on the line? */
> +
> + if (!(*Buffer))
> + {
> + *Next = NULL;
> + return (NULL);
> + }
> +
> + TokenStart = Buffer;
> +
> + /* Find the end of this token */
> +
> + while (*Buffer)
> + {
> + if (strchr (MatchString, *Buffer))
> + {
> + *Buffer = 0;
> + *Next = Buffer+1;
> + if (!**Next)
> + {
> + *Next = NULL;
> + }
> + return (TokenStart);
> + }
> + Buffer++;
> + }
> +
> + *Next = NULL;
> + return (TokenStart);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: PrError
> + *
> + * PARAMETERS: Level - Seriousness (Warning/error, etc.)
> + * MessageId - Index into global message buffer
> + * Column - Column in current line
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Preprocessor error reporting. Front end to AslCommonError2
> + *
> + ******************************************************************************/
> +
> +void
> +PrError (
> + UINT8 Level,
> + UINT8 MessageId,
> + UINT32 Column)
> +{
> +#if 0
> + AcpiOsPrintf ("%s (%u) : %s", Gbl_Files[ASL_FILE_INPUT].Filename,
> + Gbl_CurrentLineNumber, Gbl_CurrentLineBuffer);
> +#endif
> +
> +
> + if (Column > 120)
> + {
> + Column = 0;
> + }
> +
> + /* TBD: Need Logical line number? */
> +
> + AslCommonError2 (Level, MessageId,
> + Gbl_CurrentLineNumber, Column,
> + Gbl_CurrentLineBuffer,
> + Gbl_Files[ASL_FILE_INPUT].Filename, "Preprocessor");
> +
> + Gbl_PreprocessorError = TRUE;
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: PrReplaceData
> + *
> + * PARAMETERS: Buffer - Original(target) buffer pointer
> + * LengthToRemove - Length to be removed from target buffer
> + * BufferToAdd - Data to be inserted into target buffer
> + * LengthToAdd - Length of BufferToAdd
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Generic buffer data replacement.
> + *
> + ******************************************************************************/
> +
> +void
> +PrReplaceData (
> + char *Buffer,
> + UINT32 LengthToRemove,
> + char *BufferToAdd,
> + UINT32 LengthToAdd)
> +{
> + UINT32 BufferLength;
> +
> +
> + /* Buffer is a string, so the length must include the terminating zero */
> +
> + BufferLength = strlen (Buffer) + 1;
> +
> + if (LengthToRemove != LengthToAdd)
> + {
> + /*
> + * Move some of the existing data
> + * 1) If adding more bytes than removing, make room for the new data
> + * 2) if removing more bytes than adding, delete the extra space
> + */
> + if (LengthToRemove > 0)
> + {
> + memmove ((Buffer + LengthToAdd), (Buffer + LengthToRemove),
> + (BufferLength - LengthToRemove));
> + }
> + }
> +
> + /* Now we can move in the new data */
> +
> + if (LengthToAdd > 0)
> + {
> + memmove (Buffer, BufferToAdd, LengthToAdd);
> + }
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: PrOpenIncludeFile
> + *
> + * PARAMETERS: Filename - Filename or pathname for include file
> + *
> + * RETURN: None.
> + *
> + * DESCRIPTION: Open an include file and push it on the input file stack.
> + *
> + ******************************************************************************/
> +
> +void
> +PrOpenIncludeFile (
> + char *Filename)
> +{
> + FILE *IncludeFile;
> + ASL_INCLUDE_DIR *NextDir;
> +
> +
> + /*
> + * start the actual include file on the next line
> + */
> + Gbl_CurrentLineOffset++;
> +
> + /* Attempt to open the include file */
> +
> + /* If the file specifies an absolute path, just open it */
> +
> + if ((Filename[0] == '/') ||
> + (Filename[0] == '\\') ||
> + (Filename[1] == ':'))
> + {
> + IncludeFile = PrOpenIncludeWithPrefix ("", Filename);
> + if (!IncludeFile)
> + {
> + goto ErrorExit;
> + }
> + return;
> + }
> +
> + /*
> + * The include filename is not an absolute path.
> + *
> + * First, search for the file within the "local" directory -- meaning
> + * the same directory that contains the source file.
> + *
> + * Construct the file pathname from the global directory name.
> + */
> + IncludeFile = PrOpenIncludeWithPrefix (Gbl_DirectoryPath, Filename);
> + if (IncludeFile)
> + {
> + return;
> + }
> +
> + /*
> + * Second, search for the file within the (possibly multiple)
> + * directories specified by the -I option on the command line.
> + */
> + NextDir = Gbl_IncludeDirList;
> + while (NextDir)
> + {
> + IncludeFile = PrOpenIncludeWithPrefix (NextDir->Dir, Filename);
> + if (IncludeFile)
> + {
> + return;
> + }
> +
> + NextDir = NextDir->Next;
> + }
> +
> + /* We could not open the include file after trying very hard */
> +
> +ErrorExit:
> + sprintf (Gbl_MainTokenBuffer, "%s, %s", Filename, strerror (errno));
> + PrError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN, 0);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: FlOpenIncludeWithPrefix
> + *
> + * PARAMETERS: PrefixDir - Prefix directory pathname. Can be a zero
> + * length string.
> + * Filename - The include filename from the source ASL.
> + *
> + * RETURN: Valid file descriptor if successful. Null otherwise.
> + *
> + * DESCRIPTION: Open an include file and push it on the input file stack.
> + *
> + ******************************************************************************/
> +
> +FILE *
> +PrOpenIncludeWithPrefix (
> + char *PrefixDir,
> + char *Filename)
> +{
> + FILE *IncludeFile;
> + char *Pathname;
> +
> +
> + /* Build the full pathname to the file */
> +
> + Pathname = ACPI_ALLOCATE (strlen (PrefixDir) + strlen (Filename) + 1);
> +
> + strcpy (Pathname, PrefixDir);
> + strcat (Pathname, Filename);
> +
> + DbgPrint (ASL_PARSE_OUTPUT, "\n" PR_PREFIX_ID
> + "Opening include file: path %s\n",
> + Gbl_CurrentLineNumber, Pathname);
> +
> + /* Attempt to open the file, push if successful */
> +
> + IncludeFile = fopen (Pathname, "r");
> + if (IncludeFile)
> + {
> + /* Push the include file on the open input file stack */
> +
> + PrPushInputFileStack (IncludeFile, Pathname);
> + return (IncludeFile);
> + }
> +
> + ACPI_FREE (Pathname);
> + return (NULL);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AslPushInputFileStack
> + *
> + * PARAMETERS: InputFile - Open file pointer
> + * Filename - Name of the file
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Push the InputFile onto the file stack, and point the parser
> + * to this file. Called when an include file is successfully
> + * opened.
> + *
> + ******************************************************************************/
> +
> +void
> +PrPushInputFileStack (
> + FILE *InputFile,
> + char *Filename)
> +{
> + PR_FILE_NODE *Fnode;
> +
> +
> + /* Save the current state in an Fnode */
> +
> + Fnode = UtLocalCalloc (sizeof (PR_FILE_NODE));
> +
> + Fnode->File = Gbl_Files[ASL_FILE_INPUT].Handle;
> + Fnode->Next = Gbl_InputFileList;
> + Fnode->Filename = Gbl_Files[ASL_FILE_INPUT].Filename;
> + Fnode->CurrentLineNumber = Gbl_CurrentLineNumber;
> +
> + /* Push it on the stack */
> +
> + Gbl_InputFileList = Fnode;
> +
> + DbgPrint (ASL_PARSE_OUTPUT, PR_PREFIX_ID
> + "Push InputFile Stack: handle %p\n\n",
> + Gbl_CurrentLineNumber, InputFile);
> +
> + /* Reset the global line count and filename */
> +
> + Gbl_Files[ASL_FILE_INPUT].Filename = Filename;
> + Gbl_Files[ASL_FILE_INPUT].Handle = InputFile;
> + Gbl_PreviousLineNumber = 0;
> + Gbl_CurrentLineNumber = 0;
> +
> + /* Emit a new #line directive for the include file */
> +
> + FlPrintFile (ASL_FILE_PREPROCESSOR, "#line %u \"%s\"\n",
> + 1, Filename);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AslPopInputFileStack
> + *
> + * PARAMETERS: None
> + *
> + * RETURN: 0 if a node was popped, -1 otherwise
> + *
> + * DESCRIPTION: Pop the top of the input file stack and point the parser to
> + * the saved parse buffer contained in the fnode. Also, set the
> + * global line counters to the saved values. This function is
> + * called when an include file reaches EOF.
> + *
> + ******************************************************************************/
> +
> +BOOLEAN
> +PrPopInputFileStack (
> + void)
> +{
> + PR_FILE_NODE *Fnode;
> +
> +
> + Fnode = Gbl_InputFileList;
> + DbgPrint (ASL_PARSE_OUTPUT, "\n" PR_PREFIX_ID
> + "Pop InputFile Stack, Fnode %p\n\n",
> + Gbl_CurrentLineNumber, Fnode);
> +
> + if (!Fnode)
> + {
> + return (FALSE);
> + }
> +
> + /* Close the current include file */
> +
> + fclose (Gbl_Files[ASL_FILE_INPUT].Handle);
> +
> + /* Update the top-of-stack */
> +
> + Gbl_InputFileList = Fnode->Next;
> +
> + /* Reset global line counter and filename */
> +
> + Gbl_Files[ASL_FILE_INPUT].Filename = Fnode->Filename;
> + Gbl_Files[ASL_FILE_INPUT].Handle = Fnode->File;
> + Gbl_CurrentLineNumber = Fnode->CurrentLineNumber;
> + Gbl_PreviousLineNumber = 0;
> +
> + /* Emit a new #line directive after the include file */
> +
> + FlPrintFile (ASL_FILE_PREPROCESSOR, "#line %u \"%s\"\n",
> + Gbl_CurrentLineNumber + 1, Fnode->Filename);
> +
> + /* All done with this node */
> +
> + ACPI_FREE (Fnode);
> + return (TRUE);
> +}
> diff --git a/src/acpica/source/components/disassembler/dmresrcl2.c b/src/acpica/source/components/disassembler/dmresrcl2.c
> new file mode 100644
> index 0000000..6a263c1
> --- /dev/null
> +++ b/src/acpica/source/components/disassembler/dmresrcl2.c
> @@ -0,0 +1,772 @@
> +/*******************************************************************************
> + *
> + * Module Name: dmresrcl2.c - "Large" Resource Descriptor disassembly (#2)
> + *
> + ******************************************************************************/
> +
> +/******************************************************************************
> + *
> + * 1. Copyright Notice
> + *
> + * Some or all of this work - Copyright (c) 1999 - 2012, Intel Corp.
> + * All rights reserved.
> + *
> + * 2. License
> + *
> + * 2.1. This is your license from Intel Corp. under its intellectual property
> + * rights. You may have additional license terms from the party that provided
> + * you this software, covering your right to use that party's intellectual
> + * property rights.
> + *
> + * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
> + * copy of the source code appearing in this file ("Covered Code") an
> + * irrevocable, perpetual, worldwide license under Intel's copyrights in the
> + * base code distributed originally by Intel ("Original Intel Code") to copy,
> + * make derivatives, distribute, use and display any portion of the Covered
> + * Code in any form, with the right to sublicense such rights; and
> + *
> + * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
> + * license (with the right to sublicense), under only those claims of Intel
> + * patents that are infringed by the Original Intel Code, to make, use, sell,
> + * offer to sell, and import the Covered Code and derivative works thereof
> + * solely to the minimum extent necessary to exercise the above copyright
> + * license, and in no event shall the patent license extend to any additions
> + * to or modifications of the Original Intel Code. No other license or right
> + * is granted directly or by implication, estoppel or otherwise;
> + *
> + * The above copyright and patent license is granted only if the following
> + * conditions are met:
> + *
> + * 3. Conditions
> + *
> + * 3.1. Redistribution of Source with Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification with rights to further distribute source must include
> + * the above Copyright Notice, the above License, this list of Conditions,
> + * and the following Disclaimer and Export Compliance provision. In addition,
> + * Licensee must cause all Covered Code to which Licensee contributes to
> + * contain a file documenting the changes Licensee made to create that Covered
> + * Code and the date of any change. Licensee must include in that file the
> + * documentation of any changes made by any predecessor Licensee. Licensee
> + * must include a prominent statement that the modification is derived,
> + * directly or indirectly, from Original Intel Code.
> + *
> + * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification without rights to further distribute source must
> + * include the following Disclaimer and Export Compliance provision in the
> + * documentation and/or other materials provided with distribution. In
> + * addition, Licensee may not authorize further sublicense of source of any
> + * portion of the Covered Code, and must include terms to the effect that the
> + * license from Licensee to its licensee is limited to the intellectual
> + * property embodied in the software Licensee provides to its licensee, and
> + * not to intellectual property embodied in modifications its licensee may
> + * make.
> + *
> + * 3.3. Redistribution of Executable. Redistribution in executable form of any
> + * substantial portion of the Covered Code or modification must reproduce the
> + * above Copyright Notice, and the following Disclaimer and Export Compliance
> + * provision in the documentation and/or other materials provided with the
> + * distribution.
> + *
> + * 3.4. Intel retains all right, title, and interest in and to the Original
> + * Intel Code.
> + *
> + * 3.5. Neither the name Intel nor any other trademark owned or controlled by
> + * Intel shall be used in advertising or otherwise to promote the sale, use or
> + * other dealings in products derived from or relating to the Covered Code
> + * without prior written authorization from Intel.
> + *
> + * 4. Disclaimer and Export Compliance
> + *
> + * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
> + * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
> + * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
> + * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
> + * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
> + * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
> + * PARTICULAR PURPOSE.
> + *
> + * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
> + * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
> + * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
> + * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
> + * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
> + * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
> + * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
> + * LIMITED REMEDY.
> + *
> + * 4.3. Licensee shall not export, either directly or indirectly, any of this
> + * software or system incorporating such software without first obtaining any
> + * required license or other approval from the U. S. Department of Commerce or
> + * any other agency or department of the United States Government. In the
> + * event Licensee exports any such software from the United States or
> + * re-exports any such software from a foreign destination, Licensee shall
> + * ensure that the distribution and export/re-export of the software is in
> + * compliance with all laws, regulations, orders, or other restrictions of the
> + * U.S. Export Administration Regulations. Licensee agrees that neither it nor
> + * any of its subsidiaries will export/re-export any technical data, process,
> + * software, or service, directly or indirectly, to any country for which the
> + * United States government or any agency thereof requires an export license,
> + * other governmental approval, or letter of assurance, without first obtaining
> + * such license, approval or letter.
> + *
> + *****************************************************************************/
> +
> +
> +#include "acpi.h"
> +#include "accommon.h"
> +#include "acdisasm.h"
> +
> +
> +#ifdef ACPI_DISASSEMBLER
> +
> +#define _COMPONENT ACPI_CA_DEBUGGER
> + ACPI_MODULE_NAME ("dbresrcl2")
> +
> +/* Local prototypes */
> +
> +static void
> +AcpiDmI2cSerialBusDescriptor (
> + AML_RESOURCE *Resource,
> + UINT32 Length,
> + UINT32 Level);
> +
> +static void
> +AcpiDmSpiSerialBusDescriptor (
> + AML_RESOURCE *Resource,
> + UINT32 Length,
> + UINT32 Level);
> +
> +static void
> +AcpiDmUartSerialBusDescriptor (
> + AML_RESOURCE *Resource,
> + UINT32 Length,
> + UINT32 Level);
> +
> +static void
> +AcpiDmGpioCommon (
> + AML_RESOURCE *Resource,
> + UINT32 Level);
> +
> +static void
> +AcpiDmDumpRawDataBuffer (
> + UINT8 *Buffer,
> + UINT32 Length,
> + UINT32 Level);
> +
> +
> +/* Dispatch table for the serial bus descriptors */
> +
> +static ACPI_RESOURCE_HANDLER SerialBusResourceDispatch [] =
> +{
> + NULL,
> + AcpiDmI2cSerialBusDescriptor,
> + AcpiDmSpiSerialBusDescriptor,
> + AcpiDmUartSerialBusDescriptor
> +};
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiDmDumpRawDataBuffer
> + *
> + * PARAMETERS: Buffer - Pointer to the data bytes
> + * Length - Length of the descriptor in bytes
> + * Level - Current source code indentation level
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Dump a data buffer as a RawDataBuffer() object. Used for
> + * vendor data bytes.
> + *
> + ******************************************************************************/
> +
> +static void
> +AcpiDmDumpRawDataBuffer (
> + UINT8 *Buffer,
> + UINT32 Length,
> + UINT32 Level)
> +{
> + UINT32 Index;
> + UINT32 i;
> + UINT32 j;
> +
> +
> + if (!Length)
> + {
> + return;
> + }
> +
> + AcpiOsPrintf ("RawDataBuffer (0x%.2X) // Vendor Data", Length);
> +
> + AcpiOsPrintf ("\n");
> + AcpiDmIndent (Level + 1);
> + AcpiOsPrintf ("{\n");
> + AcpiDmIndent (Level + 2);
> +
> + for (i = 0; i < Length;)
> + {
> + for (j = 0; j < 8; j++)
> + {
> + Index = i + j;
> + if (Index >= Length)
> + {
> + goto Finish;
> + }
> +
> + AcpiOsPrintf ("0x%2.2X", Buffer[Index]);
> + if ((Index + 1) >= Length)
> + {
> + goto Finish;
> + }
> +
> + AcpiOsPrintf (", ");
> + }
> + AcpiOsPrintf ("\n");
> + AcpiDmIndent (Level + 2);
> +
> + i += 8;
> + }
> +
> +Finish:
> + AcpiOsPrintf ("\n");
> + AcpiDmIndent (Level + 1);
> + AcpiOsPrintf ("}");
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiDmGpioCommon
> + *
> + * PARAMETERS: Resource - Pointer to the resource descriptor
> + * Level - Current source code indentation level
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Decode common parts of a GPIO Interrupt descriptor
> + *
> + ******************************************************************************/
> +
> +static void
> +AcpiDmGpioCommon (
> + AML_RESOURCE *Resource,
> + UINT32 Level)
> +{
> + UINT32 PinCount;
> + UINT16 *PinList;
> + UINT8 *VendorData;
> + UINT32 i;
> +
> +
> + /* ResourceSource, ResourceSourceIndex, ResourceType */
> +
> + AcpiDmIndent (Level + 1);
> + if (Resource->Gpio.ResSourceOffset)
> + {
> + AcpiUtPrintString (
> + ACPI_ADD_PTR (char, Resource, Resource->Gpio.ResSourceOffset),
> + ACPI_UINT8_MAX);
> + }
> +
> + AcpiOsPrintf (", ");
> + AcpiOsPrintf ("0x%2.2X, ", Resource->Gpio.ResSourceIndex);
> + AcpiOsPrintf ("%s, ",
> + AcpiGbl_ConsumeDecode [(Resource->Gpio.Flags & 1)]);
> +
> + /* Insert a descriptor name */
> +
> + AcpiDmDescriptorName ();
> + AcpiOsPrintf (",");
> +
> + /* Dump the vendor data */
> +
> + if (Resource->Gpio.VendorOffset)
> + {
> + AcpiOsPrintf ("\n");
> + AcpiDmIndent (Level + 1);
> + VendorData = ACPI_ADD_PTR (UINT8, Resource,
> + Resource->Gpio.VendorOffset);
> +
> + AcpiDmDumpRawDataBuffer (VendorData,
> + Resource->Gpio.VendorLength, Level);
> + }
> +
> + AcpiOsPrintf (")\n");
> +
> + /* Dump the interrupt list */
> +
> + AcpiDmIndent (Level + 1);
> + AcpiOsPrintf ("{ // Pin list\n");
> +
> + PinCount = ((UINT32) (Resource->Gpio.ResSourceOffset -
> + Resource->Gpio.PinTableOffset)) /
> + sizeof (UINT16);
> +
> + PinList = (UINT16 *) ACPI_ADD_PTR (char, Resource,
> + Resource->Gpio.PinTableOffset);
> +
> + for (i = 0; i < PinCount; i++)
> + {
> + AcpiDmIndent (Level + 2);
> + AcpiOsPrintf ("0x%4.4X%s\n", PinList[i], ((i + 1) < PinCount) ? "," : "");
> + }
> +
> + AcpiDmIndent (Level + 1);
> + AcpiOsPrintf ("}\n");
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiDmGpioIntDescriptor
> + *
> + * PARAMETERS: Resource - Pointer to the resource descriptor
> + * Length - Length of the descriptor in bytes
> + * Level - Current source code indentation level
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Decode a GPIO Interrupt descriptor
> + *
> + ******************************************************************************/
> +
> +static void
> +AcpiDmGpioIntDescriptor (
> + AML_RESOURCE *Resource,
> + UINT32 Length,
> + UINT32 Level)
> +{
> +
> + /* Dump the GpioInt-specific portion of the descriptor */
> +
> + /* EdgeLevel, ActiveLevel, Shared */
> +
> + AcpiDmIndent (Level);
> + AcpiOsPrintf ("GpioInt (%s, %s, %s, ",
> + AcpiGbl_HeDecode [(Resource->Gpio.IntFlags & 1)],
> + AcpiGbl_LlDecode [(Resource->Gpio.IntFlags >> 1) & 1],
> + AcpiGbl_ShrDecode [(Resource->Gpio.IntFlags >> 3) & 1]);
> +
> + /* PinConfig, DebounceTimeout */
> +
> + if (Resource->Gpio.PinConfig <= 3)
> + {
> + AcpiOsPrintf ("%s, ",
> + AcpiGbl_PpcDecode[Resource->Gpio.PinConfig]);
> + }
> + else
> + {
> + AcpiOsPrintf ("0x%2.2X, ", Resource->Gpio.PinConfig);
> + }
> + AcpiOsPrintf ("0x%4.4X,\n", Resource->Gpio.DebounceTimeout);
> +
> + /* Dump the GpioInt/GpioIo common portion of the descriptor */
> +
> + AcpiDmGpioCommon (Resource, Level);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiDmGpioIoDescriptor
> + *
> + * PARAMETERS: Resource - Pointer to the resource descriptor
> + * Length - Length of the descriptor in bytes
> + * Level - Current source code indentation level
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Decode a GPIO Interrupt descriptor
> + *
> + ******************************************************************************/
> +
> +static void
> +AcpiDmGpioIoDescriptor (
> + AML_RESOURCE *Resource,
> + UINT32 Length,
> + UINT32 Level)
> +{
> +
> + /* Dump the GpioIo-specific portion of the descriptor */
> +
> + /* Shared, PinConfig */
> +
> + AcpiDmIndent (Level);
> + AcpiOsPrintf ("GpioIo (%s, ",
> + AcpiGbl_ShrDecode [(Resource->Gpio.IntFlags >> 3) & 1]);
> +
> + if (Resource->Gpio.PinConfig <= 3)
> + {
> + AcpiOsPrintf ("%s, ",
> + AcpiGbl_PpcDecode[Resource->Gpio.PinConfig]);
> + }
> + else
> + {
> + AcpiOsPrintf ("0x%2.2X, ", Resource->Gpio.PinConfig);
> + }
> +
> + /* DebounceTimeout, DriveStrength, IoRestriction */
> +
> + AcpiOsPrintf ("0x%4.4X, ", Resource->Gpio.DebounceTimeout);
> + AcpiOsPrintf ("0x%4.4X, ", Resource->Gpio.DriveStrength);
> + AcpiOsPrintf ("%s,\n",
> + AcpiGbl_IorDecode [Resource->Gpio.IntFlags & 3]);
> +
> + /* Dump the GpioInt/GpioIo common portion of the descriptor */
> +
> + AcpiDmGpioCommon (Resource, Level);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiDmGpioDescriptor
> + *
> + * PARAMETERS: Resource - Pointer to the resource descriptor
> + * Length - Length of the descriptor in bytes
> + * Level - Current source code indentation level
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Decode a GpioInt/GpioIo GPIO Interrupt/IO descriptor
> + *
> + ******************************************************************************/
> +
> +void
> +AcpiDmGpioDescriptor (
> + AML_RESOURCE *Resource,
> + UINT32 Length,
> + UINT32 Level)
> +{
> + UINT8 ConnectionType;
> +
> +
> + ConnectionType = Resource->Gpio.ConnectionType;
> +
> + switch (ConnectionType)
> + {
> + case AML_RESOURCE_GPIO_TYPE_INT:
> + AcpiDmGpioIntDescriptor (Resource, Length, Level);
> + break;
> +
> + case AML_RESOURCE_GPIO_TYPE_IO:
> + AcpiDmGpioIoDescriptor (Resource, Length, Level);
> + break;
> +
> + default:
> + AcpiOsPrintf ("Unknown GPIO type\n");
> + break;
> + }
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiDmDumpSerialBusVendorData
> + *
> + * PARAMETERS: Resource - Pointer to the resource descriptor
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Dump optional serial bus vendor data
> + *
> + ******************************************************************************/
> +
> +static void
> +AcpiDmDumpSerialBusVendorData (
> + AML_RESOURCE *Resource,
> + UINT32 Level)
> +{
> + UINT8 *VendorData;
> + UINT32 VendorLength;
> +
> +
> + /* Get the (optional) vendor data and length */
> +
> + switch (Resource->CommonSerialBus.Type)
> + {
> + case AML_RESOURCE_I2C_SERIALBUSTYPE:
> +
> + VendorLength = Resource->CommonSerialBus.TypeDataLength -
> + AML_RESOURCE_I2C_MIN_DATA_LEN;
> +
> + VendorData = ACPI_ADD_PTR (UINT8, Resource,
> + sizeof (AML_RESOURCE_I2C_SERIALBUS));
> + break;
> +
> + case AML_RESOURCE_SPI_SERIALBUSTYPE:
> +
> + VendorLength = Resource->CommonSerialBus.TypeDataLength -
> + AML_RESOURCE_SPI_MIN_DATA_LEN;
> +
> + VendorData = ACPI_ADD_PTR (UINT8, Resource,
> + sizeof (AML_RESOURCE_SPI_SERIALBUS));
> + break;
> +
> + case AML_RESOURCE_UART_SERIALBUSTYPE:
> +
> + VendorLength = Resource->CommonSerialBus.TypeDataLength -
> + AML_RESOURCE_UART_MIN_DATA_LEN;
> +
> + VendorData = ACPI_ADD_PTR (UINT8, Resource,
> + sizeof (AML_RESOURCE_UART_SERIALBUS));
> + break;
> +
> + default:
> + return;
> + }
> +
> + /* Dump the vendor bytes as a RawDataBuffer object */
> +
> + AcpiDmDumpRawDataBuffer (VendorData, VendorLength, Level);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiDmI2cSerialBusDescriptor
> + *
> + * PARAMETERS: Resource - Pointer to the resource descriptor
> + * Length - Length of the descriptor in bytes
> + * Level - Current source code indentation level
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Decode a I2C serial bus descriptor
> + *
> + ******************************************************************************/
> +
> +static void
> +AcpiDmI2cSerialBusDescriptor (
> + AML_RESOURCE *Resource,
> + UINT32 Length,
> + UINT32 Level)
> +{
> + UINT32 ResourceSourceOffset;
> +
> +
> + /* SlaveAddress, SlaveMode, ConnectionSpeed, AddressingMode */
> +
> + AcpiDmIndent (Level);
> + AcpiOsPrintf ("I2cSerialBus (0x%4.4X, %s, 0x%8.8X,\n",
> + Resource->I2cSerialBus.SlaveAddress,
> + AcpiGbl_SmDecode [(Resource->I2cSerialBus.Flags & 1)],
> + Resource->I2cSerialBus.ConnectionSpeed);
> +
> + AcpiDmIndent (Level + 1);
> + AcpiOsPrintf ("%s, ",
> + AcpiGbl_AmDecode [(Resource->I2cSerialBus.TypeSpecificFlags & 1)]);
> +
> + /* ResourceSource is a required field */
> +
> + ResourceSourceOffset = sizeof (AML_RESOURCE_COMMON_SERIALBUS) +
> + Resource->CommonSerialBus.TypeDataLength;
> +
> + AcpiUtPrintString (
> + ACPI_ADD_PTR (char, Resource, ResourceSourceOffset),
> + ACPI_UINT8_MAX);
> +
> + /* ResourceSourceIndex, ResourceUsage */
> +
> + AcpiOsPrintf (",\n");
> + AcpiDmIndent (Level + 1);
> + AcpiOsPrintf ("0x%2.2X, ", Resource->I2cSerialBus.ResSourceIndex);
> +
> + AcpiOsPrintf ("%s, ",
> + AcpiGbl_ConsumeDecode [(Resource->I2cSerialBus.Flags >> 1) & 1]);
> +
> + /* Insert a descriptor name */
> +
> + AcpiDmDescriptorName ();
> + AcpiOsPrintf (",\n");
> +
> + /* Dump the vendor data */
> +
> + AcpiDmIndent (Level + 1);
> + AcpiDmDumpSerialBusVendorData (Resource, Level);
> + AcpiOsPrintf (")\n");
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiDmSpiSerialBusDescriptor
> + *
> + * PARAMETERS: Resource - Pointer to the resource descriptor
> + * Length - Length of the descriptor in bytes
> + * Level - Current source code indentation level
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Decode a SPI serial bus descriptor
> + *
> + ******************************************************************************/
> +
> +static void
> +AcpiDmSpiSerialBusDescriptor (
> + AML_RESOURCE *Resource,
> + UINT32 Length,
> + UINT32 Level)
> +{
> + UINT32 ResourceSourceOffset;
> +
> +
> + /* DeviceSelection, DeviceSelectionPolarity, WireMode, DataBitLength */
> +
> + AcpiDmIndent (Level);
> + AcpiOsPrintf ("SpiSerialBus (0x%4.4X, %s, %s, 0x%2.2X,\n",
> + Resource->SpiSerialBus.DeviceSelection,
> + AcpiGbl_DpDecode [(Resource->SpiSerialBus.TypeSpecificFlags >> 1) & 1],
> + AcpiGbl_WmDecode [(Resource->SpiSerialBus.TypeSpecificFlags & 1)],
> + Resource->SpiSerialBus.DataBitLength);
> +
> + /* SlaveMode, ConnectionSpeed, ClockPolarity, ClockPhase */
> +
> + AcpiDmIndent (Level + 1);
> + AcpiOsPrintf ("%s, 0x%8.8X, %s,\n",
> + AcpiGbl_SmDecode [(Resource->SpiSerialBus.Flags & 1)],
> + Resource->SpiSerialBus.ConnectionSpeed,
> + AcpiGbl_CpoDecode [(Resource->SpiSerialBus.ClockPolarity & 1)]);
> +
> + AcpiDmIndent (Level + 1);
> + AcpiOsPrintf ("%s, ",
> + AcpiGbl_CphDecode [(Resource->SpiSerialBus.ClockPhase & 1)]);
> +
> + /* ResourceSource is a required field */
> +
> + ResourceSourceOffset = sizeof (AML_RESOURCE_COMMON_SERIALBUS) +
> + Resource->CommonSerialBus.TypeDataLength;
> +
> + AcpiUtPrintString (
> + ACPI_ADD_PTR (char, Resource, ResourceSourceOffset),
> + ACPI_UINT8_MAX);
> +
> + /* ResourceSourceIndex, ResourceUsage */
> +
> + AcpiOsPrintf (",\n");
> + AcpiDmIndent (Level + 1);
> + AcpiOsPrintf ("0x%2.2X, ", Resource->SpiSerialBus.ResSourceIndex);
> +
> + AcpiOsPrintf ("%s, ",
> + AcpiGbl_ConsumeDecode [(Resource->SpiSerialBus.Flags >> 1) & 1]);
> +
> + /* Insert a descriptor name */
> +
> + AcpiDmDescriptorName ();
> + AcpiOsPrintf (",\n");
> +
> + /* Dump the vendor data */
> +
> + AcpiDmIndent (Level + 1);
> + AcpiDmDumpSerialBusVendorData (Resource, Level);
> + AcpiOsPrintf (")\n");
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiDmUartSerialBusDescriptor
> + *
> + * PARAMETERS: Resource - Pointer to the resource descriptor
> + * Length - Length of the descriptor in bytes
> + * Level - Current source code indentation level
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Decode a UART serial bus descriptor
> + *
> + ******************************************************************************/
> +
> +static void
> +AcpiDmUartSerialBusDescriptor (
> + AML_RESOURCE *Resource,
> + UINT32 Length,
> + UINT32 Level)
> +{
> + UINT32 ResourceSourceOffset;
> +
> +
> + /* ConnectionSpeed, BitsPerByte, StopBits */
> +
> + AcpiDmIndent (Level);
> + AcpiOsPrintf ("UartSerialBus (0x%8.8X, %s, %s,\n",
> + Resource->UartSerialBus.DefaultBaudRate,
> + AcpiGbl_BpbDecode [(Resource->UartSerialBus.TypeSpecificFlags >> 4) & 3],
> + AcpiGbl_SbDecode [(Resource->UartSerialBus.TypeSpecificFlags >> 2) & 3]);
> +
> + /* LinesInUse, IsBigEndian, Parity, FlowControl */
> +
> + AcpiDmIndent (Level + 1);
> + AcpiOsPrintf ("0x%2.2X, %s, %s, %s,\n",
> + Resource->UartSerialBus.LinesEnabled,
> + AcpiGbl_EdDecode [(Resource->UartSerialBus.TypeSpecificFlags >> 7) & 1],
> + AcpiGbl_PtDecode [Resource->UartSerialBus.Parity & 7],
> + AcpiGbl_FcDecode [Resource->UartSerialBus.TypeSpecificFlags & 3]);
> +
> + /* ReceiveBufferSize, TransmitBufferSize */
> +
> + AcpiDmIndent (Level + 1);
> + AcpiOsPrintf ("0x%4.4X, 0x%4.4X, ",
> + Resource->UartSerialBus.RxFifoSize,
> + Resource->UartSerialBus.TxFifoSize);
> +
> + /* ResourceSource is a required field */
> +
> + ResourceSourceOffset = sizeof (AML_RESOURCE_COMMON_SERIALBUS) +
> + Resource->CommonSerialBus.TypeDataLength;
> +
> + AcpiUtPrintString (
> + ACPI_ADD_PTR (char, Resource, ResourceSourceOffset),
> + ACPI_UINT8_MAX);
> +
> + /* ResourceSourceIndex, ResourceUsage */
> +
> + AcpiOsPrintf (",\n");
> + AcpiDmIndent (Level + 1);
> + AcpiOsPrintf ("0x%2.2X, ", Resource->UartSerialBus.ResSourceIndex);
> +
> + AcpiOsPrintf ("%s, ",
> + AcpiGbl_ConsumeDecode [(Resource->UartSerialBus.Flags >> 1) & 1]);
> +
> + /* Insert a descriptor name */
> +
> + AcpiDmDescriptorName ();
> + AcpiOsPrintf (",\n");
> +
> + /* Dump the vendor data */
> +
> + AcpiDmIndent (Level + 1);
> + AcpiDmDumpSerialBusVendorData (Resource, Level);
> + AcpiOsPrintf (")\n");
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiDmSerialBusDescriptor
> + *
> + * PARAMETERS: Resource - Pointer to the resource descriptor
> + * Length - Length of the descriptor in bytes
> + * Level - Current source code indentation level
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Decode a I2C/SPI/UART serial bus descriptor
> + *
> + ******************************************************************************/
> +
> +void
> +AcpiDmSerialBusDescriptor (
> + AML_RESOURCE *Resource,
> + UINT32 Length,
> + UINT32 Level)
> +{
> +
> + SerialBusResourceDispatch [Resource->CommonSerialBus.Type] (
> + Resource, Length, Level);
> +}
> +
> +#endif
> +
> diff --git a/src/acpica/source/components/hardware/hwesleep.c b/src/acpica/source/components/hardware/hwesleep.c
> new file mode 100644
> index 0000000..b137229
> --- /dev/null
> +++ b/src/acpica/source/components/hardware/hwesleep.c
> @@ -0,0 +1,349 @@
> +/******************************************************************************
> + *
> + * Name: hwesleep.c - ACPI Hardware Sleep/Wake Support functions for the
> + * extended FADT-V5 sleep registers.
> + *
> + *****************************************************************************/
> +
> +/******************************************************************************
> + *
> + * 1. Copyright Notice
> + *
> + * Some or all of this work - Copyright (c) 1999 - 2012, Intel Corp.
> + * All rights reserved.
> + *
> + * 2. License
> + *
> + * 2.1. This is your license from Intel Corp. under its intellectual property
> + * rights. You may have additional license terms from the party that provided
> + * you this software, covering your right to use that party's intellectual
> + * property rights.
> + *
> + * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
> + * copy of the source code appearing in this file ("Covered Code") an
> + * irrevocable, perpetual, worldwide license under Intel's copyrights in the
> + * base code distributed originally by Intel ("Original Intel Code") to copy,
> + * make derivatives, distribute, use and display any portion of the Covered
> + * Code in any form, with the right to sublicense such rights; and
> + *
> + * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
> + * license (with the right to sublicense), under only those claims of Intel
> + * patents that are infringed by the Original Intel Code, to make, use, sell,
> + * offer to sell, and import the Covered Code and derivative works thereof
> + * solely to the minimum extent necessary to exercise the above copyright
> + * license, and in no event shall the patent license extend to any additions
> + * to or modifications of the Original Intel Code. No other license or right
> + * is granted directly or by implication, estoppel or otherwise;
> + *
> + * The above copyright and patent license is granted only if the following
> + * conditions are met:
> + *
> + * 3. Conditions
> + *
> + * 3.1. Redistribution of Source with Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification with rights to further distribute source must include
> + * the above Copyright Notice, the above License, this list of Conditions,
> + * and the following Disclaimer and Export Compliance provision. In addition,
> + * Licensee must cause all Covered Code to which Licensee contributes to
> + * contain a file documenting the changes Licensee made to create that Covered
> + * Code and the date of any change. Licensee must include in that file the
> + * documentation of any changes made by any predecessor Licensee. Licensee
> + * must include a prominent statement that the modification is derived,
> + * directly or indirectly, from Original Intel Code.
> + *
> + * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification without rights to further distribute source must
> + * include the following Disclaimer and Export Compliance provision in the
> + * documentation and/or other materials provided with distribution. In
> + * addition, Licensee may not authorize further sublicense of source of any
> + * portion of the Covered Code, and must include terms to the effect that the
> + * license from Licensee to its licensee is limited to the intellectual
> + * property embodied in the software Licensee provides to its licensee, and
> + * not to intellectual property embodied in modifications its licensee may
> + * make.
> + *
> + * 3.3. Redistribution of Executable. Redistribution in executable form of any
> + * substantial portion of the Covered Code or modification must reproduce the
> + * above Copyright Notice, and the following Disclaimer and Export Compliance
> + * provision in the documentation and/or other materials provided with the
> + * distribution.
> + *
> + * 3.4. Intel retains all right, title, and interest in and to the Original
> + * Intel Code.
> + *
> + * 3.5. Neither the name Intel nor any other trademark owned or controlled by
> + * Intel shall be used in advertising or otherwise to promote the sale, use or
> + * other dealings in products derived from or relating to the Covered Code
> + * without prior written authorization from Intel.
> + *
> + * 4. Disclaimer and Export Compliance
> + *
> + * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
> + * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
> + * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
> + * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
> + * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
> + * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
> + * PARTICULAR PURPOSE.
> + *
> + * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
> + * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
> + * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
> + * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
> + * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
> + * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
> + * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
> + * LIMITED REMEDY.
> + *
> + * 4.3. Licensee shall not export, either directly or indirectly, any of this
> + * software or system incorporating such software without first obtaining any
> + * required license or other approval from the U. S. Department of Commerce or
> + * any other agency or department of the United States Government. In the
> + * event Licensee exports any such software from the United States or
> + * re-exports any such software from a foreign destination, Licensee shall
> + * ensure that the distribution and export/re-export of the software is in
> + * compliance with all laws, regulations, orders, or other restrictions of the
> + * U.S. Export Administration Regulations. Licensee agrees that neither it nor
> + * any of its subsidiaries will export/re-export any technical data, process,
> + * software, or service, directly or indirectly, to any country for which the
> + * United States government or any agency thereof requires an export license,
> + * other governmental approval, or letter of assurance, without first obtaining
> + * such license, approval or letter.
> + *
> + *****************************************************************************/
> +
> +#include "acpi.h"
> +#include "accommon.h"
> +
> +#define _COMPONENT ACPI_HARDWARE
> + ACPI_MODULE_NAME ("hwesleep")
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiHwExecuteSleepMethod
> + *
> + * PARAMETERS: MethodPathname - Pathname of method to execute
> + * IntegerArgument - Argument to pass to the method
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Execute a sleep/wake related method with one integer argument
> + * and no return value.
> + *
> + ******************************************************************************/
> +
> +void
> +AcpiHwExecuteSleepMethod (
> + char *MethodPathname,
> + UINT32 IntegerArgument)
> +{
> + ACPI_OBJECT_LIST ArgList;
> + ACPI_OBJECT Arg;
> + ACPI_STATUS Status;
> +
> +
> + ACPI_FUNCTION_TRACE (HwExecuteSleepMethod);
> +
> +
> + /* One argument, IntegerArgument; No return value expected */
> +
> + ArgList.Count = 1;
> + ArgList.Pointer = &Arg;
> + Arg.Type = ACPI_TYPE_INTEGER;
> + Arg.Integer.Value = (UINT64) IntegerArgument;
> +
> + Status = AcpiEvaluateObject (NULL, MethodPathname, &ArgList, NULL);
> + if (ACPI_FAILURE (Status) && Status != AE_NOT_FOUND)
> + {
> + ACPI_EXCEPTION ((AE_INFO, Status, "While executing method %s",
> + MethodPathname));
> + }
> +
> + return_VOID;
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiHwExtendedSleep
> + *
> + * PARAMETERS: SleepState - Which sleep state to enter
> + * Flags - ACPI_EXECUTE_GTS to run optional method
> + *
> + * RETURN: Status
> + *
> + * DESCRIPTION: Enter a system sleep state via the extended FADT sleep
> + * registers (V5 FADT).
> + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiHwExtendedSleep (
> + UINT8 SleepState,
> + UINT8 Flags)
> +{
> + ACPI_STATUS Status;
> + UINT8 SleepTypeValue;
> + UINT64 SleepStatus;
> +
> +
> + ACPI_FUNCTION_TRACE (HwExtendedSleep);
> +
> +
> + /* Extended sleep registers must be valid */
> +
> + if (!AcpiGbl_FADT.SleepControl.Address ||
> + !AcpiGbl_FADT.SleepStatus.Address)
> + {
> + return_ACPI_STATUS (AE_NOT_EXIST);
> + }
> +
> + /* Clear wake status (WAK_STS) */
> +
> + Status = AcpiWrite ((UINT64) ACPI_X_WAKE_STATUS, &AcpiGbl_FADT.SleepStatus);
> + if (ACPI_FAILURE (Status))
> + {
> + return_ACPI_STATUS (Status);
> + }
> +
> + AcpiGbl_SystemAwakeAndRunning = FALSE;
> +
> + /* Optionally execute _GTS (Going To Sleep) */
> +
> + if (Flags & ACPI_EXECUTE_GTS)
> + {
> + AcpiHwExecuteSleepMethod (METHOD_PATHNAME__GTS, SleepState);
> + }
> +
> + /* Flush caches, as per ACPI specification */
> +
> + ACPI_FLUSH_CPU_CACHE ();
> +
> + /*
> + * Set the SLP_TYP and SLP_EN bits.
> + *
> + * Note: We only use the first value returned by the \_Sx method
> + * (AcpiGbl_SleepTypeA) - As per ACPI specification.
> + */
> + ACPI_DEBUG_PRINT ((ACPI_DB_INIT,
> + "Entering sleep state [S%u]\n", SleepState));
> +
> + SleepTypeValue = ((AcpiGbl_SleepTypeA << ACPI_X_SLEEP_TYPE_POSITION) &
> + ACPI_X_SLEEP_TYPE_MASK);
> +
> + Status = AcpiWrite ((UINT64) (SleepTypeValue | ACPI_X_SLEEP_ENABLE),
> + &AcpiGbl_FADT.SleepControl);
> + if (ACPI_FAILURE (Status))
> + {
> + return_ACPI_STATUS (Status);
> + }
> +
> + /* Wait for transition back to Working State */
> +
> + do
> + {
> + Status = AcpiRead (&SleepStatus, &AcpiGbl_FADT.SleepStatus);
> + if (ACPI_FAILURE (Status))
> + {
> + return_ACPI_STATUS (Status);
> + }
> +
> + } while (!(((UINT8) SleepStatus) & ACPI_X_WAKE_STATUS));
> +
> + return_ACPI_STATUS (AE_OK);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiHwExtendedWakePrep
> + *
> + * PARAMETERS: SleepState - Which sleep state we just exited
> + * Flags - ACPI_EXECUTE_BFS to run optional method
> + *
> + * RETURN: Status
> + *
> + * DESCRIPTION: Perform first part of OS-independent ACPI cleanup after
> + * a sleep. Called with interrupts ENABLED.
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiHwExtendedWakePrep (
> + UINT8 SleepState,
> + UINT8 Flags)
> +{
> + ACPI_STATUS Status;
> + UINT8 SleepTypeValue;
> +
> +
> + ACPI_FUNCTION_TRACE (HwExtendedWakePrep);
> +
> +
> + Status = AcpiGetSleepTypeData (ACPI_STATE_S0,
> + &AcpiGbl_SleepTypeA, &AcpiGbl_SleepTypeB);
> + if (ACPI_SUCCESS (Status))
> + {
> + SleepTypeValue = ((AcpiGbl_SleepTypeA << ACPI_X_SLEEP_TYPE_POSITION) &
> + ACPI_X_SLEEP_TYPE_MASK);
> +
> + (void) AcpiWrite ((UINT64) (SleepTypeValue | ACPI_X_SLEEP_ENABLE),
> + &AcpiGbl_FADT.SleepControl);
> + }
> +
> + /* Optionally execute _BFS (Back From Sleep) */
> +
> + if (Flags & ACPI_EXECUTE_BFS)
> + {
> + AcpiHwExecuteSleepMethod (METHOD_PATHNAME__BFS, SleepState);
> + }
> + return_ACPI_STATUS (AE_OK);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiHwExtendedWake
> + *
> + * PARAMETERS: SleepState - Which sleep state we just exited
> + * Flags - Reserved, set to zero
> + *
> + * RETURN: Status
> + *
> + * DESCRIPTION: Perform OS-independent ACPI cleanup after a sleep
> + * Called with interrupts ENABLED.
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiHwExtendedWake (
> + UINT8 SleepState,
> + UINT8 Flags)
> +{
> + ACPI_FUNCTION_TRACE (HwExtendedWake);
> +
> +
> + /* Ensure EnterSleepStatePrep -> EnterSleepState ordering */
> +
> + AcpiGbl_SleepTypeA = ACPI_SLEEP_TYPE_INVALID;
> +
> + /* Execute the wake methods */
> +
> + AcpiHwExecuteSleepMethod (METHOD_PATHNAME__SST, ACPI_SST_WAKING);
> + AcpiHwExecuteSleepMethod (METHOD_PATHNAME__WAK, SleepState);
> +
> + /*
> + * Some BIOS code assumes that WAK_STS will be cleared on resume
> + * and use it to determine whether the system is rebooting or
> + * resuming. Clear WAK_STS for compatibility.
> + */
> + (void) AcpiWrite ((UINT64) ACPI_X_WAKE_STATUS, &AcpiGbl_FADT.SleepStatus);
> + AcpiGbl_SystemAwakeAndRunning = TRUE;
> +
> + AcpiHwExecuteSleepMethod (METHOD_PATHNAME__SST, ACPI_SST_WORKING);
> + return_ACPI_STATUS (AE_OK);
> +}
> diff --git a/src/acpica/source/components/hardware/hwxfsleep.c b/src/acpica/source/components/hardware/hwxfsleep.c
> new file mode 100644
> index 0000000..631b81e
> --- /dev/null
> +++ b/src/acpica/source/components/hardware/hwxfsleep.c
> @@ -0,0 +1,550 @@
> +/******************************************************************************
> + *
> + * Name: hwxfsleep.c - ACPI Hardware Sleep/Wake External Interfaces
> + *
> + *****************************************************************************/
> +
> +/******************************************************************************
> + *
> + * 1. Copyright Notice
> + *
> + * Some or all of this work - Copyright (c) 1999 - 2012, Intel Corp.
> + * All rights reserved.
> + *
> + * 2. License
> + *
> + * 2.1. This is your license from Intel Corp. under its intellectual property
> + * rights. You may have additional license terms from the party that provided
> + * you this software, covering your right to use that party's intellectual
> + * property rights.
> + *
> + * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
> + * copy of the source code appearing in this file ("Covered Code") an
> + * irrevocable, perpetual, worldwide license under Intel's copyrights in the
> + * base code distributed originally by Intel ("Original Intel Code") to copy,
> + * make derivatives, distribute, use and display any portion of the Covered
> + * Code in any form, with the right to sublicense such rights; and
> + *
> + * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
> + * license (with the right to sublicense), under only those claims of Intel
> + * patents that are infringed by the Original Intel Code, to make, use, sell,
> + * offer to sell, and import the Covered Code and derivative works thereof
> + * solely to the minimum extent necessary to exercise the above copyright
> + * license, and in no event shall the patent license extend to any additions
> + * to or modifications of the Original Intel Code. No other license or right
> + * is granted directly or by implication, estoppel or otherwise;
> + *
> + * The above copyright and patent license is granted only if the following
> + * conditions are met:
> + *
> + * 3. Conditions
> + *
> + * 3.1. Redistribution of Source with Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification with rights to further distribute source must include
> + * the above Copyright Notice, the above License, this list of Conditions,
> + * and the following Disclaimer and Export Compliance provision. In addition,
> + * Licensee must cause all Covered Code to which Licensee contributes to
> + * contain a file documenting the changes Licensee made to create that Covered
> + * Code and the date of any change. Licensee must include in that file the
> + * documentation of any changes made by any predecessor Licensee. Licensee
> + * must include a prominent statement that the modification is derived,
> + * directly or indirectly, from Original Intel Code.
> + *
> + * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification without rights to further distribute source must
> + * include the following Disclaimer and Export Compliance provision in the
> + * documentation and/or other materials provided with distribution. In
> + * addition, Licensee may not authorize further sublicense of source of any
> + * portion of the Covered Code, and must include terms to the effect that the
> + * license from Licensee to its licensee is limited to the intellectual
> + * property embodied in the software Licensee provides to its licensee, and
> + * not to intellectual property embodied in modifications its licensee may
> + * make.
> + *
> + * 3.3. Redistribution of Executable. Redistribution in executable form of any
> + * substantial portion of the Covered Code or modification must reproduce the
> + * above Copyright Notice, and the following Disclaimer and Export Compliance
> + * provision in the documentation and/or other materials provided with the
> + * distribution.
> + *
> + * 3.4. Intel retains all right, title, and interest in and to the Original
> + * Intel Code.
> + *
> + * 3.5. Neither the name Intel nor any other trademark owned or controlled by
> + * Intel shall be used in advertising or otherwise to promote the sale, use or
> + * other dealings in products derived from or relating to the Covered Code
> + * without prior written authorization from Intel.
> + *
> + * 4. Disclaimer and Export Compliance
> + *
> + * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
> + * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
> + * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
> + * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
> + * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
> + * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
> + * PARTICULAR PURPOSE.
> + *
> + * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
> + * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
> + * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
> + * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
> + * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
> + * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
> + * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
> + * LIMITED REMEDY.
> + *
> + * 4.3. Licensee shall not export, either directly or indirectly, any of this
> + * software or system incorporating such software without first obtaining any
> + * required license or other approval from the U. S. Department of Commerce or
> + * any other agency or department of the United States Government. In the
> + * event Licensee exports any such software from the United States or
> + * re-exports any such software from a foreign destination, Licensee shall
> + * ensure that the distribution and export/re-export of the software is in
> + * compliance with all laws, regulations, orders, or other restrictions of the
> + * U.S. Export Administration Regulations. Licensee agrees that neither it nor
> + * any of its subsidiaries will export/re-export any technical data, process,
> + * software, or service, directly or indirectly, to any country for which the
> + * United States government or any agency thereof requires an export license,
> + * other governmental approval, or letter of assurance, without first obtaining
> + * such license, approval or letter.
> + *
> + *****************************************************************************/
> +
> +#include "acpi.h"
> +#include "accommon.h"
> +
> +#define _COMPONENT ACPI_HARDWARE
> + ACPI_MODULE_NAME ("hwxfsleep")
> +
> +/* Local prototypes */
> +
> +static ACPI_STATUS
> +AcpiHwSleepDispatch (
> + UINT8 SleepState,
> + UINT8 Flags,
> + UINT32 FunctionId);
> +
> +/*
> + * Dispatch table used to efficiently branch to the various sleep
> + * functions.
> + */
> +#define ACPI_SLEEP_FUNCTION_ID 0
> +#define ACPI_WAKE_PREP_FUNCTION_ID 1
> +#define ACPI_WAKE_FUNCTION_ID 2
> +
> +/* Legacy functions are optional, based upon ACPI_REDUCED_HARDWARE */
> +
> +static ACPI_SLEEP_FUNCTIONS AcpiSleepDispatch[] =
> +{
> + {ACPI_HW_OPTIONAL_FUNCTION (AcpiHwLegacySleep), AcpiHwExtendedSleep},
> + {ACPI_HW_OPTIONAL_FUNCTION (AcpiHwLegacyWakePrep), AcpiHwExtendedWakePrep},
> + {ACPI_HW_OPTIONAL_FUNCTION (AcpiHwLegacyWake), AcpiHwExtendedWake}
> +};
> +
> +
> +/*
> + * These functions are removed for the ACPI_REDUCED_HARDWARE case:
> + * AcpiSetFirmwareWakingVector
> + * AcpiSetFirmwareWakingVector64
> + * AcpiEnterSleepStateS4bios
> + */
> +
> +#if (!ACPI_REDUCED_HARDWARE)
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiSetFirmwareWakingVector
> + *
> + * PARAMETERS: PhysicalAddress - 32-bit physical address of ACPI real mode
> + * entry point.
> + *
> + * RETURN: Status
> + *
> + * DESCRIPTION: Sets the 32-bit FirmwareWakingVector field of the FACS
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiSetFirmwareWakingVector (
> + UINT32 PhysicalAddress)
> +{
> + ACPI_FUNCTION_TRACE (AcpiSetFirmwareWakingVector);
> +
> +
> + /* Set the 32-bit vector */
> +
> + AcpiGbl_FACS->FirmwareWakingVector = PhysicalAddress;
> +
> + /* Clear the 64-bit vector if it exists */
> +
> + if ((AcpiGbl_FACS->Length > 32) && (AcpiGbl_FACS->Version >= 1))
> + {
> + AcpiGbl_FACS->XFirmwareWakingVector = 0;
> + }
> +
> + return_ACPI_STATUS (AE_OK);
> +}
> +
> +ACPI_EXPORT_SYMBOL (AcpiSetFirmwareWakingVector)
> +
> +
> +#if ACPI_MACHINE_WIDTH == 64
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiSetFirmwareWakingVector64
> + *
> + * PARAMETERS: PhysicalAddress - 64-bit physical address of ACPI protected
> + * mode entry point.
> + *
> + * RETURN: Status
> + *
> + * DESCRIPTION: Sets the 64-bit X_FirmwareWakingVector field of the FACS, if
> + * it exists in the table. This function is intended for use with
> + * 64-bit host operating systems.
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiSetFirmwareWakingVector64 (
> + UINT64 PhysicalAddress)
> +{
> + ACPI_FUNCTION_TRACE (AcpiSetFirmwareWakingVector64);
> +
> +
> + /* Determine if the 64-bit vector actually exists */
> +
> + if ((AcpiGbl_FACS->Length <= 32) || (AcpiGbl_FACS->Version < 1))
> + {
> + return_ACPI_STATUS (AE_NOT_EXIST);
> + }
> +
> + /* Clear 32-bit vector, set the 64-bit X_ vector */
> +
> + AcpiGbl_FACS->FirmwareWakingVector = 0;
> + AcpiGbl_FACS->XFirmwareWakingVector = PhysicalAddress;
> + return_ACPI_STATUS (AE_OK);
> +}
> +
> +ACPI_EXPORT_SYMBOL (AcpiSetFirmwareWakingVector64)
> +#endif
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiEnterSleepStateS4bios
> + *
> + * PARAMETERS: None
> + *
> + * RETURN: Status
> + *
> + * DESCRIPTION: Perform a S4 bios request.
> + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiEnterSleepStateS4bios (
> + void)
> +{
> + UINT32 InValue;
> + ACPI_STATUS Status;
> +
> +
> + ACPI_FUNCTION_TRACE (AcpiEnterSleepStateS4bios);
> +
> +
> + /* Clear the wake status bit (PM1) */
> +
> + Status = AcpiWriteBitRegister (ACPI_BITREG_WAKE_STATUS, ACPI_CLEAR_STATUS);
> + if (ACPI_FAILURE (Status))
> + {
> + return_ACPI_STATUS (Status);
> + }
> +
> + Status = AcpiHwClearAcpiStatus ();
> + if (ACPI_FAILURE (Status))
> + {
> + return_ACPI_STATUS (Status);
> + }
> +
> + /*
> + * 1) Disable/Clear all GPEs
> + * 2) Enable all wakeup GPEs
> + */
> + Status = AcpiHwDisableAllGpes ();
> + if (ACPI_FAILURE (Status))
> + {
> + return_ACPI_STATUS (Status);
> + }
> + AcpiGbl_SystemAwakeAndRunning = FALSE;
> +
> + Status = AcpiHwEnableAllWakeupGpes ();
> + if (ACPI_FAILURE (Status))
> + {
> + return_ACPI_STATUS (Status);
> + }
> +
> + ACPI_FLUSH_CPU_CACHE ();
> +
> + Status = AcpiHwWritePort (AcpiGbl_FADT.SmiCommand,
> + (UINT32) AcpiGbl_FADT.S4BiosRequest, 8);
> +
> + do {
> + AcpiOsStall(1000);
> + Status = AcpiReadBitRegister (ACPI_BITREG_WAKE_STATUS, &InValue);
> + if (ACPI_FAILURE (Status))
> + {
> + return_ACPI_STATUS (Status);
> + }
> + } while (!InValue);
> +
> + return_ACPI_STATUS (AE_OK);
> +}
> +
> +ACPI_EXPORT_SYMBOL (AcpiEnterSleepStateS4bios)
> +
> +#endif /* !ACPI_REDUCED_HARDWARE */
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiHwSleepDispatch
> + *
> + * PARAMETERS: SleepState - Which sleep state to enter/exit
> + * FunctionId - Sleep, WakePrep, or Wake
> + *
> + * RETURN: Status from the invoked sleep handling function.
> + *
> + * DESCRIPTION: Dispatch a sleep/wake request to the appropriate handling
> + * function.
> + *
> + ******************************************************************************/
> +
> +static ACPI_STATUS
> +AcpiHwSleepDispatch (
> + UINT8 SleepState,
> + UINT8 Flags,
> + UINT32 FunctionId)
> +{
> + ACPI_STATUS Status;
> + ACPI_SLEEP_FUNCTIONS *SleepFunctions = &AcpiSleepDispatch[FunctionId];
> +
> +
> +#if (!ACPI_REDUCED_HARDWARE)
> +
> + /*
> + * If the Hardware Reduced flag is set (from the FADT), we must
> + * use the extended sleep registers
> + */
> + if (AcpiGbl_ReducedHardware ||
> + AcpiGbl_FADT.SleepControl.Address)
> + {
> + Status = SleepFunctions->ExtendedFunction (SleepState, Flags);
> + }
> + else
> + {
> + /* Legacy sleep */
> +
> + Status = SleepFunctions->LegacyFunction (SleepState, Flags);
> + }
> +
> + return (Status);
> +
> +#else
> + /*
> + * For the case where reduced-hardware-only code is being generated,
> + * we know that only the extended sleep registers are available
> + */
> + Status = SleepFunctions->ExtendedFunction (SleepState, Flags);
> + return (Status);
> +
> +#endif /* !ACPI_REDUCED_HARDWARE */
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiEnterSleepStatePrep
> + *
> + * PARAMETERS: SleepState - Which sleep state to enter
> + *
> + * RETURN: Status
> + *
> + * DESCRIPTION: Prepare to enter a system sleep state.
> + * This function must execute with interrupts enabled.
> + * We break sleeping into 2 stages so that OSPM can handle
> + * various OS-specific tasks between the two steps.
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiEnterSleepStatePrep (
> + UINT8 SleepState)
> +{
> + ACPI_STATUS Status;
> + ACPI_OBJECT_LIST ArgList;
> + ACPI_OBJECT Arg;
> + UINT32 SstValue;
> +
> +
> + ACPI_FUNCTION_TRACE (AcpiEnterSleepStatePrep);
> +
> +
> + Status = AcpiGetSleepTypeData (SleepState,
> + &AcpiGbl_SleepTypeA, &AcpiGbl_SleepTypeB);
> + if (ACPI_FAILURE (Status))
> + {
> + return_ACPI_STATUS (Status);
> + }
> +
> + /* Execute the _PTS method (Prepare To Sleep) */
> +
> + ArgList.Count = 1;
> + ArgList.Pointer = &Arg;
> + Arg.Type = ACPI_TYPE_INTEGER;
> + Arg.Integer.Value = SleepState;
> +
> + Status = AcpiEvaluateObject (NULL, METHOD_PATHNAME__PTS, &ArgList, NULL);
> + if (ACPI_FAILURE (Status) && Status != AE_NOT_FOUND)
> + {
> + return_ACPI_STATUS (Status);
> + }
> +
> + /* Setup the argument to the _SST method (System STatus) */
> +
> + switch (SleepState)
> + {
> + case ACPI_STATE_S0:
> + SstValue = ACPI_SST_WORKING;
> + break;
> +
> + case ACPI_STATE_S1:
> + case ACPI_STATE_S2:
> + case ACPI_STATE_S3:
> + SstValue = ACPI_SST_SLEEPING;
> + break;
> +
> + case ACPI_STATE_S4:
> + SstValue = ACPI_SST_SLEEP_CONTEXT;
> + break;
> +
> + default:
> + SstValue = ACPI_SST_INDICATOR_OFF; /* Default is off */
> + break;
> + }
> +
> + /*
> + * Set the system indicators to show the desired sleep state.
> + * _SST is an optional method (return no error if not found)
> + */
> + AcpiHwExecuteSleepMethod (METHOD_PATHNAME__SST, SstValue);
> + return_ACPI_STATUS (AE_OK);
> +}
> +
> +ACPI_EXPORT_SYMBOL (AcpiEnterSleepStatePrep)
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiEnterSleepState
> + *
> + * PARAMETERS: SleepState - Which sleep state to enter
> + * Flags - ACPI_EXECUTE_GTS to run optional method
> + *
> + * RETURN: Status
> + *
> + * DESCRIPTION: Enter a system sleep state
> + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiEnterSleepState (
> + UINT8 SleepState,
> + UINT8 Flags)
> +{
> + ACPI_STATUS Status;
> +
> +
> + ACPI_FUNCTION_TRACE (AcpiEnterSleepState);
> +
> +
> + if ((AcpiGbl_SleepTypeA > ACPI_SLEEP_TYPE_MAX) ||
> + (AcpiGbl_SleepTypeB > ACPI_SLEEP_TYPE_MAX))
> + {
> + ACPI_ERROR ((AE_INFO, "Sleep values out of range: A=0x%X B=0x%X",
> + AcpiGbl_SleepTypeA, AcpiGbl_SleepTypeB));
> + return_ACPI_STATUS (AE_AML_OPERAND_VALUE);
> + }
> +
> + Status = AcpiHwSleepDispatch (SleepState, Flags, ACPI_SLEEP_FUNCTION_ID);
> + return_ACPI_STATUS (Status);
> +}
> +
> +ACPI_EXPORT_SYMBOL (AcpiEnterSleepState)
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiLeaveSleepStatePrep
> + *
> + * PARAMETERS: SleepState - Which sleep state we are exiting
> + * Flags - ACPI_EXECUTE_BFS to run optional method
> + *
> + * RETURN: Status
> + *
> + * DESCRIPTION: Perform the first state of OS-independent ACPI cleanup after a
> + * sleep. Called with interrupts DISABLED.
> + * We break wake/resume into 2 stages so that OSPM can handle
> + * various OS-specific tasks between the two steps.
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiLeaveSleepStatePrep (
> + UINT8 SleepState,
> + UINT8 Flags)
> +{
> + ACPI_STATUS Status;
> +
> +
> + ACPI_FUNCTION_TRACE (AcpiLeaveSleepStatePrep);
> +
> +
> + Status = AcpiHwSleepDispatch (SleepState, Flags, ACPI_WAKE_PREP_FUNCTION_ID);
> + return_ACPI_STATUS (Status);
> +}
> +
> +ACPI_EXPORT_SYMBOL (AcpiLeaveSleepStatePrep)
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiLeaveSleepState
> + *
> + * PARAMETERS: SleepState - Which sleep state we are exiting
> + *
> + * RETURN: Status
> + *
> + * DESCRIPTION: Perform OS-independent ACPI cleanup after a sleep
> + * Called with interrupts ENABLED.
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiLeaveSleepState (
> + UINT8 SleepState)
> +{
> + ACPI_STATUS Status;
> +
> +
> + ACPI_FUNCTION_TRACE (AcpiLeaveSleepState);
> +
> +
> + Status = AcpiHwSleepDispatch (SleepState, 0, ACPI_WAKE_FUNCTION_ID);
> + return_ACPI_STATUS (Status);
> +}
> +
> +ACPI_EXPORT_SYMBOL (AcpiLeaveSleepState)
> diff --git a/src/acpica/source/components/resources/rsserial.c b/src/acpica/source/components/resources/rsserial.c
> new file mode 100644
> index 0000000..0bc71e7
> --- /dev/null
> +++ b/src/acpica/source/components/resources/rsserial.c
> @@ -0,0 +1,497 @@
> +/*******************************************************************************
> + *
> + * Module Name: rsserial - GPIO/SerialBus resource descriptors
> + *
> + ******************************************************************************/
> +
> +/******************************************************************************
> + *
> + * 1. Copyright Notice
> + *
> + * Some or all of this work - Copyright (c) 1999 - 2012, Intel Corp.
> + * All rights reserved.
> + *
> + * 2. License
> + *
> + * 2.1. This is your license from Intel Corp. under its intellectual property
> + * rights. You may have additional license terms from the party that provided
> + * you this software, covering your right to use that party's intellectual
> + * property rights.
> + *
> + * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
> + * copy of the source code appearing in this file ("Covered Code") an
> + * irrevocable, perpetual, worldwide license under Intel's copyrights in the
> + * base code distributed originally by Intel ("Original Intel Code") to copy,
> + * make derivatives, distribute, use and display any portion of the Covered
> + * Code in any form, with the right to sublicense such rights; and
> + *
> + * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
> + * license (with the right to sublicense), under only those claims of Intel
> + * patents that are infringed by the Original Intel Code, to make, use, sell,
> + * offer to sell, and import the Covered Code and derivative works thereof
> + * solely to the minimum extent necessary to exercise the above copyright
> + * license, and in no event shall the patent license extend to any additions
> + * to or modifications of the Original Intel Code. No other license or right
> + * is granted directly or by implication, estoppel or otherwise;
> + *
> + * The above copyright and patent license is granted only if the following
> + * conditions are met:
> + *
> + * 3. Conditions
> + *
> + * 3.1. Redistribution of Source with Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification with rights to further distribute source must include
> + * the above Copyright Notice, the above License, this list of Conditions,
> + * and the following Disclaimer and Export Compliance provision. In addition,
> + * Licensee must cause all Covered Code to which Licensee contributes to
> + * contain a file documenting the changes Licensee made to create that Covered
> + * Code and the date of any change. Licensee must include in that file the
> + * documentation of any changes made by any predecessor Licensee. Licensee
> + * must include a prominent statement that the modification is derived,
> + * directly or indirectly, from Original Intel Code.
> + *
> + * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification without rights to further distribute source must
> + * include the following Disclaimer and Export Compliance provision in the
> + * documentation and/or other materials provided with distribution. In
> + * addition, Licensee may not authorize further sublicense of source of any
> + * portion of the Covered Code, and must include terms to the effect that the
> + * license from Licensee to its licensee is limited to the intellectual
> + * property embodied in the software Licensee provides to its licensee, and
> + * not to intellectual property embodied in modifications its licensee may
> + * make.
> + *
> + * 3.3. Redistribution of Executable. Redistribution in executable form of any
> + * substantial portion of the Covered Code or modification must reproduce the
> + * above Copyright Notice, and the following Disclaimer and Export Compliance
> + * provision in the documentation and/or other materials provided with the
> + * distribution.
> + *
> + * 3.4. Intel retains all right, title, and interest in and to the Original
> + * Intel Code.
> + *
> + * 3.5. Neither the name Intel nor any other trademark owned or controlled by
> + * Intel shall be used in advertising or otherwise to promote the sale, use or
> + * other dealings in products derived from or relating to the Covered Code
> + * without prior written authorization from Intel.
> + *
> + * 4. Disclaimer and Export Compliance
> + *
> + * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
> + * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
> + * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
> + * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
> + * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
> + * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
> + * PARTICULAR PURPOSE.
> + *
> + * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
> + * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
> + * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
> + * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
> + * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
> + * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
> + * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
> + * LIMITED REMEDY.
> + *
> + * 4.3. Licensee shall not export, either directly or indirectly, any of this
> + * software or system incorporating such software without first obtaining any
> + * required license or other approval from the U. S. Department of Commerce or
> + * any other agency or department of the United States Government. In the
> + * event Licensee exports any such software from the United States or
> + * re-exports any such software from a foreign destination, Licensee shall
> + * ensure that the distribution and export/re-export of the software is in
> + * compliance with all laws, regulations, orders, or other restrictions of the
> + * U.S. Export Administration Regulations. Licensee agrees that neither it nor
> + * any of its subsidiaries will export/re-export any technical data, process,
> + * software, or service, directly or indirectly, to any country for which the
> + * United States government or any agency thereof requires an export license,
> + * other governmental approval, or letter of assurance, without first obtaining
> + * such license, approval or letter.
> + *
> + *****************************************************************************/
> +
> +#define __RSIRQ_C__
> +
> +#include "acpi.h"
> +#include "accommon.h"
> +#include "acresrc.h"
> +
> +#define _COMPONENT ACPI_RESOURCES
> + ACPI_MODULE_NAME ("rsserial")
> +
> +
> +/*******************************************************************************
> + *
> + * AcpiRsConvertGpio
> + *
> + ******************************************************************************/
> +
> +ACPI_RSCONVERT_INFO AcpiRsConvertGpio[17] =
> +{
> + {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_GPIO,
> + ACPI_RS_SIZE (ACPI_RESOURCE_GPIO),
> + ACPI_RSC_TABLE_SIZE (AcpiRsConvertGpio)},
> +
> + {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_GPIO,
> + sizeof (AML_RESOURCE_GPIO),
> + 0},
> +
> + /*
> + * These fields are contiguous in both the source and destination:
> + * RevisionId
> + * ConnectionType
> + */
> + {ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.Gpio.RevisionId),
> + AML_OFFSET (Gpio.RevisionId),
> + 2},
> +
> + {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Gpio.ProducerConsumer),
> + AML_OFFSET (Gpio.Flags),
> + 0},
> +
> + {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.Gpio.Sharable),
> + AML_OFFSET (Gpio.IntFlags),
> + 3},
> +
> + {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.Gpio.IoRestriction),
> + AML_OFFSET (Gpio.IntFlags),
> + 0},
> +
> + {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Gpio.Triggering),
> + AML_OFFSET (Gpio.IntFlags),
> + 0},
> +
> + {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.Gpio.Polarity),
> + AML_OFFSET (Gpio.IntFlags),
> + 1},
> +
> + {ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.Gpio.PinConfig),
> + AML_OFFSET (Gpio.PinConfig),
> + 1},
> +
> + /*
> + * These fields are contiguous in both the source and destination:
> + * DriveStrength
> + * DebounceTimeout
> + */
> + {ACPI_RSC_MOVE16, ACPI_RS_OFFSET (Data.Gpio.DriveStrength),
> + AML_OFFSET (Gpio.DriveStrength),
> + 2},
> +
> + /* Pin Table */
> +
> + {ACPI_RSC_COUNT_GPIO_PIN, ACPI_RS_OFFSET (Data.Gpio.PinTableLength),
> + AML_OFFSET (Gpio.PinTableOffset),
> + AML_OFFSET (Gpio.ResSourceOffset)},
> +
> + {ACPI_RSC_MOVE_GPIO_PIN, ACPI_RS_OFFSET (Data.Gpio.PinTable),
> + AML_OFFSET (Gpio.PinTableOffset),
> + 0},
> +
> + /* Resource Source */
> +
> + {ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.Gpio.ResourceSource.Index),
> + AML_OFFSET (Gpio.ResSourceIndex),
> + 1},
> +
> + {ACPI_RSC_COUNT_GPIO_RES, ACPI_RS_OFFSET (Data.Gpio.ResourceSource.StringLength),
> + AML_OFFSET (Gpio.ResSourceOffset),
> + AML_OFFSET (Gpio.VendorOffset)},
> +
> + {ACPI_RSC_MOVE_GPIO_RES, ACPI_RS_OFFSET (Data.Gpio.ResourceSource.StringPtr),
> + AML_OFFSET (Gpio.ResSourceOffset),
> + 0},
> +
> + /* Vendor Data */
> +
> + {ACPI_RSC_COUNT_GPIO_VEN, ACPI_RS_OFFSET (Data.Gpio.VendorLength),
> + AML_OFFSET (Gpio.VendorLength),
> + 1},
> +
> + {ACPI_RSC_MOVE_GPIO_RES, ACPI_RS_OFFSET (Data.Gpio.VendorData),
> + AML_OFFSET (Gpio.VendorOffset),
> + 0},
> +};
> +
> +
> +/*******************************************************************************
> + *
> + * AcpiRsConvertI2cSerialBus
> + *
> + ******************************************************************************/
> +
> +ACPI_RSCONVERT_INFO AcpiRsConvertI2cSerialBus[16] =
> +{
> + {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_SERIAL_BUS,
> + ACPI_RS_SIZE (ACPI_RESOURCE_I2C_SERIALBUS),
> + ACPI_RSC_TABLE_SIZE (AcpiRsConvertI2cSerialBus)},
> +
> + {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_SERIAL_BUS,
> + sizeof (AML_RESOURCE_I2C_SERIALBUS),
> + 0},
> +
> + {ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.CommonSerialBus.RevisionId),
> + AML_OFFSET (CommonSerialBus.RevisionId),
> + 1},
> +
> + {ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.CommonSerialBus.Type),
> + AML_OFFSET (CommonSerialBus.Type),
> + 1},
> +
> + {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.CommonSerialBus.SlaveMode),
> + AML_OFFSET (CommonSerialBus.Flags),
> + 0},
> +
> + {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.CommonSerialBus.ProducerConsumer),
> + AML_OFFSET (CommonSerialBus.Flags),
> + 1},
> +
> + {ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.CommonSerialBus.TypeRevisionId),
> + AML_OFFSET (CommonSerialBus.TypeRevisionId),
> + 1},
> +
> + {ACPI_RSC_MOVE16, ACPI_RS_OFFSET (Data.CommonSerialBus.TypeDataLength),
> + AML_OFFSET (CommonSerialBus.TypeDataLength),
> + 1},
> +
> + /* Vendor data */
> +
> + {ACPI_RSC_COUNT_SERIAL_VEN, ACPI_RS_OFFSET (Data.CommonSerialBus.VendorLength),
> + AML_OFFSET (CommonSerialBus.TypeDataLength),
> + AML_RESOURCE_I2C_MIN_DATA_LEN},
> +
> + {ACPI_RSC_MOVE_SERIAL_VEN, ACPI_RS_OFFSET (Data.CommonSerialBus.VendorData),
> + 0,
> + sizeof (AML_RESOURCE_I2C_SERIALBUS)},
> +
> + /* Resource Source */
> +
> + {ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.CommonSerialBus.ResourceSource.Index),
> + AML_OFFSET (CommonSerialBus.ResSourceIndex),
> + 1},
> +
> + {ACPI_RSC_COUNT_SERIAL_RES, ACPI_RS_OFFSET (Data.CommonSerialBus.ResourceSource.StringLength),
> + AML_OFFSET (CommonSerialBus.TypeDataLength),
> + sizeof (AML_RESOURCE_COMMON_SERIALBUS)},
> +
> + {ACPI_RSC_MOVE_SERIAL_RES, ACPI_RS_OFFSET (Data.CommonSerialBus.ResourceSource.StringPtr),
> + AML_OFFSET (CommonSerialBus.TypeDataLength),
> + sizeof (AML_RESOURCE_COMMON_SERIALBUS)},
> +
> + /* I2C bus type specific */
> +
> + {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.I2cSerialBus.AccessMode),
> + AML_OFFSET (I2cSerialBus.TypeSpecificFlags),
> + 0},
> +
> + {ACPI_RSC_MOVE32, ACPI_RS_OFFSET (Data.I2cSerialBus.ConnectionSpeed),
> + AML_OFFSET (I2cSerialBus.ConnectionSpeed),
> + 1},
> +
> + {ACPI_RSC_MOVE16, ACPI_RS_OFFSET (Data.I2cSerialBus.SlaveAddress),
> + AML_OFFSET (I2cSerialBus.SlaveAddress),
> + 1},
> +};
> +
> +
> +/*******************************************************************************
> + *
> + * AcpiRsConvertSpiSerialBus
> + *
> + ******************************************************************************/
> +
> +ACPI_RSCONVERT_INFO AcpiRsConvertSpiSerialBus[20] =
> +{
> + {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_SERIAL_BUS,
> + ACPI_RS_SIZE (ACPI_RESOURCE_SPI_SERIALBUS),
> + ACPI_RSC_TABLE_SIZE (AcpiRsConvertSpiSerialBus)},
> +
> + {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_SERIAL_BUS,
> + sizeof (AML_RESOURCE_SPI_SERIALBUS),
> + 0},
> +
> + {ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.CommonSerialBus.RevisionId),
> + AML_OFFSET (CommonSerialBus.RevisionId),
> + 1},
> +
> + {ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.CommonSerialBus.Type),
> + AML_OFFSET (CommonSerialBus.Type),
> + 1},
> +
> + {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.CommonSerialBus.SlaveMode),
> + AML_OFFSET (CommonSerialBus.Flags),
> + 0},
> +
> + {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.CommonSerialBus.ProducerConsumer),
> + AML_OFFSET (CommonSerialBus.Flags),
> + 1},
> +
> + {ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.CommonSerialBus.TypeRevisionId),
> + AML_OFFSET (CommonSerialBus.TypeRevisionId),
> + 1},
> +
> + {ACPI_RSC_MOVE16, ACPI_RS_OFFSET (Data.CommonSerialBus.TypeDataLength),
> + AML_OFFSET (CommonSerialBus.TypeDataLength),
> + 1},
> +
> + /* Vendor data */
> +
> + {ACPI_RSC_COUNT_SERIAL_VEN, ACPI_RS_OFFSET (Data.CommonSerialBus.VendorLength),
> + AML_OFFSET (CommonSerialBus.TypeDataLength),
> + AML_RESOURCE_SPI_MIN_DATA_LEN},
> +
> + {ACPI_RSC_MOVE_SERIAL_VEN, ACPI_RS_OFFSET (Data.CommonSerialBus.VendorData),
> + 0,
> + sizeof (AML_RESOURCE_SPI_SERIALBUS)},
> +
> + /* Resource Source */
> +
> + {ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.CommonSerialBus.ResourceSource.Index),
> + AML_OFFSET (CommonSerialBus.ResSourceIndex),
> + 1},
> +
> + {ACPI_RSC_COUNT_SERIAL_RES, ACPI_RS_OFFSET (Data.CommonSerialBus.ResourceSource.StringLength),
> + AML_OFFSET (CommonSerialBus.TypeDataLength),
> + sizeof (AML_RESOURCE_COMMON_SERIALBUS)},
> +
> + {ACPI_RSC_MOVE_SERIAL_RES, ACPI_RS_OFFSET (Data.CommonSerialBus.ResourceSource.StringPtr),
> + AML_OFFSET (CommonSerialBus.TypeDataLength),
> + sizeof (AML_RESOURCE_COMMON_SERIALBUS)},
> +
> + /* Spi bus type specific */
> +
> + {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.SpiSerialBus.WireMode),
> + AML_OFFSET (SpiSerialBus.TypeSpecificFlags),
> + 0},
> +
> + {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.SpiSerialBus.DevicePolarity),
> + AML_OFFSET (SpiSerialBus.TypeSpecificFlags),
> + 1},
> +
> + {ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.SpiSerialBus.DataBitLength),
> + AML_OFFSET (SpiSerialBus.DataBitLength),
> + 1},
> +
> + {ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.SpiSerialBus.ClockPhase),
> + AML_OFFSET (SpiSerialBus.ClockPhase),
> + 1},
> +
> + {ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.SpiSerialBus.ClockPolarity),
> + AML_OFFSET (SpiSerialBus.ClockPolarity),
> + 1},
> +
> + {ACPI_RSC_MOVE16, ACPI_RS_OFFSET (Data.SpiSerialBus.DeviceSelection),
> + AML_OFFSET (SpiSerialBus.DeviceSelection),
> + 1},
> +
> + {ACPI_RSC_MOVE32, ACPI_RS_OFFSET (Data.SpiSerialBus.ConnectionSpeed),
> + AML_OFFSET (SpiSerialBus.ConnectionSpeed),
> + 1},
> +};
> +
> +
> +/*******************************************************************************
> + *
> + * AcpiRsConvertUartSerialBus
> + *
> + ******************************************************************************/
> +
> +ACPI_RSCONVERT_INFO AcpiRsConvertUartSerialBus[22] =
> +{
> + {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_SERIAL_BUS,
> + ACPI_RS_SIZE (ACPI_RESOURCE_UART_SERIALBUS),
> + ACPI_RSC_TABLE_SIZE (AcpiRsConvertUartSerialBus)},
> +
> + {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_SERIAL_BUS,
> + sizeof (AML_RESOURCE_UART_SERIALBUS),
> + 0},
> +
> + {ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.CommonSerialBus.RevisionId),
> + AML_OFFSET (CommonSerialBus.RevisionId),
> + 1},
> +
> + {ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.CommonSerialBus.Type),
> + AML_OFFSET (CommonSerialBus.Type),
> + 1},
> +
> + {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.CommonSerialBus.SlaveMode),
> + AML_OFFSET (CommonSerialBus.Flags),
> + 0},
> +
> + {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.CommonSerialBus.ProducerConsumer),
> + AML_OFFSET (CommonSerialBus.Flags),
> + 1},
> +
> + {ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.CommonSerialBus.TypeRevisionId),
> + AML_OFFSET (CommonSerialBus.TypeRevisionId),
> + 1},
> +
> + {ACPI_RSC_MOVE16, ACPI_RS_OFFSET (Data.CommonSerialBus.TypeDataLength),
> + AML_OFFSET (CommonSerialBus.TypeDataLength),
> + 1},
> +
> + /* Vendor data */
> +
> + {ACPI_RSC_COUNT_SERIAL_VEN, ACPI_RS_OFFSET (Data.CommonSerialBus.VendorLength),
> + AML_OFFSET (CommonSerialBus.TypeDataLength),
> + AML_RESOURCE_UART_MIN_DATA_LEN},
> +
> + {ACPI_RSC_MOVE_SERIAL_VEN, ACPI_RS_OFFSET (Data.CommonSerialBus.VendorData),
> + 0,
> + sizeof (AML_RESOURCE_UART_SERIALBUS)},
> +
> + /* Resource Source */
> +
> + {ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.CommonSerialBus.ResourceSource.Index),
> + AML_OFFSET (CommonSerialBus.ResSourceIndex),
> + 1},
> +
> + {ACPI_RSC_COUNT_SERIAL_RES, ACPI_RS_OFFSET (Data.CommonSerialBus.ResourceSource.StringLength),
> + AML_OFFSET (CommonSerialBus.TypeDataLength),
> + sizeof (AML_RESOURCE_COMMON_SERIALBUS)},
> +
> + {ACPI_RSC_MOVE_SERIAL_RES, ACPI_RS_OFFSET (Data.CommonSerialBus.ResourceSource.StringPtr),
> + AML_OFFSET (CommonSerialBus.TypeDataLength),
> + sizeof (AML_RESOURCE_COMMON_SERIALBUS)},
> +
> + /* Uart bus type specific */
> +
> + {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.UartSerialBus.FlowControl),
> + AML_OFFSET (UartSerialBus.TypeSpecificFlags),
> + 0},
> +
> + {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.UartSerialBus.StopBits),
> + AML_OFFSET (UartSerialBus.TypeSpecificFlags),
> + 2},
> +
> + {ACPI_RSC_3BITFLAG, ACPI_RS_OFFSET (Data.UartSerialBus.DataBits),
> + AML_OFFSET (UartSerialBus.TypeSpecificFlags),
> + 4},
> +
> + {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.UartSerialBus.Endian),
> + AML_OFFSET (UartSerialBus.TypeSpecificFlags),
> + 7},
> +
> + {ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.UartSerialBus.Parity),
> + AML_OFFSET (UartSerialBus.Parity),
> + 1},
> +
> + {ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.UartSerialBus.LinesEnabled),
> + AML_OFFSET (UartSerialBus.LinesEnabled),
> + 1},
> +
> + {ACPI_RSC_MOVE16, ACPI_RS_OFFSET (Data.UartSerialBus.RxFifoSize),
> + AML_OFFSET (UartSerialBus.RxFifoSize),
> + 1},
> +
> + {ACPI_RSC_MOVE16, ACPI_RS_OFFSET (Data.UartSerialBus.TxFifoSize),
> + AML_OFFSET (UartSerialBus.TxFifoSize),
> + 1},
> +
> + {ACPI_RSC_MOVE32, ACPI_RS_OFFSET (Data.UartSerialBus.DefaultBaudRate),
> + AML_OFFSET (UartSerialBus.DefaultBaudRate),
> + 1},
> +};
> diff --git a/src/acpica/source/components/utilities/utaddress.c b/src/acpica/source/components/utilities/utaddress.c
> new file mode 100644
> index 0000000..8cbc8a9
> --- /dev/null
> +++ b/src/acpica/source/components/utilities/utaddress.c
> @@ -0,0 +1,394 @@
> +/******************************************************************************
> + *
> + * Module Name: utaddress - OpRegion address range check
> + *
> + *****************************************************************************/
> +
> +/******************************************************************************
> + *
> + * 1. Copyright Notice
> + *
> + * Some or all of this work - Copyright (c) 1999 - 2012, Intel Corp.
> + * All rights reserved.
> + *
> + * 2. License
> + *
> + * 2.1. This is your license from Intel Corp. under its intellectual property
> + * rights. You may have additional license terms from the party that provided
> + * you this software, covering your right to use that party's intellectual
> + * property rights.
> + *
> + * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
> + * copy of the source code appearing in this file ("Covered Code") an
> + * irrevocable, perpetual, worldwide license under Intel's copyrights in the
> + * base code distributed originally by Intel ("Original Intel Code") to copy,
> + * make derivatives, distribute, use and display any portion of the Covered
> + * Code in any form, with the right to sublicense such rights; and
> + *
> + * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
> + * license (with the right to sublicense), under only those claims of Intel
> + * patents that are infringed by the Original Intel Code, to make, use, sell,
> + * offer to sell, and import the Covered Code and derivative works thereof
> + * solely to the minimum extent necessary to exercise the above copyright
> + * license, and in no event shall the patent license extend to any additions
> + * to or modifications of the Original Intel Code. No other license or right
> + * is granted directly or by implication, estoppel or otherwise;
> + *
> + * The above copyright and patent license is granted only if the following
> + * conditions are met:
> + *
> + * 3. Conditions
> + *
> + * 3.1. Redistribution of Source with Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification with rights to further distribute source must include
> + * the above Copyright Notice, the above License, this list of Conditions,
> + * and the following Disclaimer and Export Compliance provision. In addition,
> + * Licensee must cause all Covered Code to which Licensee contributes to
> + * contain a file documenting the changes Licensee made to create that Covered
> + * Code and the date of any change. Licensee must include in that file the
> + * documentation of any changes made by any predecessor Licensee. Licensee
> + * must include a prominent statement that the modification is derived,
> + * directly or indirectly, from Original Intel Code.
> + *
> + * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification without rights to further distribute source must
> + * include the following Disclaimer and Export Compliance provision in the
> + * documentation and/or other materials provided with distribution. In
> + * addition, Licensee may not authorize further sublicense of source of any
> + * portion of the Covered Code, and must include terms to the effect that the
> + * license from Licensee to its licensee is limited to the intellectual
> + * property embodied in the software Licensee provides to its licensee, and
> + * not to intellectual property embodied in modifications its licensee may
> + * make.
> + *
> + * 3.3. Redistribution of Executable. Redistribution in executable form of any
> + * substantial portion of the Covered Code or modification must reproduce the
> + * above Copyright Notice, and the following Disclaimer and Export Compliance
> + * provision in the documentation and/or other materials provided with the
> + * distribution.
> + *
> + * 3.4. Intel retains all right, title, and interest in and to the Original
> + * Intel Code.
> + *
> + * 3.5. Neither the name Intel nor any other trademark owned or controlled by
> + * Intel shall be used in advertising or otherwise to promote the sale, use or
> + * other dealings in products derived from or relating to the Covered Code
> + * without prior written authorization from Intel.
> + *
> + * 4. Disclaimer and Export Compliance
> + *
> + * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
> + * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
> + * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
> + * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
> + * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
> + * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
> + * PARTICULAR PURPOSE.
> + *
> + * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
> + * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
> + * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
> + * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
> + * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
> + * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
> + * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
> + * LIMITED REMEDY.
> + *
> + * 4.3. Licensee shall not export, either directly or indirectly, any of this
> + * software or system incorporating such software without first obtaining any
> + * required license or other approval from the U. S. Department of Commerce or
> + * any other agency or department of the United States Government. In the
> + * event Licensee exports any such software from the United States or
> + * re-exports any such software from a foreign destination, Licensee shall
> + * ensure that the distribution and export/re-export of the software is in
> + * compliance with all laws, regulations, orders, or other restrictions of the
> + * U.S. Export Administration Regulations. Licensee agrees that neither it nor
> + * any of its subsidiaries will export/re-export any technical data, process,
> + * software, or service, directly or indirectly, to any country for which the
> + * United States government or any agency thereof requires an export license,
> + * other governmental approval, or letter of assurance, without first obtaining
> + * such license, approval or letter.
> + *
> + *****************************************************************************/
> +
> +#define __UTADDRESS_C__
> +
> +#include "acpi.h"
> +#include "accommon.h"
> +#include "acnamesp.h"
> +
> +
> +#define _COMPONENT ACPI_UTILITIES
> + ACPI_MODULE_NAME ("utaddress")
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiUtAddAddressRange
> + *
> + * PARAMETERS: SpaceId - Address space ID
> + * Address - OpRegion start address
> + * Length - OpRegion length
> + * RegionNode - OpRegion namespace node
> + *
> + * RETURN: Status
> + *
> + * DESCRIPTION: Add the Operation Region address range to the global list.
> + * The only supported Space IDs are Memory and I/O. Called when
> + * the OpRegion address/length operands are fully evaluated.
> + *
> + * MUTEX: Locks the namespace
> + *
> + * NOTE: Because this interface is only called when an OpRegion argument
> + * list is evaluated, there cannot be any duplicate RegionNodes.
> + * Duplicate Address/Length values are allowed, however, so that multiple
> + * address conflicts can be detected.
> + *
> + ******************************************************************************/
> +
> +ACPI_STATUS
> +AcpiUtAddAddressRange (
> + ACPI_ADR_SPACE_TYPE SpaceId,
> + ACPI_PHYSICAL_ADDRESS Address,
> + UINT32 Length,
> + ACPI_NAMESPACE_NODE *RegionNode)
> +{
> + ACPI_ADDRESS_RANGE *RangeInfo;
> + ACPI_STATUS Status;
> +
> +
> + ACPI_FUNCTION_TRACE (UtAddAddressRange);
> +
> +
> + if ((SpaceId != ACPI_ADR_SPACE_SYSTEM_MEMORY) &&
> + (SpaceId != ACPI_ADR_SPACE_SYSTEM_IO))
> + {
> + return_ACPI_STATUS (AE_OK);
> + }
> +
> + /* Allocate/init a new info block, add it to the appropriate list */
> +
> + RangeInfo = ACPI_ALLOCATE (sizeof (ACPI_ADDRESS_RANGE));
> + if (!RangeInfo)
> + {
> + return_ACPI_STATUS (AE_NO_MEMORY);
> + }
> +
> + RangeInfo->StartAddress = Address;
> + RangeInfo->EndAddress = (Address + Length - 1);
> + RangeInfo->RegionNode = RegionNode;
> +
> + Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
> + if (ACPI_FAILURE (Status))
> + {
> + ACPI_FREE (RangeInfo);
> + return_ACPI_STATUS (Status);
> + }
> +
> + RangeInfo->Next = AcpiGbl_AddressRangeList[SpaceId];
> + AcpiGbl_AddressRangeList[SpaceId] = RangeInfo;
> +
> + ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
> + "\nAdded [%4.4s] address range: 0x%p-0x%p\n",
> + AcpiUtGetNodeName (RangeInfo->RegionNode),
> + ACPI_CAST_PTR (void, Address),
> + ACPI_CAST_PTR (void, RangeInfo->EndAddress)));
> +
> + (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
> + return_ACPI_STATUS (AE_OK);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiUtRemoveAddressRange
> + *
> + * PARAMETERS: SpaceId - Address space ID
> + * RegionNode - OpRegion namespace node
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Remove the Operation Region from the global list. The only
> + * supported Space IDs are Memory and I/O. Called when an
> + * OpRegion is deleted.
> + *
> + * MUTEX: Assumes the namespace is locked
> + *
> + ******************************************************************************/
> +
> +void
> +AcpiUtRemoveAddressRange (
> + ACPI_ADR_SPACE_TYPE SpaceId,
> + ACPI_NAMESPACE_NODE *RegionNode)
> +{
> + ACPI_ADDRESS_RANGE *RangeInfo;
> + ACPI_ADDRESS_RANGE *Prev;
> +
> +
> + ACPI_FUNCTION_TRACE (UtRemoveAddressRange);
> +
> +
> + if ((SpaceId != ACPI_ADR_SPACE_SYSTEM_MEMORY) &&
> + (SpaceId != ACPI_ADR_SPACE_SYSTEM_IO))
> + {
> + return_VOID;
> + }
> +
> + /* Get the appropriate list head and check the list */
> +
> + RangeInfo = Prev = AcpiGbl_AddressRangeList[SpaceId];
> + while (RangeInfo)
> + {
> + if (RangeInfo->RegionNode == RegionNode)
> + {
> + if (RangeInfo == Prev) /* Found at list head */
> + {
> + AcpiGbl_AddressRangeList[SpaceId] = RangeInfo->Next;
> + }
> + else
> + {
> + Prev->Next = RangeInfo->Next;
> + }
> +
> + ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
> + "\nRemoved [%4.4s] address range: 0x%p-0x%p\n",
> + AcpiUtGetNodeName (RangeInfo->RegionNode),
> + ACPI_CAST_PTR (void, RangeInfo->StartAddress),
> + ACPI_CAST_PTR (void, RangeInfo->EndAddress)));
> +
> + ACPI_FREE (RangeInfo);
> + return_VOID;
> + }
> +
> + Prev = RangeInfo;
> + RangeInfo = RangeInfo->Next;
> + }
> +
> + return_VOID;
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiUtCheckAddressRange
> + *
> + * PARAMETERS: SpaceId - Address space ID
> + * Address - Start address
> + * Length - Length of address range
> + * Warn - TRUE if warning on overlap desired
> + *
> + * RETURN: Count of the number of conflicts detected. Zero is always
> + * returned for Space IDs other than Memory or I/O.
> + *
> + * DESCRIPTION: Check if the input address range overlaps any of the
> + * ASL operation region address ranges. The only supported
> + * Space IDs are Memory and I/O.
> + *
> + * MUTEX: Assumes the namespace is locked.
> + *
> + ******************************************************************************/
> +
> +UINT32
> +AcpiUtCheckAddressRange (
> + ACPI_ADR_SPACE_TYPE SpaceId,
> + ACPI_PHYSICAL_ADDRESS Address,
> + UINT32 Length,
> + BOOLEAN Warn)
> +{
> + ACPI_ADDRESS_RANGE *RangeInfo;
> + ACPI_PHYSICAL_ADDRESS EndAddress;
> + char *Pathname;
> + UINT32 OverlapCount = 0;
> +
> +
> + ACPI_FUNCTION_TRACE (UtCheckAddressRange);
> +
> +
> + if ((SpaceId != ACPI_ADR_SPACE_SYSTEM_MEMORY) &&
> + (SpaceId != ACPI_ADR_SPACE_SYSTEM_IO))
> + {
> + return_UINT32 (0);
> + }
> +
> + RangeInfo = AcpiGbl_AddressRangeList[SpaceId];
> + EndAddress = Address + Length - 1;
> +
> + /* Check entire list for all possible conflicts */
> +
> + while (RangeInfo)
> + {
> + /*
> + * Check if the requested Address/Length overlaps this AddressRange.
> + * Four cases to consider:
> + *
> + * 1) Input address/length is contained completely in the address range
> + * 2) Input address/length overlaps range at the range start
> + * 3) Input address/length overlaps range at the range end
> + * 4) Input address/length completely encompasses the range
> + */
> + if ((Address <= RangeInfo->EndAddress) &&
> + (EndAddress >= RangeInfo->StartAddress))
> + {
> + /* Found an address range overlap */
> +
> + OverlapCount++;
> + if (Warn) /* Optional warning message */
> + {
> + Pathname = AcpiNsGetExternalPathname (RangeInfo->RegionNode);
> +
> + ACPI_WARNING ((AE_INFO,
> + "0x%p-0x%p %s conflicts with Region %s %d",
> + ACPI_CAST_PTR (void, Address),
> + ACPI_CAST_PTR (void, EndAddress),
> + AcpiUtGetRegionName (SpaceId), Pathname, OverlapCount));
> + ACPI_FREE (Pathname);
> + }
> + }
> +
> + RangeInfo = RangeInfo->Next;
> + }
> +
> + return_UINT32 (OverlapCount);
> +}
> +
> +
> +/*******************************************************************************
> + *
> + * FUNCTION: AcpiUtDeleteAddressLists
> + *
> + * PARAMETERS: None
> + *
> + * RETURN: None
> + *
> + * DESCRIPTION: Delete all global address range lists (called during
> + * subsystem shutdown).
> + *
> + ******************************************************************************/
> +
> +void
> +AcpiUtDeleteAddressLists (
> + void)
> +{
> + ACPI_ADDRESS_RANGE *Next;
> + ACPI_ADDRESS_RANGE *RangeInfo;
> + int i;
> +
> +
> + /* Delete all elements in all address range lists */
> +
> + for (i = 0; i < ACPI_ADDRESS_RANGE_MAX; i++)
> + {
> + Next = AcpiGbl_AddressRangeList[i];
> +
> + while (Next)
> + {
> + RangeInfo = Next;
> + Next = RangeInfo->Next;
> + ACPI_FREE (RangeInfo);
> + }
> +
> + AcpiGbl_AddressRangeList[i] = NULL;
> + }
> +}
> diff --git a/src/acpica/source/include/actbl3.h b/src/acpica/source/include/actbl3.h
> new file mode 100644
> index 0000000..6fc9568
> --- /dev/null
> +++ b/src/acpica/source/include/actbl3.h
> @@ -0,0 +1,722 @@
> +/******************************************************************************
> + *
> + * Name: actbl3.h - ACPI Table Definitions
> + *
> + *****************************************************************************/
> +
> +/******************************************************************************
> + *
> + * 1. Copyright Notice
> + *
> + * Some or all of this work - Copyright (c) 1999 - 2012, Intel Corp.
> + * All rights reserved.
> + *
> + * 2. License
> + *
> + * 2.1. This is your license from Intel Corp. under its intellectual property
> + * rights. You may have additional license terms from the party that provided
> + * you this software, covering your right to use that party's intellectual
> + * property rights.
> + *
> + * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
> + * copy of the source code appearing in this file ("Covered Code") an
> + * irrevocable, perpetual, worldwide license under Intel's copyrights in the
> + * base code distributed originally by Intel ("Original Intel Code") to copy,
> + * make derivatives, distribute, use and display any portion of the Covered
> + * Code in any form, with the right to sublicense such rights; and
> + *
> + * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
> + * license (with the right to sublicense), under only those claims of Intel
> + * patents that are infringed by the Original Intel Code, to make, use, sell,
> + * offer to sell, and import the Covered Code and derivative works thereof
> + * solely to the minimum extent necessary to exercise the above copyright
> + * license, and in no event shall the patent license extend to any additions
> + * to or modifications of the Original Intel Code. No other license or right
> + * is granted directly or by implication, estoppel or otherwise;
> + *
> + * The above copyright and patent license is granted only if the following
> + * conditions are met:
> + *
> + * 3. Conditions
> + *
> + * 3.1. Redistribution of Source with Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification with rights to further distribute source must include
> + * the above Copyright Notice, the above License, this list of Conditions,
> + * and the following Disclaimer and Export Compliance provision. In addition,
> + * Licensee must cause all Covered Code to which Licensee contributes to
> + * contain a file documenting the changes Licensee made to create that Covered
> + * Code and the date of any change. Licensee must include in that file the
> + * documentation of any changes made by any predecessor Licensee. Licensee
> + * must include a prominent statement that the modification is derived,
> + * directly or indirectly, from Original Intel Code.
> + *
> + * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
> + * Redistribution of source code of any substantial portion of the Covered
> + * Code or modification without rights to further distribute source must
> + * include the following Disclaimer and Export Compliance provision in the
> + * documentation and/or other materials provided with distribution. In
> + * addition, Licensee may not authorize further sublicense of source of any
> + * portion of the Covered Code, and must include terms to the effect that the
> + * license from Licensee to its licensee is limited to the intellectual
> + * property embodied in the software Licensee provides to its licensee, and
> + * not to intellectual property embodied in modifications its licensee may
> + * make.
> + *
> + * 3.3. Redistribution of Executable. Redistribution in executable form of any
> + * substantial portion of the Covered Code or modification must reproduce the
> + * above Copyright Notice, and the following Disclaimer and Export Compliance
> + * provision in the documentation and/or other materials provided with the
> + * distribution.
> + *
> + * 3.4. Intel retains all right, title, and interest in and to the Original
> + * Intel Code.
> + *
> + * 3.5. Neither the name Intel nor any other trademark owned or controlled by
> + * Intel shall be used in advertising or otherwise to promote the sale, use or
> + * other dealings in products derived from or relating to the Covered Code
> + * without prior written authorization from Intel.
> + *
> + * 4. Disclaimer and Export Compliance
> + *
> + * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
> + * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
> + * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
> + * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
> + * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
> + * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
> + * PARTICULAR PURPOSE.
> + *
> + * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
> + * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
> + * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
> + * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
> + * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
> + * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
> + * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
> + * LIMITED REMEDY.
> + *
> + * 4.3. Licensee shall not export, either directly or indirectly, any of this
> + * software or system incorporating such software without first obtaining any
> + * required license or other approval from the U. S. Department of Commerce or
> + * any other agency or department of the United States Government. In the
> + * event Licensee exports any such software from the United States or
> + * re-exports any such software from a foreign destination, Licensee shall
> + * ensure that the distribution and export/re-export of the software is in
> + * compliance with all laws, regulations, orders, or other restrictions of the
> + * U.S. Export Administration Regulations. Licensee agrees that neither it nor
> + * any of its subsidiaries will export/re-export any technical data, process,
> + * software, or service, directly or indirectly, to any country for which the
> + * United States government or any agency thereof requires an export license,
> + * other governmental approval, or letter of assurance, without first obtaining
> + * such license, approval or letter.
> + *
> + *****************************************************************************/
> +
> +#ifndef __ACTBL3_H__
> +#define __ACTBL3_H__
> +
> +
> +/*******************************************************************************
> + *
> + * Additional ACPI Tables (3)
> + *
> + * These tables are not consumed directly by the ACPICA subsystem, but are
> + * included here to support device drivers and the AML disassembler.
> + *
> + * The tables in this file are fully defined within the ACPI specification.
> + *
> + ******************************************************************************/
> +
> +
> +/*
> + * Values for description table header signatures for tables defined in this
> + * file. Useful because they make it more difficult to inadvertently type in
> + * the wrong signature.
> + */
> +#define ACPI_SIG_BGRT "BGRT" /* Boot Graphics Resource Table */
> +#define ACPI_SIG_DRTM "DRTM" /* Dynamic Root of Trust for Measurement table */
> +#define ACPI_SIG_FPDT "FPDT" /* Firmware Performance Data Table */
> +#define ACPI_SIG_GTDT "GTDT" /* Generic Timer Description Table */
> +#define ACPI_SIG_MPST "MPST" /* Memory Power State Table */
> +#define ACPI_SIG_PCCT "PCCT" /* Platform Communications Channel Table */
> +#define ACPI_SIG_PMTT "PMTT" /* Platform Memory Topology Table */
> +#define ACPI_SIG_RASF "RASF" /* RAS Feature table */
> +
> +#define ACPI_SIG_S3PT "S3PT" /* S3 Performance (sub)Table */
> +#define ACPI_SIG_PCCS "PCC" /* PCC Shared Memory Region */
> +
> +/* Reserved table signatures */
> +
> +#define ACPI_SIG_CSRT "CSRT" /* Core System Resources Table */
> +#define ACPI_SIG_DBG2 "DBG2" /* Debug Port table 2 */
> +#define ACPI_SIG_MATR "MATR" /* Memory Address Translation Table */
> +#define ACPI_SIG_MSDM "MSDM" /* Microsoft Data Management Table */
> +#define ACPI_SIG_WPBT "WPBT" /* Windows Platform Binary Table */
> +
> +/*
> + * All tables must be byte-packed to match the ACPI specification, since
> + * the tables are provided by the system BIOS.
> + */
> +#pragma pack(1)
> +
> +/*
> + * Note about bitfields: The UINT8 type is used for bitfields in ACPI tables.
> + * This is the only type that is even remotely portable. Anything else is not
> + * portable, so do not use any other bitfield types.
> + */
> +
> +
> +/*******************************************************************************
> + *
> + * BGRT - Boot Graphics Resource Table (ACPI 5.0)
> + * Version 1
> + *
> + ******************************************************************************/
> +
> +typedef struct acpi_table_bgrt
> +{
> + ACPI_TABLE_HEADER Header; /* Common ACPI table header */
> + UINT16 Version;
> + UINT8 Status;
> + UINT8 ImageType;
> + UINT64 ImageAddress;
> + UINT32 ImageOffsetX;
> + UINT32 ImageOffsetY;
> +
> +} ACPI_TABLE_BGRT;
> +
> +
> +/*******************************************************************************
> + *
> + * DRTM - Dynamic Root of Trust for Measurement table
> + *
> + ******************************************************************************/
> +
> +typedef struct acpi_table_drtm
> +{
> + ACPI_TABLE_HEADER Header; /* Common ACPI table header */
> + UINT64 EntryBaseAddress;
> + UINT64 EntryLength;
> + UINT32 EntryAddress32;
> + UINT64 EntryAddress64;
> + UINT64 ExitAddress;
> + UINT64 LogAreaAddress;
> + UINT32 LogAreaLength;
> + UINT64 ArchDependentAddress;
> + UINT32 Flags;
> +
> +} ACPI_TABLE_DRTM;
> +
> +/* 1) Validated Tables List */
> +
> +typedef struct acpi_drtm_vtl_list
> +{
> + UINT32 ValidatedTableListCount;
> +
> +} ACPI_DRTM_VTL_LIST;
> +
> +/* 2) Resources List */
> +
> +typedef struct acpi_drtm_resource_list
> +{
> + UINT32 ResourceListCount;
> +
> +} ACPI_DRTM_RESOURCE_LIST;
> +
> +/* 3) Platform-specific Identifiers List */
> +
> +typedef struct acpi_drtm_id_list
> +{
> + UINT32 IdListCount;
> +
> +} ACPI_DRTM_ID_LIST;
> +
> +
> +/*******************************************************************************
> + *
> + * FPDT - Firmware Performance Data Table (ACPI 5.0)
> + * Version 1
> + *
> + ******************************************************************************/
> +
> +typedef struct acpi_table_fpdt
> +{
> + ACPI_TABLE_HEADER Header; /* Common ACPI table header */
> +
> +} ACPI_TABLE_FPDT;
> +
> +
> +/* FPDT subtable header */
> +
> +typedef struct acpi_fpdt_header
> +{
> + UINT16 Type;
> + UINT8 Length;
> + UINT8 Revision;
> +
> +} ACPI_FPDT_HEADER;
> +
> +/* Values for Type field above */
> +
> +enum AcpiFpdtType
> +{
> + ACPI_FPDT_TYPE_BOOT = 0,
> + ACPI_FPDT_TYPE_S3PERF = 1,
> +};
> +
> +
> +/*
> + * FPDT subtables
> + */
> +
> +/* 0: Firmware Basic Boot Performance Record */
> +
> +typedef struct acpi_fpdt_boot
> +{
> + ACPI_FPDT_HEADER Header;
> + UINT8 Reserved[4];
> + UINT64 ResetEnd;
> + UINT64 LoadStart;
> + UINT64 StartupStart;
> + UINT64 ExitServicesEntry;
> + UINT64 ExitServicesExit;
> +
> +} ACPI_FPDT_BOOT;
> +
> +
> +/* 1: S3 Performance Table Pointer Record */
> +
> +typedef struct acpi_fpdt_s3pt_ptr
> +{
> + ACPI_FPDT_HEADER Header;
> + UINT8 Reserved[4];
> + UINT64 Address;
> +
> +} ACPI_FPDT_S3PT_PTR;
> +
> +
> +/*
> + * S3PT - S3 Performance Table. This table is pointed to by the
> + * FPDT S3 Pointer Record above.
> + */
> +typedef struct acpi_table_s3pt
> +{
> + UINT8 Signature[4]; /* "S3PT" */
> + UINT32 Length;
> +
> +} ACPI_TABLE_S3PT;
> +
> +
> +/*
> + * S3PT Subtables
> + */
> +typedef struct acpi_s3pt_header
> +{
> + UINT16 Type;
> + UINT8 Length;
> + UINT8 Revision;
> +
> +} ACPI_S3PT_HEADER;
> +
> +/* Values for Type field above */
> +
> +enum AcpiS3ptType
> +{
> + ACPI_S3PT_TYPE_RESUME = 0,
> + ACPI_S3PT_TYPE_SUSPEND = 1,
> +};
> +
> +typedef struct acpi_s3pt_resume
> +{
> + ACPI_S3PT_HEADER Header;
> + UINT32 ResumeCount;
> + UINT64 FullResume;
> + UINT64 AverageResume;
> +
> +} ACPI_S3PT_RESUME;
> +
> +typedef struct acpi_s3pt_suspend
> +{
> + ACPI_S3PT_HEADER Header;
> + UINT64 SuspendStart;
> + UINT64 SuspendEnd;
> +
> +} ACPI_S3PT_SUSPEND;
> +
> +
> +/*******************************************************************************
> + *
> + * GTDT - Generic Timer Description Table (ACPI 5.0)
> + * Version 1
> + *
> + ******************************************************************************/
> +
> +typedef struct acpi_table_gtdt
> +{
> + ACPI_TABLE_HEADER Header; /* Common ACPI table header */
> + UINT64 Address;
> + UINT32 Flags;
> + UINT32 SecurePl1Interrupt;
> + UINT32 SecurePl1Flags;
> + UINT32 NonSecurePl1Interrupt;
> + UINT32 NonSecurePl1Flags;
> + UINT32 VirtualTimerInterrupt;
> + UINT32 VirtualTimerFlags;
> + UINT32 NonSecurePl2Interrupt;
> + UINT32 NonSecurePl2Flags;
> +
> +} ACPI_TABLE_GTDT;
> +
> +/* Values for Flags field above */
> +
> +#define ACPI_GTDT_MAPPED_BLOCK_PRESENT 1
> +
> +/* Values for all "TimerFlags" fields above */
> +
> +#define ACPI_GTDT_INTERRUPT_MODE 1
> +#define ACPI_GTDT_INTERRUPT_POLARITY 2
> +
> +
> +/*******************************************************************************
> + *
> + * MPST - Memory Power State Table (ACPI 5.0)
> + * Version 1
> + *
> + ******************************************************************************/
> +
> +#define ACPI_MPST_CHANNEL_INFO \
> + UINT16 Reserved1; \
> + UINT8 ChannelId; \
> + UINT8 Reserved2; \
> + UINT16 PowerNodeCount;
> +
> +/* Main table */
> +
> +typedef struct acpi_table_mpst
> +{
> + ACPI_TABLE_HEADER Header; /* Common ACPI table header */
> + ACPI_MPST_CHANNEL_INFO /* Platform Communication Channel */
> +
> +} ACPI_TABLE_MPST;
> +
> +
> +/* Memory Platform Communication Channel Info */
> +
> +typedef struct acpi_mpst_channel
> +{
> + ACPI_MPST_CHANNEL_INFO /* Platform Communication Channel */
> +
> +} ACPI_MPST_CHANNEL;
> +
> +
> +/* Memory Power Node Structure */
> +
> +typedef struct acpi_mpst_power_node
> +{
> + UINT8 Flags;
> + UINT8 Reserved1;
> + UINT16 NodeId;
> + UINT32 Length;
> + UINT64 RangeAddress;
> + UINT64 RangeLength;
> + UINT8 NumPowerStates;
> + UINT8 NumPhysicalComponents;
> + UINT16 Reserved2;
> +
> +} ACPI_MPST_POWER_NODE;
> +
> +/* Values for Flags field above */
> +
> +#define ACPI_MPST_ENABLED 1
> +#define ACPI_MPST_POWER_MANAGED 2
> +#define ACPI_MPST_HOT_PLUG_CAPABLE 4
> +
> +
> +/* Memory Power State Structure (follows POWER_NODE above) */
> +
> +typedef struct acpi_mpst_power_state
> +{
> + UINT8 PowerState;
> + UINT8 InfoIndex;
> +
> +} ACPI_MPST_POWER_STATE;
> +
> +
> +/* Physical Component ID Structure (follows POWER_STATE above) */
> +
> +typedef struct acpi_mpst_component
> +{
> + UINT16 ComponentId;
> +
> +} ACPI_MPST_COMPONENT;
> +
> +
> +/* Memory Power State Characteristics Structure (follows all POWER_NODEs) */
> +
> +typedef struct acpi_mpst_data_hdr
> +{
> + UINT16 CharacteristicsCount;
> +
> +} ACPI_MPST_DATA_HDR;
> +
> +typedef struct acpi_mpst_power_data
> +{
> + UINT8 Revision;
> + UINT8 Flags;
> + UINT16 Reserved1;
> + UINT32 AveragePower;
> + UINT32 PowerSaving;
> + UINT64 ExitLatency;
> + UINT64 Reserved2;
> +
> +} ACPI_MPST_POWER_DATA;
> +
> +/* Values for Flags field above */
> +
> +#define ACPI_MPST_PRESERVE 1
> +#define ACPI_MPST_AUTOENTRY 2
> +#define ACPI_MPST_AUTOEXIT 4
> +
> +
> +/* Shared Memory Region (not part of an ACPI table) */
> +
> +typedef struct acpi_mpst_shared
> +{
> + UINT32 Signature;
> + UINT16 PccCommand;
> + UINT16 PccStatus;
> + UINT16 CommandRegister;
> + UINT16 StatusRegister;
> + UINT16 PowerStateId;
> + UINT16 PowerNodeId;
> + UINT64 EnergyConsumed;
> + UINT64 AveragePower;
> +
> +} ACPI_MPST_SHARED;
> +
> +
> +/*******************************************************************************
> + *
> + * PCCT - Platform Communications Channel Table (ACPI 5.0)
> + * Version 1
> + *
> + ******************************************************************************/
> +
> +typedef struct acpi_table_pcct
> +{
> + ACPI_TABLE_HEADER Header; /* Common ACPI table header */
> + UINT32 Flags;
> + UINT32 Latency;
> + UINT32 Reserved;
> +
> +} ACPI_TABLE_PCCT;
> +
> +/* Values for Flags field above */
> +
> +#define ACPI_PCCT_DOORBELL 1
> +
> +/*
> + * PCCT subtables
> + */
> +
> +/* 0: Generic Communications Subspace */
> +
> +typedef struct acpi_pcct_subspace
> +{
> + ACPI_SUBTABLE_HEADER Header;
> + UINT8 Reserved[6];
> + UINT64 BaseAddress;
> + UINT64 Length;
> + ACPI_GENERIC_ADDRESS DoorbellRegister;
> + UINT64 PreserveMask;
> + UINT64 WriteMask;
> +
> +} ACPI_PCCT_SUBSPACE;
> +
> +
> +/*
> + * PCC memory structures (not part of the ACPI table)
> + */
> +
> +/* Shared Memory Region */
> +
> +typedef struct acpi_pcct_shared_memory
> +{
> + UINT32 Signature;
> + UINT16 Command;
> + UINT16 Status;
> +
> +} ACPI_PCCT_SHARED_MEMORY;
> +
> +
> +/*******************************************************************************
> + *
> + * PMTT - Platform Memory Topology Table (ACPI 5.0)
> + * Version 1
> + *
> + ******************************************************************************/
> +
> +typedef struct acpi_table_pmtt
> +{
> + ACPI_TABLE_HEADER Header; /* Common ACPI table header */
> + UINT32 Reserved;
> +
> +} ACPI_TABLE_PMTT;
> +
> +
> +/* Common header for PMTT subtables that follow main table */
> +
> +typedef struct acpi_pmtt_header
> +{
> + UINT8 Type;
> + UINT8 Reserved1;
> + UINT16 Length;
> + UINT16 Flags;
> + UINT16 Reserved2;
> +
> +} ACPI_PMTT_HEADER;
> +
> +/* Values for Type field above */
> +
> +#define ACPI_PMTT_TYPE_SOCKET 0
> +#define ACPI_PMTT_TYPE_CONTROLLER 1
> +#define ACPI_PMTT_TYPE_DIMM 2
> +#define ACPI_PMTT_TYPE_RESERVED 3 /* 0x03-0xFF are reserved */
> +
> +/* Values for Flags field above */
> +
> +#define ACPI_PMTT_TOP_LEVEL 0x0001
> +#define ACPI_PMTT_PHYSICAL 0x0002
> +#define ACPI_PMTT_MEMORY_TYPE 0x000C
> +
> +
> +/*
> + * PMTT subtables, correspond to Type in acpi_pmtt_header
> + */
> +
> +
> +/* 0: Socket Structure */
> +
> +typedef struct acpi_pmtt_socket
> +{
> + ACPI_PMTT_HEADER Header;
> + UINT16 SocketId;
> + UINT16 Reserved;
> +
> +} ACPI_PMTT_SOCKET;
> +
> +
> +/* 1: Memory Controller subtable */
> +
> +typedef struct acpi_pmtt_controller
> +{
> + ACPI_PMTT_HEADER Header;
> + UINT32 ReadLatency;
> + UINT32 WriteLatency;
> + UINT32 ReadBandwidth;
> + UINT32 WriteBandwidth;
> + UINT16 AccessWidth;
> + UINT16 Alignment;
> + UINT16 Reserved;
> + UINT16 DomainCount;
> +
> +} ACPI_PMTT_CONTROLLER;
> +
> +/* 1a: Proximity Domain substructure */
> +
> +typedef struct acpi_pmtt_domain
> +{
> + UINT32 ProximityDomain;
> +
> +} ACPI_PMTT_DOMAIN;
> +
> +
> +/* 2: Physical Component Identifier (DIMM) */
> +
> +typedef struct acpi_pmtt_physical_component
> +{
> + ACPI_PMTT_HEADER Header;
> + UINT16 ComponentId;
> + UINT16 Reserved;
> + UINT32 MemorySize;
> + UINT32 BiosHandle;
> +
> +} ACPI_PMTT_PHYSICAL_COMPONENT;
> +
> +
> +/*******************************************************************************
> + *
> + * RASF - RAS Feature Table (ACPI 5.0)
> + * Version 1
> + *
> + ******************************************************************************/
> +
> +typedef struct acpi_table_rasf
> +{
> + ACPI_TABLE_HEADER Header; /* Common ACPI table header */
> + UINT8 ChannelId[12];
> +
> +} ACPI_TABLE_RASF;
> +
> +/* RASF Platform Communication Channel Shared Memory Region */
> +
> +typedef struct acpi_rasf_shared_memory
> +{
> + UINT32 Signature;
> + UINT16 Command;
> + UINT16 Status;
> + UINT64 RequestedAddress;
> + UINT64 RequestedLength;
> + UINT64 ActualAddress;
> + UINT64 ActualLength;
> + UINT16 Flags;
> + UINT8 Speed;
> +
> +} ACPI_RASF_SHARED_MEMORY;
> +
> +/* Masks for Flags and Speed fields above */
> +
> +#define ACPI_RASF_SCRUBBER_RUNNING 1
> +#define ACPI_RASF_SPEED (7<<1)
> +
> +/* Channel Commands */
> +
> +enum AcpiRasfCommands
> +{
> + ACPI_RASF_GET_RAS_CAPABILITIES = 1,
> + ACPI_RASF_GET_PATROL_PARAMETERS = 2,
> + ACPI_RASF_START_PATROL_SCRUBBER = 3,
> + ACPI_RASF_STOP_PATROL_SCRUBBER = 4
> +};
> +
> +/* Channel Command flags */
> +
> +#define ACPI_RASF_GENERATE_SCI (1<<15)
> +
> +/* Status values */
> +
> +enum AcpiRasfStatus
> +{
> + ACPI_RASF_SUCCESS = 0,
> + ACPI_RASF_NOT_VALID = 1,
> + ACPI_RASF_NOT_SUPPORTED = 2,
> + ACPI_RASF_BUSY = 3,
> + ACPI_RASF_FAILED = 4,
> + ACPI_RASF_ABORTED = 5,
> + ACPI_RASF_INVALID_DATA = 6
> +};
> +
> +/* Status flags */
> +
> +#define ACPI_RASF_COMMAND_COMPLETE (1)
> +#define ACPI_RASF_SCI_DOORBELL (1<<1)
> +#define ACPI_RASF_ERROR (1<<2)
> +#define ACPI_RASF_STATUS (0x1F<<3)
> +
> +
> +/* Reset to default packing */
> +
> +#pragma pack()
> +
> +#endif /* __ACTBL3_H__ */
> --
> 1.7.9.5
>
Acked-by: Keng-Yu Lin <kengyu at canonical.com>
More information about the fwts-devel
mailing list