- Timestamp:
- Feb 5, 2025 11:33:27 AM (3 months ago)
- svn:sync-xref-src-repo-rev:
- 167346
- Location:
- trunk/src/VBox/Runtime/common/acpi
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/common/acpi/acpi-compiler.cpp
r108059 r108066 106 106 RTACPIASLTERMINAL_KEYWORD_FFIXED_HW, 107 107 108 RTACPIASLTERMINAL_KEYWORD_ANY_ACC, 109 RTACPIASLTERMINAL_KEYWORD_BYTE_ACC, 110 RTACPIASLTERMINAL_KEYWORD_WORD_ACC, 111 RTACPIASLTERMINAL_KEYWORD_DWORD_ACC, 112 RTACPIASLTERMINAL_KEYWORD_QWORD_ACC, 113 RTACPIASLTERMINAL_KEYWORD_BUFFER_ACC, 114 115 RTACPIASLTERMINAL_KEYWORD_LOCK, 116 RTACPIASLTERMINAL_KEYWORD_NO_LOCK, 117 118 RTACPIASLTERMINAL_KEYWORD_PRESERVE, 119 RTACPIASLTERMINAL_KEYWORD_WRITE_AS_ONES, 120 RTACPIASLTERMINAL_KEYWORD_WRITE_AS_ZEROES, 121 122 RTACPIASLTERMINAL_KEYWORD_OFFSET, 123 124 RTACPIASLTERMINAL_KEYWORD_MEMORY32_FIXED, 125 RTACPIASLTERMINAL_KEYWORD_READONLY, 126 RTACPIASLTERMINAL_KEYWORD_READWRITE, 127 108 128 RTACPIASLTERMINAL_PUNCTUATOR_COMMA, 109 129 RTACPIASLTERMINAL_PUNCTUATOR_OPEN_BRACKET, … … 235 255 { RT_STR_TUPLE("UNICODE"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Unicode }, 236 256 { RT_STR_TUPLE("OPERATIONREGION"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_OperationRegion }, 237 257 { RT_STR_TUPLE("FIELD"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Field }, 258 { RT_STR_TUPLE("NAME"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Name }, 259 { RT_STR_TUPLE("RESOURCETEMPLATE"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_ResourceTemplate }, 260 { RT_STR_TUPLE("ARG0"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Arg0 }, 261 { RT_STR_TUPLE("ARG1"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Arg1 }, 262 { RT_STR_TUPLE("ARG2"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Arg2 }, 263 { RT_STR_TUPLE("ARG3"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Arg3 }, 264 { RT_STR_TUPLE("ARG4"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Arg4 }, 265 { RT_STR_TUPLE("ARG5"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Arg5 }, 266 { RT_STR_TUPLE("ARG6"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Arg6 }, 267 { RT_STR_TUPLE("LOCAL0"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Local0 }, 268 { RT_STR_TUPLE("LOCAL1"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Local1 }, 269 { RT_STR_TUPLE("LOCAL2"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Local2 }, 270 { RT_STR_TUPLE("LOCAL3"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Local3 }, 271 { RT_STR_TUPLE("LOCAL4"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Local4 }, 272 { RT_STR_TUPLE("LOCAL5"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Local5 }, 273 { RT_STR_TUPLE("LOCAL6"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Local6 }, 274 { RT_STR_TUPLE("LOCAL7"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Local7 }, 275 { RT_STR_TUPLE("PACKAGE"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Package }, 276 { RT_STR_TUPLE("BUFFER"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Buffer }, 277 { RT_STR_TUPLE("TOUUID"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_ToUuid }, 278 { RT_STR_TUPLE("DEREFOF"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_DerefOf }, 279 { RT_STR_TUPLE("INDEX"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Index }, 280 { RT_STR_TUPLE("STORE"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, kAcpiAstNodeOp_Store }, 281 282 /* Keywords not in the operation parser table. */ 238 283 { RT_STR_TUPLE("DEFINITIONBLOCK"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_DEFINITION_BLOCK }, 239 284 { RT_STR_TUPLE("UNKNOWNOBJ"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_UNKNOWN_OBJ }, … … 268 313 { RT_STR_TUPLE("PRM"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_PRM }, 269 314 { RT_STR_TUPLE("FFIXEDHW"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_FFIXED_HW }, 315 316 { RT_STR_TUPLE("ANYACC"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_ANY_ACC }, 317 { RT_STR_TUPLE("BYTEACC"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_BYTE_ACC }, 318 { RT_STR_TUPLE("WORDACC"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_WORD_ACC }, 319 { RT_STR_TUPLE("DWORDACC"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_DWORD_ACC }, 320 { RT_STR_TUPLE("QWORDACC"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_QWORD_ACC }, 321 { RT_STR_TUPLE("BUFFERACC"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_BUFFER_ACC }, 322 323 { RT_STR_TUPLE("LOCK"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_LOCK }, 324 { RT_STR_TUPLE("NOLOCK"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_NO_LOCK }, 325 326 { RT_STR_TUPLE("PRESERVE"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_PRESERVE }, 327 { RT_STR_TUPLE("WRITEASONES"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_WRITE_AS_ONES }, 328 { RT_STR_TUPLE("WRITEASZEROS"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_WRITE_AS_ZEROES }, 329 330 { RT_STR_TUPLE("OFFSET"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_OFFSET }, 331 { RT_STR_TUPLE("MEMORY32FIXED"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_MEMORY32_FIXED }, 332 { RT_STR_TUPLE("READONLY"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_READONLY }, 333 { RT_STR_TUPLE("READWRITE"), RTSCRIPTLEXTOKTYPE_KEYWORD, true, RTACPIASLTERMINAL_KEYWORD_READWRITE }, 270 334 271 335 /* Punctuators */ … … 630 694 } while(0) 631 695 696 #define RTACPIASL_PARSE_KEYWORD_LIST(a_enmKeyword, a_aenmKeywordList) \ 697 RTACPIASLTERMINAL a_enmKeyword = RTACPIASLTERMINAL_INVALID; \ 698 do { \ 699 int rc2 = rtAcpiAslLexerConsumeIfKeywordInList(pThis, a_aenmKeywordList, &a_enmKeyword); \ 700 if (RT_FAILURE(rc2)) \ 701 return rc2; \ 702 if (a_enmKeyword == RTACPIASLTERMINAL_INVALID) \ 703 return RTErrInfoSetF(pThis->pErrInfo, VERR_INVALID_PARAMETER, "Parser: Unexpected keyword found"); \ 704 } while(0) 705 632 706 #define RTACPIASL_PARSE_PUNCTUATOR(a_enmPunctuator, a_chPunctuator) \ 633 707 do { \ … … 721 795 RTACPIASLTERMINAL_INVALID 722 796 }; 797 798 799 static const RTACPIASLTERMINAL g_aenmAccessTypeKeywords[] = { 800 RTACPIASLTERMINAL_KEYWORD_ANY_ACC, 801 RTACPIASLTERMINAL_KEYWORD_BYTE_ACC, 802 RTACPIASLTERMINAL_KEYWORD_WORD_ACC, 803 RTACPIASLTERMINAL_KEYWORD_DWORD_ACC, 804 RTACPIASLTERMINAL_KEYWORD_QWORD_ACC, 805 RTACPIASLTERMINAL_KEYWORD_BUFFER_ACC, 806 RTACPIASLTERMINAL_INVALID 807 }; 808 809 810 static const RTACPIASLTERMINAL g_aenmLockRuleKeywords[] = { 811 RTACPIASLTERMINAL_KEYWORD_LOCK, 812 RTACPIASLTERMINAL_KEYWORD_NO_LOCK, 813 RTACPIASLTERMINAL_INVALID 814 }; 815 816 817 static const RTACPIASLTERMINAL g_aenmUpdateRuleKeywords[] = { 818 RTACPIASLTERMINAL_KEYWORD_PRESERVE, 819 RTACPIASLTERMINAL_KEYWORD_WRITE_AS_ONES, 820 RTACPIASLTERMINAL_KEYWORD_WRITE_AS_ZEROES, 821 RTACPIASLTERMINAL_INVALID 822 }; 823 824 825 static const RTACPIASLTERMINAL g_aenmResourceTemplateKeywords[] = { 826 RTACPIASLTERMINAL_KEYWORD_MEMORY32_FIXED, 827 RTACPIASLTERMINAL_INVALID 828 }; 829 830 831 static const RTACPIASLTERMINAL g_aenmRwRoKeywords[] = { 832 RTACPIASLTERMINAL_KEYWORD_READONLY, 833 RTACPIASLTERMINAL_KEYWORD_READWRITE, 834 RTACPIASLTERMINAL_INVALID 835 }; 836 723 837 724 838 … … 888 1002 889 1003 1004 static int rtAcpiTblParseFieldUnitList(PRTACPIASLCU pThis, PRTACPIASTNODE pAstNd) 1005 { 1006 RTACPIFIELDENTRY aFieldEntries[128]; RT_ZERO(aFieldEntries); /** @todo Allow dynamic allocation? */ 1007 uint32_t cFields = 0; 1008 1009 for (;;) 1010 { 1011 /** @todo Is an empty list allowed (currently we allow that)? */ 1012 if (rtAcpiAslLexerIsPunctuator(pThis, RTACPIASLTERMINAL_PUNCTUATOR_CLOSE_CURLY_BRACKET)) 1013 break; 1014 1015 /* 1016 * Two of the following are possible: 1017 * Offset(Integer) 1018 * NameSeg "," Integer 1019 */ 1020 bool fConsumed = false; 1021 int rc = rtAcpiAslLexerConsumeIfKeyword(pThis, RTACPIASLTERMINAL_KEYWORD_OFFSET, &fConsumed); 1022 if (RT_FAILURE(rc)) 1023 return rc; 1024 1025 if (fConsumed) 1026 { 1027 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_OPEN_BRACKET, '('); 1028 /* Must be an integer */ 1029 RTACPIASL_PARSE_NATURAL(offBytes); 1030 aFieldEntries[cFields].pszName = NULL; 1031 aFieldEntries[cFields].cBits = offBytes * sizeof(uint8_t); 1032 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_CLOSE_BRACKET, ')'); 1033 } 1034 else 1035 { 1036 /* This must be the second case. */ 1037 RTACPIASL_PARSE_NAME_STRING(pszName); /** @todo Verify that the name string consists only of a single name segment. */ 1038 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_COMMA, ','); 1039 RTACPIASL_PARSE_NATURAL(cBits); 1040 aFieldEntries[cFields].pszName = pszName; 1041 aFieldEntries[cFields].cBits = cBits; 1042 } 1043 1044 cFields++; 1045 1046 /* A following "," means there is another entry, otherwise the closing "}" should follow. */ 1047 if (!rtAcpiAslLexerIsPunctuator(pThis, RTACPIASLTERMINAL_PUNCTUATOR_COMMA)) 1048 break; 1049 1050 RTACPIASL_SKIP_CURRENT_TOKEN(); /* Skip the "," */ 1051 1052 if (cFields == RT_ELEMENTS(aFieldEntries)) 1053 return RTErrInfoSetF(pThis->pErrInfo, VERR_BUFFER_OVERFLOW, 1054 "The field list overflows the current allowed maximum of %u fields", RT_ELEMENTS(aFieldEntries)); 1055 } 1056 1057 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_CLOSE_CURLY_BRACKET, '}'); 1058 1059 /* Allocate the list to the node. */ 1060 pAstNd->paFields = (PRTACPIFIELDENTRY)RTMemAllocZ(cFields * sizeof(aFieldEntries[0])); 1061 if (!pAstNd->paFields) 1062 return RTErrInfoSetF(pThis->pErrInfo, VERR_NO_MEMORY, "Out of memory allocating field unit list with %u entries", cFields); 1063 1064 for (uint32_t i = 0; i < cFields; i++) 1065 pAstNd->paFields[i] = aFieldEntries[i]; 1066 1067 return VINF_SUCCESS; 1068 } 1069 1070 1071 static DECLCALLBACK(int) rtAcpiTblAslParseField(PRTACPIASLCU pThis, PCRTACPIASLKEYWORD pKeyword, PRTACPIASTNODE pAstNd) 1072 { 1073 RT_NOREF(pKeyword); 1074 1075 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_OPEN_BRACKET, '('); 1076 1077 /* Namestring is required. */ 1078 RTACPIASL_PARSE_NAME_STRING(pszNameString); 1079 pAstNd->aArgs[0].enmType = kAcpiAstArgType_NameString; 1080 pAstNd->aArgs[0].u.pszNameString = pszNameString; 1081 1082 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_COMMA, ','); 1083 1084 /* Must have an access type defined. */ 1085 RTACPIASL_PARSE_KEYWORD_LIST(enmAccessType, g_aenmAccessTypeKeywords); 1086 pAstNd->aArgs[1].enmType = kAcpiAstArgType_FieldAcc; 1087 switch (enmAccessType) 1088 { 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; 1095 default: 1096 AssertFailedReturn(VERR_INTERNAL_ERROR); 1097 } 1098 1099 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_COMMA, ','); 1100 1101 /* Must have a lock rule defined. */ 1102 RTACPIASL_PARSE_KEYWORD_LIST(enmLockRule, g_aenmLockRuleKeywords); 1103 pAstNd->aArgs[2].enmType = kAcpiAstArgType_Bool; 1104 switch (enmLockRule) 1105 { 1106 case RTACPIASLTERMINAL_KEYWORD_LOCK: pAstNd->aArgs[1].u.f = true; break; 1107 case RTACPIASLTERMINAL_KEYWORD_NO_LOCK: pAstNd->aArgs[1].u.f = false; break; 1108 default: 1109 AssertFailedReturn(VERR_INTERNAL_ERROR); 1110 } 1111 1112 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_COMMA, ','); 1113 1114 /* Must have an update rule defined. */ 1115 RTACPIASL_PARSE_KEYWORD_LIST(enmUpdateRule, g_aenmUpdateRuleKeywords); 1116 pAstNd->aArgs[2].enmType = kAcpiAstArgType_FieldUpdate; 1117 switch (enmUpdateRule) 1118 { 1119 case RTACPIASLTERMINAL_KEYWORD_PRESERVE: pAstNd->aArgs[2].u.enmFieldUpdate = kAcpiFieldUpdate_Preserve; break; 1120 case RTACPIASLTERMINAL_KEYWORD_WRITE_AS_ONES: pAstNd->aArgs[2].u.enmFieldUpdate = kAcpiFieldUpdate_WriteAsOnes; break; 1121 case RTACPIASLTERMINAL_KEYWORD_WRITE_AS_ZEROES: pAstNd->aArgs[2].u.enmFieldUpdate = kAcpiFieldUpdate_WriteAsZeroes; break; 1122 default: 1123 AssertFailedReturn(VERR_INTERNAL_ERROR); 1124 } 1125 1126 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_CLOSE_BRACKET, ')'); 1127 1128 /* Parse the field unit list. */ 1129 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_OPEN_CURLY_BRACKET, '{'); 1130 return rtAcpiTblParseFieldUnitList(pThis, pAstNd); 1131 } 1132 1133 1134 static DECLCALLBACK(int) rtAcpiTblAslParseResourceTemplate(PRTACPIASLCU pThis, PCRTACPIASLKEYWORD pKeyword, PRTACPIASTNODE pAstNd) 1135 { 1136 RT_NOREF(pKeyword, pAstNd); 1137 1138 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_OPEN_BRACKET, '('); 1139 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_CLOSE_BRACKET, ')'); 1140 1141 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_OPEN_CURLY_BRACKET, '{'); 1142 1143 RTACPIRES hAcpiRes = NULL; 1144 int rc = RTAcpiResourceCreate(&hAcpiRes); 1145 if (RT_FAILURE(rc)) 1146 return RTErrInfoSetF(pThis->pErrInfo, rc, "Creating the ACPI resource template failed while parsing"); 1147 1148 /* Assign here already to have the ACPI resource freed when the node gets destroyed. */ 1149 pAstNd->hAcpiRes = hAcpiRes; 1150 1151 /* Get to work */ 1152 for (;;) 1153 { 1154 RTACPIASL_PARSE_KEYWORD_LIST(enmResourceKeyword, g_aenmResourceTemplateKeywords); 1155 switch (enmResourceKeyword) 1156 { 1157 case RTACPIASLTERMINAL_KEYWORD_MEMORY32_FIXED: 1158 { 1159 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_OPEN_BRACKET, '('); 1160 RTACPIASL_PARSE_KEYWORD_LIST(enmKeywordAccess, g_aenmRwRoKeywords); 1161 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_COMMA, ','); 1162 RTACPIASL_PARSE_NATURAL(u64PhysAddrStart); 1163 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_COMMA, ','); 1164 RTACPIASL_PARSE_NATURAL(cbRegion); 1165 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_COMMA, ','); 1166 RTACPIASL_PARSE_NAME_STRING(pszName); /** @todo This is optional actually. */ 1167 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_CLOSE_BRACKET, ')'); 1168 1169 /* Check that the given range is within bounds. */ 1170 if ( u64PhysAddrStart >= _4G 1171 || cbRegion >= _4G 1172 || u64PhysAddrStart + cbRegion >= _4G 1173 || u64PhysAddrStart + cbRegion < u64PhysAddrStart) 1174 return RTErrInfoSetF(pThis->pErrInfo, VERR_INVALID_PARAMETER, 1175 "The given memory range does not fit into a 32-bit memory address space: Start=%#RX64 Size=%#RX64", 1176 u64PhysAddrStart, cbRegion); 1177 1178 rc = RTAcpiResourceAdd32BitFixedMemoryRange(hAcpiRes, u64PhysAddrStart, cbRegion, enmKeywordAccess == RTACPIASLTERMINAL_KEYWORD_READWRITE); 1179 break; 1180 } 1181 default: /* This should never occur. */ 1182 AssertReleaseFailed(); 1183 } 1184 1185 /* Done processing (indicated by the closing "}")?. */ 1186 if (rtAcpiAslLexerIsPunctuator(pThis, RTACPIASLTERMINAL_PUNCTUATOR_CLOSE_CURLY_BRACKET)) 1187 break; 1188 } 1189 1190 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_CLOSE_CURLY_BRACKET, '}'); 1191 return VINF_SUCCESS; 1192 } 1193 1194 1195 static DECLCALLBACK(int) rtAcpiTblAslParsePackageOrBuffer(PRTACPIASLCU pThis, PCRTACPIASLKEYWORD pKeyword, PRTACPIASTNODE pAstNd) 1196 { 1197 RT_NOREF(pKeyword); 1198 1199 /* The scope flag manually because the parsing is done here already. */ 1200 RTListInit(&pAstNd->LstScopeNodes); 1201 pAstNd->fFlags |= RTACPI_AST_NODE_F_NEW_SCOPE; 1202 1203 pAstNd->aArgs[0].enmType = kAcpiAstArgType_AstNode; 1204 pAstNd->aArgs[0].u.pAstNd = NULL; 1205 1206 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_OPEN_BRACKET, '('); 1207 if (!rtAcpiAslLexerIsPunctuator(pThis, RTACPIASLTERMINAL_PUNCTUATOR_CLOSE_BRACKET)) 1208 { 1209 PRTACPIASTNODE pAstNdSize = NULL; 1210 int rc = rtAcpiTblAslParseTermArg(pThis, &pAstNdSize); 1211 if (RT_FAILURE(rc)) 1212 return rc; 1213 pAstNd->aArgs[0].u.pAstNd = pAstNdSize; 1214 } 1215 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_CLOSE_BRACKET, ')'); 1216 1217 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_OPEN_CURLY_BRACKET, '{'); 1218 1219 /* Get to work */ 1220 for (;;) 1221 { 1222 /** @todo Is an empty list allowed (currently we allow that)? */ 1223 if (rtAcpiAslLexerIsPunctuator(pThis, RTACPIASLTERMINAL_PUNCTUATOR_CLOSE_CURLY_BRACKET)) 1224 break; 1225 1226 /* Parse the object */ 1227 PRTACPIASTNODE pAstNdPkg = NULL; 1228 int rc = rtAcpiTblAslParseTermArg(pThis, &pAstNdPkg); 1229 if (RT_FAILURE(rc)) 1230 return rc; 1231 1232 RTListAppend(&pAstNd->LstScopeNodes, &pAstNdPkg->NdAst); 1233 1234 /* A following "," means there is another entry, otherwise the closing "}" should follow. */ 1235 if (!rtAcpiAslLexerIsPunctuator(pThis, RTACPIASLTERMINAL_PUNCTUATOR_COMMA)) 1236 break; 1237 1238 RTACPIASL_SKIP_CURRENT_TOKEN(); /* Skip the "," */ 1239 } 1240 1241 RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_CLOSE_CURLY_BRACKET, '}'); 1242 return VINF_SUCCESS; 1243 } 890 1244 891 1245 #define RTACPI_ASL_KEYWORD_DEFINE_INVALID \ … … 934 1288 } 935 1289 1290 #define RTACPI_ASL_KEYWORD_DEFINE_0REQ_1OPT(a_szKeyword, a_fFlags, a_enmArgTypeOpt0) \ 1291 { \ 1292 a_szKeyword, NULL, 0, 0, a_fFlags, \ 1293 { kAcpiAstArgType_Invalid, \ 1294 kAcpiAstArgType_Invalid, \ 1295 kAcpiAstArgType_Invalid, \ 1296 kAcpiAstArgType_Invalid, \ 1297 kAcpiAstArgType_Invalid}, \ 1298 { \ 1299 { a_enmArgTypeOpt0, { 0 } }, \ 1300 { kAcpiAstArgType_Invalid, { 0 } }, \ 1301 { kAcpiAstArgType_Invalid, { 0 } } \ 1302 } \ 1303 } 1304 936 1305 #define RTACPI_ASL_KEYWORD_DEFINE_1REQ_0OPT(a_szKeyword, a_fFlags, a_enmArgType0) \ 937 1306 { \ … … 988 1357 /* kAcpiAstNodeOp_StringLiteral */ RTACPI_ASL_KEYWORD_DEFINE_INVALID, 989 1358 /* 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),1359 /* kAcpiAstNodeOp_Scope */ RTACPI_ASL_KEYWORD_DEFINE_1REQ_0OPT("Scope", RTACPI_AST_NODE_F_NEW_SCOPE, kAcpiAstArgType_NameString), 991 1360 /* kAcpiAstNodeOp_Processor */ { 992 1361 "Processor", NULL, 2, 2, RTACPI_AST_NODE_F_NEW_SCOPE, … … 1004 1373 } 1005 1374 }, 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), 1375 /* kAcpiAstNodeOp_External */ RTACPI_ASL_KEYWORD_DEFINE_HANDLER( "External", rtAcpiTblAslParseExternal, 1, 2, RTACPI_AST_NODE_F_DEFAULT), 1376 /* kAcpiAstNodeOp_Method */ RTACPI_ASL_KEYWORD_DEFINE_HANDLER( "Method", rtAcpiTblAslParseMethod, 1, 3, RTACPI_AST_NODE_F_NEW_SCOPE), 1377 /* kAcpiAstNodeOp_Device */ RTACPI_ASL_KEYWORD_DEFINE_1REQ_0OPT("Device", RTACPI_AST_NODE_F_NEW_SCOPE, kAcpiAstArgType_NameString), 1378 /* kAcpiAstNodeOp_If */ RTACPI_ASL_KEYWORD_DEFINE_1REQ_0OPT("If", RTACPI_AST_NODE_F_NEW_SCOPE, kAcpiAstArgType_AstNode), 1379 /* kAcpiAstNodeOp_Else */ RTACPI_ASL_KEYWORD_DEFINE_0REQ_0OPT("Else", RTACPI_AST_NODE_F_NEW_SCOPE), 1380 /* kAcpiAstNodeOp_LAnd */ RTACPI_ASL_KEYWORD_DEFINE_2REQ_0OPT("LAnd", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode, kAcpiAstArgType_AstNode), 1381 /* kAcpiAstNodeOp_LEqual */ RTACPI_ASL_KEYWORD_DEFINE_2REQ_0OPT("LEqual", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode, kAcpiAstArgType_AstNode), 1382 /* kAcpiAstNodeOp_LGreater */ RTACPI_ASL_KEYWORD_DEFINE_2REQ_0OPT("LGreater", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode, kAcpiAstArgType_AstNode), 1383 /* kAcpiAstNodeOp_LGreaterEqual */ RTACPI_ASL_KEYWORD_DEFINE_2REQ_0OPT("LGreaterEqual", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode, kAcpiAstArgType_AstNode), 1384 /* kAcpiAstNodeOp_LLess */ RTACPI_ASL_KEYWORD_DEFINE_2REQ_0OPT("LLess", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode, kAcpiAstArgType_AstNode), 1385 /* kAcpiAstNodeOp_LLessEqual */ RTACPI_ASL_KEYWORD_DEFINE_2REQ_0OPT("LLessEqual", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode, kAcpiAstArgType_AstNode), 1386 /* kAcpiAstNodeOp_LNot */ RTACPI_ASL_KEYWORD_DEFINE_2REQ_0OPT("LNot", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode, kAcpiAstArgType_AstNode), 1387 /* kAcpiAstNodeOp_LNotEqual */ RTACPI_ASL_KEYWORD_DEFINE_2REQ_0OPT("LNotEqual", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode, kAcpiAstArgType_AstNode), 1388 /* kAcpiAstNodeOp_Zero */ RTACPI_ASL_KEYWORD_DEFINE_0REQ_0OPT("Zero", RTACPI_AST_NODE_F_DEFAULT), 1389 /* kAcpiAstNodeOp_One */ RTACPI_ASL_KEYWORD_DEFINE_0REQ_0OPT("One", RTACPI_AST_NODE_F_DEFAULT), 1390 /* kAcpiAstNodeOp_Ones */ RTACPI_ASL_KEYWORD_DEFINE_0REQ_0OPT("Ones", RTACPI_AST_NODE_F_DEFAULT), 1391 /* kAcpiAstNodeOp_Return */ RTACPI_ASL_KEYWORD_DEFINE_1REQ_0OPT("Return", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode), 1392 /* kAcpiAstNodeOp_Unicode */ RTACPI_ASL_KEYWORD_DEFINE_1REQ_0OPT("Unicode", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode), /* Actually only String allowed here */ 1393 /* kAcpiAstNodeOp_OperationRegion */ RTACPI_ASL_KEYWORD_DEFINE_4REQ_0OPT("OperationRegion", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_NameString, kAcpiAstArgType_RegionSpace, kAcpiAstArgType_AstNode, kAcpiAstArgType_AstNode), 1394 /* kAcpiAstNodeOp_Field */ RTACPI_ASL_KEYWORD_DEFINE_HANDLER( "Field", rtAcpiTblAslParseField, 4, 0, RTACPI_AST_NODE_F_DEFAULT), 1395 /* kAcpiAstNodeOp_Name */ RTACPI_ASL_KEYWORD_DEFINE_2REQ_0OPT("Name", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_NameString, kAcpiAstArgType_AstNode), 1396 /* kAcpiAstNodeOp_ResourceTemplate */ RTACPI_ASL_KEYWORD_DEFINE_HANDLER( "ResourceTemplate", rtAcpiTblAslParseResourceTemplate, 0, 0, RTACPI_AST_NODE_F_DEFAULT), 1397 /* kAcpiAstNodeOp_Arg0 */ RTACPI_ASL_KEYWORD_DEFINE_0REQ_0OPT("Arg0", RTACPI_AST_NODE_F_DEFAULT), 1398 /* kAcpiAstNodeOp_Arg1 */ RTACPI_ASL_KEYWORD_DEFINE_0REQ_0OPT("Arg1", RTACPI_AST_NODE_F_DEFAULT), 1399 /* kAcpiAstNodeOp_Arg2 */ RTACPI_ASL_KEYWORD_DEFINE_0REQ_0OPT("Arg2", RTACPI_AST_NODE_F_DEFAULT), 1400 /* kAcpiAstNodeOp_Arg3 */ RTACPI_ASL_KEYWORD_DEFINE_0REQ_0OPT("Arg3", RTACPI_AST_NODE_F_DEFAULT), 1401 /* kAcpiAstNodeOp_Arg4 */ RTACPI_ASL_KEYWORD_DEFINE_0REQ_0OPT("Arg4", RTACPI_AST_NODE_F_DEFAULT), 1402 /* kAcpiAstNodeOp_Arg5 */ RTACPI_ASL_KEYWORD_DEFINE_0REQ_0OPT("Arg5", RTACPI_AST_NODE_F_DEFAULT), 1403 /* kAcpiAstNodeOp_Arg6 */ RTACPI_ASL_KEYWORD_DEFINE_0REQ_0OPT("Arg6", RTACPI_AST_NODE_F_DEFAULT), 1404 /* kAcpiAstNodeOp_Local0 */ RTACPI_ASL_KEYWORD_DEFINE_0REQ_0OPT("Local0", RTACPI_AST_NODE_F_DEFAULT), 1405 /* kAcpiAstNodeOp_Local1 */ RTACPI_ASL_KEYWORD_DEFINE_0REQ_0OPT("Local1", RTACPI_AST_NODE_F_DEFAULT), 1406 /* kAcpiAstNodeOp_Local2 */ RTACPI_ASL_KEYWORD_DEFINE_0REQ_0OPT("Local2", RTACPI_AST_NODE_F_DEFAULT), 1407 /* kAcpiAstNodeOp_Local3 */ RTACPI_ASL_KEYWORD_DEFINE_0REQ_0OPT("Local3", RTACPI_AST_NODE_F_DEFAULT), 1408 /* kAcpiAstNodeOp_Local4 */ RTACPI_ASL_KEYWORD_DEFINE_0REQ_0OPT("Local4", RTACPI_AST_NODE_F_DEFAULT), 1409 /* kAcpiAstNodeOp_Local5 */ RTACPI_ASL_KEYWORD_DEFINE_0REQ_0OPT("Local5", RTACPI_AST_NODE_F_DEFAULT), 1410 /* kAcpiAstNodeOp_Local6 */ RTACPI_ASL_KEYWORD_DEFINE_0REQ_0OPT("Local6", RTACPI_AST_NODE_F_DEFAULT), 1411 /* kAcpiAstNodeOp_Local7 */ RTACPI_ASL_KEYWORD_DEFINE_0REQ_0OPT("Local7", RTACPI_AST_NODE_F_DEFAULT), 1412 /* kAcpiAstNodeOp_Package */ RTACPI_ASL_KEYWORD_DEFINE_HANDLER( "Package", rtAcpiTblAslParsePackageOrBuffer, 0, 1, RTACPI_AST_NODE_F_DEFAULT), 1413 /* kAcpiAstNodeOp_Buffer */ RTACPI_ASL_KEYWORD_DEFINE_HANDLER( "Buffer", rtAcpiTblAslParsePackageOrBuffer, 0, 1, RTACPI_AST_NODE_F_DEFAULT), 1414 /* kAcpiAstNodeOp_ToUUid */ RTACPI_ASL_KEYWORD_DEFINE_1REQ_0OPT("ToUUID", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode), 1415 /* kAcpiAstNodeOp_DerefOf */ RTACPI_ASL_KEYWORD_DEFINE_1REQ_0OPT("DerefOf", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode), 1416 /* kAcpiAstNodeOp_Index */ RTACPI_ASL_KEYWORD_DEFINE_2REQ_0OPT("Index", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode, kAcpiAstArgType_AstNode), 1417 /* kAcpiAstNodeOp_Store */ RTACPI_ASL_KEYWORD_DEFINE_2REQ_0OPT("Store", RTACPI_AST_NODE_F_DEFAULT, kAcpiAstArgType_AstNode, kAcpiAstArgType_AstNode), 1025 1418 1026 1419 }; -
trunk/src/VBox/Runtime/common/acpi/acpi.cpp
r108059 r108066 440 440 * @param pThis The ACPI table instance. 441 441 * @param pszName The name to append, maximum is 4 bytes (or 5 if \\ is the first character). 442 * 443 * @todo This is completely wrong with how name strings are working. 442 444 */ 443 445 DECLINLINE(void) rtAcpiTblAppendNameString(PRTACPITBLINT pThis, const char *pszName) … … 449 451 rtAcpiTblCopyStringPadWith(pb, cbName, pszName, '_'); 450 452 rtAcpiTblUpdatePkgLength(pThis, cbName); 453 } 454 } 455 456 457 /** 458 * Appends a name segment or the NullName to the given ACPI table. 459 * 460 * @returns nothing. 461 * @param pThis The ACPI table instance. 462 * @param pszName The name to append, maximum is 4 chracters. If less than 4 characters 463 * anything left is padded with _. NULL means append the NullName. 464 */ 465 DECLINLINE(void) rtAcpiTblAppendNameSegOrNullName(PRTACPITBLINT pThis, const char *pszName) 466 { 467 if (!pszName) 468 { 469 uint8_t *pb = rtAcpiTblBufEnsureSpace(pThis, 1); 470 if (pb) 471 { 472 *pb = ACPI_AML_BYTE_CODE_PREFIX_NULL_NAME; 473 rtAcpiTblUpdatePkgLength(pThis, 1); 474 } 475 } 476 else 477 { 478 AssertReturnVoidStmt(strlen(pszName) <= 4, pThis->rcErr = VERR_INVALID_PARAMETER); 479 uint8_t *pb = rtAcpiTblBufEnsureSpace(pThis, 4); 480 if (pb) 481 { 482 rtAcpiTblCopyStringPadWith(pb, 4, pszName, '_'); 483 rtAcpiTblUpdatePkgLength(pThis, 4); 484 } 451 485 } 452 486 } … … 1163 1197 for (uint32_t i = 0; i < cFields; i++) 1164 1198 { 1165 rtAcpiTblAppendNameS tring(pThis, paFields[i].pszName);1199 rtAcpiTblAppendNameSegOrNullName(pThis, paFields[i].pszName); 1166 1200 rtAcpiTblEncodePkgLength(pThis, paFields[i].cBits); 1167 1201 }
Note:
See TracChangeset
for help on using the changeset viewer.