VirtualBox

Changeset 108066 in vbox for trunk/src


Ignore:
Timestamp:
Feb 5, 2025 11:33:27 AM (3 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
167346
Message:

Runtime/RTAcpi*: Updates to the ACPI ASL -> AML compiler, bugref:10733

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  
    106106    RTACPIASLTERMINAL_KEYWORD_FFIXED_HW,
    107107
     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
    108128    RTACPIASLTERMINAL_PUNCTUATOR_COMMA,
    109129    RTACPIASLTERMINAL_PUNCTUATOR_OPEN_BRACKET,
     
    235255    { RT_STR_TUPLE("UNICODE"),                  RTSCRIPTLEXTOKTYPE_KEYWORD,    true,  kAcpiAstNodeOp_Unicode                           },
    236256    { 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. */
    238283    { RT_STR_TUPLE("DEFINITIONBLOCK"),          RTSCRIPTLEXTOKTYPE_KEYWORD,    true,  RTACPIASLTERMINAL_KEYWORD_DEFINITION_BLOCK       },
    239284    { RT_STR_TUPLE("UNKNOWNOBJ"),               RTSCRIPTLEXTOKTYPE_KEYWORD,    true,  RTACPIASLTERMINAL_KEYWORD_UNKNOWN_OBJ            },
     
    268313    { RT_STR_TUPLE("PRM"),                      RTSCRIPTLEXTOKTYPE_KEYWORD,    true,  RTACPIASLTERMINAL_KEYWORD_PRM                    },
    269314    { 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              },
    270334
    271335    /* Punctuators */
     
    630694    } while(0)
    631695
     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
    632706#define RTACPIASL_PARSE_PUNCTUATOR(a_enmPunctuator, a_chPunctuator) \
    633707    do { \
     
    721795    RTACPIASLTERMINAL_INVALID
    722796};
     797
     798
     799static 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
     810static const RTACPIASLTERMINAL g_aenmLockRuleKeywords[] = {
     811    RTACPIASLTERMINAL_KEYWORD_LOCK,
     812    RTACPIASLTERMINAL_KEYWORD_NO_LOCK,
     813    RTACPIASLTERMINAL_INVALID
     814};
     815
     816
     817static 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
     825static const RTACPIASLTERMINAL g_aenmResourceTemplateKeywords[] = {
     826    RTACPIASLTERMINAL_KEYWORD_MEMORY32_FIXED,
     827    RTACPIASLTERMINAL_INVALID
     828};
     829
     830
     831static const RTACPIASLTERMINAL g_aenmRwRoKeywords[] = {
     832    RTACPIASLTERMINAL_KEYWORD_READONLY,
     833    RTACPIASLTERMINAL_KEYWORD_READWRITE,
     834    RTACPIASLTERMINAL_INVALID
     835};
     836
    723837
    724838
     
    8881002
    8891003
     1004static 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
     1071static 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
     1134static 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
     1195static 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}
    8901244
    8911245#define RTACPI_ASL_KEYWORD_DEFINE_INVALID \
     
    9341288    }
    9351289
     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
    9361305#define RTACPI_ASL_KEYWORD_DEFINE_1REQ_0OPT(a_szKeyword, a_fFlags, a_enmArgType0) \
    9371306    { \
     
    9881357    /* kAcpiAstNodeOp_StringLiteral     */  RTACPI_ASL_KEYWORD_DEFINE_INVALID,
    9891358    /* 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),
    9911360    /* kAcpiAstNodeOp_Processor         */  {
    9921361                                                "Processor", NULL, 2, 2, RTACPI_AST_NODE_F_NEW_SCOPE,
     
    10041373                                                }
    10051374                                            },
    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),
    10251418
    10261419};
  • trunk/src/VBox/Runtime/common/acpi/acpi.cpp

    r108059 r108066  
    440440 * @param pThis                 The ACPI table instance.
    441441 * @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.
    442444 */
    443445DECLINLINE(void) rtAcpiTblAppendNameString(PRTACPITBLINT pThis, const char *pszName)
     
    449451        rtAcpiTblCopyStringPadWith(pb, cbName, pszName, '_');
    450452        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 */
     465DECLINLINE(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        }
    451485    }
    452486}
     
    11631197    for (uint32_t i = 0; i < cFields; i++)
    11641198    {
    1165         rtAcpiTblAppendNameString(pThis, paFields[i].pszName);
     1199        rtAcpiTblAppendNameSegOrNullName(pThis, paFields[i].pszName);
    11661200        rtAcpiTblEncodePkgLength(pThis, paFields[i].cBits);
    11671201    }
Note: See TracChangeset for help on using the changeset viewer.

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