Changeset 108095 in vbox
- Timestamp:
- Feb 6, 2025 10:49:06 AM (2 weeks ago)
- svn:sync-xref-src-repo-rev:
- 167393
- Location:
- trunk
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/iprt/acpi.h
r108089 r108095 480 480 kAcpiStmt_DerefOf, 481 481 /** Store(SuperName, TermArg => Integer) statement. */ 482 kAcpiStmt_Notify 482 kAcpiStmt_Notify, 483 /** SizeOf(SuperName) statement. */ 484 kAcpiStmt_SizeOf, 485 /** Increment(TermArg) statement. */ 486 kAcpiStmt_Increment, 487 /** Decrement(TermArg) statement. */ 488 kAcpiStmt_Decrement, 489 /** CondRefOf(TermArg, Target) statement. */ 490 kAcpiStmt_CondRefOf, 483 491 } RTACPISTMT; 484 492 … … 528 536 */ 529 537 RTDECL(int) RTAcpiTblElseFinalize(RTACPITBL hAcpiTbl); 538 539 540 /** 541 * Starts a new While statement operation. 542 * 543 * @returns IPRT status code. 544 * @param hAcpiTbl The ACPI table handle. 545 */ 546 RTDECL(int) RTAcpiTblWhileStart(RTACPITBL hAcpiTbl); 547 548 549 /** 550 * Finalizes the current While statement operation. 551 * 552 * @returns IPRT status code. 553 * @param hAcpiTbl The ACPI table handle. 554 */ 555 RTDECL(int) RTAcpiTblWhileFinalize(RTACPITBL hAcpiTbl); 530 556 531 557 -
trunk/include/iprt/mangling.h
r108087 r108095 434 434 # define RTAcpiTblUuidAppend RT_MANGLER(RTAcpiTblUuidAppend) 435 435 # define RTAcpiTblUuidAppendFromStr RT_MANGLER(RTAcpiTblUuidAppendFromStr) 436 # define RTAcpiTblWhileFinalize RT_MANGLER(RTAcpiTblWhileFinalize) 437 # define RTAcpiTblWhileStart RT_MANGLER(RTAcpiTblWhileStart) 436 438 # define RTArchValToString RT_MANGLER(RTArchValToString) 437 439 # define RTAssertAreQuiet RT_MANGLER(RTAssertAreQuiet) -
trunk/src/VBox/Runtime/common/acpi/acpi-ast.cpp
r108088 r108095 332 332 break; 333 333 } 334 case kAcpiAstNodeOp_While: 335 { 336 AssertBreakStmt( pAstNd->cArgs == 1 337 && pAstNd->aArgs[0].enmType == kAcpiAstArgType_AstNode, 338 rc = VERR_INTERNAL_ERROR); 339 rc = RTAcpiTblWhileStart(hAcpiTbl); 340 if (RT_SUCCESS(rc)) 341 { 342 /* Predicate. */ 343 rc = rtAcpiAstDumpToTbl(pAstNd->aArgs[0].u.pAstNd, hAcpiTbl); 344 if (RT_SUCCESS(rc)) 345 { 346 /* Walk all the other AST nodes. */ 347 rc = rtAcpiAstDumpAstList(&pAstNd->LstScopeNodes, hAcpiTbl); 348 if (RT_SUCCESS(rc)) 349 rc = RTAcpiTblWhileFinalize(hAcpiTbl); 350 } 351 } 352 break; 353 } 334 354 case kAcpiAstNodeOp_LAnd: 335 355 case kAcpiAstNodeOp_LEqual: … … 591 611 } 592 612 case kAcpiAstNodeOp_DerefOf: 613 case kAcpiAstNodeOp_SizeOf: 614 case kAcpiAstNodeOp_Increment: 615 case kAcpiAstNodeOp_Decrement: 593 616 { 594 617 AssertBreakStmt( pAstNd->cArgs == 1 595 618 && pAstNd->aArgs[0].enmType == kAcpiAstArgType_AstNode, 596 619 rc = VERR_INTERNAL_ERROR); 597 rc = RTAcpiTblStmtSimpleAppend(hAcpiTbl, kAcpiStmt_DerefOf); 620 621 RTACPISTMT enmStmt; 622 switch (pAstNd->enmOp) 623 { 624 case kAcpiAstNodeOp_DerefOf: enmStmt = kAcpiStmt_DerefOf; break; 625 case kAcpiAstNodeOp_SizeOf: enmStmt = kAcpiStmt_SizeOf; break; 626 case kAcpiAstNodeOp_Increment: enmStmt = kAcpiStmt_Increment; break; 627 case kAcpiAstNodeOp_Decrement: enmStmt = kAcpiStmt_Decrement; break; 628 default: 629 AssertReleaseFailed(); /* Impossible */ 630 return VERR_INTERNAL_ERROR; 631 } 632 633 634 rc = RTAcpiTblStmtSimpleAppend(hAcpiTbl, enmStmt); 598 635 if (RT_SUCCESS(rc)) 599 636 rc = rtAcpiAstDumpToTbl(pAstNd->aArgs[0].u.pAstNd, hAcpiTbl); … … 618 655 } 619 656 case kAcpiAstNodeOp_Not: 657 case kAcpiAstNodeOp_CondRefOf: 620 658 { 621 659 AssertBreakStmt( pAstNd->cArgs == 2 … … 623 661 && pAstNd->aArgs[1].enmType == kAcpiAstArgType_AstNode, 624 662 rc = VERR_INTERNAL_ERROR); 625 rc = RTAcpiTblStmtSimpleAppend(hAcpiTbl, kAcpiStmt_Store); 663 rc = RTAcpiTblStmtSimpleAppend(hAcpiTbl, 664 pAstNd->enmOp == kAcpiAstNodeOp_Not 665 ? kAcpiStmt_Not 666 : kAcpiStmt_CondRefOf); 626 667 if (RT_SUCCESS(rc)) 627 668 rc = rtAcpiAstDumpToTbl(pAstNd->aArgs[0].u.pAstNd, hAcpiTbl); -
trunk/src/VBox/Runtime/common/acpi/acpi-compiler.cpp
r108088 r108095 290 290 { RT_STR_TUPLE("NOT"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Not }, 291 291 { RT_STR_TUPLE("NOTIFY"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Notify }, 292 { RT_STR_TUPLE("SIZEOF"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_SizeOf }, 293 { RT_STR_TUPLE("WHILE"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_While }, 294 { RT_STR_TUPLE("INCREMENT"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Increment }, 295 { RT_STR_TUPLE("DECREMENT"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Decrement }, 296 { RT_STR_TUPLE("CONDREFOF"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_CondRefOf }, 297 { RT_STR_TUPLE("INDEXFIELD"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_IndexField }, 292 298 293 299 /* Keywords not in the operation parser table. */ … … 1069 1075 1070 1076 1071 static DECLCALLBACK(int) rtAcpiTblAslParseField (PRTACPIASLCU pThis, PCRTACPIASLKEYWORD pKeyword, PRTACPIASTNODE pAstNd)1077 static DECLCALLBACK(int) rtAcpiTblAslParseFieldOrIndexField(PRTACPIASLCU pThis, PCRTACPIASLKEYWORD pKeyword, PRTACPIASTNODE pAstNd) 1072 1078 { 1073 1079 RT_NOREF(pKeyword); 1074 1080 1075 1081 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_OPEN_BRACKET, '('); 1082 1083 uint8_t idxArg = 0; 1084 1085 if (pKeyword->cArgsReq == 5) 1086 { 1087 /* This is an IndexField. */ 1088 1089 /* Namestring is required. */ 1090 RTACPIASL_PARSE_NAME_STRING(pszNameString); 1091 pAstNd->aArgs[idxArg].enmType = kAcpiAstArgType_NameString; 1092 pAstNd->aArgs[idxArg].u.pszNameString = pszNameString; 1093 idxArg++; 1094 1095 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_COMMA, ','); 1096 } 1097 else /* Field */ 1098 Assert(pKeyword->cArgsReq == 4); 1076 1099 1077 1100 /* Namestring is required. */ 1078 1101 RTACPIASL_PARSE_NAME_STRING(pszNameString); 1079 pAstNd->aArgs[0].enmType = kAcpiAstArgType_NameString; 1080 pAstNd->aArgs[0].u.pszNameString = pszNameString; 1102 pAstNd->aArgs[idxArg].enmType = kAcpiAstArgType_NameString; 1103 pAstNd->aArgs[idxArg].u.pszNameString = pszNameString; 1104 idxArg++; 1081 1105 1082 1106 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_COMMA, ','); … … 1084 1108 /* Must have an access type defined. */ 1085 1109 RTACPIASL_PARSE_KEYWORD_LIST(enmAccessType, g_aenmAccessTypeKeywords); 1086 pAstNd->aArgs[ 1].enmType = kAcpiAstArgType_FieldAcc;1110 pAstNd->aArgs[idxArg].enmType = kAcpiAstArgType_FieldAcc; 1087 1111 switch (enmAccessType) 1088 1112 { 1089 case RTACPIASLTERMINAL_KEYWORD_ANY_ACC: pAstNd->aArgs[ 1].u.enmFieldAcc = kAcpiFieldAcc_Any; break;1090 case RTACPIASLTERMINAL_KEYWORD_BYTE_ACC: pAstNd->aArgs[ 1].u.enmFieldAcc = kAcpiFieldAcc_Byte; break;1091 case RTACPIASLTERMINAL_KEYWORD_WORD_ACC: pAstNd->aArgs[ 1].u.enmFieldAcc = kAcpiFieldAcc_Word; break;1092 case RTACPIASLTERMINAL_KEYWORD_DWORD_ACC: pAstNd->aArgs[ 1].u.enmFieldAcc = kAcpiFieldAcc_DWord; break;1093 case RTACPIASLTERMINAL_KEYWORD_QWORD_ACC: pAstNd->aArgs[ 1].u.enmFieldAcc = kAcpiFieldAcc_QWord; break;1094 case RTACPIASLTERMINAL_KEYWORD_BUFFER_ACC: pAstNd->aArgs[ 1].u.enmFieldAcc = kAcpiFieldAcc_Buffer; break;1113 case RTACPIASLTERMINAL_KEYWORD_ANY_ACC: pAstNd->aArgs[idxArg].u.enmFieldAcc = kAcpiFieldAcc_Any; break; 1114 case RTACPIASLTERMINAL_KEYWORD_BYTE_ACC: pAstNd->aArgs[idxArg].u.enmFieldAcc = kAcpiFieldAcc_Byte; break; 1115 case RTACPIASLTERMINAL_KEYWORD_WORD_ACC: pAstNd->aArgs[idxArg].u.enmFieldAcc = kAcpiFieldAcc_Word; break; 1116 case RTACPIASLTERMINAL_KEYWORD_DWORD_ACC: pAstNd->aArgs[idxArg].u.enmFieldAcc = kAcpiFieldAcc_DWord; break; 1117 case RTACPIASLTERMINAL_KEYWORD_QWORD_ACC: pAstNd->aArgs[idxArg].u.enmFieldAcc = kAcpiFieldAcc_QWord; break; 1118 case RTACPIASLTERMINAL_KEYWORD_BUFFER_ACC: pAstNd->aArgs[idxArg].u.enmFieldAcc = kAcpiFieldAcc_Buffer; break; 1095 1119 default: 1096 1120 AssertFailedReturn(VERR_INTERNAL_ERROR); 1097 1121 } 1122 idxArg++; 1098 1123 1099 1124 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_COMMA, ','); … … 1101 1126 /* Must have a lock rule defined. */ 1102 1127 RTACPIASL_PARSE_KEYWORD_LIST(enmLockRule, g_aenmLockRuleKeywords); 1103 pAstNd->aArgs[ 2].enmType = kAcpiAstArgType_Bool;1128 pAstNd->aArgs[idxArg].enmType = kAcpiAstArgType_Bool; 1104 1129 switch (enmLockRule) 1105 1130 { 1106 case RTACPIASLTERMINAL_KEYWORD_LOCK: pAstNd->aArgs[ 2].u.f = true; break;1107 case RTACPIASLTERMINAL_KEYWORD_NO_LOCK: pAstNd->aArgs[ 2].u.f = false; break;1131 case RTACPIASLTERMINAL_KEYWORD_LOCK: pAstNd->aArgs[idxArg].u.f = true; break; 1132 case RTACPIASLTERMINAL_KEYWORD_NO_LOCK: pAstNd->aArgs[idxArg].u.f = false; break; 1108 1133 default: 1109 1134 AssertFailedReturn(VERR_INTERNAL_ERROR); 1110 1135 } 1136 idxArg++; 1111 1137 1112 1138 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_COMMA, ','); … … 1114 1140 /* Must have an update rule defined. */ 1115 1141 RTACPIASL_PARSE_KEYWORD_LIST(enmUpdateRule, g_aenmUpdateRuleKeywords); 1116 pAstNd->aArgs[ 3].enmType = kAcpiAstArgType_FieldUpdate;1142 pAstNd->aArgs[idxArg].enmType = kAcpiAstArgType_FieldUpdate; 1117 1143 switch (enmUpdateRule) 1118 1144 { 1119 case RTACPIASLTERMINAL_KEYWORD_PRESERVE: pAstNd->aArgs[ 3].u.enmFieldUpdate = kAcpiFieldUpdate_Preserve; break;1120 case RTACPIASLTERMINAL_KEYWORD_WRITE_AS_ONES: pAstNd->aArgs[ 3].u.enmFieldUpdate = kAcpiFieldUpdate_WriteAsOnes; break;1121 case RTACPIASLTERMINAL_KEYWORD_WRITE_AS_ZEROES: pAstNd->aArgs[ 3].u.enmFieldUpdate = kAcpiFieldUpdate_WriteAsZeroes; break;1145 case RTACPIASLTERMINAL_KEYWORD_PRESERVE: pAstNd->aArgs[idxArg].u.enmFieldUpdate = kAcpiFieldUpdate_Preserve; break; 1146 case RTACPIASLTERMINAL_KEYWORD_WRITE_AS_ONES: pAstNd->aArgs[idxArg].u.enmFieldUpdate = kAcpiFieldUpdate_WriteAsOnes; break; 1147 case RTACPIASLTERMINAL_KEYWORD_WRITE_AS_ZEROES: pAstNd->aArgs[idxArg].u.enmFieldUpdate = kAcpiFieldUpdate_WriteAsZeroes; break; 1122 1148 default: 1123 1149 AssertFailedReturn(VERR_INTERNAL_ERROR); 1124 1150 } 1151 idxArg++; 1125 1152 1126 1153 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_CLOSE_BRACKET, ')'); … … 1449 1476 /* kAcpiAstNodeOp_LLess */ RTACPI_ASL_KEYWORD_DEFINE_2REQ_0OPT("LLess", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode, kAcpiAstArgType_AstNode), 1450 1477 /* kAcpiAstNodeOp_LLessEqual */ RTACPI_ASL_KEYWORD_DEFINE_2REQ_0OPT("LLessEqual", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode, kAcpiAstArgType_AstNode), 1451 /* kAcpiAstNodeOp_LNot */ RTACPI_ASL_KEYWORD_DEFINE_ 2REQ_0OPT("LNot", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode,kAcpiAstArgType_AstNode),1478 /* kAcpiAstNodeOp_LNot */ RTACPI_ASL_KEYWORD_DEFINE_1REQ_0OPT("LNot", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode), 1452 1479 /* kAcpiAstNodeOp_LNotEqual */ RTACPI_ASL_KEYWORD_DEFINE_2REQ_0OPT("LNotEqual", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode, kAcpiAstArgType_AstNode), 1453 1480 /* kAcpiAstNodeOp_Zero */ RTACPI_ASL_KEYWORD_DEFINE_0REQ_0OPT("Zero", RTACPI_AST_NODE_F_DEFAULT), … … 1457 1484 /* kAcpiAstNodeOp_Unicode */ RTACPI_ASL_KEYWORD_DEFINE_1REQ_0OPT("Unicode", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode), /* Actually only String allowed here */ 1458 1485 /* kAcpiAstNodeOp_OperationRegion */ RTACPI_ASL_KEYWORD_DEFINE_4REQ_0OPT("OperationRegion", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_NameString, kAcpiAstArgType_RegionSpace, kAcpiAstArgType_AstNode, kAcpiAstArgType_AstNode), 1459 /* kAcpiAstNodeOp_Field */ RTACPI_ASL_KEYWORD_DEFINE_HANDLER( "Field", rtAcpiTblAslParseField ,4, 0, RTACPI_AST_NODE_F_DEFAULT),1486 /* kAcpiAstNodeOp_Field */ RTACPI_ASL_KEYWORD_DEFINE_HANDLER( "Field", rtAcpiTblAslParseFieldOrIndexField, 4, 0, RTACPI_AST_NODE_F_DEFAULT), 1460 1487 /* kAcpiAstNodeOp_Name */ RTACPI_ASL_KEYWORD_DEFINE_2REQ_0OPT("Name", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_NameString, kAcpiAstArgType_AstNode), 1461 1488 /* kAcpiAstNodeOp_ResourceTemplate */ RTACPI_ASL_KEYWORD_DEFINE_HANDLER( "ResourceTemplate", rtAcpiTblAslParseResourceTemplate, 0, 0, RTACPI_AST_NODE_F_DEFAULT), … … 1492 1519 /* kAcpiAstNodeOp_Not */ RTACPI_ASL_KEYWORD_DEFINE_1REQ_1OPT("Not", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode, kAcpiAstArgType_AstNode), 1493 1520 /* kAcpiAstNodeOp_Notify */ RTACPI_ASL_KEYWORD_DEFINE_2REQ_0OPT("Notify", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode, kAcpiAstArgType_AstNode), 1494 1521 /* kAcpiAstNodeOp_SizeOf */ RTACPI_ASL_KEYWORD_DEFINE_1REQ_0OPT("SizeOf", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode), 1522 /* kAcpiAstNodeOp_While */ RTACPI_ASL_KEYWORD_DEFINE_1REQ_0OPT("While", RTACPI_AST_NODE_F_NEW_SCOPE, kAcpiAstArgType_AstNode), 1523 /* kAcpiAstNodeOp_Increment */ RTACPI_ASL_KEYWORD_DEFINE_1REQ_0OPT("Increment", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode), 1524 /* kAcpiAstNodeOp_Decrement */ RTACPI_ASL_KEYWORD_DEFINE_1REQ_0OPT("Decrement", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode), 1525 /* kAcpiAstNodeOp_CondRefOf */ RTACPI_ASL_KEYWORD_DEFINE_1REQ_1OPT("CondRefOf", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode, kAcpiAstArgType_AstNode), 1526 /* kAcpiAstNodeOp_IndexField */ RTACPI_ASL_KEYWORD_DEFINE_HANDLER( "IndexField", rtAcpiTblAslParseFieldOrIndexField, 5, 0, RTACPI_AST_NODE_F_DEFAULT), 1495 1527 }; 1496 1528 -
trunk/src/VBox/Runtime/common/acpi/acpi.cpp
r108091 r108095 1077 1077 1078 1078 uint8_t bOp; 1079 bool fExtOp = false; 1079 1080 switch (enmStmt) 1080 1081 { … … 1095 1096 case kAcpiStmt_DerefOf: bOp = ACPI_AML_BYTE_CODE_OP_DEREF_OF; break; 1096 1097 case kAcpiStmt_Notify: bOp = ACPI_AML_BYTE_CODE_OP_NOTIFY; break; 1098 case kAcpiStmt_SizeOf: bOp = ACPI_AML_BYTE_CODE_OP_SIZE_OF; break; 1099 case kAcpiStmt_Increment: bOp = ACPI_AML_BYTE_CODE_OP_INCREMENT; break; 1100 case kAcpiStmt_Decrement: bOp = ACPI_AML_BYTE_CODE_OP_INCREMENT; break; 1101 case kAcpiStmt_CondRefOf: bOp = ACPI_AML_BYTE_CODE_EXT_OP_COND_REF_OF; fExtOp = true; break; 1097 1102 default: 1098 1103 AssertFailedReturn(VERR_INVALID_PARAMETER); 1099 1104 } 1105 if (fExtOp) 1106 rtAcpiTblAppendByte(pThis, ACPI_AML_BYTE_CODE_PREFIX_EXT_OP); 1100 1107 rtAcpiTblAppendByte(pThis, bOp); 1101 1108 return pThis->rcErr; … … 1138 1145 1139 1146 return rtAcpiTblPkgFinish(pThis, ACPI_AML_BYTE_CODE_OP_ELSE); 1147 } 1148 1149 1150 RTDECL(int) RTAcpiTblWhileStart(RTACPITBL hAcpiTbl) 1151 { 1152 PRTACPITBLINT pThis = hAcpiTbl; 1153 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 1154 1155 rtAcpiTblPkgStart(pThis, ACPI_AML_BYTE_CODE_OP_WHILE); 1156 return pThis->rcErr; 1157 } 1158 1159 1160 RTDECL(int) RTAcpiTblWhileFinalize(RTACPITBL hAcpiTbl) 1161 { 1162 PRTACPITBLINT pThis = hAcpiTbl; 1163 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 1164 1165 return rtAcpiTblPkgFinish(pThis, ACPI_AML_BYTE_CODE_OP_WHILE); 1140 1166 } 1141 1167 -
trunk/src/VBox/Runtime/include/internal/acpi.h
r108088 r108095 166 166 kAcpiAstNodeOp_Not, 167 167 kAcpiAstNodeOp_Notify, 168 kAcpiAstNodeOp_SizeOf, 169 kAcpiAstNodeOp_While, 170 kAcpiAstNodeOp_Increment, 171 kAcpiAstNodeOp_Decrement, 172 kAcpiAstNodeOp_CondRefOf, 173 kAcpiAstNodeOp_IndexField, 168 174 kAcpiAstNodeOp_32Bit_Hack = 0x7fffffff 169 175 } RTACPIASTNODEOP;
Note:
See TracChangeset
for help on using the changeset viewer.