Changeset 108059 in vbox
- Timestamp:
- Feb 4, 2025 1:35:41 PM (2 weeks ago)
- svn:sync-xref-src-repo-rev:
- 167339
- Location:
- trunk
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/iprt/acpi.h
r108029 r108059 725 725 726 726 727 /** 728 * Object type. 729 */ 730 typedef enum RTACPIOBJTYPE 731 { 732 /** Invalid object type. */ 733 kAcpiObjType_Invalid = 0, 734 /** Unknown object - UnknownObj */ 735 kAcpiObjType_Unknown, 736 /** Integer object - IntObj */ 737 kAcpiObjType_Int, 738 /** String object - StrObj */ 739 kAcpiObjType_Str, 740 /** Buffer object - BuffObj */ 741 kAcpiObjType_Buff, 742 /** Package object - PkgObj */ 743 kAcpiObjType_Pkg, 744 /** Field unit object - FieldUnitObj */ 745 kAcpiObjType_FieldUnit, 746 /** Device object - DeviceObj */ 747 kAcpiObjType_Device, 748 /** Event object - EventObj */ 749 kAcpiObjType_Event, 750 /** Method object - MethodObj */ 751 kAcpiObjType_Method, 752 /** Mutex object - MutexObj */ 753 kAcpiObjType_MutexObj, 754 /** OpRegion object - OpRegionObj */ 755 kAcpiObjType_OpRegion, 756 /** Power resource object - PowerResObj */ 757 kAcpiObjType_PowerRes, 758 /** Thermal zone object - ThermalZoneObj */ 759 kAcpiObjType_ThermalZone, 760 /** Buffer field object - BuffFieldObj */ 761 kAcpiObjType_BuffField 762 } RTACPIOBJTYPE; 763 764 765 /** 766 * Appends a new External declaration to the given ACPI table. 767 * 768 * @returns IPRT status code. 769 * @param hAcpiTbl The ACPI table handle. 770 * @param pszName The name stirng of the external object. 771 * @param enmObjType The object type. 772 * @param cArgs Number of arguments for the object (mostly method), valid is [0..7]. 773 */ 774 RTDECL(int) RTAcpiTblExternalAppend(RTACPITBL hAcpiTbl, const char *pszName, RTACPIOBJTYPE enmObjType, uint8_t cArgs); 775 727 776 728 777 /** @name ACPI resource builder related API. -
trunk/include/iprt/formats/acpi-aml.h
r107952 r108059 296 296 297 297 298 /** @name Object type values found in AML 299 * @{ */ 300 /** Object type is uninitialized. */ 301 #define ACPI_AML_OBJECT_TYPE_UNINIT 0 302 /** Object is an integer. */ 303 #define ACPI_AML_OBJECT_TYPE_INTEGER 1 304 /** Object is a string. */ 305 #define ACPI_AML_OBJECT_TYPE_STRING 2 306 /** Object is a buffer. */ 307 #define ACPI_AML_OBJECT_TYPE_BUFFER 3 308 /** Object is a package. */ 309 #define ACPI_AML_OBJECT_TYPE_PACKAGE 4 310 /** Object is a field unit. */ 311 #define ACPI_AML_OBJECT_TYPE_FIELD_UNIT 5 312 /** Object is a device. */ 313 #define ACPI_AML_OBJECT_TYPE_DEVICE 6 314 /** Object is an event. */ 315 #define ACPI_AML_OBJECT_TYPE_EVENT 7 316 /** Object is a method. */ 317 #define ACPI_AML_OBJECT_TYPE_METHOD 8 318 /** Object is a mutex. */ 319 #define ACPI_AML_OBJECT_TYPE_MUTEX 9 320 /** Object is an operation region. */ 321 #define ACPI_AML_OBJECT_TYPE_OPERATION_REGION 10 322 /** Object is a power resource. */ 323 #define ACPI_AML_OBJECT_TYPE_POWER_RESOURCE 11 324 /** Object is a processor. */ 325 #define ACPI_AML_OBJECT_TYPE_PROCESSOR 12 326 /** Object is a thermal zone. */ 327 #define ACPI_AML_OBJECT_TYPE_THERMAL_ZONE 13 328 /** Object is a buffer field. */ 329 #define ACPI_AML_OBJECT_TYPE_BUFFER_FIELD 14 330 /** Object is a DDB handle. */ 331 #define ACPI_AML_OBJECT_TYPE_DDB_HANDLE 15 332 /** Object is the debug object. */ 333 #define ACPI_AML_OBJECT_TYPE_DEBUG 16 334 /** @} */ 335 336 298 337 /** @name Some helpers for classifying AML bytecode. 299 338 * @{ */ -
trunk/include/iprt/mangling.h
r108029 r108059 404 404 # define RTAcpiTblElseFinalize RT_MANGLER(RTAcpiTblElseFinalize) 405 405 # define RTAcpiTblElseStart RT_MANGLER(RTAcpiTblElseStart) 406 # define RTAcpiTblExternalAppend RT_MANGLER(RTAcpiTblExternalAppend) 406 407 # define RTAcpiTblFieldAppend RT_MANGLER(RTAcpiTblFieldAppend) 407 408 # define RTAcpiTblFinalize RT_MANGLER(RTAcpiTblFinalize) -
trunk/src/VBox/Runtime/common/acpi/acpi-ast.cpp
r108029 r108059 69 69 *********************************************************************************************************************************/ 70 70 71 DECLHIDDEN(PRTACPIASTNODE) rtAcpiAstNodeAlloc( uint8_t bOpc, uint32_t fFlags, uint8_t cArgs)71 DECLHIDDEN(PRTACPIASTNODE) rtAcpiAstNodeAlloc(RTACPIASTNODEOP enmOp, uint32_t fFlags, uint8_t cArgs) 72 72 { 73 73 PRTACPIASTNODE pAstNd = (PRTACPIASTNODE)RTMemAllocZ(RT_UOFFSETOF_DYN(RTACPIASTNODE, aArgs[cArgs])); 74 74 if (pAstNd) 75 75 { 76 pAstNd-> bOpc = bOpc;76 pAstNd->enmOp = enmOp; 77 77 pAstNd->fFlags = fFlags; 78 78 pAstNd->cArgs = cArgs; … … 105 105 106 106 107 static int rtAcpiAstDumpExtOpc(PCRTACPIASTNODE pAstNd, RTACPITBL hAcpiTbl)107 DECLHIDDEN(int) rtAcpiAstDumpToTbl(PCRTACPIASTNODE pAstNd, RTACPITBL hAcpiTbl) 108 108 { 109 109 int rc; 110 110 111 switch (pAstNd-> bOpc)111 switch (pAstNd->enmOp) 112 112 { 113 case ACPI_AML_BYTE_CODE_EXT_OP_PROCESSOR: 113 case kAcpiAstNodeOp_Scope: 114 { 115 AssertBreakStmt( pAstNd->cArgs == 1 116 && pAstNd->aArgs[0].enmType == kAcpiAstArgType_NameString, 117 rc = VERR_INTERNAL_ERROR); 118 rc = RTAcpiTblScopeStart(hAcpiTbl, pAstNd->aArgs[0].u.pszNameString); 119 if (RT_SUCCESS(rc)) 120 { 121 /* Walk all the other AST nodes. */ 122 rc = rtAcpiAstDumpAstList(&pAstNd->LstScopeNodes, hAcpiTbl); 123 if (RT_SUCCESS(rc)) 124 rc = RTAcpiTblScopeFinalize(hAcpiTbl); 125 } 126 break; 127 } 128 case kAcpiAstNodeOp_Processor: 114 129 { 115 130 AssertBreakStmt( pAstNd->cArgs == 4 … … 133 148 break; 134 149 } 135 default: 136 AssertFailedStmt(rc = VERR_NOT_IMPLEMENTED); 137 } 138 139 return rc; 140 } 141 142 143 static int rtAcpiAstDumpOpc(PCRTACPIASTNODE pAstNd, RTACPITBL hAcpiTbl) 144 { 145 int rc; 146 147 switch (pAstNd->bOpc) 148 { 149 case ACPI_AML_BYTE_CODE_OP_SCOPE: 150 case kAcpiAstNodeOp_External: 150 151 { 151 AssertBreakStmt( pAstNd->cArgs == 1 152 && pAstNd->aArgs[0].enmType == kAcpiAstArgType_NameString, 152 AssertBreakStmt( pAstNd->cArgs == 3 153 && pAstNd->aArgs[0].enmType == kAcpiAstArgType_NameString 154 && pAstNd->aArgs[1].enmType == kAcpiAstArgType_ObjType 155 && pAstNd->aArgs[2].enmType == kAcpiAstArgType_U8, 153 156 rc = VERR_INTERNAL_ERROR); 154 rc = RTAcpiTblScopeStart(hAcpiTbl, pAstNd->aArgs[0].u.pszNameString); 157 rc = RTAcpiTblExternalAppend(hAcpiTbl, pAstNd->aArgs[0].u.pszNameString, pAstNd->aArgs[1].u.enmObjType, pAstNd->aArgs[2].u.u8); 158 } 159 case kAcpiAstNodeOp_Method: 160 { 161 AssertBreakStmt( pAstNd->cArgs == 4 162 && pAstNd->aArgs[0].enmType == kAcpiAstArgType_NameString 163 && pAstNd->aArgs[1].enmType == kAcpiAstArgType_U8 164 && pAstNd->aArgs[2].enmType == kAcpiAstArgType_Bool 165 && pAstNd->aArgs[3].enmType == kAcpiAstArgType_U8, 166 rc = VERR_INTERNAL_ERROR); 167 rc = RTAcpiTblMethodStart(hAcpiTbl, pAstNd->aArgs[0].u.pszNameString, 168 pAstNd->aArgs[1].u.u8, 169 pAstNd->aArgs[1].u.f ? RTACPI_METHOD_F_SERIALIZED : RTACPI_METHOD_F_NOT_SERIALIZED, 170 pAstNd->aArgs[1].u.u8); 155 171 if (RT_SUCCESS(rc)) 156 172 { … … 158 174 rc = rtAcpiAstDumpAstList(&pAstNd->LstScopeNodes, hAcpiTbl); 159 175 if (RT_SUCCESS(rc)) 160 rc = RTAcpiTbl ScopeFinalize(hAcpiTbl);176 rc = RTAcpiTblMethodFinalize(hAcpiTbl); 161 177 } 162 break;163 178 } 164 179 default: … … 168 183 return rc; 169 184 } 170 171 172 DECLHIDDEN(int) rtAcpiAstDumpToTbl(PCRTACPIASTNODE pAstNd, RTACPITBL hAcpiTbl)173 {174 if (pAstNd->fFlags & RTACPI_AST_NODE_F_EXT_OPC)175 return rtAcpiAstDumpExtOpc(pAstNd, hAcpiTbl);176 else177 return rtAcpiAstDumpOpc(pAstNd, hAcpiTbl);178 } -
trunk/src/VBox/Runtime/common/acpi/acpi-compiler.cpp
r108050 r108059 72 72 typedef enum RTACPIASLTERMINAL 73 73 { 74 RTACPIASLTERMINAL_INVALID = 0,75 76 /** Keyword terminals, must come first as they are used for indexing into a table later on. */74 RTACPIASLTERMINAL_INVALID = 2047, 75 76 /** Miscelleanous keywords not appearing in the parser table. */ 77 77 RTACPIASLTERMINAL_KEYWORD_DEFINITION_BLOCK, 78 RTACPIASLTERMINAL_KEYWORD_SCOPE, 79 RTACPIASLTERMINAL_KEYWORD_PROCESSOR, 78 RTACPIASLTERMINAL_KEYWORD_UNKNOWN_OBJ, 79 RTACPIASLTERMINAL_KEYWORD_INT_OBJ, 80 RTACPIASLTERMINAL_KEYWORD_STR_OBJ, 81 RTACPIASLTERMINAL_KEYWORD_BUFF_OBJ, 82 RTACPIASLTERMINAL_KEYWORD_PKG_OBJ, 83 RTACPIASLTERMINAL_KEYWORD_FIELD_UNIT_OBJ, 84 RTACPIASLTERMINAL_KEYWORD_DEVICE_OBJ, 85 RTACPIASLTERMINAL_KEYWORD_EVENT_OBJ, 86 RTACPIASLTERMINAL_KEYWORD_METHOD_OBJ, 87 RTACPIASLTERMINAL_KEYWORD_MUTEX_OBJ, 88 RTACPIASLTERMINAL_KEYWORD_OP_REGION_OBJ, 89 RTACPIASLTERMINAL_KEYWORD_POWER_RES_OBJ, 90 RTACPIASLTERMINAL_KEYWORD_THERMAL_ZONE_OBJ, 91 RTACPIASLTERMINAL_KEYWORD_BUFF_FIELD_OBJ, 92 RTACPIASLTERMINAL_KEYWORD_SERIALIZED, 93 RTACPIASLTERMINAL_KEYWORD_NOT_SERIALIZED, 94 RTACPIASLTERMINAL_KEYWORD_SYSTEM_IO, 95 RTACPIASLTERMINAL_KEYWORD_SYSTEM_MEMORY, 96 RTACPIASLTERMINAL_KEYWORD_PCI_CONFIG, 97 RTACPIASLTERMINAL_KEYWORD_EMBEDDED_CONTROL, 98 RTACPIASLTERMINAL_KEYWORD_SMBUS, 99 RTACPIASLTERMINAL_KEYWORD_SYSTEM_CMOS, 100 RTACPIASLTERMINAL_KEYWORD_PCI_BAR_TARGET, 101 RTACPIASLTERMINAL_KEYWORD_IPMI, 102 RTACPIASLTERMINAL_KEYWORD_GENERAL_PURPOSE_IO, 103 RTACPIASLTERMINAL_KEYWORD_GENERIC_SERIAL_BUS, 104 RTACPIASLTERMINAL_KEYWORD_PCC, 105 RTACPIASLTERMINAL_KEYWORD_PRM, 106 RTACPIASLTERMINAL_KEYWORD_FFIXED_HW, 80 107 81 108 RTACPIASLTERMINAL_PUNCTUATOR_COMMA, … … 86 113 87 114 } RTACPIASLTERMINAL; 115 /** Pointer to a terminal enum. */ 116 typedef RTACPIASLTERMINAL *PRTACPIASLTERMINAL; 117 /** Pointer to a const terminal enum. */ 118 typedef const RTACPIASLTERMINAL *PCRTACPIASLTERMINAL; 88 119 89 120 … … 110 141 111 142 143 /** Pointer to a const ASL keyword encoding entry. */ 144 typedef const struct RTACPIASLKEYWORD *PCRTACPIASLKEYWORD; 145 146 /** 147 * ACPI ASL -> AST parse callback. 148 * 149 * @returns IPRT status code. 150 * @param pThis ACPI ASL compiler state. 151 * @param pKeyword The keyword entry being processed. 152 * @param pAstNd The AST node to initialize. 153 */ 154 typedef DECLCALLBACKTYPE(int, FNRTACPITBLASLPARSE,(PRTACPIASLCU pThis, PCRTACPIASLKEYWORD pKeyword, PRTACPIASTNODE pAstNd)); 155 /** Pointer to a ACPI AML -> ASL decode callback. */ 156 typedef FNRTACPITBLASLPARSE *PFNRTACPITBLASLPARSE; 157 158 112 159 /** 113 160 * ASL keyword encoding entry. … … 117 164 /** Name of the opcode. */ 118 165 const char *pszOpc; 119 /** The opcode AML value. */ 120 uint8_t bOpc; 166 /** The parsing callback to call, optional. 167 * If not NULL this will have priority over the default parsing. */ 168 PFNRTACPITBLASLPARSE pfnParse; 121 169 /** Number of arguments required. */ 122 170 uint8_t cArgsReq; … … 132 180 /** Pointer to a ASL keyword encoding entry. */ 133 181 typedef RTACPIASLKEYWORD *PRTACPIASLKEYWORD; 134 /** Pointer to a const ASL keyword encoding entry. */135 typedef const RTACPIASLKEYWORD *PCRTACPIASLKEYWORD;136 182 137 183 … … 168 214 { 169 215 /* Keywords */ 216 { RT_STR_TUPLE("SCOPE"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Scope }, 217 { RT_STR_TUPLE("PROCESSOR"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Processor }, 218 { RT_STR_TUPLE("EXTERNAL"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_External }, 219 { RT_STR_TUPLE("METHOD"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Method }, 220 { RT_STR_TUPLE("DEVICE"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Device }, 221 { RT_STR_TUPLE("IF"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_If }, 222 { RT_STR_TUPLE("ELSE"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Else }, 223 { RT_STR_TUPLE("LAND"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_LAnd }, 224 { RT_STR_TUPLE("LEQUAL"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_LEqual }, 225 { RT_STR_TUPLE("LGREATER"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_LGreater }, 226 { RT_STR_TUPLE("LGREATEREQUAL"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_LGreaterEqual }, 227 { RT_STR_TUPLE("LLESS"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_LLess }, 228 { RT_STR_TUPLE("LLESSEQUAL"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_LLessEqual }, 229 { RT_STR_TUPLE("LNOT"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_LNot }, 230 { RT_STR_TUPLE("LNOTEQUAL"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_LNotEqual }, 231 { RT_STR_TUPLE("ZERO"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Zero }, 232 { RT_STR_TUPLE("ONE"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_One }, 233 { RT_STR_TUPLE("ONES"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Ones }, 234 { RT_STR_TUPLE("RETURN"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Return }, 235 { RT_STR_TUPLE("UNICODE"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Unicode }, 236 { RT_STR_TUPLE("OPERATIONREGION"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_OperationRegion }, 237 170 238 { RT_STR_TUPLE("DEFINITIONBLOCK"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_DEFINITION_BLOCK }, 171 { RT_STR_TUPLE("PROCESSOR"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_PROCESSOR }, 172 { RT_STR_TUPLE("SCOPE"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_SCOPE }, 239 { RT_STR_TUPLE("UNKNOWNOBJ"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_UNKNOWN_OBJ }, 240 { RT_STR_TUPLE("INTOBJ"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_INT_OBJ }, 241 { RT_STR_TUPLE("STROBJ"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_STR_OBJ }, 242 { RT_STR_TUPLE("BUFFOBJ"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_BUFF_OBJ }, 243 { RT_STR_TUPLE("PKGOBJ"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_PKG_OBJ }, 244 { RT_STR_TUPLE("FIELDUNITOBJ"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_FIELD_UNIT_OBJ }, 245 { RT_STR_TUPLE("DEVICEOBJ"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_DEVICE_OBJ }, 246 { RT_STR_TUPLE("EVENTOBJ"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_EVENT_OBJ }, 247 { RT_STR_TUPLE("METHODOBJ"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_METHOD_OBJ }, 248 { RT_STR_TUPLE("MUTEXOBJ"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_MUTEX_OBJ }, 249 { RT_STR_TUPLE("OPREGIONOBJ"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_OP_REGION_OBJ }, 250 { RT_STR_TUPLE("POWERRESOBJ"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_POWER_RES_OBJ }, 251 { RT_STR_TUPLE("THERMALZONEOBJ"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_THERMAL_ZONE_OBJ }, 252 { RT_STR_TUPLE("BUFFFIELDOBJ"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_BUFF_FIELD_OBJ }, 253 254 { RT_STR_TUPLE("SERIALIZED"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_SERIALIZED }, 255 { RT_STR_TUPLE("NOTSERIALIZED"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_NOT_SERIALIZED }, 256 257 { RT_STR_TUPLE("SYSTEMIO"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_SYSTEM_IO }, 258 { RT_STR_TUPLE("SYSTEMMEMORY"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_SYSTEM_MEMORY }, 259 { RT_STR_TUPLE("PCI_CONFIG"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_PCI_CONFIG }, 260 { RT_STR_TUPLE("EMBEDDEDCONTROL"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_EMBEDDED_CONTROL }, 261 { RT_STR_TUPLE("SMBUS"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_SMBUS }, 262 { RT_STR_TUPLE("SYSTEMCMOS"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_SYSTEM_CMOS }, 263 { RT_STR_TUPLE("PCIBARTARGET"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_PCI_BAR_TARGET }, 264 { RT_STR_TUPLE("IPMI"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_IPMI }, 265 { RT_STR_TUPLE("GENERALPURPOSEIO"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_GENERAL_PURPOSE_IO }, 266 { RT_STR_TUPLE("GENERICSERIALBUS"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_GENERIC_SERIAL_BUS }, 267 { RT_STR_TUPLE("PCC"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_PCC }, 268 { RT_STR_TUPLE("PRM"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_PRM }, 269 { RT_STR_TUPLE("FFIXEDHW"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_FFIXED_HW }, 173 270 174 271 /* Punctuators */ … … 379 476 380 477 381 static int rtAcpiAslLexerConsumeIfKeyword (PCRTACPIASLCU pThis, RTACPIASLTERMINAL enmTerm, bool *pfConsumed)478 static int rtAcpiAslLexerConsumeIfKeywordInList(PCRTACPIASLCU pThis, PCRTACPIASLTERMINAL paenmTerms, PRTACPIASLTERMINAL penmTerm) 382 479 { 383 480 PCRTSCRIPTLEXTOKEN pTok; … … 386 483 return RTErrInfoSetF(pThis->pErrInfo, rc, "Lexer: Failed to query keyword token with %Rrc", rc); 387 484 485 if (pTok->enmType == RTSCRIPTLEXTOKTYPE_KEYWORD) 486 { 487 unsigned i = 0; 488 do 489 { 490 if (pTok->Type.Keyword.pKeyword->u64Val == (uint64_t)paenmTerms[i]) 491 { 492 RTScriptLexConsumeToken(pThis->hLexSource); 493 *penmTerm = paenmTerms[i]; 494 return VINF_SUCCESS; 495 } 496 497 i++; 498 } while (paenmTerms[i] != RTACPIASLTERMINAL_INVALID); 499 } 500 501 *penmTerm = RTACPIASLTERMINAL_INVALID; 502 return VINF_SUCCESS; 503 } 504 505 506 static int rtAcpiAslLexerConsumeIfKeyword(PCRTACPIASLCU pThis, RTACPIASLTERMINAL enmTerm, bool *pfConsumed) 507 { 508 PCRTSCRIPTLEXTOKEN pTok; 509 int rc = RTScriptLexQueryToken(pThis->hLexSource, &pTok); 510 if (RT_FAILURE(rc)) 511 return RTErrInfoSetF(pThis->pErrInfo, rc, "Lexer: Failed to query keyword token with %Rrc", rc); 512 388 513 if ( pTok->enmType == RTSCRIPTLEXTOKTYPE_KEYWORD 389 514 && pTok->Type.Keyword.pKeyword->u64Val == (uint64_t)enmTerm) … … 497 622 #define RTACPIASL_PARSE_KEYWORD(a_enmKeyword, a_pszKeyword) \ 498 623 do { \ 499 bool fConsumed = false; \500 int rc2 = rtAcpiAslLexerConsumeIfKeyword(pThis, a_enmKeyword, &fConsumed ); \624 bool fConsumed2 = false; \ 625 int rc2 = rtAcpiAslLexerConsumeIfKeyword(pThis, a_enmKeyword, &fConsumed2); \ 501 626 if (RT_FAILURE(rc2)) \ 502 627 return rc2; \ 503 if (!fConsumed ) \628 if (!fConsumed2) \ 504 629 return RTErrInfoSetF(pThis->pErrInfo, VERR_INVALID_PARAMETER, "Parser: Expected keyword '%s'", a_pszKeyword); \ 505 630 } while(0) … … 507 632 #define RTACPIASL_PARSE_PUNCTUATOR(a_enmPunctuator, a_chPunctuator) \ 508 633 do { \ 509 bool fConsumed = false; \510 int rc2 = rtAcpiAslLexerConsumeIfPunctuator(pThis, a_enmPunctuator, &fConsumed ); \634 bool fConsumed2 = false; \ 635 int rc2 = rtAcpiAslLexerConsumeIfPunctuator(pThis, a_enmPunctuator, &fConsumed2); \ 511 636 if (RT_FAILURE(rc2)) \ 512 637 return rc2; \ 513 if (!fConsumed ) \638 if (!fConsumed2) \ 514 639 return RTErrInfoSetF(pThis->pErrInfo, VERR_INVALID_PARAMETER, "Parser: Expected punctuator '%c'", a_chPunctuator); \ 515 640 } while(0) … … 538 663 uint64_t a_u64 = 0; \ 539 664 do { \ 540 bool fConsumed = false; \541 int rc2 = rtAcpiAslLexerConsumeIfNatural(pThis, &a_u64, &fConsumed ); \665 bool fConsumed2 = false; \ 666 int rc2 = rtAcpiAslLexerConsumeIfNatural(pThis, &a_u64, &fConsumed2); \ 542 667 if (RT_FAILURE(rc2)) \ 543 668 return rc2; \ 544 if (!fConsumed ) \669 if (!fConsumed2) \ 545 670 return RTErrInfoSetF(pThis->pErrInfo, VERR_INVALID_PARAMETER, "Parser: Expected a natural number"); \ 546 671 } while(0) … … 551 676 552 677 static int rtAcpiTblAslParseInner(PRTACPIASLCU pThis, PRTLISTANCHOR pLstStmts); 678 static int rtAcpiTblAslParseTermArg(PRTACPIASLCU pThis, PRTACPIASTNODE *ppAstNd); 679 680 681 static const RTACPIASLTERMINAL g_aenmObjTypeKeywords[] = { 682 RTACPIASLTERMINAL_KEYWORD_UNKNOWN_OBJ, 683 RTACPIASLTERMINAL_KEYWORD_INT_OBJ, 684 RTACPIASLTERMINAL_KEYWORD_STR_OBJ, 685 RTACPIASLTERMINAL_KEYWORD_BUFF_OBJ, 686 RTACPIASLTERMINAL_KEYWORD_PKG_OBJ, 687 RTACPIASLTERMINAL_KEYWORD_FIELD_UNIT_OBJ, 688 RTACPIASLTERMINAL_KEYWORD_DEVICE_OBJ, 689 RTACPIASLTERMINAL_KEYWORD_EVENT_OBJ, 690 RTACPIASLTERMINAL_KEYWORD_METHOD_OBJ, 691 RTACPIASLTERMINAL_KEYWORD_MUTEX_OBJ, 692 RTACPIASLTERMINAL_KEYWORD_OP_REGION_OBJ, 693 RTACPIASLTERMINAL_KEYWORD_POWER_RES_OBJ, 694 RTACPIASLTERMINAL_KEYWORD_THERMAL_ZONE_OBJ, 695 RTACPIASLTERMINAL_KEYWORD_BUFF_FIELD_OBJ, 696 RTACPIASLTERMINAL_INVALID 697 }; 698 699 700 static const RTACPIASLTERMINAL g_aenmSerializeRuleKeywords[] = { 701 RTACPIASLTERMINAL_KEYWORD_SERIALIZED, 702 RTACPIASLTERMINAL_KEYWORD_NOT_SERIALIZED, 703 RTACPIASLTERMINAL_INVALID 704 }; 705 706 707 static const RTACPIASLTERMINAL g_aenmRegionSpaceKeywords[] = { 708 RTACPIASLTERMINAL_KEYWORD_SYSTEM_IO, 709 RTACPIASLTERMINAL_KEYWORD_SYSTEM_MEMORY, 710 RTACPIASLTERMINAL_KEYWORD_PCI_CONFIG, 711 RTACPIASLTERMINAL_KEYWORD_EMBEDDED_CONTROL, 712 RTACPIASLTERMINAL_KEYWORD_SMBUS, 713 RTACPIASLTERMINAL_KEYWORD_SYSTEM_CMOS, 714 RTACPIASLTERMINAL_KEYWORD_PCI_BAR_TARGET, 715 RTACPIASLTERMINAL_KEYWORD_IPMI, 716 RTACPIASLTERMINAL_KEYWORD_GENERAL_PURPOSE_IO, 717 RTACPIASLTERMINAL_KEYWORD_GENERIC_SERIAL_BUS, 718 RTACPIASLTERMINAL_KEYWORD_PCC, 719 RTACPIASLTERMINAL_KEYWORD_PRM, 720 RTACPIASLTERMINAL_KEYWORD_FFIXED_HW, 721 RTACPIASLTERMINAL_INVALID 722 }; 723 724 725 static DECLCALLBACK(int) rtAcpiTblAslParseExternal(PRTACPIASLCU pThis, PCRTACPIASLKEYWORD pKeyword, PRTACPIASTNODE pAstNd) 726 { 727 RT_NOREF(pKeyword, pAstNd); 728 729 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_OPEN_BRACKET, '('); 730 731 /* Namestring is required. */ 732 RTACPIASL_PARSE_NAME_STRING(pszNameString); 733 pAstNd->aArgs[0].enmType = kAcpiAstArgType_NameString; 734 pAstNd->aArgs[0].u.pszNameString = pszNameString; 735 736 /* Defaults for optional arguments. */ 737 pAstNd->aArgs[1].enmType = kAcpiAstArgType_ObjType; 738 pAstNd->aArgs[1].u.enmObjType = kAcpiObjType_Unknown; 739 pAstNd->aArgs[2].enmType = kAcpiAstArgType_U8; 740 pAstNd->aArgs[2].u.u8 = 0; 741 742 if (rtAcpiAslLexerIsPunctuator(pThis, RTACPIASLTERMINAL_PUNCTUATOR_COMMA)) 743 { 744 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_COMMA, ','); 745 746 RTACPIASLTERMINAL enmKeyword; 747 int rc = rtAcpiAslLexerConsumeIfKeywordInList(pThis, &g_aenmObjTypeKeywords[0], &enmKeyword); 748 if (RT_FAILURE(rc)) 749 return rc; 750 751 if (enmKeyword != RTACPIASLTERMINAL_INVALID) 752 { 753 switch (enmKeyword) 754 { 755 case RTACPIASLTERMINAL_KEYWORD_UNKNOWN_OBJ: pAstNd->aArgs[1].u.enmObjType = kAcpiObjType_Unknown; break; 756 case RTACPIASLTERMINAL_KEYWORD_INT_OBJ: pAstNd->aArgs[1].u.enmObjType = kAcpiObjType_Int; break; 757 case RTACPIASLTERMINAL_KEYWORD_STR_OBJ: pAstNd->aArgs[1].u.enmObjType = kAcpiObjType_Str; break; 758 case RTACPIASLTERMINAL_KEYWORD_BUFF_OBJ: pAstNd->aArgs[1].u.enmObjType = kAcpiObjType_Buff; break; 759 case RTACPIASLTERMINAL_KEYWORD_PKG_OBJ: pAstNd->aArgs[1].u.enmObjType = kAcpiObjType_Pkg; break; 760 case RTACPIASLTERMINAL_KEYWORD_FIELD_UNIT_OBJ: pAstNd->aArgs[1].u.enmObjType = kAcpiObjType_FieldUnit; break; 761 case RTACPIASLTERMINAL_KEYWORD_DEVICE_OBJ: pAstNd->aArgs[1].u.enmObjType = kAcpiObjType_Device; break; 762 case RTACPIASLTERMINAL_KEYWORD_EVENT_OBJ: pAstNd->aArgs[1].u.enmObjType = kAcpiObjType_Event; break; 763 case RTACPIASLTERMINAL_KEYWORD_METHOD_OBJ: pAstNd->aArgs[1].u.enmObjType = kAcpiObjType_Method; break; 764 case RTACPIASLTERMINAL_KEYWORD_MUTEX_OBJ: pAstNd->aArgs[1].u.enmObjType = kAcpiObjType_MutexObj; break; 765 case RTACPIASLTERMINAL_KEYWORD_OP_REGION_OBJ: pAstNd->aArgs[1].u.enmObjType = kAcpiObjType_OpRegion; break; 766 case RTACPIASLTERMINAL_KEYWORD_POWER_RES_OBJ: pAstNd->aArgs[1].u.enmObjType = kAcpiObjType_PowerRes; break; 767 case RTACPIASLTERMINAL_KEYWORD_THERMAL_ZONE_OBJ: pAstNd->aArgs[1].u.enmObjType = kAcpiObjType_ThermalZone; break; 768 case RTACPIASLTERMINAL_KEYWORD_BUFF_FIELD_OBJ: pAstNd->aArgs[1].u.enmObjType = kAcpiObjType_BuffField; break; 769 default: 770 AssertFailedReturn(VERR_INTERNAL_ERROR); 771 } 772 } 773 774 if (rtAcpiAslLexerIsPunctuator(pThis, RTACPIASLTERMINAL_PUNCTUATOR_COMMA)) 775 { 776 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_COMMA, ','); 777 778 /** @todo ResultType */ 779 780 if (rtAcpiAslLexerIsPunctuator(pThis, RTACPIASLTERMINAL_PUNCTUATOR_COMMA)) 781 { 782 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_COMMA, ','); 783 784 /** @todo ParameterTypes */ 785 } 786 } 787 } 788 789 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_CLOSE_BRACKET, ')'); 790 return VINF_SUCCESS; 791 } 792 793 794 static DECLCALLBACK(int) rtAcpiTblAslParseMethod(PRTACPIASLCU pThis, PCRTACPIASLKEYWORD pKeyword, PRTACPIASTNODE pAstNd) 795 { 796 RT_NOREF(pKeyword, pAstNd); 797 798 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_OPEN_BRACKET, '('); 799 800 /* Namestring is required. */ 801 RTACPIASL_PARSE_NAME_STRING(pszNameString); 802 pAstNd->aArgs[0].enmType = kAcpiAstArgType_NameString; 803 pAstNd->aArgs[0].u.pszNameString = pszNameString; 804 805 /* Defaults for optional arguments. */ 806 pAstNd->aArgs[1].enmType = kAcpiAstArgType_U8; 807 pAstNd->aArgs[1].u.u8 = 0; 808 pAstNd->aArgs[2].enmType = kAcpiAstArgType_Bool; 809 pAstNd->aArgs[2].u.f = false; 810 pAstNd->aArgs[3].enmType = kAcpiAstArgType_U8; 811 pAstNd->aArgs[3].u.u8 = 0; 812 813 if (rtAcpiAslLexerIsPunctuator(pThis, RTACPIASLTERMINAL_PUNCTUATOR_COMMA)) 814 { 815 /* NumArgs */ 816 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_COMMA, ','); 817 818 uint64_t u64 = 0; 819 bool fConsumed = false; 820 int rc = rtAcpiAslLexerConsumeIfNatural(pThis, &u64, &fConsumed); 821 if (RT_FAILURE(rc)) 822 return rc; 823 824 if (fConsumed) 825 { 826 if (u64 >= 8) 827 return RTErrInfoSetF(pThis->pErrInfo, VERR_INVALID_PARAMETER, 828 "Argument count value is out of range [0..7]: %u", u64); 829 pAstNd->aArgs[1].u.u8 = (uint8_t)u64; 830 } 831 832 if (rtAcpiAslLexerIsPunctuator(pThis, RTACPIASLTERMINAL_PUNCTUATOR_COMMA)) 833 { 834 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_COMMA, ','); 835 836 /* Serialized|NotSerialized */ 837 RTACPIASLTERMINAL enmKeyword; 838 rc = rtAcpiAslLexerConsumeIfKeywordInList(pThis, &g_aenmSerializeRuleKeywords[0], &enmKeyword); 839 if (RT_FAILURE(rc)) 840 return rc; 841 842 if (enmKeyword != RTACPIASLTERMINAL_INVALID) 843 { 844 Assert(enmKeyword == RTACPIASLTERMINAL_KEYWORD_SERIALIZED || enmKeyword == RTACPIASLTERMINAL_KEYWORD_NOT_SERIALIZED); 845 pAstNd->aArgs[2].u.f = enmKeyword == RTACPIASLTERMINAL_KEYWORD_SERIALIZED 846 ? RTACPI_METHOD_F_SERIALIZED 847 : RTACPI_METHOD_F_NOT_SERIALIZED; 848 } 849 850 if (rtAcpiAslLexerIsPunctuator(pThis, RTACPIASLTERMINAL_PUNCTUATOR_COMMA)) 851 { 852 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_COMMA, ','); 853 854 /* Sync Level */ 855 u64 = 0; 856 rc = rtAcpiAslLexerConsumeIfNatural(pThis, &u64, &fConsumed); 857 if (RT_FAILURE(rc)) 858 return rc; 859 860 if (fConsumed) 861 { 862 if (u64 >= 16) 863 return RTErrInfoSetF(pThis->pErrInfo, VERR_INVALID_PARAMETER, 864 "SyncLevel value is out of range [0..15]: %u", u64); 865 pAstNd->aArgs[1].u.u8 = (uint8_t)u64; 866 } 867 868 if (rtAcpiAslLexerIsPunctuator(pThis, RTACPIASLTERMINAL_PUNCTUATOR_COMMA)) 869 { 870 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_COMMA, ','); 871 872 /** @todo ReturnType */ 873 874 if (rtAcpiAslLexerIsPunctuator(pThis, RTACPIASLTERMINAL_PUNCTUATOR_COMMA)) 875 { 876 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_COMMA, ','); 877 878 /** @todo ParameterTypes */ 879 } 880 } 881 } 882 } 883 } 884 885 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_CLOSE_BRACKET, ')'); 886 return VINF_SUCCESS; 887 } 888 889 890 891 #define RTACPI_ASL_KEYWORD_DEFINE_INVALID \ 892 { \ 893 NULL, NULL, 0, 0, RTACPI_AST_NODE_F_DEFAULT, \ 894 { kAcpiAstArgType_Invalid, \ 895 kAcpiAstArgType_Invalid, \ 896 kAcpiAstArgType_Invalid, \ 897 kAcpiAstArgType_Invalid, \ 898 kAcpiAstArgType_Invalid}, \ 899 { \ 900 { kAcpiAstArgType_Invalid, { 0 } }, \ 901 { kAcpiAstArgType_Invalid, { 0 } }, \ 902 { kAcpiAstArgType_Invalid, { 0 } } \ 903 } \ 904 } 905 906 #define RTACPI_ASL_KEYWORD_DEFINE_HANDLER(a_szKeyword, a_pfnHandler, a_cArgReq, a_cArgOpt, a_fFlags) \ 907 { \ 908 a_szKeyword, a_pfnHandler, a_cArgReq, a_cArgOpt, a_fFlags, \ 909 { kAcpiAstArgType_Invalid, \ 910 kAcpiAstArgType_Invalid, \ 911 kAcpiAstArgType_Invalid, \ 912 kAcpiAstArgType_Invalid, \ 913 kAcpiAstArgType_Invalid}, \ 914 { \ 915 { kAcpiAstArgType_Invalid, { 0 } }, \ 916 { kAcpiAstArgType_Invalid, { 0 } }, \ 917 { kAcpiAstArgType_Invalid, { 0 } } \ 918 } \ 919 } 920 921 #define RTACPI_ASL_KEYWORD_DEFINE_0REQ_0OPT(a_szKeyword, a_fFlags) \ 922 { \ 923 a_szKeyword, NULL, 0, 0, a_fFlags, \ 924 { kAcpiAstArgType_Invalid, \ 925 kAcpiAstArgType_Invalid, \ 926 kAcpiAstArgType_Invalid, \ 927 kAcpiAstArgType_Invalid, \ 928 kAcpiAstArgType_Invalid}, \ 929 { \ 930 { kAcpiAstArgType_Invalid, { 0 } }, \ 931 { kAcpiAstArgType_Invalid, { 0 } }, \ 932 { kAcpiAstArgType_Invalid, { 0 } } \ 933 } \ 934 } 935 936 #define RTACPI_ASL_KEYWORD_DEFINE_1REQ_0OPT(a_szKeyword, a_fFlags, a_enmArgType0) \ 937 { \ 938 a_szKeyword, NULL, 1, 0, a_fFlags, \ 939 { a_enmArgType0, \ 940 kAcpiAstArgType_Invalid, \ 941 kAcpiAstArgType_Invalid, \ 942 kAcpiAstArgType_Invalid, \ 943 kAcpiAstArgType_Invalid}, \ 944 { \ 945 { kAcpiAstArgType_Invalid, { 0 } }, \ 946 { kAcpiAstArgType_Invalid, { 0 } }, \ 947 { kAcpiAstArgType_Invalid, { 0 } } \ 948 } \ 949 } 950 951 #define RTACPI_ASL_KEYWORD_DEFINE_2REQ_0OPT(a_szKeyword, a_fFlags, a_enmArgType0, a_enmArgType1) \ 952 { \ 953 a_szKeyword, NULL, 2, 0, a_fFlags, \ 954 { a_enmArgType0, \ 955 a_enmArgType1, \ 956 kAcpiAstArgType_Invalid, \ 957 kAcpiAstArgType_Invalid, \ 958 kAcpiAstArgType_Invalid}, \ 959 { \ 960 { kAcpiAstArgType_Invalid, { 0 } }, \ 961 { kAcpiAstArgType_Invalid, { 0 } }, \ 962 { kAcpiAstArgType_Invalid, { 0 } } \ 963 } \ 964 } 965 966 #define RTACPI_ASL_KEYWORD_DEFINE_4REQ_0OPT(a_szKeyword, a_fFlags, a_enmArgType0, a_enmArgType1, a_enmArgType2, a_enmArgType3) \ 967 { \ 968 a_szKeyword, NULL, 4, 0, a_fFlags, \ 969 { a_enmArgType0, \ 970 a_enmArgType1, \ 971 a_enmArgType2, \ 972 a_enmArgType3, \ 973 kAcpiAstArgType_Invalid}, \ 974 { \ 975 { kAcpiAstArgType_Invalid, { 0 } }, \ 976 { kAcpiAstArgType_Invalid, { 0 } }, \ 977 { kAcpiAstArgType_Invalid, { 0 } } \ 978 } \ 979 } 553 980 554 981 /** 555 * Keyword encoding table, indexed by RTACPIASLTERMINAL_XXX.982 * Operations encoding table, indexed by kAcpiAstNodeOp_XXX. 556 983 */ 557 static const RTACPIASLKEYWORD g_aAslKeywords[] = 558 { 559 /* RTACPIASLTERMINAL_INVALID */ { 560 NULL, 0, 0, 0, RTACPI_AST_NODE_F_DEFAULT, 561 { kAcpiAstArgType_Invalid, 562 kAcpiAstArgType_Invalid, 563 kAcpiAstArgType_Invalid, 564 kAcpiAstArgType_Invalid, 565 kAcpiAstArgType_Invalid}, 566 { 567 { kAcpiAstArgType_Invalid, { 0 } }, 568 { kAcpiAstArgType_Invalid, { 0 } }, 569 { kAcpiAstArgType_Invalid, { 0 } } 570 } 571 }, 572 /* RTACPIASLTERMINAL_DEFINITION_BLOCK */ { 573 NULL, 0, 0, 0, RTACPI_AST_NODE_F_DEFAULT, 574 { kAcpiAstArgType_Invalid, 575 kAcpiAstArgType_Invalid, 576 kAcpiAstArgType_Invalid, 577 kAcpiAstArgType_Invalid, 578 kAcpiAstArgType_Invalid}, 579 { 580 { kAcpiAstArgType_Invalid, { 0 } }, 581 { kAcpiAstArgType_Invalid, { 0 } }, 582 { kAcpiAstArgType_Invalid, { 0 } } 583 } 584 }, 585 /* RTACPIASLTERMINAL_SCOPE */ { 586 "Scope", ACPI_AML_BYTE_CODE_OP_SCOPE, 1, 0, RTACPI_AST_NODE_F_NEW_SCOPE, 587 { kAcpiAstArgType_NameString, 588 kAcpiAstArgType_Invalid, 589 kAcpiAstArgType_Invalid, 590 kAcpiAstArgType_Invalid, 591 kAcpiAstArgType_Invalid 984 static const RTACPIASLKEYWORD g_aAslOps[] = 985 { 986 /* kAcpiAstNodeOp_Invalid */ RTACPI_ASL_KEYWORD_DEFINE_INVALID, 987 /* kAcpiAstNodeOp_Identifier */ RTACPI_ASL_KEYWORD_DEFINE_INVALID, 988 /* kAcpiAstNodeOp_StringLiteral */ RTACPI_ASL_KEYWORD_DEFINE_INVALID, 989 /* kAcpiAstNodeOp_Number */ RTACPI_ASL_KEYWORD_DEFINE_INVALID, 990 /* kAcpiAstNodeOp_Scope */ RTACPI_ASL_KEYWORD_DEFINE_1REQ_0OPT("Scope", RTACPI_AST_NODE_F_NEW_SCOPE, kAcpiAstArgType_NameString), 991 /* kAcpiAstNodeOp_Processor */ { 992 "Processor", NULL, 2, 2, RTACPI_AST_NODE_F_NEW_SCOPE, 993 { 994 kAcpiAstArgType_NameString, 995 kAcpiAstArgType_U8, 996 kAcpiAstArgType_Invalid, 997 kAcpiAstArgType_Invalid, 998 kAcpiAstArgType_Invalid 999 }, 1000 { 1001 { kAcpiAstArgType_U32, { 0 } }, 1002 { kAcpiAstArgType_U8, { 0 } }, 1003 { kAcpiAstArgType_Invalid, { 0 } } 1004 } 592 1005 }, 593 {594 { kAcpiAstArgType_Invalid, { 0 } },595 { kAcpiAstArgType_Invalid, { 0 } },596 { kAcpiAstArgType_Invalid, { 0 } }597 }598 },599 /* RTACPIASLTERMINAL_PROCESSOR */ {600 "Processor", ACPI_AML_BYTE_CODE_EXT_OP_PROCESSOR, 2, 2, RTACPI_AST_NODE_F_NEW_SCOPE | RTACPI_AST_NODE_F_EXT_OPC,601 { kAcpiAstArgType_NameString,602 kAcpiAstArgType_U8,603 kAcpiAstArgType_Invalid,604 kAcpiAstArgType_Invalid,605 kAcpiAstArgType_Invalid606 },607 {608 { kAcpiAstArgType_U32, { 0 } },609 { kAcpiAstArgType_U8, { 0 } },610 { kAcpiAstArgType_Invalid, { 0 } }611 }612 }, 1006 /* kAcpiAstNodeOp_External */ RTACPI_ASL_KEYWORD_DEFINE_HANDLER( "External", rtAcpiTblAslParseExternal, 1, 2, RTACPI_AST_NODE_F_DEFAULT), 1007 /* kAcpiAstNodeOp_Method */ RTACPI_ASL_KEYWORD_DEFINE_HANDLER( "Method", rtAcpiTblAslParseMethod, 1, 3, RTACPI_AST_NODE_F_NEW_SCOPE), 1008 /* kAcpiAstNodeOp_Device */ RTACPI_ASL_KEYWORD_DEFINE_1REQ_0OPT("Device", RTACPI_AST_NODE_F_NEW_SCOPE, kAcpiAstArgType_NameString), 1009 /* kAcpiAstNodeOp_If */ RTACPI_ASL_KEYWORD_DEFINE_1REQ_0OPT("If", RTACPI_AST_NODE_F_NEW_SCOPE, kAcpiAstArgType_AstNode), 1010 /* kAcpiAstNodeOp_Else */ RTACPI_ASL_KEYWORD_DEFINE_0REQ_0OPT("Else", RTACPI_AST_NODE_F_NEW_SCOPE), 1011 /* kAcpiAstNodeOp_LAnd */ RTACPI_ASL_KEYWORD_DEFINE_2REQ_0OPT("LAnd", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode, kAcpiAstArgType_AstNode), 1012 /* kAcpiAstNodeOp_LEqual */ RTACPI_ASL_KEYWORD_DEFINE_2REQ_0OPT("LEqual", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode, kAcpiAstArgType_AstNode), 1013 /* kAcpiAstNodeOp_LGreater */ RTACPI_ASL_KEYWORD_DEFINE_2REQ_0OPT("LGreater", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode, kAcpiAstArgType_AstNode), 1014 /* kAcpiAstNodeOp_LGreaterEqual */ RTACPI_ASL_KEYWORD_DEFINE_2REQ_0OPT("LGreaterEqual", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode, kAcpiAstArgType_AstNode), 1015 /* kAcpiAstNodeOp_LLess */ RTACPI_ASL_KEYWORD_DEFINE_2REQ_0OPT("LLess", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode, kAcpiAstArgType_AstNode), 1016 /* kAcpiAstNodeOp_LLessEqual */ RTACPI_ASL_KEYWORD_DEFINE_2REQ_0OPT("LLessEqual", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode, kAcpiAstArgType_AstNode), 1017 /* kAcpiAstNodeOp_LNot */ RTACPI_ASL_KEYWORD_DEFINE_2REQ_0OPT("LNot", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode, kAcpiAstArgType_AstNode), 1018 /* kAcpiAstNodeOp_LNotEqual */ RTACPI_ASL_KEYWORD_DEFINE_2REQ_0OPT("LNotEqual", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode, kAcpiAstArgType_AstNode), 1019 /* kAcpiAstNodeOp_Zero */ RTACPI_ASL_KEYWORD_DEFINE_0REQ_0OPT("Zero", RTACPI_AST_NODE_F_DEFAULT), 1020 /* kAcpiAstNodeOp_One */ RTACPI_ASL_KEYWORD_DEFINE_0REQ_0OPT("One", RTACPI_AST_NODE_F_DEFAULT), 1021 /* kAcpiAstNodeOp_Ones */ RTACPI_ASL_KEYWORD_DEFINE_0REQ_0OPT("Ones", RTACPI_AST_NODE_F_DEFAULT), 1022 /* kAcpiAstNodeOp_Return */ RTACPI_ASL_KEYWORD_DEFINE_1REQ_0OPT("Return", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode), 1023 /* kAcpiAstNodeOp_Unicode */ RTACPI_ASL_KEYWORD_DEFINE_1REQ_0OPT("Unicode", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode), /* Actually only String allowed here */ 1024 /* kAcpiAstNodeOp_OperationRegion */ RTACPI_ASL_KEYWORD_DEFINE_4REQ_0OPT("OperationRegion", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_NameString, kAcpiAstArgType_RegionSpace, kAcpiAstArgType_AstNode, kAcpiAstArgType_AstNode), 1025 613 1026 }; 614 1027 1028 615 1029 static int rtAcpiTblAslParseArgument(PRTACPIASLCU pThis, const char *pszKeyword, uint8_t iArg, RTACPIASTARGTYPE enmArgType, PRTACPIASTARG pArg) 616 1030 { … … 619 1033 case kAcpiAstArgType_AstNode: 620 1034 { 621 //rtAcpiTblAslParseTerminal(pThis, RTACPIASLTERMINAL enmTerminal, PRTACPIASTNODE *ppAstNd) 1035 PRTACPIASTNODE pAstNd = NULL; 1036 int rc = rtAcpiTblAslParseTermArg(pThis, &pAstNd); 1037 if (RT_FAILURE(rc)) 1038 return rc; 1039 pArg->enmType = kAcpiAstArgType_AstNode; 1040 pArg->u.pAstNd = pAstNd; 622 1041 break; 623 1042 } … … 672 1091 break; 673 1092 } 1093 case kAcpiAstArgType_RegionSpace: 1094 { 1095 RTACPIASLTERMINAL enmKeyword; 1096 int rc = rtAcpiAslLexerConsumeIfKeywordInList(pThis, &g_aenmRegionSpaceKeywords[0], &enmKeyword); 1097 if (RT_FAILURE(rc)) 1098 return rc; 1099 1100 if (enmKeyword != RTACPIASLTERMINAL_INVALID) 1101 { 1102 pArg->enmType = kAcpiAstArgType_RegionSpace; 1103 switch (enmKeyword) 1104 { 1105 case RTACPIASLTERMINAL_KEYWORD_SYSTEM_IO: pArg->u.enmRegionSpace = kAcpiOperationRegionSpace_SystemIo; break; 1106 case RTACPIASLTERMINAL_KEYWORD_SYSTEM_MEMORY: pArg->u.enmRegionSpace = kAcpiOperationRegionSpace_SystemMemory; break; 1107 case RTACPIASLTERMINAL_KEYWORD_PCI_CONFIG: pArg->u.enmRegionSpace = kAcpiOperationRegionSpace_PciConfig; break; 1108 case RTACPIASLTERMINAL_KEYWORD_EMBEDDED_CONTROL: pArg->u.enmRegionSpace = kAcpiOperationRegionSpace_EmbeddedControl; break; 1109 case RTACPIASLTERMINAL_KEYWORD_SMBUS: pArg->u.enmRegionSpace = kAcpiOperationRegionSpace_SmBus; break; 1110 case RTACPIASLTERMINAL_KEYWORD_SYSTEM_CMOS: pArg->u.enmRegionSpace = kAcpiOperationRegionSpace_SystemCmos; break; 1111 case RTACPIASLTERMINAL_KEYWORD_PCI_BAR_TARGET: pArg->u.enmRegionSpace = kAcpiOperationRegionSpace_PciBarTarget; break; 1112 case RTACPIASLTERMINAL_KEYWORD_IPMI: pArg->u.enmRegionSpace = kAcpiOperationRegionSpace_Ipmi; break; 1113 case RTACPIASLTERMINAL_KEYWORD_GENERAL_PURPOSE_IO: pArg->u.enmRegionSpace = kAcpiOperationRegionSpace_Gpio; break; 1114 case RTACPIASLTERMINAL_KEYWORD_GENERIC_SERIAL_BUS: pArg->u.enmRegionSpace = kAcpiOperationRegionSpace_GenericSerialBus; break; 1115 case RTACPIASLTERMINAL_KEYWORD_PCC: pArg->u.enmRegionSpace = kAcpiOperationRegionSpace_Pcc; break; 1116 case RTACPIASLTERMINAL_KEYWORD_PRM: 1117 case RTACPIASLTERMINAL_KEYWORD_FFIXED_HW: 1118 default: 1119 AssertFailedReturn(VERR_INTERNAL_ERROR); 1120 } 1121 } 1122 else 1123 return RTErrInfoSetF(pThis->pErrInfo, VERR_INVALID_PARAMETER, "Unknown RegionSpace keyword encountered"); 1124 break; 1125 } 674 1126 default: 675 1127 AssertReleaseFailed(); … … 680 1132 681 1133 682 static int rtAcpiTblAslParse Terminal(PRTACPIASLCU pThis, RTACPIASLTERMINAL enmTerminal, PRTACPIASTNODE *ppAstNd)1134 static int rtAcpiTblAslParseOp(PRTACPIASLCU pThis, RTACPIASTNODEOP enmOp, PRTACPIASTNODE *ppAstNd) 683 1135 { 684 1136 int rc = VINF_SUCCESS; 685 1137 686 AssertReturn(enm Terminal > RTACPIASLTERMINAL_INVALID && (unsigned)enmTerminal < RT_ELEMENTS(g_aAslKeywords), VERR_INTERNAL_ERROR);1138 AssertReturn(enmOp > kAcpiAstNodeOp_Invalid && (unsigned)enmOp < RT_ELEMENTS(g_aAslOps), VERR_INTERNAL_ERROR); 687 1139 688 1140 *ppAstNd = NULL; 689 1141 690 PCRTACPIASLKEYWORD pAslKeyword = &g_aAsl Keywords[enmTerminal];691 PRTACPIASTNODE pAstNd = rtAcpiAstNodeAlloc( pAslKeyword->bOpc, pAslKeyword->fFlags, pAslKeyword->cArgsReq + pAslKeyword->cArgsOpt);1142 PCRTACPIASLKEYWORD pAslKeyword = &g_aAslOps[enmOp]; 1143 PRTACPIASTNODE pAstNd = rtAcpiAstNodeAlloc(enmOp, pAslKeyword->fFlags, pAslKeyword->cArgsReq + pAslKeyword->cArgsOpt); 692 1144 if (!pAstNd) 693 1145 return RTErrInfoSetF(pThis->pErrInfo, VERR_NO_MEMORY, "Failed to allocate ACPI AST node when processing keyword '%s'", pAslKeyword->pszOpc); … … 695 1147 *ppAstNd = pAstNd; 696 1148 697 if (pAslKeyword->cArgsReq || pAslKeyword->cArgsOpt) 1149 /* Call and parse callback if present, otherwise do the default parsing. */ 1150 if (pAslKeyword->pfnParse) 1151 { 1152 rc = pAslKeyword->pfnParse(pThis, pAslKeyword, pAstNd); 1153 if (RT_FAILURE(rc)) 1154 return rc; 1155 } 1156 else if (pAslKeyword->cArgsReq || pAslKeyword->cArgsOpt) 698 1157 { 699 1158 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_OPEN_BRACKET, '('); … … 769 1228 770 1229 1230 /** 1231 * Parses what looks like an name string, possibly with a call. 1232 * 1233 * @returns IPRT status code. 1234 * @param pThis The ACPI compilation unit state. 1235 * @param pszIde The identifier. 1236 * @param ppAstNd Where to store the AST node on success. 1237 */ 1238 static int rtAcpiTblAslParseIde(PRTACPIASLCU pThis, const char *pszIde, PRTACPIASTNODE *ppAstNd) 1239 { 1240 *ppAstNd = NULL; 1241 1242 /* If there is a ( following this looks like a function call which can have up to 8 arguments. */ 1243 uint8_t cArgs = 0; 1244 RTACPIASTARG aArgs[8]; RT_ZERO(aArgs); 1245 if (rtAcpiAslLexerIsPunctuator(pThis, RTACPIASLTERMINAL_PUNCTUATOR_OPEN_BRACKET)) 1246 { 1247 RTACPIASL_SKIP_CURRENT_TOKEN(); /* Skip "(" */ 1248 1249 while (cArgs < RT_ELEMENTS(aArgs)) 1250 { 1251 PRTACPIASTNODE pAstNd = NULL; 1252 int rc = rtAcpiTblAslParseTermArg(pThis, &pAstNd); 1253 if (RT_FAILURE(rc)) 1254 return rc; 1255 1256 aArgs[cArgs].enmType = kAcpiAstArgType_AstNode; 1257 aArgs[cArgs].u.pAstNd = pAstNd; 1258 cArgs++; 1259 1260 /* ")" means we are done here. */ 1261 if (rtAcpiAslLexerIsPunctuator(pThis, RTACPIASLTERMINAL_PUNCTUATOR_CLOSE_BRACKET)) 1262 break; 1263 1264 /* Arguments are separated by "," */ 1265 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_COMMA, ','); 1266 } 1267 1268 /* Now there must be a closing ) */ 1269 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_CLOSE_BRACKET, ')'); 1270 } 1271 1272 PRTACPIASTNODE pAstNd = rtAcpiAstNodeAlloc(kAcpiAstNodeOp_Identifier, RTACPI_AST_NODE_F_DEFAULT, cArgs); 1273 if (!pAstNd) 1274 return RTErrInfoSetF(pThis->pErrInfo, VERR_NO_MEMORY, "Failed to allocate ACPI AST node when processing identifier '%s'", pszIde); 1275 1276 pAstNd->pszIde = pszIde; 1277 1278 /* Fill in the arguments. */ 1279 for (uint8_t i = 0; i < cArgs; i++) 1280 pAstNd->aArgs[i] = aArgs[i]; 1281 1282 *ppAstNd = pAstNd; 1283 return VINF_SUCCESS; 1284 } 1285 1286 1287 static int rtAcpiTblAslParseTermArg(PRTACPIASLCU pThis, PRTACPIASTNODE *ppAstNd) 1288 { 1289 PCRTSCRIPTLEXTOKEN pTok; 1290 int rc = RTScriptLexQueryToken(pThis->hLexSource, &pTok); 1291 if (RT_FAILURE(rc)) 1292 return RTErrInfoSetF(pThis->pErrInfo, rc, "Parser: Failed to query next token with %Rrc", rc); 1293 1294 if (pTok->enmType == RTSCRIPTLEXTOKTYPE_ERROR) 1295 return RTErrInfoSet(pThis->pErrInfo, VERR_INVALID_PARAMETER, pTok->Type.Error.pErr->pszMsg); 1296 if (pTok->enmType == RTSCRIPTLEXTOKTYPE_EOS) 1297 return RTErrInfoSetF(pThis->pErrInfo, VERR_INVALID_PARAMETER, "Parser: Unexpected end of stream"); 1298 1299 PRTACPIASTNODE pAstNd = NULL; 1300 if (pTok->enmType == RTSCRIPTLEXTOKTYPE_KEYWORD) 1301 { 1302 uint64_t idKeyword = pTok->Type.Keyword.pKeyword->u64Val; 1303 if (idKeyword < RT_ELEMENTS(g_aAslOps)) 1304 { 1305 RTScriptLexConsumeToken(pThis->hLexSource); /* This must come here as rtAcpiTblAslParseOp() will continue parsing. */ 1306 rc = rtAcpiTblAslParseOp(pThis, (RTACPIASTNODEOP)idKeyword, &pAstNd); 1307 } 1308 else 1309 return RTErrInfoSetF(pThis->pErrInfo, VERR_INVALID_PARAMETER, "Parser: Unexpected keyword '%s' encountered", pTok->Type.Keyword.pKeyword->pszMatch); 1310 } 1311 else if (pTok->enmType == RTSCRIPTLEXTOKTYPE_IDENTIFIER) 1312 { 1313 /* We can safely consume the token here after getting the pointer to the identifier string as the string is cached and doesn't go away. */ 1314 const char *pszIde = pTok->Type.Id.pszIde; 1315 RTScriptLexConsumeToken(pThis->hLexSource); 1316 rc = rtAcpiTblAslParseIde(pThis, pszIde, &pAstNd); 1317 } 1318 else if (pTok->enmType == RTSCRIPTLEXTOKTYPE_STRINGLIT) 1319 { 1320 pAstNd = rtAcpiAstNodeAlloc(kAcpiAstNodeOp_StringLiteral, RTACPI_AST_NODE_F_DEFAULT, 0); 1321 if (!pAstNd) 1322 return RTErrInfoSetF(pThis->pErrInfo, VERR_NO_MEMORY, "Failed to allocate ACPI AST node when processing identifier '%s'", 1323 pTok->Type.StringLit.pszString); 1324 1325 pAstNd->pszStrLit = pTok->Type.StringLit.pszString; 1326 RTScriptLexConsumeToken(pThis->hLexSource); 1327 } 1328 else if (pTok->enmType == RTSCRIPTLEXTOKTYPE_NUMBER) 1329 { 1330 Assert(pTok->Type.Number.enmType == RTSCRIPTLEXTOKNUMTYPE_NATURAL); 1331 pAstNd = rtAcpiAstNodeAlloc(kAcpiAstNodeOp_Number, RTACPI_AST_NODE_F_DEFAULT, 0); 1332 if (!pAstNd) 1333 return RTErrInfoSetF(pThis->pErrInfo, VERR_NO_MEMORY, "Failed to allocate ACPI AST node when processing number '%#RX64'", 1334 pTok->Type.Number.Type.u64); 1335 1336 pAstNd->u64 = pTok->Type.Number.Type.u64; 1337 RTScriptLexConsumeToken(pThis->hLexSource); 1338 } 1339 else 1340 { 1341 AssertFailed(); 1342 return RTErrInfoSetF(pThis->pErrInfo, VERR_INVALID_PARAMETER, "Parser: Unexpected token encountered"); 1343 } 1344 1345 if (RT_FAILURE(rc)) 1346 { 1347 if (pAstNd) 1348 rtAcpiAstNodeFree(pAstNd); 1349 return rc; 1350 } 1351 1352 AssertPtr(pAstNd); 1353 *ppAstNd = pAstNd; 1354 return VINF_SUCCESS; 1355 } 1356 1357 771 1358 static int rtAcpiTblAslParseInner(PRTACPIASLCU pThis, PRTLISTANCHOR pLstStmts) 772 1359 { 773 1360 for (;;) 774 1361 { 775 PCRTSCRIPTLEXTOKEN pTok; 776 int rc = RTScriptLexQueryToken(pThis->hLexSource, &pTok); 1362 /* Need to break out of the loop if done processing this scope (consumption is done by the caller). */ 1363 if (rtAcpiAslLexerIsPunctuator(pThis, RTACPIASLTERMINAL_PUNCTUATOR_CLOSE_CURLY_BRACKET)) 1364 return VINF_SUCCESS; 1365 1366 PRTACPIASTNODE pAstNd = NULL; 1367 int rc = rtAcpiTblAslParseTermArg(pThis, &pAstNd); 777 1368 if (RT_FAILURE(rc)) 778 return RTErrInfoSetF(pThis->pErrInfo, rc, "Parser: Failed to query next token with %Rrc", rc);779 780 if ( pTok->enmType == RTSCRIPTLEXTOKTYPE_PUNCTUATOR781 && pTok->Type.Keyword.pKeyword->u64Val == RTACPIASLTERMINAL_PUNCTUATOR_CLOSE_CURLY_BRACKET)782 return VINF_SUCCESS;783 784 if (pTok->enmType == RTSCRIPTLEXTOKTYPE_EOS)785 return RTErrInfoSetF(pThis->pErrInfo, VERR_INVALID_PARAMETER, "Parser: Unexpected end of stream");786 if (pTok->enmType != RTSCRIPTLEXTOKTYPE_KEYWORD)787 return RTErrInfoSetF(pThis->pErrInfo, VERR_INVALID_PARAMETER, "Parser: Unexpected token encountered");788 789 RTACPIASLTERMINAL enmKeyword = (RTACPIASLTERMINAL)pTok->Type.Keyword.pKeyword->u64Val;790 RTScriptLexConsumeToken(pThis->hLexSource); /* This must come here as rtAcpiTblAslParseTerminal() will continue parsing. */791 792 PRTACPIASTNODE pAstNd = NULL;793 rc = rtAcpiTblAslParseTerminal(pThis, enmKeyword, &pAstNd);794 if (RT_FAILURE(rc))795 {796 if (pAstNd)797 rtAcpiAstNodeFree(pAstNd);798 1369 return rc; 799 } 800 1370 1371 Assert(pAstNd); 801 1372 RTListAppend(pLstStmts, &pAstNd->NdAst); 802 1373 } -
trunk/src/VBox/Runtime/common/acpi/acpi.cpp
r108029 r108059 1172 1172 1173 1173 1174 RTDECL(int) RTAcpiTblExternalAppend(RTACPITBL hAcpiTbl, const char *pszName, RTACPIOBJTYPE enmObjType, uint8_t cArgs) 1175 { 1176 PRTACPITBLINT pThis = hAcpiTbl; 1177 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 1178 AssertReturn(cArgs <= 7, VERR_INVALID_PARAMETER); 1179 1180 uint8_t bObjType; 1181 switch (enmObjType) 1182 { 1183 case kAcpiObjType_Unknown: bObjType = ACPI_AML_OBJECT_TYPE_UNINIT; break; 1184 case kAcpiObjType_Int: bObjType = ACPI_AML_OBJECT_TYPE_INTEGER; break; 1185 case kAcpiObjType_Str: bObjType = ACPI_AML_OBJECT_TYPE_STRING; break; 1186 case kAcpiObjType_Buff: bObjType = ACPI_AML_OBJECT_TYPE_BUFFER; break; 1187 case kAcpiObjType_Pkg: bObjType = ACPI_AML_OBJECT_TYPE_PACKAGE; break; 1188 case kAcpiObjType_FieldUnit: bObjType = ACPI_AML_OBJECT_TYPE_FIELD_UNIT; break; 1189 case kAcpiObjType_Device: bObjType = ACPI_AML_OBJECT_TYPE_DEVICE; break; 1190 case kAcpiObjType_Event: bObjType = ACPI_AML_OBJECT_TYPE_EVENT; break; 1191 case kAcpiObjType_Method: bObjType = ACPI_AML_OBJECT_TYPE_METHOD; break; 1192 case kAcpiObjType_MutexObj: bObjType = ACPI_AML_OBJECT_TYPE_MUTEX; break; 1193 case kAcpiObjType_OpRegion: bObjType = ACPI_AML_OBJECT_TYPE_OPERATION_REGION; break; 1194 case kAcpiObjType_PowerRes: bObjType = ACPI_AML_OBJECT_TYPE_POWER_RESOURCE; break; 1195 case kAcpiObjType_ThermalZone: bObjType = ACPI_AML_OBJECT_TYPE_THERMAL_ZONE; break; 1196 case kAcpiObjType_BuffField: bObjType = ACPI_AML_OBJECT_TYPE_BUFFER_FIELD; break; 1197 default: 1198 pThis->rcErr = VERR_INVALID_PARAMETER; 1199 AssertFailedReturn(pThis->rcErr); 1200 } 1201 1202 rtAcpiTblAppendByte(pThis, ACPI_AML_BYTE_CODE_OP_EXTERNAL); 1203 rtAcpiTblAppendNameString(pThis, pszName); 1204 rtAcpiTblAppendByte(pThis, bObjType); 1205 rtAcpiTblAppendByte(pThis, cArgs); 1206 return pThis->rcErr; 1207 } 1208 1209 1174 1210 RTDECL(int) RTAcpiTblCreateFromVfsIoStrm(PRTACPITBL phAcpiTbl, RTVFSIOSTREAM hVfsIos, RTACPITBLTYPE enmInType, PRTERRINFO pErrInfo) 1175 1211 { -
trunk/src/VBox/Runtime/include/internal/acpi.h
r108029 r108059 59 59 kAcpiAstArgType_AstNode, 60 60 kAcpiAstArgType_NameString, 61 kAcpiAstArgType_Bool, 61 62 kAcpiAstArgType_U8, 62 63 kAcpiAstArgType_U16, 63 64 kAcpiAstArgType_U32, 64 65 kAcpiAstArgType_U64, 66 kAcpiAstArgType_ObjType, 67 kAcpiAstArgType_RegionSpace, 65 68 kAcpiAstArgType_32Bit_Hack = 0x7fffffff 66 69 } RTACPIASTARGTYPE; … … 73 76 { 74 77 /** Argument type. */ 75 RTACPIASTARGTYPE enmType;78 RTACPIASTARGTYPE enmType; 76 79 /** Type dependent data. */ 77 80 union 78 81 { 79 uintptr_t uPtrInternal; 80 PCRTACPIASTNODE pAstNode; 81 const char *pszNameString; 82 uint8_t u8; 83 uint16_t u16; 84 uint32_t u32; 85 uint64_t u64; 82 uintptr_t uPtrInternal; 83 PCRTACPIASTNODE pAstNd; 84 const char *pszNameString; 85 bool f; 86 uint8_t u8; 87 uint16_t u16; 88 uint32_t u32; 89 uint64_t u64; 90 RTACPIOBJTYPE enmObjType; 91 RTACPIOPREGIONSPACE enmRegionSpace; 86 92 } u; 87 93 } RTACPIASTARG; … … 93 99 94 100 /** 101 * The ACPI AST node op. 102 */ 103 typedef enum RTACPIASTNODEOP 104 { 105 kAcpiAstNodeOp_Invalid = 0, 106 kAcpiAstNodeOp_Identifier, 107 kAcpiAstNodeOp_StringLiteral, 108 kAcpiAstNodeOp_Number, 109 kAcpiAstNodeOp_Scope, 110 kAcpiAstNodeOp_Processor, 111 kAcpiAstNodeOp_External, 112 kAcpiAstNodeOp_Method, 113 kAcpiAstNodeOp_Device, 114 kAcpiAstNodeOp_If, 115 kAcpiAstNodeOp_Else, 116 kAcpiAstNodeOp_LAnd, 117 kAcpiAstNodeOp_LEqual, 118 kAcpiAstNodeOp_LGreater, 119 kAcpiAstNodeOp_LGreaterEqual, 120 kAcpiAstNodeOp_LLess, 121 kAcpiAstNodeOp_LLessEqual, 122 kAcpiAstNodeOp_LNot, 123 kAcpiAstNodeOp_LNotEqual, 124 kAcpiAstNodeOp_Zero, 125 kAcpiAstNodeOp_One, 126 kAcpiAstNodeOp_Ones, 127 kAcpiAstNodeOp_Return, 128 kAcpiAstNodeOp_Unicode, 129 kAcpiAstNodeOp_OperationRegion, 130 kAcpiAstNodeOp_32Bit_Hack = 0x7fffffff 131 } RTACPIASTNODEOP; 132 133 134 /** 95 135 * The core ACPI AST node. 96 136 */ … … 99 139 /** List node. */ 100 140 RTLISTNODE NdAst; 101 /** The AML opcode defining the node. */ 102 uint8_t bOpc; 141 /** The AML op defining the node. */ 142 RTACPIASTNODEOP enmOp; 143 /** Some additional flags. */ 144 uint32_t fFlags; 145 /** Operation dependent data. */ 146 union 147 { 148 /** List of other AST nodes for the opened scope if indicated by the AST flags (RTACPIASTNODE). */ 149 RTLISTANCHOR LstScopeNodes; 150 /** Pointer to the identifier if an identifier node. */ 151 const char *pszIde; 152 /** Pointer to the string literal if a string literal node. */ 153 const char *pszStrLit; 154 /** A number */ 155 uint64_t u64; 156 }; 103 157 /** Number of "arguments" for the opcode following (for example Scope(), Method(), If(), etc., i.e. anything requiring () after the keyword ). */ 104 158 uint8_t cArgs; 105 159 /** Padding */ 106 160 uint8_t abRsvd[2]; 107 /** Some additional flags. */108 uint32_t fFlags;109 /** List of other AST nodes for the opened scope if indicated by the AST flags (RTACPIASTNODE). */110 RTLISTANCHOR LstScopeNodes;111 161 /** The AST node arguments - variable in size. */ 112 162 RTACPIASTARG aArgs[1]; … … 117 167 /** The AST node opens a new scope. */ 118 168 #define RTACPI_AST_NODE_F_NEW_SCOPE RT_BIT_32(0) 119 /** The AST node opcode is part of the extended prefix opcode map. */120 #define RTACPI_AST_NODE_F_EXT_OPC RT_BIT_32(1)121 169 122 170 … … 125 173 * 126 174 * @returns Pointer to the new ACPI AST node or NULL if out of memory. 127 * @param bOpc The opcode value forthe AST node.175 * @param enmOp The operation of the AST node. 128 176 * @param fFlags Flags for this node. 129 177 * @param cArgs Number of arguments to allocate. 130 178 */ 131 DECLHIDDEN(PRTACPIASTNODE) rtAcpiAstNodeAlloc( uint8_t bOpc, uint32_t fFlags, uint8_t cArgs);179 DECLHIDDEN(PRTACPIASTNODE) rtAcpiAstNodeAlloc(RTACPIASTNODEOP enmOp, uint32_t fFlags, uint8_t cArgs); 132 180 133 181
Note:
See TracChangeset
for help on using the changeset viewer.