Changeset 107063 in vbox for trunk/src/VBox/Runtime/common/misc/acpi.cpp
- Timestamp:
- Nov 20, 2024 5:22:16 PM (4 months ago)
- svn:sync-xref-src-repo-rev:
- 166017
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/common/misc/acpi.cpp
r107058 r107063 431 431 432 432 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 */ 440 DECLINLINE(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 433 480 RTDECL(uint8_t) RTAcpiChecksumGenerate(const void *pvData, size_t cbData) 434 481 { … … 926 973 return RTAcpiTblUuidAppend(pThis, &Uuid); 927 974 975 return pThis->rcErr; 976 } 977 978 979 RTDECL(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 1014 RTDECL(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); 928 1057 return pThis->rcErr; 929 1058 }
Note:
See TracChangeset
for help on using the changeset viewer.