VirtualBox

Ignore:
Timestamp:
Nov 20, 2024 5:22:16 PM (4 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
166017
Message:

Runtime/RTAcpi*: Some updates to the ACPI code generation, bugref:10733

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/misc/acpi.cpp

    r107058 r107063  
    431431
    432432
     433/**
     434 * Encodes a PkgLength item for the given number.
     435 *
     436 * @returns IPRT status code.
     437 * @param pThis                 The ACPI table instance.
     438 * @param u64Length             The length to encode.
     439 */
     440DECLINLINE(int) rtAcpiTblEncodePkgLength(PRTACPITBLINT pThis, uint64_t u64Length)
     441{
     442    AssertReturn(u64Length < RT_BIT_32(28), VERR_BUFFER_OVERFLOW);
     443
     444    if (u64Length <= 63)
     445    {
     446        /* PkgLength only consists of the package lead byte. */
     447        rtAcpiTblAppendByte(pThis, (u64Length & 0x3f));
     448    }
     449    else if (u64Length < RT_BIT_32(12))
     450    {
     451        uint8_t abData[2];
     452        abData[0] = (1 << 6) | (u64Length & 0xf);
     453        abData[1] = (u64Length >> 4) & 0xff;
     454        rtAcpiTblAppendData(pThis, &abData[0], sizeof(abData));
     455    }
     456    else if (u64Length < RT_BIT_32(20))
     457    {
     458        uint8_t abData[3];
     459        abData[0] = (1 << 6) | (u64Length & 0xf);
     460        abData[1] = (u64Length >> 4)  & 0xff;
     461        abData[2] = (u64Length >> 12) & 0xff;
     462        rtAcpiTblAppendData(pThis, &abData[0], sizeof(abData));
     463    }
     464    else if (u64Length < RT_BIT_32(28))
     465    {
     466        uint8_t abData[4];
     467        abData[0] = (1 << 6) | (u64Length & 0xf);
     468        abData[1] = (u64Length >> 4)  & 0xff;
     469        abData[2] = (u64Length >> 12) & 0xff;
     470        abData[3] = (u64Length >> 20) & 0xff;
     471        rtAcpiTblAppendData(pThis, &abData[0], sizeof(abData));
     472    }
     473    else
     474        AssertReleaseFailed();
     475
     476    return VINF_SUCCESS;
     477}
     478
     479
    433480RTDECL(uint8_t) RTAcpiChecksumGenerate(const void *pvData, size_t cbData)
    434481{
     
    926973        return RTAcpiTblUuidAppend(pThis, &Uuid);
    927974
     975    return pThis->rcErr;
     976}
     977
     978
     979RTDECL(int) RTAcpiTblOpRegionAppend(RTACPITBL hAcpiTbl, const char *pszName, RTACPIOPREGIONSPACE enmSpace,
     980                                    uint64_t offRegion, uint64_t cbRegion)
     981{
     982    PRTACPITBLINT pThis = hAcpiTbl;
     983    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
     984
     985    uint8_t abOp[2] = { ACPI_AML_BYTE_CODE_PREFIX_EXT_OP, ACPI_AML_BYTE_CODE_EXT_OP_OP_REGION };
     986    rtAcpiTblAppendData(pThis, &abOp[0], sizeof(abOp));
     987    rtAcpiTblAppendNameString(pThis, pszName);
     988
     989    uint8_t bRegionSpace = 0xff;
     990    switch (enmSpace)
     991    {
     992        case kAcpiOperationRegionSpace_SystemMemory:        bRegionSpace = 0x00; break;
     993        case kAcpiOperationRegionSpace_SystemIo:            bRegionSpace = 0x01; break;
     994        case kAcpiOperationRegionSpace_PciConfig:           bRegionSpace = 0x02; break;
     995        case kAcpiOperationRegionSpace_EmbeddedControl:     bRegionSpace = 0x03; break;
     996        case kAcpiOperationRegionSpace_SmBus:               bRegionSpace = 0x04; break;
     997        case kAcpiOperationRegionSpace_SystemCmos:          bRegionSpace = 0x05; break;
     998        case kAcpiOperationRegionSpace_PciBarTarget:        bRegionSpace = 0x06; break;
     999        case kAcpiOperationRegionSpace_Ipmi:                bRegionSpace = 0x07; break;
     1000        case kAcpiOperationRegionSpace_Gpio:                bRegionSpace = 0x08; break;
     1001        case kAcpiOperationRegionSpace_GenericSerialBus:    bRegionSpace = 0x09; break;
     1002        case kAcpiOperationRegionSpace_Pcc:                 bRegionSpace = 0x0a; break;
     1003        default:
     1004            pThis->rcErr = VERR_INVALID_PARAMETER;
     1005            AssertFailedReturn(pThis->rcErr);
     1006    }
     1007    rtAcpiTblAppendByte(pThis, bRegionSpace);
     1008    RTAcpiTblIntegerAppend(pThis, offRegion);
     1009    RTAcpiTblIntegerAppend(pThis, cbRegion);
     1010    return pThis->rcErr;
     1011}
     1012
     1013
     1014RTDECL(int) RTAcpiTblFieldAppend(RTACPITBL hAcpiTbl, const char *pszNameRef, RTACPIFIELDACC enmAcc,
     1015                                 bool fLock, RTACPIFIELDUPDATE enmUpdate, PCRTACPIFIELDENTRY paFields,
     1016                                 uint32_t cFields)
     1017{
     1018    PRTACPITBLINT pThis = hAcpiTbl;
     1019    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
     1020
     1021    rtAcpiTblPkgStartExt(pThis, ACPI_AML_BYTE_CODE_EXT_OP_FIELD);
     1022    rtAcpiTblAppendNameString(pThis, pszNameRef);
     1023
     1024    uint8_t fFlags = 0;
     1025    switch (enmAcc)
     1026    {
     1027        case kAcpiFieldAcc_Any:    fFlags = 0; break;
     1028        case kAcpiFieldAcc_Byte:   fFlags = 1; break;
     1029        case kAcpiFieldAcc_Word:   fFlags = 2; break;
     1030        case kAcpiFieldAcc_DWord:  fFlags = 3; break;
     1031        case kAcpiFieldAcc_QWord:  fFlags = 4; break;
     1032        case kAcpiFieldAcc_Buffer: fFlags = 5; break;
     1033        default:
     1034            pThis->rcErr = VERR_INVALID_PARAMETER;
     1035            AssertFailedReturn(pThis->rcErr);
     1036    }
     1037    if (fLock)
     1038        fFlags |= RT_BIT(4);
     1039    switch (enmUpdate)
     1040    {
     1041        case kAcpiFieldUpdate_Preserve:      fFlags |= 0 << 5; break;
     1042        case kAcpiFieldUpdate_WriteAsOnes:   fFlags |= 1 << 5; break;
     1043        case kAcpiFieldUpdate_WriteAsZeroes: fFlags |= 2 << 5; break;
     1044        default:
     1045            pThis->rcErr = VERR_INVALID_PARAMETER;
     1046            AssertFailedReturn(pThis->rcErr);
     1047    }
     1048    rtAcpiTblAppendByte(pThis, fFlags);
     1049
     1050    for (uint32_t i = 0; i < cFields; i++)
     1051    {
     1052        rtAcpiTblAppendNameString(pThis, paFields[i].pszName);
     1053        rtAcpiTblEncodePkgLength(pThis, paFields[i].cBits);
     1054    }
     1055
     1056    rtAcpiTblPkgFinish(pThis, ACPI_AML_BYTE_CODE_EXT_OP_FIELD);
    9281057    return pThis->rcErr;
    9291058}
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette