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

📄 exoparg1.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 3 页
字号:
        switch (WalkState->Opcode)        {        case AML_BIT_NOT_OP:            /* Not (Operand, Result)  */            ReturnDesc->Integer.Value = ~Operand[0]->Integer.Value;            break;        case AML_FIND_SET_LEFT_BIT_OP:  /* FindSetLeftBit (Operand, Result) */            ReturnDesc->Integer.Value = Operand[0]->Integer.Value;            /*             * Acpi specification describes Integer type as a little             * endian unsigned value, so this boundary condition is valid.             */            for (Temp32 = 0; ReturnDesc->Integer.Value &&                             Temp32 < ACPI_INTEGER_BIT_SIZE; ++Temp32)            {                ReturnDesc->Integer.Value >>= 1;            }            ReturnDesc->Integer.Value = Temp32;            break;        case AML_FIND_SET_RIGHT_BIT_OP: /* FindSetRightBit (Operand, Result) */            ReturnDesc->Integer.Value = Operand[0]->Integer.Value;            /*             * The Acpi specification describes Integer type as a little             * endian unsigned value, so this boundary condition is valid.             */            for (Temp32 = 0; ReturnDesc->Integer.Value &&                             Temp32 < ACPI_INTEGER_BIT_SIZE; ++Temp32)            {                ReturnDesc->Integer.Value <<= 1;            }            /* Since the bit position is one-based, subtract from 33 (65) */            ReturnDesc->Integer.Value =                Temp32 == 0 ? 0 : (ACPI_INTEGER_BIT_SIZE + 1) - Temp32;            break;        case AML_FROM_BCD_OP:           /* FromBcd (BCDValue, Result)  */            /*             * The 64-bit ACPI integer can hold 16 4-bit BCD characters             * (if table is 32-bit, integer can hold 8 BCD characters)             * Convert each 4-bit BCD value             */            PowerOfTen = 1;            ReturnDesc->Integer.Value = 0;            Digit = Operand[0]->Integer.Value;            /* Convert each BCD digit (each is one nybble wide) */            for (i = 0; (i < AcpiGbl_IntegerNybbleWidth) && (Digit > 0); i++)            {                /* Get the least significant 4-bit BCD digit */                Temp32 = ((UINT32) Digit) & 0xF;                /* Check the range of the digit */                if (Temp32 > 9)                {                    ACPI_ERROR ((AE_INFO,                        "BCD digit too large (not decimal): 0x%X",                        Temp32));                    Status = AE_AML_NUMERIC_OVERFLOW;                    goto Cleanup;                }                /* Sum the digit into the result with the current power of 10 */                ReturnDesc->Integer.Value +=                    (((ACPI_INTEGER) Temp32) * PowerOfTen);                /* Shift to next BCD digit */                Digit >>= 4;                /* Next power of 10 */                PowerOfTen *= 10;            }            break;        case AML_TO_BCD_OP:             /* ToBcd (Operand, Result)  */            ReturnDesc->Integer.Value = 0;            Digit = Operand[0]->Integer.Value;            /* Each BCD digit is one nybble wide */            for (i = 0; (i < AcpiGbl_IntegerNybbleWidth) && (Digit > 0); i++)            {                (void) AcpiUtShortDivide (Digit, 10, &Digit, &Temp32);                /*                 * Insert the BCD digit that resides in the                 * remainder from above                 */                ReturnDesc->Integer.Value |=                    (((ACPI_INTEGER) Temp32) << ACPI_MUL_4 (i));            }            /* Overflow if there is any data left in Digit */            if (Digit > 0)            {                ACPI_ERROR ((AE_INFO,                    "Integer too large to convert to BCD: %8.8X%8.8X",                    ACPI_FORMAT_UINT64 (Operand[0]->Integer.Value)));                Status = AE_AML_NUMERIC_OVERFLOW;                goto Cleanup;            }            break;        case AML_COND_REF_OF_OP:        /* CondRefOf (SourceObject, Result)  */            /*             * This op is a little strange because the internal return value is             * different than the return value stored in the result descriptor             * (There are really two return values)             */            if ((ACPI_NAMESPACE_NODE *) Operand[0] == AcpiGbl_RootNode)            {                /*                 * This means that the object does not exist in the namespace,                 * return FALSE                 */                ReturnDesc->Integer.Value = 0;                goto Cleanup;            }            /* Get the object reference, store it, and remove our reference */            Status = AcpiExGetObjectReference (Operand[0],                        &ReturnDesc2, WalkState);            if (ACPI_FAILURE (Status))            {                goto Cleanup;            }            Status = AcpiExStore (ReturnDesc2, Operand[1], WalkState);            AcpiUtRemoveReference (ReturnDesc2);            /* The object exists in the namespace, return TRUE */            ReturnDesc->Integer.Value = ACPI_INTEGER_MAX;            goto Cleanup;        default:            /* No other opcodes get here */            break;        }        break;    case AML_STORE_OP:              /* Store (Source, Target) */        /*         * A store operand is typically a number, string, buffer or lvalue         * Be careful about deleting the source object,         * since the object itself may have been stored.         */        Status = AcpiExStore (Operand[0], Operand[1], WalkState);        if (ACPI_FAILURE (Status))        {            return_ACPI_STATUS (Status);        }        /* It is possible that the Store already produced a return object */        if (!WalkState->ResultObj)        {            /*             * Normally, we would remove a reference on the Operand[0]             * parameter; But since it is being used as the internal return             * object (meaning we would normally increment it), the two             * cancel out, and we simply don't do anything.             */            WalkState->ResultObj = Operand[0];            WalkState->Operands[0] = NULL;  /* Prevent deletion */        }        return_ACPI_STATUS (Status);    /*     * ACPI 2.0 Opcodes     */    case AML_COPY_OP:               /* Copy (Source, Target) */        Status = AcpiUtCopyIobjectToIobject (Operand[0], &ReturnDesc,                    WalkState);        break;    case AML_TO_DECSTRING_OP:       /* ToDecimalString (Data, Result) */        Status = AcpiExConvertToString (Operand[0], &ReturnDesc,                    ACPI_EXPLICIT_CONVERT_DECIMAL);        if (ReturnDesc == Operand[0])        {            /* No conversion performed, add ref to handle return value */            AcpiUtAddReference (ReturnDesc);        }        break;    case AML_TO_HEXSTRING_OP:       /* ToHexString (Data, Result) */        Status = AcpiExConvertToString (Operand[0], &ReturnDesc,                    ACPI_EXPLICIT_CONVERT_HEX);        if (ReturnDesc == Operand[0])        {            /* No conversion performed, add ref to handle return value */            AcpiUtAddReference (ReturnDesc);        }        break;    case AML_TO_BUFFER_OP:          /* ToBuffer (Data, Result) */        Status = AcpiExConvertToBuffer (Operand[0], &ReturnDesc);        if (ReturnDesc == Operand[0])        {            /* No conversion performed, add ref to handle return value */            AcpiUtAddReference (ReturnDesc);        }        break;    case AML_TO_INTEGER_OP:         /* ToInteger (Data, Result) */        Status = AcpiExConvertToInteger (Operand[0], &ReturnDesc,                    ACPI_ANY_BASE);        if (ReturnDesc == Operand[0])        {            /* No conversion performed, add ref to handle return value */            AcpiUtAddReference (ReturnDesc);        }        break;    case AML_SHIFT_LEFT_BIT_OP:     /* ShiftLeftBit (Source, BitNum)  */    case AML_SHIFT_RIGHT_BIT_OP:    /* ShiftRightBit (Source, BitNum) */        /* These are two obsolete opcodes */        ACPI_ERROR ((AE_INFO,            "%s is obsolete and not implemented",            AcpiPsGetOpcodeName (WalkState->Opcode)));        Status = AE_SUPPORT;        goto Cleanup;    default:                        /* Unknown opcode */        ACPI_ERROR ((AE_INFO, "Unknown AML opcode %X",            WalkState->Opcode));        Status = AE_AML_BAD_OPCODE;        goto Cleanup;    }    if (ACPI_SUCCESS (Status))    {        /* Store the return value computed above into the target object */        Status = AcpiExStore (ReturnDesc, Operand[1], WalkState);    }Cleanup:    /* Delete return object on error */    if (ACPI_FAILURE (Status))    {        AcpiUtRemoveReference (ReturnDesc);    }    /* Save return object on success */    else if (!WalkState->ResultObj)    {        WalkState->ResultObj = ReturnDesc;    }    return_ACPI_STATUS (Status);}/******************************************************************************* * * FUNCTION:    AcpiExOpcode_1A_0T_1R * * PARAMETERS:  WalkState           - Current state (contains AML opcode) * * RETURN:      Status * * DESCRIPTION: Execute opcode with one argument, no target, and a return value * ******************************************************************************/ACPI_STATUSAcpiExOpcode_1A_0T_1R (    ACPI_WALK_STATE         *WalkState){    ACPI_OPERAND_OBJECT     **Operand = &WalkState->Operands[0];    ACPI_OPERAND_OBJECT     *TempDesc;    ACPI_OPERAND_OBJECT     *ReturnDesc = NULL;    ACPI_STATUS             Status = AE_OK;    UINT32                  Type;    ACPI_INTEGER            Value;    ACPI_FUNCTION_TRACE_STR (ExOpcode_1A_0T_1R,        AcpiPsGetOpcodeName (WalkState->Opcode));    /* Examine the AML opcode */    switch (WalkState->Opcode)    {    case AML_LNOT_OP:               /* LNot (Operand) */        ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);        if (!ReturnDesc)        {            Status = AE_NO_MEMORY;            goto Cleanup;        }        /*         * Set result to ONES (TRUE) if Value == 0.  Note:         * ReturnDesc->Integer.Value is initially == 0 (FALSE) from above.         */        if (!Operand[0]->Integer.Value)        {            ReturnDesc->Integer.Value = ACPI_INTEGER_MAX;        }        break;    case AML_DECREMENT_OP:          /* Decrement (Operand)  */    case AML_INCREMENT_OP:          /* Increment (Operand)  */        /*         * Create a new integer.  Can't just get the base integer and         * increment it because it may be an Arg or Field.         */        ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);        if (!ReturnDesc)        {            Status = AE_NO_MEMORY;            goto Cleanup;        }        /*         * Since we are expecting a Reference operand, it can be either a         * NS Node or an internal object.         */        TempDesc = Operand[0];        if (ACPI_GET_DESCRIPTOR_TYPE (TempDesc) == ACPI_DESC_TYPE_OPERAND)        {            /* Internal reference object - prevent deletion */            AcpiUtAddReference (TempDesc);        }        /*         * Convert the Reference operand to an Integer (This removes a         * reference on the Operand[0] object)         *         * NOTE:  We use LNOT_OP here in order to force resolution of the         * reference operand to an actual integer.         */        Status = AcpiExResolveOperands (AML_LNOT_OP, &TempDesc, WalkState);        if (ACPI_FAILURE (Status))        {            ACPI_EXCEPTION ((AE_INFO, Status,                "While resolving operands for [%s]",                AcpiPsGetOpcodeName (WalkState->Opcode)));            goto Cleanup;        }

⌨️ 快捷键说明

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