⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aslopcodes.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 2 页
字号:
    Next = Op->Asl.Child;    /* First child is the access type */    Next->Asl.AmlOpcode = AML_RAW_DATA_BYTE;    Next->Asl.ParseOpcode = PARSEOP_RAW_DATA;    /* Second child is the optional access attribute */    Next = Next->Asl.Next;    if (Next->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)    {        Next->Asl.Value.Integer = 0;    }    Next->Asl.AmlOpcode = AML_RAW_DATA_BYTE;    Next->Asl.ParseOpcode = PARSEOP_RAW_DATA;}/******************************************************************************* * * FUNCTION:    OpcDoUnicode * * PARAMETERS:  Op        - Parse node * * RETURN:      None * * DESCRIPTION: Implement the UNICODE ASL "macro".  Convert the input string *              to a unicode buffer.  There is no Unicode AML opcode. * * Note:  The Unicode string is 16 bits per character, no leading signature, *        with a 16-bit terminating NULL. * ******************************************************************************/static voidOpcDoUnicode (    ACPI_PARSE_OBJECT       *Op){    ACPI_PARSE_OBJECT       *InitializerOp;    UINT32                  Length;    UINT32                  Count;    UINT32                  i;    UINT8                   *AsciiString;    UINT16                  *UnicodeString;    ACPI_PARSE_OBJECT       *BufferLengthOp;    /* Change op into a buffer object */    Op->Asl.CompileFlags &= ~NODE_COMPILE_TIME_CONST;    Op->Asl.ParseOpcode = PARSEOP_BUFFER;    UtSetParseOpName (Op);    /* Buffer Length is first, followed by the string */    BufferLengthOp = Op->Asl.Child;    InitializerOp = BufferLengthOp->Asl.Next;    AsciiString = (UINT8 *) InitializerOp->Asl.Value.String;    /* Create a new buffer for the Unicode string */    Count = strlen (InitializerOp->Asl.Value.String) + 1;    Length = Count * sizeof (UINT16);    UnicodeString = UtLocalCalloc (Length);    /* Convert to Unicode string (including null terminator) */    for (i = 0; i < Count; i++)    {        UnicodeString[i] = (UINT16) AsciiString[i];    }    /*     * Just set the buffer size node to be the buffer length, regardless     * of whether it was previously an integer or a default_arg placeholder     */    BufferLengthOp->Asl.ParseOpcode   = PARSEOP_INTEGER;    BufferLengthOp->Asl.AmlOpcode     = AML_DWORD_OP;    BufferLengthOp->Asl.Value.Integer = Length;    UtSetParseOpName (BufferLengthOp);    (void) OpcSetOptimalIntegerSize (BufferLengthOp);    /* The Unicode string is a raw data buffer */    InitializerOp->Asl.Value.Buffer   = (UINT8 *) UnicodeString;    InitializerOp->Asl.AmlOpcode      = AML_RAW_DATA_BUFFER;    InitializerOp->Asl.AmlLength      = Length;    InitializerOp->Asl.ParseOpcode    = PARSEOP_RAW_DATA;    InitializerOp->Asl.Child          = NULL;    UtSetParseOpName (InitializerOp);}/******************************************************************************* * * FUNCTION:    OpcDoEisaId * * PARAMETERS:  Op        - Parse node * * RETURN:      None * * DESCRIPTION: Convert a string EISA ID to numeric representation.  See the *              Pnp BIOS Specification for details.  Here is an excerpt: * *              A seven character ASCII representation of the product *              identifier compressed into a 32-bit identifier.  The seven *              character ID consists of a three character manufacturer code, *              a three character hexadecimal product identifier, and a one *              character hexadecimal revision number.  The manufacturer code *              is a 3 uppercase character code that is compressed into 3 5-bit *              values as follows: *                  1) Find hex ASCII value for each letter *                  2) Subtract 40h from each ASCII value *                  3) Retain 5 least signficant bits for each letter by *                     discarding upper 3 bits because they are always 0. *                  4) Compressed code = concatenate 0 and the 3 5-bit values * *              The format of the compressed product identifier is as follows: *              Byte 0: Bit 7       - Reserved (0) *                      Bits 6-2:   - 1st character of compressed mfg code *                      Bits 1-0    - Upper 2 bits of 2nd character of mfg code *              Byte 1: Bits 7-5    - Lower 3 bits of 2nd character of mfg code *                      Bits 4-0    - 3rd character of mfg code *              Byte 2: Bits 7-4    - 1st hex digit of product number *                      Bits 3-0    - 2nd hex digit of product number *              Byte 3: Bits 7-4    - 3st hex digit of product number *                      Bits 3-0    - Hex digit of the revision number * ******************************************************************************/static voidOpcDoEisaId (    ACPI_PARSE_OBJECT       *Op){    UINT32                  EisaId = 0;    UINT32                  BigEndianId;    char                    *InString;    ACPI_STATUS             Status = AE_OK;    ACPI_NATIVE_UINT        i;    InString = (char *) Op->Asl.Value.String;    /*     * The EISAID string must be exactly 7 characters and of the form     * "UUUXXXX" -- 3 uppercase letters and 4 hex digits (e.g., "PNP0001")     */    if (ACPI_STRLEN (InString) != 7)    {        Status = AE_BAD_PARAMETER;    }    else    {        /* Check all 7 characters for correct format */        for (i = 0; i < 7; i++)        {            /* First 3 characters must be uppercase letters */            if (i < 3)            {                if (!isupper (InString[i]))                {                    Status = AE_BAD_PARAMETER;                }            }            /* Last 4 characters must be hex digits */            else if (!isxdigit (InString[i]))            {                Status = AE_BAD_PARAMETER;            }        }    }    if (ACPI_FAILURE (Status))    {        AslError (ASL_ERROR, ASL_MSG_INVALID_EISAID, Op, Op->Asl.Value.String);    }    else    {        /* Create ID big-endian first (bits are contiguous) */        BigEndianId =            (UINT32) (InString[0] - 0x40) << 26 |            (UINT32) (InString[1] - 0x40) << 21 |            (UINT32) (InString[2] - 0x40) << 16 |            (UtHexCharToValue (InString[3])) << 12 |            (UtHexCharToValue (InString[4])) << 8  |            (UtHexCharToValue (InString[5])) << 4  |             UtHexCharToValue (InString[6]);        /* Swap to little-endian to get final ID (see function header) */        EisaId = AcpiUtDwordByteSwap (BigEndianId);    }    /*     * Morph the Op into an integer, regardless of whether there     * was an error in the EISAID string     */    Op->Asl.Value.Integer = EisaId;    Op->Asl.CompileFlags &= ~NODE_COMPILE_TIME_CONST;    Op->Asl.ParseOpcode = PARSEOP_INTEGER;    (void) OpcSetOptimalIntegerSize (Op);    /* Op is now an integer */    UtSetParseOpName (Op);}/******************************************************************************* * * FUNCTION:    OpcDoUiId * * PARAMETERS:  Op        - Parse node * * RETURN:      None * * DESCRIPTION: Convert UUID string to 16-byte buffer * ******************************************************************************/static voidOpcDoUuId (    ACPI_PARSE_OBJECT       *Op){    char                    *InString;    char                    *Buffer;    ACPI_STATUS             Status = AE_OK;    ACPI_NATIVE_UINT        i;    ACPI_PARSE_OBJECT       *NewOp;    InString = (char *) Op->Asl.Value.String;    if (ACPI_STRLEN (InString) != 36)    {        Status = AE_BAD_PARAMETER;    }    else    {        /* Check all 36 characters for correct format */        for (i = 0; i < 36; i++)        {            if ((i == 8) || (i == 13) || (i == 18) || (i == 23))            {                if (InString[i] != '-')                {                    Status = AE_BAD_PARAMETER;                }            }            else            {                if (!isxdigit (InString[i]))                {                    Status = AE_BAD_PARAMETER;                }            }        }    }    Buffer = UtLocalCalloc (16);    if (ACPI_FAILURE (Status))    {        AslError (ASL_ERROR, ASL_MSG_INVALID_UUID, Op, Op->Asl.Value.String);    }    else for (i = 0; i < 16; i++)    {        Buffer[i]  = (char) (UtHexCharToValue (InString[OpcMapToUUID[i]]) << 4);        Buffer[i] |= (char)  UtHexCharToValue (InString[OpcMapToUUID[i] + 1]);    }    /* Change Op to a Buffer */    Op->Asl.ParseOpcode = PARSEOP_BUFFER;    Op->Common.AmlOpcode = AML_BUFFER_OP;    /* Disable further optimization */    Op->Asl.CompileFlags &= ~NODE_COMPILE_TIME_CONST;    UtSetParseOpName (Op);    /* Child node is the buffer length */    NewOp = TrAllocateNode (PARSEOP_INTEGER);    NewOp->Asl.AmlOpcode     = AML_BYTE_OP;    NewOp->Asl.Value.Integer = 16;    NewOp->Asl.Parent        = Op;    Op->Asl.Child = NewOp;    Op = NewOp;    /* Peer to the child is the raw buffer data */    NewOp = TrAllocateNode (PARSEOP_RAW_DATA);    NewOp->Asl.AmlOpcode     = AML_RAW_DATA_BUFFER;    NewOp->Asl.AmlLength     = 16;    NewOp->Asl.Value.String  = (char *) Buffer;    NewOp->Asl.Parent        = Op->Asl.Parent;    Op->Asl.Next = NewOp;}/******************************************************************************* * * FUNCTION:    OpcGenerateAmlOpcode * * PARAMETERS:  Op        - Parse node * * RETURN:      None * * DESCRIPTION: Generate the AML opcode associated with the node and its *              parse (lex/flex) keyword opcode.  Essentially implements *              a mapping between the parse opcodes and the actual AML opcodes. * ******************************************************************************/voidOpcGenerateAmlOpcode (    ACPI_PARSE_OBJECT       *Op){    UINT16                  Index;    Index = (UINT16) (Op->Asl.ParseOpcode - ASL_PARSE_OPCODE_BASE);    Op->Asl.AmlOpcode     = AslKeywordMapping[Index].AmlOpcode;    Op->Asl.AcpiBtype     = AslKeywordMapping[Index].AcpiBtype;    Op->Asl.CompileFlags |= AslKeywordMapping[Index].Flags;    if (!Op->Asl.Value.Integer)    {        Op->Asl.Value.Integer = AslKeywordMapping[Index].Value;    }    /* Special handling for some opcodes */    switch (Op->Asl.ParseOpcode)    {    case PARSEOP_INTEGER:        /*         * Set the opcode based on the size of the integer         */        (void) OpcSetOptimalIntegerSize (Op);        break;    case PARSEOP_OFFSET:        Op->Asl.AmlOpcodeLength = 1;        break;    case PARSEOP_ACCESSAS:        OpcDoAccessAs (Op);        break;    case PARSEOP_EISAID:        OpcDoEisaId (Op);        break;    case PARSEOP_TOUUID:        OpcDoUuId (Op);        break;    case PARSEOP_UNICODE:        OpcDoUnicode (Op);        break;    case PARSEOP_INCLUDE:        Op->Asl.Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;        Gbl_HasIncludeFiles = TRUE;        break;    case PARSEOP_EXTERNAL:        Op->Asl.Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;        Op->Asl.Child->Asl.Next->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;        break;    default:        /* Nothing to do for other opcodes */        break;    }    return;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -