/*** pnpmacro.c - Parse PNP Macro terms * * Copyright (c) 1996,1997 Microsoft Corporation * Author: Michael Tsang (MikeTs) * Created: 05/05/97 * * MODIFICATION HISTORY */ #include "pch.h" RESFIELD IRQFields[] = { "_INT", 1*8 + 0, 16, "_HE", 3*8 + 0, 1, "_LL", 3*8 + 3, 1, "_SHR", 3*8 + 4, 1, NULL, 0, 0 }; RESFIELD IRQNoFlagsFields[] = { "_INT", 1*8 + 0, 16, NULL, 0, 0 }; RESFIELD DMAFields[] = { "_DMA", 1*8 + 0, 8, "_SIZ", 2*8 + 0, 2, "_BM", 2*8 + 2, 1, "_TYP", 2*8 + 5, 2, NULL, 0, 0 }; RESFIELD IOFields[] = { "_DEC", 1*8 + 0, 1, "_MIN", 2*8 + 0, 16, "_MAX", 4*8 + 0, 16, "_ALN", 6*8 + 0, 8, "_LEN", 7*8 + 0, 8, NULL, 0, 0 }; RESFIELD FixedIOFields[] = { "_BAS", 1*8 + 0, 16, "_LEN", 3*8 + 0, 8, NULL, 0, 0 }; RESFIELD Mem24Fields[] = { "_RW", 3*8 + 0, 1, "_MIN", 4*8 + 0, 16, "_MAX", 6*8 + 0, 16, "_ALN", 8*8 + 0, 16, "_LEN", 10*8+ 0, 16, NULL, 0, 0 }; RESFIELD Mem32Fields[] = { "_RW", 3*8 + 0, 1, "_MIN", 4*8 + 0, 32, "_MAX", 8*8 + 0, 32, "_ALN", 12*8+ 0, 32, "_LEN", 16*8+ 0, 32, NULL, 0, 0 }; RESFIELD FixedMem32Fields[] = { "_RW", 3*8 + 0, 1, "_BAS", 4*8 + 0, 32, "_LEN", 8*8 + 0, 32, NULL, 0, 0 }; RESFIELD GenFlagFields[] = { "_DEC", 4*8 + 1, 1, "_MIF", 4*8 + 2, 1, "_MAF", 4*8 + 3, 1, NULL, 0, 0 }; RESFIELD MemTypeFields[] = { "_RW", 5*8 + 0, 1, "_MEM", 5*8 + 1, 3, NULL, 0, 0 }; RESFIELD IOTypeFields[] = { "_RNG", 5*8 + 0, 2, NULL, 0, 0 }; RESFIELD DWordFields[] = { "_GRA", 6*8 + 0, 32, "_MIN", 10*8+ 0, 32, "_MAX", 14*8+ 0, 32, "_TRA", 18*8+ 0, 32, "_LEN", 22*8+ 0, 32, NULL, 0, 0 }; RESFIELD WordFields[] = { "_GRA", 6*8 + 0, 16, "_MIN", 8*8 + 0, 16, "_MAX", 10*8+ 0, 16, "_TRA", 12*8+ 0, 16, "_LEN", 14*8+ 0, 16, NULL, 0, 0 }; RESFIELD QWordFields[] = { "_GRA", 6*8 + 0, 64, "_MIN", 14*8+ 0, 64, "_MAX", 22*8+ 0, 64, "_TRA", 30*8+ 0, 64, "_LEN", 38*8+ 0, 64, NULL, 0, 0 }; RESFIELD IRQExFields[] = { "_HE", 3*8 + 1, 1, "_LL", 3*8 + 2, 1, "_SHR", 3*8 + 3, 1, NULL, 0, 0 }; ULONG dwResBitOffset = 0; /***LP XferCodeToBuff - Transfer code object tree to buffer * * ENTRY * pbBuff -> buffer * pdwcb -> length * pcCode -> code object tree * * EXIT-SUCCESS * returns ASLERR_NONE * EXIT-FAILURE * returns negative error code */ int LOCAL XferCodeToBuff(PBYTE pbBuff, PDWORD pdwcb, PCODEOBJ pcCode) { int rc = ASLERR_NONE; DWORD dwLen; int iLen; PCODEOBJ pc, pcNext; ENTER((2, "XferCodeToBuff(pbBuff=%x,Len=%x,pcCode=%x,CodeType=%x)\n", pbBuff, *pdwcb, pcCode, pcCode->dwCodeType)); switch (pcCode->dwCodeType) { case CODETYPE_ASLTERM: if (pcCode->dwCodeValue != OP_NONE) { iLen = OPCODELEN(pcCode->dwCodeValue); memcpy(&pbBuff[*pdwcb], &pcCode->dwCodeValue, iLen); *pdwcb += (DWORD)iLen; if ((TermTable[pcCode->dwTermIndex].dwfTerm & TF_PACKAGE_LEN) && ((rc = EncodePktLen(pcCode->dwCodeLen, &dwLen, &iLen)) == ASLERR_NONE)) { memcpy(&pbBuff[*pdwcb], &dwLen, iLen); *pdwcb += (DWORD)iLen; } if ((rc == ASLERR_NONE) && (pcCode->pbDataBuff != NULL)) { int i; for (i = 0, pc = (PCODEOBJ)pcCode->pbDataBuff; i < (int)pcCode->dwDataLen; ++i) { if ((rc = XferCodeToBuff(pbBuff, pdwcb, &pc[i])) != ASLERR_NONE) { break; } } if (rc == ASLERR_NONE) { MEMFREE(pcCode->pbDataBuff); pcCode->pbDataBuff = NULL; } } } if (rc == ASLERR_NONE) { for (pc = pcCode->pcFirstChild; pc != NULL; pc = pcNext) { if ((rc = XferCodeToBuff(pbBuff, pdwcb, pc)) != ASLERR_NONE) break; // // Am I the only one left in the list? // if (pc->list.plistNext == &pc->list) pcNext = NULL; else pcNext = (PCODEOBJ)pc->list.plistNext; ListRemoveEntry(&pc->list, (PPLIST)&pcCode->pcFirstChild); MEMFREE(pc); } } break; case CODETYPE_DATAOBJ: case CODETYPE_STRING: case CODETYPE_QWORD: memcpy(&pbBuff[*pdwcb], pcCode->pbDataBuff, pcCode->dwDataLen); *pdwcb += pcCode->dwDataLen; break; case CODETYPE_INTEGER: memcpy(&pbBuff[*pdwcb], &pcCode->dwCodeValue, pcCode->dwDataLen); *pdwcb += pcCode->dwDataLen; break; case CODETYPE_KEYWORD: case CODETYPE_UNKNOWN: break; default: ERROR(("XferCodeToBuff: unexpected code object type - %d", pcCode->dwCodeType)); rc = ASLERR_INTERNAL_ERROR; } EXIT((2, "XferCodeToBuff=%x (Len=%x)\n", rc, *pdwcb)); return rc; } //XferCodeToBuff /***LP ResourceTemplate - Start of PNP Resource Template * * ENTRY * ptoken -> token stream * fActionFL - TRUE if this is a fixed list action * * EXIT-SUCCESS * returns ASLERR_NONE * EXIT-FAILURE * returns negative error code */ int LOCAL ResourceTemplate(PTOKEN ptoken, BOOL fActionFL) { int rc = ASLERR_NONE; PCODEOBJ pcData; ENTER((1, "ResourceTemplate(ptoken=%p,fActionFL=%d)\n", ptoken, fActionFL)); DEREF(ptoken); if (fActionFL) { dwResBitOffset = 0; } else { if ((pcData = (PCODEOBJ)MEMALLOC(sizeof(CODEOBJ))) == NULL) { ERROR(("ResourceTemplate: failed to allocate buffer object")); rc = ASLERR_OUT_OF_MEM; } else { memset(pcData, 0, sizeof(CODEOBJ)); pcData->dwCodeType = CODETYPE_DATAOBJ; if (gpcodeScope->dwCodeLen <= 0x3f) pcData->dwDataLen = gpcodeScope->dwCodeLen - 1; else if (gpcodeScope->dwCodeLen <= 0xfff) pcData->dwDataLen = gpcodeScope->dwCodeLen - 2; else if (gpcodeScope->dwCodeLen <= 0xfffff) pcData->dwDataLen = gpcodeScope->dwCodeLen - 3; else pcData->dwDataLen = gpcodeScope->dwCodeLen - 4; pcData->dwDataLen += 2; //add length of EndTag if ((pcData->pbDataBuff = MEMALLOC(pcData->dwDataLen)) == NULL) { ERROR(("ResourceTemplate: failed to allocate data buffer")); rc = ASLERR_OUT_OF_MEM; } else { PCODEOBJ pc, pcNext; DWORD dwcb = 0; for (pc = gpcodeScope->pcFirstChild; pc != NULL; pc = pcNext) { if ((rc = XferCodeToBuff(pcData->pbDataBuff, &dwcb, pc)) != ASLERR_NONE) { break; } // // Am I the only one left in the list? // if (pc->list.plistNext == &pc->list) pcNext = NULL; else pcNext = (PCODEOBJ)pc->list.plistNext; ListRemoveEntry(&pc->list, (PPLIST)&gpcodeScope->pcFirstChild); MEMFREE(pc); } if (rc == ASLERR_NONE) { pcData->pbDataBuff[dwcb] = 0x79; //EndTag dwcb++; // // Generate a zero-checksum EndTag because the ASL code // will probably change the resources anyway. // pcData->pbDataBuff[dwcb] = 0; pcData->pcParent = gpcodeScope; ListInsertTail(&pcData->list, (PPLIST)&gpcodeScope->pcFirstChild); ASSERT(dwcb + 1 == pcData->dwDataLen); pcData->dwCodeLen = pcData->dwDataLen; pcData->bCodeChkSum = ComputeDataChkSum(pcData->pbDataBuff, pcData->dwDataLen); if ((gpcodeScope->pbDataBuff = MEMALLOC(sizeof(CODEOBJ))) == NULL) { ERROR(("ResourceTemplate: failed to allocate buffer argument object")); rc = ASLERR_OUT_OF_MEM; } else { memset(gpcodeScope->pbDataBuff, 0, sizeof(CODEOBJ)); if ((rc = MakeIntData(pcData->dwDataLen, (PCODEOBJ)gpcodeScope->pbDataBuff)) == ASLERR_NONE) { gpcodeScope->dwDataLen = 1; gpcodeScope->dwCodeLen = 0; gpcodeScope->bCodeChkSum = 0; ComputeChkSumLen(gpcodeScope); } } } } } } EXIT((1, "ResourceTemplate=%d\n", rc)); return rc; } //ResourceTemplate /***LP AddSmallOffset - Add code length to cumulative bit offset * * ENTRY * ptoken -> token stream * fActionFL - TRUE if this is a fixed list action * * EXIT-SUCCESS * returns ASLERR_NONE * EXIT-FAILURE * returns negative error code */ int LOCAL AddSmallOffset(PTOKEN ptoken, BOOL fActionFL) { int rc = ASLERR_NONE; ENTER((1, "AddSmallOffset(ptoken=%p,fActionFL=%d)\n", ptoken, fActionFL)); DEREF(ptoken); DEREF(fActionFL); ASSERT(fActionFL == TRUE); ASSERT((gpcodeScope->dwCodeValue & 0x80) == 0); dwResBitOffset += ((gpcodeScope->dwCodeValue & 0x07) + 1)*8; EXIT((1, "AddSmallOffset=%d\n", rc)); return rc; } //AddSmallOffset /***LP StartDependentFn - Start of Dependent Function * * ENTRY * ptoken -> token stream * fActionFL - TRUE if this is a fixed list action * * EXIT-SUCCESS * returns ASLERR_NONE * EXIT-FAILURE * returns negative error code */ int LOCAL StartDependentFn(PTOKEN ptoken, BOOL fActionFL) { int rc = ASLERR_NONE; PCODEOBJ pArgs; ENTER((1, "StartDependentFn(ptoken=%p,fActionFL=%d)\n", ptoken, fActionFL)); DEREF(fActionFL); ASSERT(fActionFL == TRUE); pArgs = (PCODEOBJ)gpcodeScope->pbDataBuff; if (pArgs[0].dwCodeValue > 2) { PrintTokenErr(ptoken, "Arg0 should be between 0-2", TRUE); rc = ASLERR_SYNTAX; } else if (pArgs[1].dwCodeValue > 2) { PrintTokenErr(ptoken, "Arg1 should be between 0-2", TRUE); rc = ASLERR_SYNTAX; } else { pArgs[0].dwCodeValue |= pArgs[1].dwCodeValue << 2; pArgs[0].bCodeChkSum = (BYTE)pArgs[0].dwCodeValue; gpcodeScope->dwDataLen = 1; ASSERT((gpcodeScope->dwCodeValue & 0x80) == 0); dwResBitOffset += ((gpcodeScope->dwCodeValue & 0x07) + 1)*8; } EXIT((1, "StartDependentFn=%d\n", rc)); return rc; } //StartDependentFn /***LP IRQDesc - IRQ resource descriptor * * ENTRY * ptoken -> token stream * fActionFL - TRUE if this is a fixed list action * * EXIT-SUCCESS * returns ASLERR_NONE * EXIT-FAILURE * returns negative error code */ int LOCAL IRQDesc(PTOKEN ptoken, BOOL fActionFL) { int rc = ASLERR_NONE; PCODEOBJ pArgs; DWORD dwLen, dwIRQ = 0, dw; PCODEOBJ pc; #define MAX_IRQ 0x0f ENTER((1, "IRQDesc(ptoken=%p,fActionFL=%d)\n", ptoken, fActionFL)); DEREF(fActionFL); ASSERT(fActionFL == FALSE); pArgs = (PCODEOBJ)gpcodeScope->pbDataBuff; if (gpcodeScope->dwDataLen == 4) //IRQ { dwLen = 3; if ((rc = SetDefMissingKW(&pArgs[2], ID_EXCLUSIVE)) == ASLERR_NONE) { EncodeKeywords(pArgs, 0x07, 0); if ((pArgs[0].dwCodeValue & (_LL | _HE)) == (_LL | _HE)) { PrintTokenErr(ptoken, "Illegal combination of interrupt level and trigger mode", TRUE); rc = ASLERR_SYNTAX; } } } else //IRQNoFlags { ASSERT(gpcodeScope->dwDataLen == 1); dwLen = 2; } if (rc == ASLERR_NONE) { pc = gpcodeScope->pcFirstChild; if (pc != NULL) { ASSERT(pc->dwCodeType == CODETYPE_DATAOBJ); for (dw = 0; dw < pc->dwDataLen; ++dw) { if (pc->pbDataBuff[dw] > MAX_IRQ) { PrintTokenErr(ptoken, "Invalid IRQ number", TRUE); rc = ASLERR_SYNTAX; break; } else { dwIRQ |= 1 << pc->pbDataBuff[dw]; } } if (rc == ASLERR_NONE) { MEMFREE(pc->pbDataBuff); pc->pbDataBuff = NULL; } } else if ((pc = MEMALLOC(sizeof(CODEOBJ))) != NULL) { memset(pc, 0, sizeof(CODEOBJ)); pc->pcParent = gpcodeScope; ListInsertTail(&pc->list, (PPLIST)&gpcodeScope->pcFirstChild); } else { ERROR(("IRQDesc: failed to allocate DMA descriptor")); rc = ASLERR_OUT_OF_MEM; } if (rc == ASLERR_NONE) { PCODEOBJ pa; if (dwLen == 3) dwIRQ |= (pArgs[0].dwCodeValue & 0xff) << 16; SetIntObject(pc, dwIRQ, dwLen); pa = &pArgs[gpcodeScope->dwDataLen == 4? 3: 0]; if (pa->dwCodeType == CODETYPE_STRING) { PNSOBJ pns; if ((rc = CreateNameSpaceObj(ptoken, (PSZ)pa->pbDataBuff, gpnsCurrentScope, gpnsCurrentOwner, &pns, NSF_EXIST_ERR)) == ASLERR_NONE) { pns->ObjData.dwDataType = OBJTYPE_PNP_RES; rc = CreateResFields(ptoken, pns, gpcodeScope->dwDataLen == 4? IRQFields: IRQNoFlagsFields); } MEMFREE(pa->pbDataBuff); memset(pa, 0, sizeof(CODEOBJ)); } if (rc == ASLERR_NONE) { gpcodeScope->dwDataLen = 0; MEMFREE(gpcodeScope->pbDataBuff); gpcodeScope->pbDataBuff = NULL; gpcodeScope->dwCodeLen = 0; gpcodeScope->bCodeChkSum = 0; ComputeChkSumLen(gpcodeScope); ASSERT((gpcodeScope->dwCodeValue & 0x80) == 0); dwResBitOffset += ((gpcodeScope->dwCodeValue & 0x07) + 1)*8; } } } EXIT((1, "IRQDesc=%d\n", rc)); return rc; } //IRQDesc /***LP DMADesc - DMA resource descriptor * * ENTRY * ptoken -> token stream * fActionFL - TRUE if this is a fixed list action * * EXIT-SUCCESS * returns ASLERR_NONE * EXIT-FAILURE * returns negative error code */ int LOCAL DMADesc(PTOKEN ptoken, BOOL fActionFL) { int rc = ASLERR_NONE; PCODEOBJ pArgs; DWORD dwDMA = 0, dw; PCODEOBJ pc; #define MAX_DMA 0x07 ENTER((1, "DMADesc(ptoken=%p,fActionFL=%d)\n", ptoken, fActionFL)); DEREF(fActionFL); ASSERT(fActionFL == FALSE); pArgs = (PCODEOBJ)gpcodeScope->pbDataBuff; EncodeKeywords(pArgs, 0x07, 0); pc = gpcodeScope->pcFirstChild; if (pc != NULL) { ASSERT(pc->dwCodeType == CODETYPE_DATAOBJ); for (dw = 0; dw < pc->dwDataLen; ++dw) { if (pc->pbDataBuff[dw] > MAX_DMA) { PrintTokenErr(ptoken, "Invalid DMA number", TRUE); rc = ASLERR_SYNTAX; break; } else { dwDMA |= 1 << pc->pbDataBuff[dw]; } } if (rc == ASLERR_NONE) { MEMFREE(pc->pbDataBuff); pc->pbDataBuff = NULL; } } else if ((pc = MEMALLOC(sizeof(CODEOBJ))) != NULL) { memset(pc, 0, sizeof(CODEOBJ)); pc->pcParent = gpcodeScope; ListInsertTail(&pc->list, (PPLIST)&gpcodeScope->pcFirstChild); } else { ERROR(("DMADesc: failed to allocate DMA descriptor")); rc = ASLERR_OUT_OF_MEM; } if (rc == ASLERR_NONE) { dwDMA |= (pArgs[0].dwCodeValue & 0xff) << 8; SetIntObject(pc, dwDMA, sizeof(WORD)); if (pArgs[3].dwCodeType == CODETYPE_STRING) { PNSOBJ pns; if ((rc = CreateNameSpaceObj(ptoken, (PSZ)pArgs[3].pbDataBuff, gpnsCurrentScope, gpnsCurrentOwner, &pns, NSF_EXIST_ERR)) == ASLERR_NONE) { pns->ObjData.dwDataType = OBJTYPE_PNP_RES; rc = CreateResFields(ptoken, pns, DMAFields); } MEMFREE(pArgs[3].pbDataBuff); memset(&pArgs[3], 0, sizeof(CODEOBJ)); } if (rc == ASLERR_NONE) { gpcodeScope->dwDataLen = 0; MEMFREE(gpcodeScope->pbDataBuff); gpcodeScope->pbDataBuff = NULL; gpcodeScope->dwCodeLen = 0; gpcodeScope->bCodeChkSum = 0; ComputeChkSumLen(gpcodeScope); ASSERT((gpcodeScope->dwCodeValue & 0x80) == 0); dwResBitOffset += ((gpcodeScope->dwCodeValue & 0x07) + 1)*8; } } EXIT((1, "DMADesc=%d\n", rc)); return rc; } //DMADesc /***LP IODesc - IO resource descriptor * * ENTRY * ptoken -> token stream * fActionFL - TRUE if this is a fixed list action * * EXIT-SUCCESS * returns ASLERR_NONE * EXIT-FAILURE * returns negative error code */ int LOCAL IODesc(PTOKEN ptoken, BOOL fActionFL) { int rc = ASLERR_NONE; PCODEOBJ pArgs; ENTER((1, "IODesc(ptoken=%p,fActionFL=%d)\n", ptoken, fActionFL)); DEREF(ptoken); DEREF(fActionFL); ASSERT(fActionFL == TRUE); pArgs = (PCODEOBJ)gpcodeScope->pbDataBuff; EncodeKeywords(pArgs, 0x01, 0); if (pArgs[5].dwCodeType == CODETYPE_STRING) { PNSOBJ pns; if ((rc = CreateNameSpaceObj(ptoken, (PSZ)pArgs[5].pbDataBuff, gpnsCurrentScope, gpnsCurrentOwner, &pns, NSF_EXIST_ERR)) == ASLERR_NONE) { pns->ObjData.dwDataType = OBJTYPE_PNP_RES; rc = CreateResFields(ptoken, pns, IOFields); } MEMFREE(pArgs[5].pbDataBuff); memset(&pArgs[5], 0, sizeof(CODEOBJ)); } if (rc == ASLERR_NONE) { ASSERT((gpcodeScope->dwCodeValue & 0x80) == 0); dwResBitOffset += ((gpcodeScope->dwCodeValue & 0x07) + 1)*8; } EXIT((1, "IODesc=%d\n", rc)); return rc; } //IODesc /***LP FixedIODesc - FixedIO resource descriptor * * ENTRY * ptoken -> token stream * fActionFL - TRUE if this is a fixed list action * * EXIT-SUCCESS * returns ASLERR_NONE * EXIT-FAILURE * returns negative error code */ int LOCAL FixedIODesc(PTOKEN ptoken, BOOL fActionFL) { int rc = ASLERR_NONE; PCODEOBJ pArgs = (PCODEOBJ)gpcodeScope->pbDataBuff; ENTER((1, "FixedIODesc(ptoken=%p,fActionFL=%d)\n", ptoken, fActionFL)); DEREF(ptoken); DEREF(fActionFL); ASSERT(fActionFL == TRUE); if (pArgs[2].dwCodeType == CODETYPE_STRING) { PNSOBJ pns; if ((rc = CreateNameSpaceObj(ptoken, (PSZ)pArgs[2].pbDataBuff, gpnsCurrentScope, gpnsCurrentOwner, &pns, NSF_EXIST_ERR)) == ASLERR_NONE) { pns->ObjData.dwDataType = OBJTYPE_PNP_RES; rc = CreateResFields(ptoken, pns, FixedIOFields); } MEMFREE(pArgs[2].pbDataBuff); memset(&pArgs[2], 0, sizeof(CODEOBJ)); } if (rc == ASLERR_NONE) { ASSERT((gpcodeScope->dwCodeValue & 0x80) == 0); dwResBitOffset += ((gpcodeScope->dwCodeValue & 0x07) + 1)*8; } EXIT((1, "FixedIODesc=%d\n", rc)); return rc; } //FixedIODesc /***LP VendorDesc - Vendor-defined resource * * ENTRY * ptoken -> token stream * dwMaxSize - 0x07 if short resource, 0xffff if long resource * * EXIT-SUCCESS * returns ASLERR_NONE * EXIT-FAILURE * returns negative error code */ int LOCAL VendorDesc(PTOKEN ptoken, DWORD dwMaxSize) { int rc = ASLERR_NONE; PCODEOBJ pc; PBYTE pbOldBuff = NULL; DWORD dwOldLen = 0; #define SHORT_MAX_SIZE 0x07 #define LONG_MAX_SIZE 0xffff ENTER((1, "VendorDesc(ptoken=%p,MaxSize=%d)\n", ptoken, dwMaxSize)); ASSERT((dwMaxSize == SHORT_MAX_SIZE) || (dwMaxSize == LONG_MAX_SIZE)); pc = gpcodeScope->pcFirstChild; if (pc != NULL) { ASSERT(pc->dwCodeType == CODETYPE_DATAOBJ); if (pc->dwDataLen > dwMaxSize) { PrintTokenErr(ptoken, "Vendor resource data can only be up to " "7 bytes for short descriptor and 64K-1 bytes for " "long descriptor", TRUE); rc = ASLERR_SYNTAX; } else { pbOldBuff = pc->pbDataBuff; dwOldLen = pc->dwDataLen; } } else if ((pc = MEMALLOC(sizeof(CODEOBJ))) != NULL) { memset(pc, 0, sizeof(CODEOBJ)); pc->pcParent = gpcodeScope; ListInsertTail(&pc->list, (PPLIST)&gpcodeScope->pcFirstChild); } else { ERROR(("VendorDesc: failed to allocate vendor-defined resource object")); rc = ASLERR_OUT_OF_MEM; } if (rc == ASLERR_NONE) { int i; pc->dwCodeType = CODETYPE_DATAOBJ; if (dwMaxSize == SHORT_MAX_SIZE) pc->dwDataLen = dwOldLen + 1; else pc->dwDataLen = dwOldLen + sizeof(WORD); if ((pc->pbDataBuff = MEMALLOC(pc->dwDataLen)) != NULL) { PCODEOBJ pArgs = (PCODEOBJ)gpcodeScope->pbDataBuff; if (dwMaxSize == SHORT_MAX_SIZE) { pc->pbDataBuff[0] = (BYTE)(0x70 | dwOldLen); i = 1; } else { *((PWORD)&pc->pbDataBuff[0]) = (WORD)dwOldLen; i = sizeof(WORD); } if (pbOldBuff != NULL) { memcpy(&pc->pbDataBuff[i], pbOldBuff, dwOldLen); MEMFREE(pbOldBuff); } pc->dwCodeLen = pc->dwDataLen; pc->bCodeChkSum = ComputeDataChkSum((PBYTE)&pc->pbDataBuff, pc->dwCodeLen); if (pArgs[0].dwCodeType == CODETYPE_STRING) { PNSOBJ pns; if ((rc = CreateNameSpaceObj(ptoken, (PSZ)pArgs[0].pbDataBuff, gpnsCurrentScope, gpnsCurrentOwner, &pns, NSF_EXIST_ERR)) == ASLERR_NONE) { pns->ObjData.dwDataType = OBJTYPE_RES_FIELD; pns->ObjData.uipDataValue = dwResBitOffset + (dwMaxSize == SHORT_MAX_SIZE? 8: 8*3); pns->ObjData.dwDataLen = 8*dwOldLen; } MEMFREE(pArgs[0].pbDataBuff); memset(&pArgs[0], 0, sizeof(CODEOBJ)); } if (rc == ASLERR_NONE) { gpcodeScope->dwDataLen = 0; MEMFREE(gpcodeScope->pbDataBuff); gpcodeScope->pbDataBuff = NULL; gpcodeScope->dwCodeLen = 0; gpcodeScope->bCodeChkSum = 0; ComputeChkSumLen(gpcodeScope); if (dwMaxSize == SHORT_MAX_SIZE) { dwResBitOffset += ((pc->pbDataBuff[0] & 0x07) + 1)*8; } else { dwResBitOffset += (*((PWORD)&pc->pbDataBuff[0]) + 3)*8; } } } else { ERROR(("VendorDesc: failed to allocate vendor-defined resource buffer")); rc = ASLERR_OUT_OF_MEM; } } EXIT((1, "VendorDesc=%d\n", rc)); return rc; } //VendorDesc /***LP VendorShort - Vendor-defined short resource * * ENTRY * ptoken -> token stream * fActionFL - TRUE if this is a fixed list action * * EXIT-SUCCESS * returns ASLERR_NONE * EXIT-FAILURE * returns negative error code */ int LOCAL VendorShort(PTOKEN ptoken, BOOL fActionFL) { int rc; ENTER((1, "VendorShort(ptoken=%p,fActionFL=%d)\n", ptoken, fActionFL)); DEREF(fActionFL); ASSERT(fActionFL == FALSE); rc = VendorDesc(ptoken, 0x07); EXIT((1, "VendorShort=%d\n", rc)); return rc; } //VendorShort /***LP InsertDescLength - Insert long descriptor length * * ENTRY * pcode -> code object * dwDescLen - length of descriptor * * EXIT-SUCCESS * returns ASLERR_NONE * EXIT-FAILURE * returns negative error code */ int LOCAL InsertDescLength(PCODEOBJ pcode, DWORD dwDescLen) { int rc; PCODEOBJ pNewArgs; ENTER((2, "InsertDescLength(pcode=%x,DescLen=%d)\n", pcode, dwDescLen)); if ((pNewArgs = MEMALLOC((pcode->dwDataLen + 1)*sizeof(CODEOBJ))) != NULL) { memcpy(&pNewArgs[1], pcode->pbDataBuff, pcode->dwDataLen*sizeof(CODEOBJ)); memset(&pNewArgs[0], 0, sizeof(CODEOBJ)); SetIntObject(&pNewArgs[0], dwDescLen, sizeof(WORD)); MEMFREE(pcode->pbDataBuff); pcode->dwDataLen++; pcode->pbDataBuff = (PBYTE)pNewArgs; rc = ASLERR_NONE; } else { ERROR(("InsertDescLength: failed to allocate new argument objects")); rc = ASLERR_OUT_OF_MEM; } EXIT((2, "InsertDescLength=%d\n", rc)); return rc; } //InsertDescLength /***LP Memory24Desc - 24-bit memory resource descriptor * * ENTRY * ptoken -> token stream * fActionFL - TRUE if this is a fixed list action * * EXIT-SUCCESS * returns ASLERR_NONE * EXIT-FAILURE * returns negative error code */ int LOCAL Memory24Desc(PTOKEN ptoken, BOOL fActionFL) { int rc = ASLERR_NONE; PCODEOBJ pArgs; ENTER((1, "Memory24Desc(ptoken=%p,fActionFL=%d)\n", ptoken, fActionFL)); DEREF(ptoken); DEREF(fActionFL); ASSERT(fActionFL == TRUE); pArgs = (PCODEOBJ)gpcodeScope->pbDataBuff; EncodeKeywords(pArgs, 0x01, 0); if (pArgs[5].dwCodeType == CODETYPE_STRING) { PNSOBJ pns; if ((rc = CreateNameSpaceObj(ptoken, (PSZ)pArgs[5].pbDataBuff, gpnsCurrentScope, gpnsCurrentOwner, &pns, NSF_EXIST_ERR)) == ASLERR_NONE) { pns->ObjData.dwDataType = OBJTYPE_PNP_RES; rc = CreateResFields(ptoken, pns, Mem24Fields); } MEMFREE(pArgs[5].pbDataBuff); memset(&pArgs[5], 0, sizeof(CODEOBJ)); } if ((rc == ASLERR_NONE) && ((rc = InsertDescLength(gpcodeScope, 9)) == ASLERR_NONE)) { dwResBitOffset += 12*8; } EXIT((1, "Memory24Desc=%d\n", rc)); return rc; } //Memory24Desc /***LP VendorLong - Vendor-defined long resource * * ENTRY * ptoken -> token stream * fActionFL - TRUE if this is a fixed list action * * EXIT-SUCCESS * returns ASLERR_NONE * EXIT-FAILURE * returns negative error code */ int LOCAL VendorLong(PTOKEN ptoken, BOOL fActionFL) { int rc; ENTER((1, "VendorLong(ptoken=%p,fActionFL=%d)\n", ptoken, fActionFL)); DEREF(fActionFL); ASSERT(fActionFL == FALSE); rc = VendorDesc(ptoken, 0xffff); EXIT((1, "VendorLong=%d\n", rc)); return rc; } //VendorLong /***LP Memory32Desc - 32-bit memory resource descriptor * * ENTRY * ptoken -> token stream * fActionFL - TRUE if this is a fixed list action * * EXIT-SUCCESS * returns ASLERR_NONE * EXIT-FAILURE * returns negative error code */ int LOCAL Memory32Desc(PTOKEN ptoken, BOOL fActionFL) { int rc = ASLERR_NONE; PCODEOBJ pArgs; ENTER((1, "Memory32Desc(ptoken=%p,fActionFL=%d)\n", ptoken, fActionFL)); DEREF(ptoken); DEREF(fActionFL); ASSERT(fActionFL == TRUE); pArgs = (PCODEOBJ)gpcodeScope->pbDataBuff; EncodeKeywords(pArgs, 0x01, 0); if (pArgs[5].dwCodeType == CODETYPE_STRING) { PNSOBJ pns; if ((rc = CreateNameSpaceObj(ptoken, (PSZ)pArgs[5].pbDataBuff, gpnsCurrentScope, gpnsCurrentOwner, &pns, NSF_EXIST_ERR)) == ASLERR_NONE) { pns->ObjData.dwDataType = OBJTYPE_PNP_RES; rc = CreateResFields(ptoken, pns, Mem32Fields); } MEMFREE(pArgs[5].pbDataBuff); memset(&pArgs[5], 0, sizeof(CODEOBJ)); } if ((rc == ASLERR_NONE) && ((rc = InsertDescLength(gpcodeScope, 17)) == ASLERR_NONE)) { dwResBitOffset += 20*8; } EXIT((1, "Memory32Desc=%d\n", rc)); return rc; } //Memory32Desc /***LP FixedMemory32Desc - 32-bit fixed memory resource descriptor * * ENTRY * ptoken -> token stream * fActionFL - TRUE if this is a fixed list action * * EXIT-SUCCESS * returns ASLERR_NONE * EXIT-FAILURE * returns negative error code */ int LOCAL FixedMemory32Desc(PTOKEN ptoken, BOOL fActionFL) { int rc = ASLERR_NONE; PCODEOBJ pArgs; ENTER((1, "FixedMemory32Desc(ptoken=%p,fActionFL=%d)\n", ptoken, fActionFL)); DEREF(ptoken); DEREF(fActionFL); ASSERT(fActionFL == TRUE); pArgs = (PCODEOBJ)gpcodeScope->pbDataBuff; EncodeKeywords(pArgs, 0x01, 0); if (pArgs[3].dwCodeType == CODETYPE_STRING) { PNSOBJ pns; if ((rc = CreateNameSpaceObj(ptoken, (PSZ)pArgs[3].pbDataBuff, gpnsCurrentScope, gpnsCurrentOwner, &pns, NSF_EXIST_ERR)) == ASLERR_NONE) { pns->ObjData.dwDataType = OBJTYPE_PNP_RES; rc = CreateResFields(ptoken, pns, FixedMem32Fields); } MEMFREE(pArgs[3].pbDataBuff); memset(&pArgs[3], 0, sizeof(CODEOBJ)); } if ((rc == ASLERR_NONE) && ((rc = InsertDescLength(gpcodeScope, 9)) == ASLERR_NONE)) { dwResBitOffset += 12*8; } EXIT((1, "FixedMemory32Desc=%d\n", rc)); return rc; } //FixedMemory32Desc #define RESTYPE_MEM 0 #define RESTYPE_IO 1 #define RESTYPE_BUSNUM 2 /***LP MemSpaceDesc - Memory space descriptor * * ENTRY * ptoken -> TOKEN * dwMinLen - minimum descriptor length * ResFields -> resource fields table * * EXIT-SUCCESS * returns ASLERR_NONE * EXIT-FAILURE * returns negative error code */ int LOCAL MemSpaceDesc(PTOKEN ptoken, DWORD dwMinLen, PRESFIELD ResFields) { int rc; PCODEOBJ pArgs; ENTER((1, "MemSpaceDesc(ptoken=%p,MinLen=%d,ResFields=%p)\n", ptoken, dwMinLen, ResFields)); pArgs = (PCODEOBJ)gpcodeScope->pbDataBuff; if (((rc = SetDefMissingKW(&pArgs[0], ID_RESCONSUMER)) == ASLERR_NONE) && ((rc = SetDefMissingKW(&pArgs[1], ID_POSDECODE)) == ASLERR_NONE) && ((rc = SetDefMissingKW(&pArgs[2], ID_MINNOTFIXED)) == ASLERR_NONE) && ((rc = SetDefMissingKW(&pArgs[3], ID_MAXNOTFIXED)) == ASLERR_NONE) && ((rc = SetDefMissingKW(&pArgs[4], ID_NONCACHEABLE)) == ASLERR_NONE)) { EncodeKeywords(pArgs, 0x0f, 2); EncodeKeywords(pArgs, 0x30, 3); SetIntObject(&pArgs[1], RESTYPE_MEM, sizeof(BYTE)); if (!(pArgs[11].dwfCode & CF_MISSING_ARG)) dwMinLen++; if (!(pArgs[12].dwfCode & CF_MISSING_ARG)) { ASSERT(pArgs[12].dwCodeType == CODETYPE_STRING); dwMinLen += pArgs[12].dwDataLen; } SetIntObject(&pArgs[0], dwMinLen, sizeof(WORD)); if (pArgs[13].dwCodeType == CODETYPE_STRING) { PNSOBJ pns; if ((rc = CreateNameSpaceObj(ptoken, (PSZ)pArgs[13].pbDataBuff, gpnsCurrentScope, gpnsCurrentOwner, &pns, NSF_EXIST_ERR)) == ASLERR_NONE) { pns->ObjData.dwDataType = OBJTYPE_PNP_RES; if (((rc = CreateResFields(ptoken, pns, GenFlagFields)) == ASLERR_NONE) && ((rc = CreateResFields(ptoken, pns, MemTypeFields)) == ASLERR_NONE)) { rc = CreateResFields(ptoken, pns, ResFields); } } MEMFREE(pArgs[13].pbDataBuff); memset(&pArgs[13], 0, sizeof(CODEOBJ)); } if (rc == ASLERR_NONE) { dwResBitOffset += (dwMinLen + 3)*8; } } EXIT((1, "MemSpaceDesc=%d\n", rc)); return rc; } //MemSpaceDesc /***LP IOSpaceDesc - IO space descriptor * * ENTRY * ptoken -> TOKEN * dwMinLen - minimum descriptor length * ResFields -> resource fields table * * EXIT-SUCCESS * returns ASLERR_NONE * EXIT-FAILURE * returns negative error code */ int LOCAL IOSpaceDesc(PTOKEN ptoken, DWORD dwMinLen, PRESFIELD ResFields) { int rc; PCODEOBJ pArgs; ENTER((2, "IOSpaceDesc(ptoken=%p,MinLen=%d,ResFields=%p)\n", ptoken, dwMinLen, ResFields)); pArgs = (PCODEOBJ)gpcodeScope->pbDataBuff; if (((rc = SetDefMissingKW(&pArgs[0], ID_RESCONSUMER)) == ASLERR_NONE) && ((rc = SetDefMissingKW(&pArgs[1], ID_MINNOTFIXED)) == ASLERR_NONE) && ((rc = SetDefMissingKW(&pArgs[2], ID_MAXNOTFIXED)) == ASLERR_NONE) && ((rc = SetDefMissingKW(&pArgs[3], ID_POSDECODE)) == ASLERR_NONE) && ((rc = SetDefMissingKW(&pArgs[4], ID_ENTIRERNG)) == ASLERR_NONE)) { EncodeKeywords(pArgs, 0x0f, 2); EncodeKeywords(pArgs, 0x10, 3); SetIntObject(&pArgs[1], RESTYPE_IO, sizeof(BYTE)); if (!(pArgs[10].dwfCode & CF_MISSING_ARG)) dwMinLen++; if (!(pArgs[11].dwfCode & CF_MISSING_ARG)) { ASSERT(pArgs[11].dwCodeType == CODETYPE_STRING); dwMinLen += pArgs[11].dwDataLen; } SetIntObject(&pArgs[0], dwMinLen, sizeof(WORD)); if (pArgs[12].dwCodeType == CODETYPE_STRING) { PNSOBJ pns; if ((rc = CreateNameSpaceObj(ptoken, (PSZ)pArgs[12].pbDataBuff, gpnsCurrentScope, gpnsCurrentOwner, &pns, NSF_EXIST_ERR)) == ASLERR_NONE) { pns->ObjData.dwDataType = OBJTYPE_PNP_RES; if (((rc = CreateResFields(ptoken, pns, GenFlagFields)) == ASLERR_NONE) && ((rc = CreateResFields(ptoken, pns, MemTypeFields)) == ASLERR_NONE)) { rc = CreateResFields(ptoken, pns, ResFields); } } MEMFREE(pArgs[12].pbDataBuff); memset(&pArgs[12], 0, sizeof(CODEOBJ)); } if (rc == ASLERR_NONE) { dwResBitOffset += (dwMinLen + 3)*8; } } EXIT((2, "IOSpaceDesc=%d\n", rc)); return rc; } //IOSpaceDesc /***LP DWordMemDesc - DWord memory descriptor * * ENTRY * ptoken -> token stream * fActionFL - TRUE if this is a fixed list action * * EXIT-SUCCESS * returns ASLERR_NONE * EXIT-FAILURE * returns negative error code */ int LOCAL DWordMemDesc(PTOKEN ptoken, BOOL fActionFL) { int rc; ENTER((1, "DWordMemDesc(ptoken=%p,fActionFL=%d)\n", ptoken, fActionFL)); DEREF(ptoken); DEREF(fActionFL); ASSERT(fActionFL == TRUE); rc = MemSpaceDesc(ptoken, 23, DWordFields); EXIT((1, "DWordMemDesc=%d\n", rc)); return rc; } //DWordMemDesc /***LP DWordIODesc - DWord IO descriptor * * ENTRY * ptoken -> token stream * fActionFL - TRUE if this is a fixed list action * * EXIT-SUCCESS * returns ASLERR_NONE * EXIT-FAILURE * returns negative error code */ int LOCAL DWordIODesc(PTOKEN ptoken, BOOL fActionFL) { int rc; ENTER((1, "DWordIODesc(ptoken=%p,fActionFL=%d)\n", ptoken, fActionFL)); DEREF(ptoken); DEREF(fActionFL); ASSERT(fActionFL == TRUE); rc = IOSpaceDesc(ptoken, 23, DWordFields); EXIT((1, "DWordIODesc=%d\n", rc)); return rc; } //DWordIODesc /***LP WordIODesc - Word IO descriptor * * ENTRY * ptoken -> token stream * fActionFL - TRUE if this is a fixed list action * * EXIT-SUCCESS * returns ASLERR_NONE * EXIT-FAILURE * returns negative error code */ int LOCAL WordIODesc(PTOKEN ptoken, BOOL fActionFL) { int rc; ENTER((1, "WordIODesc(ptoken=%p,fActionFL=%d)\n", ptoken, fActionFL)); DEREF(ptoken); DEREF(fActionFL); ASSERT(fActionFL == TRUE); rc = IOSpaceDesc(ptoken, 13, WordFields); EXIT((1, "WordIODesc=%d\n", rc)); return rc; } //WordIODesc /***LP WordBusNumDesc - Word BusNum descriptor * * ENTRY * ptoken -> token stream * fActionFL - TRUE if this is a fixed list action * * EXIT-SUCCESS * returns ASLERR_NONE * EXIT-FAILURE * returns negative error code */ int LOCAL WordBusNumDesc(PTOKEN ptoken, BOOL fActionFL) { int rc; PCODEOBJ pArgs; ENTER((1, "WordBusNumDesc(ptoken=%p,fActionFL=%d)\n", ptoken, fActionFL)); DEREF(ptoken); DEREF(fActionFL); ASSERT(fActionFL == TRUE); pArgs = (PCODEOBJ)gpcodeScope->pbDataBuff; if (((rc = SetDefMissingKW(&pArgs[0], ID_RESCONSUMER)) == ASLERR_NONE) && ((rc = SetDefMissingKW(&pArgs[1], ID_MINNOTFIXED)) == ASLERR_NONE) && ((rc = SetDefMissingKW(&pArgs[2], ID_MAXNOTFIXED)) == ASLERR_NONE) && ((rc = SetDefMissingKW(&pArgs[3], ID_POSDECODE)) == ASLERR_NONE)) { DWORD dwLen; EncodeKeywords(pArgs, 0x0f, 2); SetIntObject(&pArgs[1], RESTYPE_BUSNUM, sizeof(BYTE)); SetIntObject(&pArgs[3], 0, sizeof(BYTE)); dwLen = 13; if (!(pArgs[9].dwfCode & CF_MISSING_ARG)) dwLen++; if (!(pArgs[10].dwfCode & CF_MISSING_ARG)) { ASSERT(pArgs[10].dwCodeType == CODETYPE_STRING); dwLen += pArgs[10].dwDataLen; } SetIntObject(&pArgs[0], dwLen, sizeof(WORD)); if (pArgs[11].dwCodeType == CODETYPE_STRING) { PNSOBJ pns; if ((rc = CreateNameSpaceObj(ptoken, (PSZ)pArgs[11].pbDataBuff, gpnsCurrentScope, gpnsCurrentOwner, &pns, NSF_EXIST_ERR)) == ASLERR_NONE) { pns->ObjData.dwDataType = OBJTYPE_PNP_RES; if ((rc = CreateResFields(ptoken, pns, GenFlagFields)) == ASLERR_NONE) { rc = CreateResFields(ptoken, pns, WordFields); } } MEMFREE(pArgs[11].pbDataBuff); memset(&pArgs[11], 0, sizeof(CODEOBJ)); } if (rc == ASLERR_NONE) { dwResBitOffset += (dwLen + 3)*8; } } EXIT((1, "WordBusNumDesc=%d\n", rc)); return rc; } //WordBusNumDesc /***LP InterruptDesc - Extended Interrupt resource descriptor * * ENTRY * ptoken -> token stream * fActionFL - TRUE if this is a fixed list action * * EXIT-SUCCESS * returns ASLERR_NONE * EXIT-FAILURE * returns negative error code */ int LOCAL InterruptDesc(PTOKEN ptoken, BOOL fActionFL) { int rc = ASLERR_NONE; PCODEOBJ pArgs; PCODEOBJ pc; ENTER((1, "InterruptDesc(ptoken=%p,fActionFL=%d)\n", ptoken, fActionFL)); DEREF(fActionFL); ASSERT(fActionFL == FALSE); pArgs = (PCODEOBJ)gpcodeScope->pbDataBuff; pc = gpcodeScope->pcFirstChild; if (((rc = SetDefMissingKW(&pArgs[0], ID_RESCONSUMER)) == ASLERR_NONE) && ((rc = SetDefMissingKW(&pArgs[3], ID_EXCLUSIVE)) == ASLERR_NONE)) { if (pArgs[1].dwCodeValue == ID_EDGE) pArgs[1].dwCodeValue = ID_EXT_EDGE; else if (pArgs[1].dwCodeValue == ID_LEVEL) pArgs[1].dwCodeValue = ID_EXT_LEVEL; if (pArgs[2].dwCodeValue == ID_ACTIVEHI) pArgs[2].dwCodeValue = ID_EXT_ACTIVEHI; else if (pArgs[2].dwCodeValue == ID_ACTIVELO) pArgs[2].dwCodeValue = ID_EXT_ACTIVELO; if (pArgs[3].dwCodeValue == ID_SHARED) pArgs[3].dwCodeValue = ID_EXT_SHARED; else if (pArgs[3].dwCodeValue == ID_EXCLUSIVE) pArgs[3].dwCodeValue = ID_EXT_EXCLUSIVE; if (((rc = LookupIDIndex(pArgs[1].dwCodeValue, &pArgs[1].dwTermIndex)) == ASLERR_NONE) && ((rc = LookupIDIndex(pArgs[2].dwCodeValue, &pArgs[2].dwTermIndex)) == ASLERR_NONE) && ((rc = LookupIDIndex(pArgs[3].dwCodeValue, &pArgs[3].dwTermIndex)) == ASLERR_NONE)) { EncodeKeywords(pArgs, 0x0f, 1); { DWORD dwNumIRQs = 0; DWORD dwLen; if (pc != NULL) { ASSERT(pc->dwCodeType == CODETYPE_DATAOBJ); dwNumIRQs = pc->dwDataLen/sizeof(DWORD); } SetIntObject(&pArgs[2], dwNumIRQs, sizeof(BYTE)); memcpy(&pArgs[3], pc, sizeof(CODEOBJ)); MEMFREE(pc); gpcodeScope->pcFirstChild = NULL; dwLen = 2 + dwNumIRQs*sizeof(DWORD); if (!(pArgs[4].dwfCode & CF_MISSING_ARG)) dwLen++; if (!(pArgs[5].dwfCode & CF_MISSING_ARG)) { ASSERT(pArgs[5].dwCodeType == CODETYPE_STRING); dwLen += pArgs[5].dwDataLen; } SetIntObject(&pArgs[0], dwLen, sizeof(WORD)); if (pArgs[6].dwCodeType == CODETYPE_STRING) { PNSOBJ pns; static RESFIELD IRQTabFields[] = { "_INT", 5*8 + 0, 0, NULL, 0, 0 }; IRQTabFields[0].dwBitSize = dwNumIRQs*32; if ((rc = CreateNameSpaceObj(ptoken, (PSZ)pArgs[6].pbDataBuff, gpnsCurrentScope, gpnsCurrentOwner, &pns, NSF_EXIST_ERR)) == ASLERR_NONE) { pns->ObjData.dwDataType = OBJTYPE_PNP_RES; if ((rc = CreateResFields(ptoken, pns, IRQExFields)) == ASLERR_NONE) { rc = CreateResFields(ptoken, pns, IRQTabFields); } } MEMFREE(pArgs[6].pbDataBuff); memset(&pArgs[6], 0, sizeof(CODEOBJ)); } if (rc == ASLERR_NONE) { gpcodeScope->dwCodeLen = 0; gpcodeScope->bCodeChkSum = 0; ComputeChkSumLen(gpcodeScope); dwResBitOffset = (dwLen + 3)*8; } } } } EXIT((1, "InterruptDesc=%d\n", rc)); return rc; } //InterruptDesc /***LP QWordMemDesc - QWord memory descriptor * * ENTRY * ptoken -> token stream * fActionFL - TRUE if this is a fixed list action * * EXIT-SUCCESS * returns ASLERR_NONE * EXIT-FAILURE * returns negative error code */ int LOCAL QWordMemDesc(PTOKEN ptoken, BOOL fActionFL) { int rc; ENTER((1, "QWordMemDesc(ptoken=%p,fActionFL=%d)\n", ptoken, fActionFL)); DEREF(ptoken); DEREF(fActionFL); ASSERT(fActionFL == TRUE); rc = MemSpaceDesc(ptoken, 43, QWordFields); EXIT((1, "QWordMemDesc=%d\n", rc)); return rc; } //QWordMemDesc /***LP QWordIODesc - QWord IO descriptor * * ENTRY * ptoken -> token stream * fActionFL - TRUE if this is a fixed list action * * EXIT-SUCCESS * returns ASLERR_NONE * EXIT-FAILURE * returns negative error code */ int LOCAL QWordIODesc(PTOKEN ptoken, BOOL fActionFL) { int rc; ENTER((1, "QWordIODesc(ptoken=%p,fActionFL=%d)\n", ptoken, fActionFL)); DEREF(ptoken); DEREF(fActionFL); ASSERT(fActionFL == TRUE); rc = IOSpaceDesc(ptoken, 43, QWordFields); EXIT((1, "QWordIODesc=%d\n", rc)); return rc; } //QWordIODesc /***LP CreateResFields - Create resource fields * * ENTRY * ptoken -> TOKEN * pnsParent -> parent object * prf -> resource fields table * * EXIT-SUCCESS * returns ASLERR_NONE * EXIT-FAILURE * returns negative error code */ int LOCAL CreateResFields(PTOKEN ptoken, PNSOBJ pnsParent, PRESFIELD prf) { int rc = ASLERR_NONE; int i; PNSOBJ pns; ENTER((2, "CreateResFields(ptoken=%p,pnsParent=%s,prf=%p)\n", ptoken, GetObjectPath(pnsParent), prf)); for (i = 0; prf[i].pszName != NULL; ++i) { if ((rc = CreateNameSpaceObj(ptoken, prf[i].pszName, pnsParent, gpnsCurrentOwner, &pns, NSF_EXIST_ERR)) == ASLERR_NONE) { pns->ObjData.dwDataType = OBJTYPE_RES_FIELD; pns->ObjData.uipDataValue = dwResBitOffset + prf[i].dwBitOffset; pns->ObjData.dwDataLen = prf[i].dwBitSize; } } EXIT((2, "CreateResFields=%d\n", rc)); return rc; } //CreateResFields