VirtualBox

Changeset 108059 in vbox


Ignore:
Timestamp:
Feb 4, 2025 1:35:41 PM (2 weeks ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
167339
Message:

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

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/iprt/acpi.h

    r108029 r108059  
    725725
    726726
     727/**
     728 * Object type.
     729 */
     730typedef 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 */
     774RTDECL(int) RTAcpiTblExternalAppend(RTACPITBL hAcpiTbl, const char *pszName, RTACPIOBJTYPE enmObjType, uint8_t cArgs);
     775
    727776
    728777/** @name ACPI resource builder related API.
  • trunk/include/iprt/formats/acpi-aml.h

    r107952 r108059  
    296296
    297297
     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
    298337/** @name Some helpers for classifying AML bytecode.
    299338 * @{ */
  • trunk/include/iprt/mangling.h

    r108029 r108059  
    404404# define RTAcpiTblElseFinalize                          RT_MANGLER(RTAcpiTblElseFinalize)
    405405# define RTAcpiTblElseStart                             RT_MANGLER(RTAcpiTblElseStart)
     406# define RTAcpiTblExternalAppend                        RT_MANGLER(RTAcpiTblExternalAppend)
    406407# define RTAcpiTblFieldAppend                           RT_MANGLER(RTAcpiTblFieldAppend)
    407408# define RTAcpiTblFinalize                              RT_MANGLER(RTAcpiTblFinalize)
  • trunk/src/VBox/Runtime/common/acpi/acpi-ast.cpp

    r108029 r108059  
    6969*********************************************************************************************************************************/
    7070
    71 DECLHIDDEN(PRTACPIASTNODE) rtAcpiAstNodeAlloc(uint8_t bOpc, uint32_t fFlags, uint8_t cArgs)
     71DECLHIDDEN(PRTACPIASTNODE) rtAcpiAstNodeAlloc(RTACPIASTNODEOP enmOp, uint32_t fFlags, uint8_t cArgs)
    7272{
    7373    PRTACPIASTNODE pAstNd = (PRTACPIASTNODE)RTMemAllocZ(RT_UOFFSETOF_DYN(RTACPIASTNODE, aArgs[cArgs]));
    7474    if (pAstNd)
    7575    {
    76         pAstNd->bOpc   = bOpc;
     76        pAstNd->enmOp  = enmOp;
    7777        pAstNd->fFlags = fFlags;
    7878        pAstNd->cArgs  = cArgs;
     
    105105
    106106
    107 static int rtAcpiAstDumpExtOpc(PCRTACPIASTNODE pAstNd, RTACPITBL hAcpiTbl)
     107DECLHIDDEN(int) rtAcpiAstDumpToTbl(PCRTACPIASTNODE pAstNd, RTACPITBL hAcpiTbl)
    108108{
    109109    int rc;
    110110
    111     switch (pAstNd->bOpc)
     111    switch (pAstNd->enmOp)
    112112    {
    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:
    114129        {
    115130            AssertBreakStmt(   pAstNd->cArgs == 4
     
    133148            break;
    134149        }
    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:
    150151        {
    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,
    153156                            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);
    155171            if (RT_SUCCESS(rc))
    156172            {
     
    158174                rc = rtAcpiAstDumpAstList(&pAstNd->LstScopeNodes, hAcpiTbl);
    159175                if (RT_SUCCESS(rc))
    160                     rc = RTAcpiTblScopeFinalize(hAcpiTbl);
     176                    rc = RTAcpiTblMethodFinalize(hAcpiTbl);
    161177            }
    162             break;
    163178        }
    164179        default:
     
    168183    return rc;
    169184}
    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     else
    177         return rtAcpiAstDumpOpc(pAstNd, hAcpiTbl);
    178 }
  • trunk/src/VBox/Runtime/common/acpi/acpi-compiler.cpp

    r108050 r108059  
    7272typedef enum RTACPIASLTERMINAL
    7373{
    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. */
    7777    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,
    80107
    81108    RTACPIASLTERMINAL_PUNCTUATOR_COMMA,
     
    86113
    87114} RTACPIASLTERMINAL;
     115/** Pointer to a terminal enum. */
     116typedef RTACPIASLTERMINAL *PRTACPIASLTERMINAL;
     117/** Pointer to a const terminal enum. */
     118typedef const RTACPIASLTERMINAL *PCRTACPIASLTERMINAL;
    88119
    89120
     
    110141
    111142
     143/** Pointer to a const ASL keyword encoding entry. */
     144typedef 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 */
     154typedef DECLCALLBACKTYPE(int, FNRTACPITBLASLPARSE,(PRTACPIASLCU pThis, PCRTACPIASLKEYWORD pKeyword, PRTACPIASTNODE pAstNd));
     155/** Pointer to a ACPI AML -> ASL decode callback. */
     156typedef FNRTACPITBLASLPARSE *PFNRTACPITBLASLPARSE;
     157
     158
    112159/**
    113160 * ASL keyword encoding entry.
     
    117164    /** Name of the opcode. */
    118165    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;
    121169    /** Number of arguments required. */
    122170    uint8_t                  cArgsReq;
     
    132180/** Pointer to a ASL keyword encoding entry. */
    133181typedef RTACPIASLKEYWORD *PRTACPIASLKEYWORD;
    134 /** Pointer to a const ASL keyword encoding entry. */
    135 typedef const RTACPIASLKEYWORD *PCRTACPIASLKEYWORD;
    136182
    137183
     
    168214{
    169215    /* 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
    170238    { 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              },
    173270
    174271    /* Punctuators */
     
    379476
    380477
    381 static int rtAcpiAslLexerConsumeIfKeyword(PCRTACPIASLCU pThis, RTACPIASLTERMINAL enmTerm, bool *pfConsumed)
     478static int rtAcpiAslLexerConsumeIfKeywordInList(PCRTACPIASLCU pThis, PCRTACPIASLTERMINAL paenmTerms, PRTACPIASLTERMINAL penmTerm)
    382479{
    383480    PCRTSCRIPTLEXTOKEN pTok;
     
    386483        return RTErrInfoSetF(pThis->pErrInfo, rc, "Lexer: Failed to query keyword token with %Rrc", rc);
    387484
     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
     506static 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
    388513    if (   pTok->enmType == RTSCRIPTLEXTOKTYPE_KEYWORD
    389514        && pTok->Type.Keyword.pKeyword->u64Val == (uint64_t)enmTerm)
     
    497622#define RTACPIASL_PARSE_KEYWORD(a_enmKeyword, a_pszKeyword) \
    498623    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); \
    501626        if (RT_FAILURE(rc2)) \
    502627            return rc2; \
    503         if (!fConsumed) \
     628        if (!fConsumed2) \
    504629            return RTErrInfoSetF(pThis->pErrInfo, VERR_INVALID_PARAMETER, "Parser: Expected keyword '%s'", a_pszKeyword); \
    505630    } while(0)
     
    507632#define RTACPIASL_PARSE_PUNCTUATOR(a_enmPunctuator, a_chPunctuator) \
    508633    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); \
    511636        if (RT_FAILURE(rc2)) \
    512637            return rc2; \
    513         if (!fConsumed) \
     638        if (!fConsumed2) \
    514639            return RTErrInfoSetF(pThis->pErrInfo, VERR_INVALID_PARAMETER, "Parser: Expected punctuator '%c'", a_chPunctuator); \
    515640    } while(0)
     
    538663    uint64_t a_u64 = 0; \
    539664    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); \
    542667        if (RT_FAILURE(rc2)) \
    543668            return rc2; \
    544         if (!fConsumed) \
     669        if (!fConsumed2) \
    545670            return RTErrInfoSetF(pThis->pErrInfo, VERR_INVALID_PARAMETER, "Parser: Expected a natural number"); \
    546671    } while(0)
     
    551676
    552677static int rtAcpiTblAslParseInner(PRTACPIASLCU pThis, PRTLISTANCHOR pLstStmts);
     678static int rtAcpiTblAslParseTermArg(PRTACPIASLCU pThis, PRTACPIASTNODE *ppAstNd);
     679
     680
     681static 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
     700static const RTACPIASLTERMINAL g_aenmSerializeRuleKeywords[] = {
     701    RTACPIASLTERMINAL_KEYWORD_SERIALIZED,
     702    RTACPIASLTERMINAL_KEYWORD_NOT_SERIALIZED,
     703    RTACPIASLTERMINAL_INVALID
     704};
     705
     706
     707static 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
     725static 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
     794static 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    }
    553980
    554981/**
    555  * Keyword encoding table, indexed by RTACPIASLTERMINAL_XXX.
     982 * Operations encoding table, indexed by kAcpiAstNodeOp_XXX.
    556983 */
    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
     984static 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                                                }
    5921005                                            },
    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_Invalid
    606                                             },
    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
    6131026};
    6141027
     1028
    6151029static int rtAcpiTblAslParseArgument(PRTACPIASLCU pThis, const char *pszKeyword, uint8_t iArg, RTACPIASTARGTYPE enmArgType, PRTACPIASTARG pArg)
    6161030{
     
    6191033        case kAcpiAstArgType_AstNode:
    6201034        {
    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;
    6221041            break;
    6231042        }
     
    6721091            break;
    6731092        }
     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        }
    6741126        default:
    6751127            AssertReleaseFailed();
     
    6801132
    6811133
    682 static int rtAcpiTblAslParseTerminal(PRTACPIASLCU pThis, RTACPIASLTERMINAL enmTerminal, PRTACPIASTNODE *ppAstNd)
     1134static int rtAcpiTblAslParseOp(PRTACPIASLCU pThis, RTACPIASTNODEOP enmOp, PRTACPIASTNODE *ppAstNd)
    6831135{
    6841136    int rc = VINF_SUCCESS;
    6851137
    686     AssertReturn(enmTerminal > 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);
    6871139
    6881140    *ppAstNd = NULL;
    6891141
    690     PCRTACPIASLKEYWORD pAslKeyword = &g_aAslKeywords[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);
    6921144    if (!pAstNd)
    6931145        return RTErrInfoSetF(pThis->pErrInfo, VERR_NO_MEMORY, "Failed to allocate ACPI AST node when processing keyword '%s'", pAslKeyword->pszOpc);
     
    6951147    *ppAstNd = pAstNd;
    6961148
    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)
    6981157    {
    6991158        RTACPIASL_PARSE_PUNCTUATOR(RTACPIASLTERMINAL_PUNCTUATOR_OPEN_BRACKET, '(');
     
    7691228
    7701229
     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 */
     1238static 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
     1287static 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
    7711358static int rtAcpiTblAslParseInner(PRTACPIASLCU pThis, PRTLISTANCHOR pLstStmts)
    7721359{
    7731360    for (;;)
    7741361    {
    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);
    7771368        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_PUNCTUATOR
    781             && 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);
    7981369            return rc;
    799         }
    800 
     1370
     1371        Assert(pAstNd);
    8011372        RTListAppend(pLstStmts, &pAstNd->NdAst);
    8021373    }
  • trunk/src/VBox/Runtime/common/acpi/acpi.cpp

    r108029 r108059  
    11721172
    11731173
     1174RTDECL(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
    11741210RTDECL(int) RTAcpiTblCreateFromVfsIoStrm(PRTACPITBL phAcpiTbl, RTVFSIOSTREAM hVfsIos, RTACPITBLTYPE enmInType, PRTERRINFO pErrInfo)
    11751211{
  • trunk/src/VBox/Runtime/include/internal/acpi.h

    r108029 r108059  
    5959    kAcpiAstArgType_AstNode,
    6060    kAcpiAstArgType_NameString,
     61    kAcpiAstArgType_Bool,
    6162    kAcpiAstArgType_U8,
    6263    kAcpiAstArgType_U16,
    6364    kAcpiAstArgType_U32,
    6465    kAcpiAstArgType_U64,
     66    kAcpiAstArgType_ObjType,
     67    kAcpiAstArgType_RegionSpace,
    6568    kAcpiAstArgType_32Bit_Hack = 0x7fffffff
    6669} RTACPIASTARGTYPE;
     
    7376{
    7477    /** Argument type. */
    75     RTACPIASTARGTYPE    enmType;
     78    RTACPIASTARGTYPE        enmType;
    7679    /** Type dependent data. */
    7780    union
    7881    {
    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;
    8692    } u;
    8793} RTACPIASTARG;
     
    9399
    94100/**
     101 * The ACPI AST node op.
     102 */
     103typedef 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/**
    95135 * The core ACPI AST node.
    96136 */
     
    99139    /** List node. */
    100140    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    };
    103157    /** Number of "arguments" for the opcode following (for example Scope(), Method(), If(), etc., i.e. anything requiring () after the keyword ). */
    104158    uint8_t             cArgs;
    105159    /** Padding */
    106160    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;
    111161    /** The AST node arguments - variable in size. */
    112162    RTACPIASTARG        aArgs[1];
     
    117167/** The AST node opens a new scope. */
    118168#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)
    121169
    122170
     
    125173 *
    126174 * @returns Pointer to the new ACPI AST node or NULL if out of memory.
    127  * @param   bOpc                The opcode value for the AST node.
     175 * @param   enmOp               The operation of the AST node.
    128176 * @param   fFlags              Flags for this node.
    129177 * @param   cArgs               Number of arguments to allocate.
    130178 */
    131 DECLHIDDEN(PRTACPIASTNODE) rtAcpiAstNodeAlloc(uint8_t bOpc, uint32_t fFlags, uint8_t cArgs);
     179DECLHIDDEN(PRTACPIASTNODE) rtAcpiAstNodeAlloc(RTACPIASTNODEOP enmOp, uint32_t fFlags, uint8_t cArgs);
    132180
    133181
Note: See TracChangeset for help on using the changeset viewer.

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