/*** namedobj.c - Parse named object instructions * * Copyright (c) 1996,1997 Microsoft Corporation * Author: Michael Tsang (MikeTs) * Created 09/10/96 * * MODIFICATION HISTORY */ #include "pch.h" #ifdef LOCKABLE_PRAGMA #pragma ACPI_LOCKABLE_DATA #pragma ACPI_LOCKABLE_CODE #endif /***LP BankField - Parse and execute the BankField instruction * * ENTRY * pctxt -> CTXT * pterm -> TERM * * EXIT-SUCCESS * returns STATUS_SUCCESS * EXIT-FAILURE * returns AMLIERR_ code */ NTSTATUS LOCAL BankField(PCTXT pctxt, PTERM pterm) { TRACENAME("BANKFIELD") NTSTATUS rc = STATUS_SUCCESS; PNSOBJ pnsBase, pnsBank; ENTER(2, ("BankField(pctxt=%x,pterm=%x,pbOp=%x)\n", pctxt, pterm, pctxt->pbOp)); if (((rc = GetNameSpaceObject((PSZ)pterm->pdataArgs[0].pbDataBuff, pctxt->pnsScope, &pnsBase, NSF_WARN_NOTFOUND)) == STATUS_SUCCESS) && ((rc = GetNameSpaceObject((PSZ)pterm->pdataArgs[1].pbDataBuff, pctxt->pnsScope, &pnsBank, NSF_WARN_NOTFOUND)) == STATUS_SUCCESS)) { if (pnsBase->ObjData.dwDataType != OBJTYPE_OPREGION) { rc = AMLI_LOGERR(AMLIERR_UNEXPECTED_OBJTYPE, ("BankField: %s is not an operation region", pterm->pdataArgs[0].pbDataBuff)); } else if (pnsBank->ObjData.dwDataType != OBJTYPE_FIELDUNIT) { rc = AMLI_LOGERR(AMLIERR_UNEXPECTED_OBJTYPE, ("BankField: %s is not a field unit", pterm->pdataArgs[1].pbDataBuff)); } else if ((rc = CreateNameSpaceObject(pctxt->pheapCurrent, NULL, pctxt->pnsScope, pctxt->powner, &pterm->pnsObj, 0)) == STATUS_SUCCESS) { pterm->pnsObj->ObjData.dwDataType = OBJTYPE_BANKFIELD; pterm->pnsObj->ObjData.dwDataLen = sizeof(BANKFIELDOBJ); if ((pterm->pnsObj->ObjData.pbDataBuff = NEWKFOBJ(pctxt->pheapCurrent, pterm->pnsObj->ObjData.dwDataLen)) == NULL) { rc = AMLI_LOGERR(AMLIERR_OUT_OF_MEM, ("BankField: failed to allocate BankField object")); } else { PBANKFIELDOBJ pbf; MEMZERO(pterm->pnsObj->ObjData.pbDataBuff, pterm->pnsObj->ObjData.dwDataLen); pbf = (PBANKFIELDOBJ)pterm->pnsObj->ObjData.pbDataBuff; pbf->pnsBase = pnsBase; pbf->pnsBank = pnsBank; pbf->dwBankValue = (ULONG)pterm->pdataArgs[2].uipDataValue; rc = ParseFieldList(pctxt, pterm->pbOpEnd, pterm->pnsObj, (ULONG)pterm->pdataArgs[3].uipDataValue, ((POPREGIONOBJ)pnsBase->ObjData.pbDataBuff)->dwLen); } } } EXIT(2, ("BankField=%x (pnsObj=%x)\n", rc, pterm->pnsObj)); return rc; } //BankField /***LP CreateXField - Parse and execute the CreateXField instructions * * ENTRY * pctxt -> CTXT * pterm -> TERM * pdataTarget -> Target object data * ppbf -> to hold created target BuffField object * * EXIT-SUCCESS * returns STATUS_SUCCESS * EXIT-FAILURE * returns AMLIERR_ code */ NTSTATUS LOCAL CreateXField(PCTXT pctxt, PTERM pterm, POBJDATA pdataTarget, PBUFFFIELDOBJ *ppbf) { TRACENAME("CREATEXFIELD") NTSTATUS rc = STATUS_SUCCESS; POBJDATA pdata = NULL; ENTER(2, ("CreateXField(pctxt=%x,pbOp=%x,pterm=%x,pdataTarget=%x,ppbf=%x)\n", pctxt, pctxt->pbOp, pterm, pdataTarget, ppbf)); ASSERT(pdataTarget != NULL); ASSERT(pdataTarget->dwDataType == OBJTYPE_STRDATA); if (((rc = ValidateArgTypes(pterm->pdataArgs, "BI")) == STATUS_SUCCESS) && ((rc = CreateNameSpaceObject(pctxt->pheapCurrent, (PSZ)pdataTarget->pbDataBuff, pctxt->pnsScope, pctxt->powner, &pterm->pnsObj, 0)) == STATUS_SUCCESS)) { pdata = &pterm->pnsObj->ObjData; pdata->dwDataType = OBJTYPE_BUFFFIELD; pdata->dwDataLen = sizeof(BUFFFIELDOBJ); if ((pdata->pbDataBuff = NEWBFOBJ(pctxt->pheapCurrent, pdata->dwDataLen)) == NULL) { rc = AMLI_LOGERR(AMLIERR_OUT_OF_MEM, ("CreateXField: failed to allocate BuffField object")); } else { MEMZERO(pdata->pbDataBuff, pdata->dwDataLen); *ppbf = (PBUFFFIELDOBJ)pdata->pbDataBuff; (*ppbf)->pbDataBuff = pterm->pdataArgs[0].pbDataBuff; (*ppbf)->dwBuffLen = pterm->pdataArgs[0].dwDataLen; } } EXIT(2, ("CreateXField=%x (pdata=%x)\n", rc, pdata)); return rc; } //CreateXField /***LP CreateBitField - Parse and execute the CreateBitField instruction * * ENTRY * pctxt -> CTXT * pterm -> TERM * * EXIT-SUCCESS * returns STATUS_SUCCESS * EXIT-FAILURE * returns AMLIERR_ code */ NTSTATUS LOCAL CreateBitField(PCTXT pctxt, PTERM pterm) { TRACENAME("CREATEBITFIELD") NTSTATUS rc = STATUS_SUCCESS; PBUFFFIELDOBJ pbf; ENTER(2, ("CreateBitField(pctxt=%x,pbOp=%x,pterm=%x)\n", pctxt, pctxt->pbOp, pterm)); if ((rc = CreateXField(pctxt, pterm, &pterm->pdataArgs[2], &pbf)) == STATUS_SUCCESS) { pbf->FieldDesc.dwByteOffset = (ULONG) (pterm->pdataArgs[1].uipDataValue/8); pbf->FieldDesc.dwStartBitPos = (ULONG) (pterm->pdataArgs[1].uipDataValue - pbf->FieldDesc.dwByteOffset*8); pbf->FieldDesc.dwNumBits = 1; pbf->FieldDesc.dwFieldFlags = ACCTYPE_BYTE; } EXIT(2, ("CreateBitField=%x (pnsObj=%x)\n", rc, pterm->pnsObj)); return rc; } //CreateBitField /***LP CreateByteField - Parse and execute the CreateByteField instruction * * ENTRY * pctxt -> CTXT * pterm -> TERM * * EXIT-SUCCESS * returns STATUS_SUCCESS * EXIT-FAILURE * returns AMLIERR_ code */ NTSTATUS LOCAL CreateByteField(PCTXT pctxt, PTERM pterm) { TRACENAME("CREATEBYTEFIELD") NTSTATUS rc = STATUS_SUCCESS; PBUFFFIELDOBJ pbf; ENTER(2, ("CreateByteField(pctxt=%x,pbOp=%x,pterm=%x)\n", pctxt, pctxt->pbOp, pterm)); if ((rc = CreateXField(pctxt, pterm, &pterm->pdataArgs[2], &pbf)) == STATUS_SUCCESS) { pbf->FieldDesc.dwByteOffset = (ULONG)pterm->pdataArgs[1].uipDataValue; pbf->FieldDesc.dwStartBitPos = 0; pbf->FieldDesc.dwNumBits = 8*sizeof(UCHAR); pbf->FieldDesc.dwFieldFlags = ACCTYPE_BYTE; } EXIT(2, ("CreateByteField=%x (pnsObj=%x)\n", rc, pterm->pnsObj)); return rc; } //CreateByteField /***LP CreateWordField - Parse and execute the CreateWordField instruction * * ENTRY * pctxt -> CTXT * pterm -> TERM * * EXIT-SUCCESS * returns STATUS_SUCCESS * EXIT-FAILURE * returns AMLIERR_ code */ NTSTATUS LOCAL CreateWordField(PCTXT pctxt, PTERM pterm) { TRACENAME("CREATEWORDFIELD") NTSTATUS rc = STATUS_SUCCESS; PBUFFFIELDOBJ pbf; ENTER(2, ("CreateWordField(pctxt=%x,pbOp=%x,pterm=%x)\n", pctxt, pctxt->pbOp, pterm)); if ((rc = CreateXField(pctxt, pterm, &pterm->pdataArgs[2], &pbf)) == STATUS_SUCCESS) { pbf->FieldDesc.dwByteOffset = (ULONG)pterm->pdataArgs[1].uipDataValue; pbf->FieldDesc.dwStartBitPos = 0; pbf->FieldDesc.dwNumBits = 8*sizeof(USHORT); pbf->FieldDesc.dwFieldFlags = ACCTYPE_WORD; } EXIT(2, ("CreateWordField=%x (pnsObj=%x)\n", rc, pterm->pnsObj)); return rc; } //CreateWordField /***LP CreateDWordField - Parse and execute the CreateDWordField instruction * * ENTRY * pctxt -> CTXT * pterm -> TERM * * EXIT-SUCCESS * returns STATUS_SUCCESS * EXIT-FAILURE * returns AMLIERR_ code */ NTSTATUS LOCAL CreateDWordField(PCTXT pctxt, PTERM pterm) { TRACENAME("CREATEDWORDFIELD") NTSTATUS rc = STATUS_SUCCESS; PBUFFFIELDOBJ pbf; ENTER(2, ("CreateDWordField(pctxt=%x,pbOp=%x,pterm=%x)\n", pctxt, pctxt->pbOp, pterm)); if ((rc = CreateXField(pctxt, pterm, &pterm->pdataArgs[2], &pbf)) == STATUS_SUCCESS) { pbf->FieldDesc.dwByteOffset = (ULONG)pterm->pdataArgs[1].uipDataValue; pbf->FieldDesc.dwStartBitPos = 0; pbf->FieldDesc.dwNumBits = 8*sizeof(ULONG); pbf->FieldDesc.dwFieldFlags = ACCTYPE_DWORD; } EXIT(2, ("CreateDWordField=%x (pnsObj=%x)\n", rc, pterm->pnsObj)); return rc; } //CreateDWordField /***LP CreateField - Parse and execute the CreateField instruction * * ENTRY * pctxt -> CTXT * pterm -> TERM * * EXIT-SUCCESS * returns STATUS_SUCCESS * EXIT-FAILURE * returns AMLIERR_ code */ NTSTATUS LOCAL CreateField(PCTXT pctxt, PTERM pterm) { TRACENAME("CREATEFIELD") NTSTATUS rc = STATUS_SUCCESS; PBUFFFIELDOBJ pbf; ENTER(2, ("CreateField(pctxt=%x,pbOp=%x,pterm=%x)\n", pctxt, pctxt->pbOp, pterm)); if (pterm->pdataArgs[2].dwDataType == OBJTYPE_INTDATA) { if ((rc = CreateXField(pctxt, pterm, &pterm->pdataArgs[3], &pbf)) == STATUS_SUCCESS) { pbf->FieldDesc.dwByteOffset = (ULONG) (pterm->pdataArgs[1].uipDataValue/8); pbf->FieldDesc.dwStartBitPos = (ULONG) (pterm->pdataArgs[1].uipDataValue - pbf->FieldDesc.dwByteOffset*8); pbf->FieldDesc.dwNumBits = (ULONG)pterm->pdataArgs[2].uipDataValue; pbf->FieldDesc.dwFieldFlags = ACCTYPE_BYTE | FDF_BUFFER_TYPE; } } else { rc = AMLI_LOGERR(AMLIERR_UNEXPECTED_ARGTYPE, ("CreateField: NoBits must be evaluated to integer type")); } EXIT(2, ("CreateField=%x (pnsObj=%x)\n", rc, pterm->pnsObj)); return rc; } //CreateField /***LP Device - Parse and execute the Scope instruction * * ENTRY * pctxt -> CTXT * pterm -> TERM * * EXIT-SUCCESS * returns STATUS_SUCCESS * EXIT-FAILURE * returns AMLIERR_ code */ NTSTATUS LOCAL Device(PCTXT pctxt, PTERM pterm) { TRACENAME("DEVICE") NTSTATUS rc = STATUS_SUCCESS; ENTER(2, ("Device(pctxt=%x,pbOp=%x,pterm=%x)\n", pctxt, pctxt->pbOp, pterm)); if ((rc = CreateNameSpaceObject(pctxt->pheapCurrent, (PSZ)pterm->pdataArgs[0].pbDataBuff, pctxt->pnsScope, pctxt->powner, &pterm->pnsObj, 0)) == STATUS_SUCCESS) { pterm->pnsObj->ObjData.dwDataType = OBJTYPE_DEVICE; if (ghCreate.pfnHandler != NULL) { ((PFNOO)ghCreate.pfnHandler)(OBJTYPE_DEVICE, pterm->pnsObj); } rc = PushScope(pctxt, pctxt->pbOp, pterm->pbOpEnd, NULL, pterm->pnsObj, pctxt->powner, pctxt->pheapCurrent, pterm->pdataResult); } EXIT(2, ("Device=%x (pnsObj=%x)\n", rc, pterm->pnsObj)); return rc; } //Device /***LP InitEvent - Initialize an event object * * ENTRY * pheap -> HEAP * pns -> event object to be initialized * * EXIT-SUCCESS * returns STATUS_SUCCESS * EXIT-FAILURE * returns AMLIERR_ code */ NTSTATUS LOCAL InitEvent(PHEAP pheap, PNSOBJ pns) { TRACENAME("INITEVENT") NTSTATUS rc = STATUS_SUCCESS; ENTER(2, ("InitEvent(pheap=%x,pns=%x)\n", pheap, pns)); pns->ObjData.dwDataType = OBJTYPE_EVENT; pns->ObjData.dwDataLen = sizeof(EVENTOBJ); if ((pns->ObjData.pbDataBuff = NEWEVOBJ(pheap, pns->ObjData.dwDataLen)) == NULL) { rc = AMLI_LOGERR(AMLIERR_OUT_OF_MEM, ("InitEvent: failed to allocate Event object")); } else { MEMZERO(pns->ObjData.pbDataBuff, pns->ObjData.dwDataLen); } EXIT(2, ("InitEvent=%x\n", rc)); return rc; } //InitEvent /***LP Event - Parse and execute the Event instruction * * ENTRY * pctxt -> CTXT * pterm -> TERM * * EXIT-SUCCESS * returns STATUS_SUCCESS * EXIT-FAILURE * returns AMLIERR_ code */ NTSTATUS LOCAL Event(PCTXT pctxt, PTERM pterm) { TRACENAME("EVENT") NTSTATUS rc = STATUS_SUCCESS; ENTER(2, ("Event(pctxt=%x,pbOp=%x,pterm=%x)\n", pctxt, pctxt->pbOp, pterm)); if ((rc = CreateNameSpaceObject(pctxt->pheapCurrent, (PSZ)pterm->pdataArgs[0].pbDataBuff, pctxt->pnsScope, pctxt->powner, &pterm->pnsObj, 0)) == STATUS_SUCCESS) { rc = InitEvent(pctxt->pheapCurrent, pterm->pnsObj); } EXIT(2, ("Event=%x (pnsObj=%x)\n", rc, pterm->pnsObj)); return rc; } //Event /***LP Field - Parse and execute the Field instruction * * ENTRY * pctxt -> CTXT * pterm -> TERM * * EXIT-SUCCESS * returns STATUS_SUCCESS * EXIT-FAILURE * returns AMLIERR_ code */ NTSTATUS LOCAL Field(PCTXT pctxt, PTERM pterm) { TRACENAME("FIELD") NTSTATUS rc = STATUS_SUCCESS; PNSOBJ pnsBase; ENTER(2, ("Field(pctxt=%x,pbOp=%x,pterm=%x)\n", pctxt, pctxt->pbOp, pterm)); if ((rc = GetNameSpaceObject((PSZ)pterm->pdataArgs[0].pbDataBuff, pctxt->pnsScope, &pnsBase, NSF_WARN_NOTFOUND)) == STATUS_SUCCESS) { if (pnsBase->ObjData.dwDataType != OBJTYPE_OPREGION) { rc = AMLI_LOGERR(AMLIERR_UNEXPECTED_OBJTYPE, ("Field: %s is not an operation region", pterm->pdataArgs[0].pbDataBuff)); } else if ((rc = CreateNameSpaceObject(pctxt->pheapCurrent, NULL, pctxt->pnsScope, pctxt->powner, &pterm->pnsObj, 0)) == STATUS_SUCCESS) { pterm->pnsObj->ObjData.dwDataType = OBJTYPE_FIELD; pterm->pnsObj->ObjData.dwDataLen = sizeof(FIELDOBJ); if ((pterm->pnsObj->ObjData.pbDataBuff = NEWFOBJ(pctxt->pheapCurrent, pterm->pnsObj->ObjData.dwDataLen)) == NULL) { rc = AMLI_LOGERR(AMLIERR_OUT_OF_MEM, ("Field: failed to allocate Field object")); } else { PFIELDOBJ pfd; MEMZERO(pterm->pnsObj->ObjData.pbDataBuff, pterm->pnsObj->ObjData.dwDataLen); pfd = (PFIELDOBJ)pterm->pnsObj->ObjData.pbDataBuff; pfd->pnsBase = pnsBase; rc = ParseFieldList(pctxt, pterm->pbOpEnd, pterm->pnsObj, (ULONG)pterm->pdataArgs[1].uipDataValue, ((POPREGIONOBJ)pnsBase->ObjData.pbDataBuff)->dwLen); } } } EXIT(2, ("Field=%x (pnsObj=%x)\n", rc, pterm->pnsObj)); return rc; } //Field /***LP IndexField - Parse and execute the Field instruction * * ENTRY * pctxt -> CTXT * pterm -> TERM * * EXIT-SUCCESS * returns STATUS_SUCCESS * EXIT-FAILURE * returns AMLIERR_ code */ NTSTATUS LOCAL IndexField(PCTXT pctxt, PTERM pterm) { TRACENAME("INDEXFIELD") NTSTATUS rc = STATUS_SUCCESS; PNSOBJ pnsIdx, pnsData; ENTER(2, ("IndexField(pctxt=%x,pbOp=%x,pterm=%x)\n", pctxt, pctxt->pbOp, pterm)); if (((rc = GetNameSpaceObject((PSZ)pterm->pdataArgs[0].pbDataBuff, pctxt->pnsScope, &pnsIdx, NSF_WARN_NOTFOUND)) == STATUS_SUCCESS) && ((rc = GetNameSpaceObject((PSZ)pterm->pdataArgs[1].pbDataBuff, pctxt->pnsScope, &pnsData, NSF_WARN_NOTFOUND)) == STATUS_SUCCESS)) { if (pnsIdx->ObjData.dwDataType != OBJTYPE_FIELDUNIT) { rc = AMLI_LOGERR(AMLIERR_UNEXPECTED_OBJTYPE, ("IndexField: Index (%s) is not a field unit", pterm->pdataArgs[0].pbDataBuff)); } else if (pnsData->ObjData.dwDataType != OBJTYPE_FIELDUNIT) { rc = AMLI_LOGERR(AMLIERR_UNEXPECTED_OBJTYPE, ("IndexField: Data (%s) is not a field unit", pterm->pdataArgs[1].pbDataBuff)); } else if ((rc = CreateNameSpaceObject(pctxt->pheapCurrent, NULL, pctxt->pnsScope, pctxt->powner, &pterm->pnsObj, 0)) == STATUS_SUCCESS) { pterm->pnsObj->ObjData.dwDataType = OBJTYPE_INDEXFIELD; pterm->pnsObj->ObjData.dwDataLen = sizeof(INDEXFIELDOBJ); if ((pterm->pnsObj->ObjData.pbDataBuff = NEWIFOBJ(pctxt->pheapCurrent, pterm->pnsObj->ObjData.dwDataLen)) == NULL) { rc = AMLI_LOGERR(AMLIERR_OUT_OF_MEM, ("IndexField: failed to allocate IndexField object")); } else { PINDEXFIELDOBJ pif; MEMZERO(pterm->pnsObj->ObjData.pbDataBuff, pterm->pnsObj->ObjData.dwDataLen); pif = (PINDEXFIELDOBJ)pterm->pnsObj->ObjData.pbDataBuff; pif->pnsIndex = pnsIdx; pif->pnsData = pnsData; rc = ParseFieldList(pctxt, pterm->pbOpEnd, pterm->pnsObj, (ULONG)pterm->pdataArgs[2].uipDataValue, 0xffffffff); } } } EXIT(2, ("IndexField=%x (pnsObj=%x)\n", rc, pterm->pnsObj)); return rc; } //IndexField /***LP Method - Parse and execute the Method instruction * * ENTRY * pctxt -> CTXT * pterm -> TERM * * EXIT-SUCCESS * returns STATUS_SUCCESS * EXIT-FAILURE * returns AMLIERR_ code */ NTSTATUS LOCAL Method(PCTXT pctxt, PTERM pterm) { TRACENAME("METHOD") NTSTATUS rc = STATUS_SUCCESS; ENTER(2, ("Method(pctxt=%x,pbOp=%x,pterm=%x)\n", pctxt, pctxt->pbOp, pterm)); if ((rc = CreateNameSpaceObject(pctxt->pheapCurrent, (PSZ)pterm->pdataArgs[0].pbDataBuff, pctxt->pnsScope, pctxt->powner, &pterm->pnsObj, 0)) == STATUS_SUCCESS) { pterm->pnsObj->ObjData.dwDataType = OBJTYPE_METHOD; pterm->pnsObj->ObjData.dwDataLen = (ULONG)(FIELD_OFFSET(METHODOBJ, abCodeBuff) + pterm->pbOpEnd - pctxt->pbOp); if ((pterm->pnsObj->ObjData.pbDataBuff = NEWMEOBJ(pctxt->pheapCurrent, pterm->pnsObj->ObjData.dwDataLen)) == NULL) { rc = AMLI_LOGERR(AMLIERR_OUT_OF_MEM, ("Method: failed to allocate method buffer")); } else { PMETHODOBJ pm = (PMETHODOBJ)pterm->pnsObj->ObjData.pbDataBuff; #ifdef DEBUGGER AddObjSymbol(pm->abCodeBuff, pterm->pnsObj); #endif MEMZERO(pterm->pnsObj->ObjData.pbDataBuff, pterm->pnsObj->ObjData.dwDataLen); pm->bMethodFlags = *(pctxt->pbOp - 1); MEMCPY(&pm->abCodeBuff, pctxt->pbOp, pterm->pbOpEnd - pctxt->pbOp); pctxt->pbOp = pterm->pbOpEnd; } } EXIT(2, ("Method=%x (pnsObj=%x)\n", rc, pterm->pnsObj)); return rc; } //Method /***LP InitMutex - Initialize a mutex object * * ENTRY * pheap -> HEAP * pns -> mutex object to be initialized * dwLevel - sync level * * EXIT-SUCCESS * returns STATUS_SUCCESS * EXIT-FAILURE * returns AMLIERR_ code */ NTSTATUS LOCAL InitMutex(PHEAP pheap, PNSOBJ pns, ULONG dwLevel) { TRACENAME("INITMUTEX") NTSTATUS rc = STATUS_SUCCESS; ENTER(2, ("InitMutex(pheap=%x,pns=%x,Level=%x)\n", pheap, pns, dwLevel)); pns->ObjData.dwDataType = OBJTYPE_MUTEX; pns->ObjData.dwDataLen = sizeof(MUTEXOBJ); if ((pns->ObjData.pbDataBuff = NEWMTOBJ(pheap, pns->ObjData.dwDataLen)) == NULL) { rc = AMLI_LOGERR(AMLIERR_OUT_OF_MEM, ("InitMutex: failed to allocate Mutex object")); } else { MEMZERO(pns->ObjData.pbDataBuff, pns->ObjData.dwDataLen); ((PMUTEXOBJ)pns->ObjData.pbDataBuff)->dwSyncLevel = dwLevel; } EXIT(2, ("InitMutex=%x\n", rc)); return rc; } //InitMutex /***LP Mutex - Parse and execute the Mutex instruction * * ENTRY * pctxt -> CTXT * pterm -> TERM * * EXIT-SUCCESS * returns STATUS_SUCCESS * EXIT-FAILURE * returns AMLIERR_ code */ NTSTATUS LOCAL Mutex(PCTXT pctxt, PTERM pterm) { TRACENAME("MUTEX") NTSTATUS rc = STATUS_SUCCESS; ENTER(2, ("Mutex(pctxt=%x,pbOp=%x,pterm=%x)\n", pctxt, pctxt->pbOp, pterm)); if ((rc = CreateNameSpaceObject(pctxt->pheapCurrent, (PSZ)pterm->pdataArgs[0].pbDataBuff, pctxt->pnsScope, pctxt->powner, &pterm->pnsObj, 0)) == STATUS_SUCCESS) { rc = InitMutex(pctxt->pheapCurrent, pterm->pnsObj, (ULONG)pterm->pdataArgs[1].uipDataValue); } EXIT(2, ("Mutex=%x (pnsObj=%x)\n", rc, pterm->pnsObj)); return rc; } //Mutex /***LP OpRegion - Parse and execute the Field instruction * * ENTRY * pctxt -> CTXT * pterm -> TERM * * EXIT-SUCCESS * returns STATUS_SUCCESS * EXIT-FAILURE * returns AMLIERR_ code */ NTSTATUS LOCAL OpRegion(PCTXT pctxt, PTERM pterm) { TRACENAME("OPREGION") NTSTATUS rc = STATUS_SUCCESS; ENTER(2, ("OpRegion(pctxt=%x,pbOp=%x,pterm=%x)\n", pctxt, pctxt->pbOp, pterm)); if ((rc = CreateNameSpaceObject(pctxt->pheapCurrent, (PSZ)pterm->pdataArgs[0].pbDataBuff, pctxt->pnsScope, pctxt->powner, &pterm->pnsObj, 0)) == STATUS_SUCCESS) { pterm->pnsObj->ObjData.dwDataType = OBJTYPE_OPREGION; pterm->pnsObj->ObjData.dwDataLen = sizeof(OPREGIONOBJ); if ((pterm->pnsObj->ObjData.pbDataBuff = NEWOROBJ(pctxt->pheapCurrent, pterm->pnsObj->ObjData.dwDataLen)) == NULL) { rc = AMLI_LOGERR(AMLIERR_OUT_OF_MEM, ("OpRegion: failed to allocate OpRegion object")); } else { POPREGIONOBJ pop; MEMZERO(pterm->pnsObj->ObjData.pbDataBuff, pterm->pnsObj->ObjData.dwDataLen); pop = (POPREGIONOBJ)pterm->pnsObj->ObjData.pbDataBuff; pop->bRegionSpace = (UCHAR)pterm->pdataArgs[1].uipDataValue; pop->uipOffset = pterm->pdataArgs[2].uipDataValue; pop->dwLen = (ULONG)pterm->pdataArgs[3].uipDataValue; KeInitializeSpinLock(&pop->listLock); if (pop->bRegionSpace == REGSPACE_MEM) { if(gInitTime) { ValidateMemoryOpregionRange(pop->uipOffset, pop->dwLen); } rc = MapUnmapPhysMem(pctxt, pop->uipOffset, pop->dwLen, &pop->uipOffset); } else if (pop->bRegionSpace == REGSPACE_IO) { PHYSICAL_ADDRESS phyaddr = {0, 0}, XlatedAddr; ULONG dwAddrSpace; phyaddr.LowPart = (ULONG)pop->uipOffset; dwAddrSpace = 1; if (HalTranslateBusAddress(Internal, 0, phyaddr, &dwAddrSpace, &XlatedAddr)) { pop->uipOffset = (ULONG_PTR)XlatedAddr.LowPart; } else { rc = AMLI_LOGERR(AMLIERR_FAILED_ADDR_XLATE, ("OpRegion: failed to translate IO address %x", pop->uipOffset)); } } else if (pop->bRegionSpace == REGSPACE_PCIBARTARGET) { if (ghCreate.pfnHandler != NULL) { ((PFNOO)ghCreate.pfnHandler)(OBJTYPE_OPREGION, pterm->pnsObj); } } } } EXIT(2, ("OpRegion=%x (pnsObj=%x)\n", rc, pterm->pnsObj)); return rc; } //OpRegion /***LP PowerRes - Parse and execute the PowerRes instruction * * ENTRY * pctxt -> CTXT * pterm -> TERM * * EXIT-SUCCESS * returns STATUS_SUCCESS * EXIT-FAILURE * returns AMLIERR_ code */ NTSTATUS LOCAL PowerRes(PCTXT pctxt, PTERM pterm) { TRACENAME("POWERRES") NTSTATUS rc = STATUS_SUCCESS; ENTER(2, ("PowerRes(pctxt=%x,pbOp=%x,pterm=%x)\n", pctxt, pctxt->pbOp, pterm)); if ((rc = CreateNameSpaceObject(pctxt->pheapCurrent, (PSZ)pterm->pdataArgs[0].pbDataBuff, pctxt->pnsScope, pctxt->powner, &pterm->pnsObj, 0)) == STATUS_SUCCESS) { pterm->pnsObj->ObjData.dwDataType = OBJTYPE_POWERRES; pterm->pnsObj->ObjData.dwDataLen = sizeof(POWERRESOBJ); if ((pterm->pnsObj->ObjData.pbDataBuff = NEWPROBJ(pctxt->pheapCurrent, pterm->pnsObj->ObjData.dwDataLen)) == NULL) { rc = AMLI_LOGERR(AMLIERR_OUT_OF_MEM, ("PowerRes: failed to allocate PowerRes object")); } else { PPOWERRESOBJ ppr; MEMZERO(pterm->pnsObj->ObjData.pbDataBuff, pterm->pnsObj->ObjData.dwDataLen); ppr = (PPOWERRESOBJ)pterm->pnsObj->ObjData.pbDataBuff; ppr->bSystemLevel = (UCHAR)pterm->pdataArgs[1].uipDataValue; ppr->bResOrder = (UCHAR)pterm->pdataArgs[2].uipDataValue; if (ghCreate.pfnHandler != NULL) { ((PFNOO)ghCreate.pfnHandler)(OBJTYPE_POWERRES, pterm->pnsObj); } rc = PushScope(pctxt, pctxt->pbOp, pterm->pbOpEnd, NULL, pterm->pnsObj, pctxt->powner, pctxt->pheapCurrent, pterm->pdataResult); } } EXIT(2, ("PowerRes=%x (pnsObj=%x)\n", rc, pterm->pnsObj)); return rc; } //PowerRes /***LP Processor - Parse and execute the Processor instruction * * ENTRY * pctxt -> CTXT * pterm -> TERM * * EXIT-SUCCESS * returns STATUS_SUCCESS * EXIT-FAILURE * returns AMLIERR_ code */ NTSTATUS LOCAL Processor(PCTXT pctxt, PTERM pterm) { TRACENAME("PROCESSOR") NTSTATUS rc = STATUS_SUCCESS; ENTER(2, ("Processor(pctxt=%x,pbOp=%x,pterm=%x)\n", pctxt, pctxt->pbOp, pterm)); if ((rc = CreateNameSpaceObject(pctxt->pheapCurrent, (PSZ)pterm->pdataArgs[0].pbDataBuff, pctxt->pnsScope, pctxt->powner, &pterm->pnsObj, 0)) == STATUS_SUCCESS) { pterm->pnsObj->ObjData.dwDataType = OBJTYPE_PROCESSOR; pterm->pnsObj->ObjData.dwDataLen = sizeof(PROCESSOROBJ); if ((pterm->pnsObj->ObjData.pbDataBuff = NEWPCOBJ(pctxt->pheapCurrent, pterm->pnsObj->ObjData.dwDataLen)) == NULL) { rc = AMLI_LOGERR(AMLIERR_OUT_OF_MEM, ("Processor: failed to allocate processor object")); } else { PPROCESSOROBJ pproc; MEMZERO(pterm->pnsObj->ObjData.pbDataBuff, pterm->pnsObj->ObjData.dwDataLen); pproc = (PPROCESSOROBJ)pterm->pnsObj->ObjData.pbDataBuff; pproc->bApicID = (UCHAR)pterm->pdataArgs[1].uipDataValue; pproc->dwPBlk = (ULONG)pterm->pdataArgs[2].uipDataValue; pproc->dwPBlkLen = (ULONG)pterm->pdataArgs[3].uipDataValue; if (ghCreate.pfnHandler != NULL) { ((PFNOO)ghCreate.pfnHandler)(OBJTYPE_PROCESSOR, pterm->pnsObj); } rc = PushScope(pctxt, pctxt->pbOp, pterm->pbOpEnd, NULL, pterm->pnsObj, pctxt->powner, pctxt->pheapCurrent, pterm->pdataResult); } } EXIT(2, ("Processor=%x (pnsObj=%x)\n", rc, pterm->pnsObj)); return rc; } //Processor /***LP ThermalZone - Parse and execute the ThermalZone instruction * * ENTRY * pctxt -> CTXT * pterm -> TERM * * EXIT-SUCCESS * returns STATUS_SUCCESS * EXIT-FAILURE * returns AMLIERR_ code */ NTSTATUS LOCAL ThermalZone(PCTXT pctxt, PTERM pterm) { TRACENAME("ThermalZone") NTSTATUS rc = STATUS_SUCCESS; ENTER(2, ("ThermalZone(pctxt=%x,pbOp=%x,pterm=%x)\n", pctxt, pctxt->pbOp, pterm)); if ((rc = CreateNameSpaceObject(pctxt->pheapCurrent, (PSZ)pterm->pdataArgs[0].pbDataBuff, pctxt->pnsScope, pctxt->powner, &pterm->pnsObj, 0)) == STATUS_SUCCESS) { pterm->pnsObj->ObjData.dwDataType = OBJTYPE_THERMALZONE; if (ghCreate.pfnHandler != NULL) { ((PFNOO)ghCreate.pfnHandler)(OBJTYPE_THERMALZONE, pterm->pnsObj); } rc = PushScope(pctxt, pctxt->pbOp, pterm->pbOpEnd, NULL, pterm->pnsObj, pctxt->powner, pctxt->pheapCurrent, pterm->pdataResult); } EXIT(2, ("ThermalZone=%x (pnsObj=%x)\n", rc, pterm->pnsObj)); return rc; } //ThermalZone