本文整理汇总了C++中AcpiUtDeleteObjectDesc函数的典型用法代码示例。如果您正苦于以下问题:C++ AcpiUtDeleteObjectDesc函数的具体用法?C++ AcpiUtDeleteObjectDesc怎么用?C++ AcpiUtDeleteObjectDesc使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了AcpiUtDeleteObjectDesc函数的10个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: AcpiDsCreateMethodMutex
static ACPI_STATUS
AcpiDsCreateMethodMutex (
ACPI_OPERAND_OBJECT *MethodDesc)
{
ACPI_OPERAND_OBJECT *MutexDesc;
ACPI_STATUS Status;
ACPI_FUNCTION_TRACE (DsCreateMethodMutex);
/* Create the new mutex object */
MutexDesc = AcpiUtCreateInternalObject (ACPI_TYPE_MUTEX);
if (!MutexDesc)
{
return_ACPI_STATUS (AE_NO_MEMORY);
}
/* Create the actual OS Mutex */
Status = AcpiOsCreateMutex (&MutexDesc->Mutex.OsMutex);
if (ACPI_FAILURE (Status))
{
AcpiUtDeleteObjectDesc (MutexDesc);
return_ACPI_STATUS (Status);
}
MutexDesc->Mutex.SyncLevel = MethodDesc->Method.SyncLevel;
MethodDesc->Method.Mutex = MutexDesc;
return_ACPI_STATUS (AE_OK);
}
开发者ID:Lxg1582,项目名称:freebsd,代码行数:32,代码来源:dsmethod.c
示例2: AcpiDsCreateOperand
//.........这里部分代码省略.........
}
/* Put the resulting object onto the current object stack */
Status = AcpiDsObjStackPush (ObjDesc, WalkState);
if (ACPI_FAILURE (Status))
{
return_ACPI_STATUS (Status);
}
ACPI_DEBUGGER_EXEC (AcpiDbDisplayArgumentObject (ObjDesc, WalkState));
}
else
{
/* Check for null name case */
if ((Arg->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
!(Arg->Common.Flags & ACPI_PARSEOP_IN_STACK))
{
/*
* If the name is null, this means that this is an
* optional result parameter that was not specified
* in the original ASL. Create a Zero Constant for a
* placeholder. (Store to a constant is a Noop.)
*/
Opcode = AML_ZERO_OP; /* Has no arguments! */
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
"Null namepath: Arg=%p\n", Arg));
}
else
{
Opcode = Arg->Common.AmlOpcode;
}
/* Get the object type of the argument */
OpInfo = AcpiPsGetOpcodeInfo (Opcode);
if (OpInfo->ObjectType == ACPI_TYPE_INVALID)
{
return_ACPI_STATUS (AE_NOT_IMPLEMENTED);
}
if ((OpInfo->Flags & AML_HAS_RETVAL) || (Arg->Common.Flags & ACPI_PARSEOP_IN_STACK))
{
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
"Argument previously created, already stacked\n"));
ACPI_DEBUGGER_EXEC (AcpiDbDisplayArgumentObject (
WalkState->Operands [WalkState->NumOperands - 1], WalkState));
/*
* Use value that was already previously returned
* by the evaluation of this argument
*/
Status = AcpiDsResultPop (&ObjDesc, WalkState);
if (ACPI_FAILURE (Status))
{
/*
* Only error is underflow, and this indicates
* a missing or null operand!
*/
ACPI_EXCEPTION ((AE_INFO, Status,
"Missing or null operand"));
return_ACPI_STATUS (Status);
}
}
else
{
/* Create an ACPI_INTERNAL_OBJECT for the argument */
ObjDesc = AcpiUtCreateInternalObject (OpInfo->ObjectType);
if (!ObjDesc)
{
return_ACPI_STATUS (AE_NO_MEMORY);
}
/* Initialize the new object */
Status = AcpiDsInitObjectFromOp (
WalkState, Arg, Opcode, &ObjDesc);
if (ACPI_FAILURE (Status))
{
AcpiUtDeleteObjectDesc (ObjDesc);
return_ACPI_STATUS (Status);
}
}
/* Put the operand object on the object stack */
Status = AcpiDsObjStackPush (ObjDesc, WalkState);
if (ACPI_FAILURE (Status))
{
return_ACPI_STATUS (Status);
}
ACPI_DEBUGGER_EXEC (AcpiDbDisplayArgumentObject (ObjDesc, WalkState));
}
return_ACPI_STATUS (AE_OK);
}
开发者ID:ornarium,项目名称:freebsd,代码行数:101,代码来源:dsutils.c
示例3: AcpiDsBuildInternalPackageObj
ACPI_STATUS
AcpiDsBuildInternalPackageObj (
ACPI_WALK_STATE *WalkState,
ACPI_PARSE_OBJECT *Op,
UINT32 ElementCount,
ACPI_OPERAND_OBJECT **ObjDescPtr)
{
ACPI_PARSE_OBJECT *Arg;
ACPI_PARSE_OBJECT *Parent;
ACPI_OPERAND_OBJECT *ObjDesc = NULL;
ACPI_STATUS Status = AE_OK;
UINT32 i;
UINT16 Index;
UINT16 ReferenceCount;
ACPI_FUNCTION_TRACE (DsBuildInternalPackageObj);
/* Find the parent of a possibly nested package */
Parent = Op->Common.Parent;
while ((Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
(Parent->Common.AmlOpcode == AML_VAR_PACKAGE_OP))
{
Parent = Parent->Common.Parent;
}
/*
* If we are evaluating a Named package object "Name (xxxx, Package)",
* the package object already exists, otherwise it must be created.
*/
ObjDesc = *ObjDescPtr;
if (!ObjDesc)
{
ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_PACKAGE);
*ObjDescPtr = ObjDesc;
if (!ObjDesc)
{
return_ACPI_STATUS (AE_NO_MEMORY);
}
ObjDesc->Package.Node = Parent->Common.Node;
}
/*
* Allocate the element array (array of pointers to the individual
* objects) based on the NumElements parameter. Add an extra pointer slot
* so that the list is always null terminated.
*/
ObjDesc->Package.Elements = ACPI_ALLOCATE_ZEROED (
((ACPI_SIZE) ElementCount + 1) * sizeof (void *));
if (!ObjDesc->Package.Elements)
{
AcpiUtDeleteObjectDesc (ObjDesc);
return_ACPI_STATUS (AE_NO_MEMORY);
}
ObjDesc->Package.Count = ElementCount;
/*
* Initialize the elements of the package, up to the NumElements count.
* Package is automatically padded with uninitialized (NULL) elements
* if NumElements is greater than the package list length. Likewise,
* Package is truncated if NumElements is less than the list length.
*/
Arg = Op->Common.Value.Arg;
Arg = Arg->Common.Next;
for (i = 0; Arg && (i < ElementCount); i++)
{
if (Arg->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP)
{
if (Arg->Common.Node->Type == ACPI_TYPE_METHOD)
{
/*
* A method reference "looks" to the parser to be a method
* invocation, so we special case it here
*/
Arg->Common.AmlOpcode = AML_INT_NAMEPATH_OP;
Status = AcpiDsBuildInternalObject (WalkState, Arg,
&ObjDesc->Package.Elements[i]);
}
else
{
/* This package element is already built, just get it */
ObjDesc->Package.Elements[i] =
ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Arg->Common.Node);
}
}
else
{
Status = AcpiDsBuildInternalObject (WalkState, Arg,
&ObjDesc->Package.Elements[i]);
}
if (*ObjDescPtr)
{
/* Existing package, get existing reference count */
//.........这里部分代码省略.........
开发者ID:ornarium,项目名称:freebsd,代码行数:101,代码来源:dsobject.c
示例4: AcpiDsBuildInternalBufferObj
ACPI_STATUS
AcpiDsBuildInternalBufferObj (
ACPI_WALK_STATE *WalkState,
ACPI_PARSE_OBJECT *Op,
UINT32 BufferLength,
ACPI_OPERAND_OBJECT **ObjDescPtr)
{
ACPI_PARSE_OBJECT *Arg;
ACPI_OPERAND_OBJECT *ObjDesc;
ACPI_PARSE_OBJECT *ByteList;
UINT32 ByteListLength = 0;
ACPI_FUNCTION_TRACE (DsBuildInternalBufferObj);
/*
* If we are evaluating a Named buffer object "Name (xxxx, Buffer)".
* The buffer object already exists (from the NS node), otherwise it must
* be created.
*/
ObjDesc = *ObjDescPtr;
if (!ObjDesc)
{
/* Create a new buffer object */
ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_BUFFER);
*ObjDescPtr = ObjDesc;
if (!ObjDesc)
{
return_ACPI_STATUS (AE_NO_MEMORY);
}
}
/*
* Second arg is the buffer data (optional) ByteList can be either
* individual bytes or a string initializer. In either case, a
* ByteList appears in the AML.
*/
Arg = Op->Common.Value.Arg; /* skip first arg */
ByteList = Arg->Named.Next;
if (ByteList)
{
if (ByteList->Common.AmlOpcode != AML_INT_BYTELIST_OP)
{
ACPI_ERROR ((AE_INFO,
"Expecting bytelist, found AML opcode 0x%X in op %p",
ByteList->Common.AmlOpcode, ByteList));
AcpiUtRemoveReference (ObjDesc);
return (AE_TYPE);
}
ByteListLength = (UINT32) ByteList->Common.Value.Integer;
}
/*
* The buffer length (number of bytes) will be the larger of:
* 1) The specified buffer length and
* 2) The length of the initializer byte list
*/
ObjDesc->Buffer.Length = BufferLength;
if (ByteListLength > BufferLength)
{
ObjDesc->Buffer.Length = ByteListLength;
}
/* Allocate the buffer */
if (ObjDesc->Buffer.Length == 0)
{
ObjDesc->Buffer.Pointer = NULL;
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
"Buffer defined with zero length in AML, creating\n"));
}
else
{
ObjDesc->Buffer.Pointer = ACPI_ALLOCATE_ZEROED (
ObjDesc->Buffer.Length);
if (!ObjDesc->Buffer.Pointer)
{
AcpiUtDeleteObjectDesc (ObjDesc);
return_ACPI_STATUS (AE_NO_MEMORY);
}
/* Initialize buffer from the ByteList (if present) */
if (ByteList)
{
ACPI_MEMCPY (ObjDesc->Buffer.Pointer, ByteList->Named.Data,
ByteListLength);
}
}
ObjDesc->Buffer.Flags |= AOPOBJ_DATA_VALID;
Op->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjDesc);
return_ACPI_STATUS (AE_OK);
}
开发者ID:ornarium,项目名称:freebsd,代码行数:99,代码来源:dsobject.c
示例5: AcpiUtDeleteInternalObj
//.........这里部分代码省略.........
(void) AcpiOsDeleteSemaphore (AcpiGbl_GlobalLockSemaphore);
AcpiGbl_GlobalLockSemaphore = NULL;
AcpiOsDeleteMutex (Object->Mutex.OsMutex);
AcpiGbl_GlobalLockMutex = NULL;
}
else
{
AcpiExUnlinkMutex (Object);
AcpiOsDeleteMutex (Object->Mutex.OsMutex);
}
break;
case ACPI_TYPE_EVENT:
ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
"***** Event %p, OS Semaphore %p\n",
Object, Object->Event.OsSemaphore));
(void) AcpiOsDeleteSemaphore (Object->Event.OsSemaphore);
Object->Event.OsSemaphore = NULL;
break;
case ACPI_TYPE_METHOD:
ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
"***** Method %p\n", Object));
/* Delete the method mutex if it exists */
if (Object->Method.Mutex)
{
AcpiOsDeleteMutex (Object->Method.Mutex->Mutex.OsMutex);
AcpiUtDeleteObjectDesc (Object->Method.Mutex);
Object->Method.Mutex = NULL;
}
break;
case ACPI_TYPE_REGION:
ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
"***** Region %p\n", Object));
/*
* Update AddressRange list. However, only permanent regions
* are installed in this list. (Not created within a method)
*/
if (!(Object->Region.Node->Flags & ANOBJ_TEMPORARY))
{
AcpiUtRemoveAddressRange (Object->Region.SpaceId,
Object->Region.Node);
}
SecondDesc = AcpiNsGetSecondaryObject (Object);
if (SecondDesc)
{
/*
* Free the RegionContext if and only if the handler is one of the
* default handlers -- and therefore, we created the context object
* locally, it was not created by an external caller.
*/
HandlerDesc = Object->Region.Handler;
if (HandlerDesc)
{
NextDesc = HandlerDesc->AddressSpace.RegionList;
StartDesc = NextDesc;
开发者ID:99corps,项目名称:runtime,代码行数:67,代码来源:utdelete.c
示例6: AcpiDsBuildInternalPackageObj
ACPI_STATUS
AcpiDsBuildInternalPackageObj (
ACPI_WALK_STATE *WalkState,
ACPI_PARSE_OBJECT *Op,
UINT32 ElementCount,
ACPI_OPERAND_OBJECT **ObjDescPtr)
{
ACPI_PARSE_OBJECT *Arg;
ACPI_PARSE_OBJECT *Parent;
ACPI_OPERAND_OBJECT *ObjDesc = NULL;
ACPI_STATUS Status = AE_OK;
ACPI_NATIVE_UINT i;
ACPI_FUNCTION_TRACE (DsBuildInternalPackageObj);
/* Find the parent of a possibly nested package */
Parent = Op->Common.Parent;
while ((Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
(Parent->Common.AmlOpcode == AML_VAR_PACKAGE_OP))
{
Parent = Parent->Common.Parent;
}
/*
* If we are evaluating a Named package object "Name (xxxx, Package)",
* the package object already exists, otherwise it must be created.
*/
ObjDesc = *ObjDescPtr;
if (!ObjDesc)
{
ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_PACKAGE);
*ObjDescPtr = ObjDesc;
if (!ObjDesc)
{
return_ACPI_STATUS (AE_NO_MEMORY);
}
ObjDesc->Package.Node = Parent->Common.Node;
}
/*
* Allocate the element array (array of pointers to the individual
* objects) based on the NumElements parameter. Add an extra pointer slot
* so that the list is always null terminated.
*/
ObjDesc->Package.Elements = ACPI_ALLOCATE_ZEROED (
((ACPI_SIZE) ElementCount + 1) * sizeof (void *));
if (!ObjDesc->Package.Elements)
{
AcpiUtDeleteObjectDesc (ObjDesc);
return_ACPI_STATUS (AE_NO_MEMORY);
}
ObjDesc->Package.Count = ElementCount;
/*
* Initialize the elements of the package, up to the NumElements count.
* Package is automatically padded with uninitialized (NULL) elements
* if NumElements is greater than the package list length. Likewise,
* Package is truncated if NumElements is less than the list length.
*/
Arg = Op->Common.Value.Arg;
Arg = Arg->Common.Next;
for (i = 0; Arg && (i < ElementCount); i++)
{
if (Arg->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP)
{
/* This package element is already built, just get it */
ObjDesc->Package.Elements[i] =
ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Arg->Common.Node);
}
else
{
Status = AcpiDsBuildInternalObject (WalkState, Arg,
&ObjDesc->Package.Elements[i]);
}
Arg = Arg->Common.Next;
}
if (!Arg)
{
ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
"Package List length larger than NumElements count (%X), truncated\n",
ElementCount));
}
ObjDesc->Package.Flags |= AOPOBJ_DATA_VALID;
Op->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjDesc);
return_ACPI_STATUS (Status);
}
开发者ID:andreiw,项目名称:polaris,代码行数:95,代码来源:dsobject.c
示例7: AcpiUtCreateInternalObjectDbg
ACPI_OPERAND_OBJECT *
AcpiUtCreateInternalObjectDbg (
const char *ModuleName,
UINT32 LineNumber,
UINT32 ComponentId,
ACPI_OBJECT_TYPE Type)
{
ACPI_OPERAND_OBJECT *Object;
ACPI_OPERAND_OBJECT *SecondObject;
ACPI_FUNCTION_TRACE_STR (UtCreateInternalObjectDbg,
AcpiUtGetTypeName (Type));
/* Allocate the raw object descriptor */
Object = AcpiUtAllocateObjectDescDbg (
ModuleName, LineNumber, ComponentId);
if (!Object)
{
return_PTR (NULL);
}
switch (Type)
{
case ACPI_TYPE_REGION:
case ACPI_TYPE_BUFFER_FIELD:
case ACPI_TYPE_LOCAL_BANK_FIELD:
/* These types require a secondary object */
SecondObject = AcpiUtAllocateObjectDescDbg (
ModuleName, LineNumber, ComponentId);
if (!SecondObject)
{
AcpiUtDeleteObjectDesc (Object);
return_PTR (NULL);
}
SecondObject->Common.Type = ACPI_TYPE_LOCAL_EXTRA;
SecondObject->Common.ReferenceCount = 1;
/* Link the second object to the first */
Object->Common.NextObject = SecondObject;
break;
default:
/* All others have no secondary object */
break;
}
/* Save the object type in the object descriptor */
Object->Common.Type = (UINT8) Type;
/* Init the reference count */
Object->Common.ReferenceCount = 1;
/* Any per-type initialization should go here */
return_PTR (Object);
}
开发者ID:FreeBSDFoundation,项目名称:freebsd,代码行数:66,代码来源:utobject.c
示例8: AcpiExPrepFieldValue
ACPI_STATUS
AcpiExPrepFieldValue (
ACPI_CREATE_FIELD_INFO *Info)
{
ACPI_OPERAND_OBJECT *ObjDesc;
ACPI_OPERAND_OBJECT *SecondDesc = NULL;
ACPI_STATUS Status;
UINT32 AccessByteWidth;
UINT32 Type;
ACPI_FUNCTION_TRACE (ExPrepFieldValue);
/* Parameter validation */
if (Info->FieldType != ACPI_TYPE_LOCAL_INDEX_FIELD)
{
if (!Info->RegionNode)
{
ACPI_ERROR ((AE_INFO, "Null RegionNode"));
return_ACPI_STATUS (AE_AML_NO_OPERAND);
}
Type = AcpiNsGetType (Info->RegionNode);
if (Type != ACPI_TYPE_REGION)
{
ACPI_ERROR ((AE_INFO, "Needed Region, found type 0x%X (%s)",
Type, AcpiUtGetTypeName (Type)));
return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
}
}
/* Allocate a new field object */
ObjDesc = AcpiUtCreateInternalObject (Info->FieldType);
if (!ObjDesc)
{
return_ACPI_STATUS (AE_NO_MEMORY);
}
/* Initialize areas of the object that are common to all fields */
ObjDesc->CommonField.Node = Info->FieldNode;
Status = AcpiExPrepCommonFieldObject (ObjDesc,
Info->FieldFlags, Info->Attribute,
Info->FieldBitPosition, Info->FieldBitLength);
if (ACPI_FAILURE (Status))
{
AcpiUtDeleteObjectDesc (ObjDesc);
return_ACPI_STATUS (Status);
}
/* Initialize areas of the object that are specific to the field type */
switch (Info->FieldType)
{
case ACPI_TYPE_LOCAL_REGION_FIELD:
ObjDesc->Field.RegionObj = AcpiNsGetAttachedObject (Info->RegionNode);
/* Fields specific to GenericSerialBus fields */
ObjDesc->Field.AccessLength = Info->AccessLength;
if (Info->ConnectionNode)
{
SecondDesc = Info->ConnectionNode->Object;
if (!(SecondDesc->Common.Flags & AOPOBJ_DATA_VALID))
{
Status = AcpiDsGetBufferArguments (SecondDesc);
if (ACPI_FAILURE (Status))
{
AcpiUtDeleteObjectDesc (ObjDesc);
return_ACPI_STATUS (Status);
}
}
ObjDesc->Field.ResourceBuffer = SecondDesc->Buffer.Pointer;
ObjDesc->Field.ResourceLength = (UINT16) SecondDesc->Buffer.Length;
}
else if (Info->ResourceBuffer)
{
ObjDesc->Field.ResourceBuffer = Info->ResourceBuffer;
ObjDesc->Field.ResourceLength = Info->ResourceLength;
}
/* Allow full data read from EC address space */
if ((ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_EC) &&
(ObjDesc->CommonField.BitLength > 8))
{
AccessByteWidth = ACPI_ROUND_BITS_UP_TO_BYTES (
ObjDesc->CommonField.BitLength);
/* Maximum byte width supported is 255 */
if (AccessByteWidth < 256)
{
//.........这里部分代码省略.........
开发者ID:CSharpLover,项目名称:MosquitOS,代码行数:101,代码来源:exprep.c
示例9: AcpiUtDeleteInternalObj
//.........这里部分代码省略.........
AcpiOsDeleteMutex (Object->Mutex.OsMutex);
AcpiGbl_GlobalLockMutex = NULL;
}
else
{
AcpiExUnlinkMutex (Object);
AcpiOsDeleteMutex (Object->Mutex.OsMutex);
}
break;
case ACPI_TYPE_EVENT:
ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
"***** Event %p, OS Semaphore %p\n",
Object, Object->Event.OsSemaphore));
(void) AcpiOsDeleteSemaphore (Object->Event.OsSemaphore);
Object->Event.OsSemaphore = NULL;
break;
case ACPI_TYPE_METHOD:
ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
"***** Method %p\n", Object));
/* Delete the method mutex if it exists */
if (Object->Method.Mutex)
{
AcpiOsDeleteMutex (Object->Method.Mutex->Mutex.OsMutex);
AcpiUtDeleteObjectDesc (Object->Method.Mutex);
Object->Method.Mutex = NULL;
}
break;
case ACPI_TYPE_REGION:
ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
"***** Region %p\n", Object));
SecondDesc = AcpiNsGetSecondaryObject (Object);
if (SecondDesc)
{
/*
* Free the RegionContext if and only if the handler is one of the
* default handlers -- and therefore, we created the context object
* locally, it was not created by an external caller.
*/
HandlerDesc = Object->Region.Handler;
if (HandlerDesc)
{
if (HandlerDesc->AddressSpace.HandlerFlags &
ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)
{
/* Deactivate region and free region context */
if (HandlerDesc->AddressSpace.Setup)
{
(void) HandlerDesc->AddressSpace.Setup (Object,
ACPI_REGION_DEACTIVATE,
HandlerDesc->AddressSpace.Context,
&SecondDesc->Extra.RegionContext);
开发者ID:oza,项目名称:FreeBSD-7.3-dyntick,代码行数:67,代码来源:utdelete.c
示例10: AcpiDsBuildInternalPackageObj
ACPI_STATUS
AcpiDsBuildInternalPackageObj (
ACPI_WALK_STATE *WalkState,
ACPI_PARSE_OBJECT *Op,
UINT32 PackageLength,
ACPI_OPERAND_OBJECT **ObjDescPtr)
{
ACPI_PARSE_OBJECT *Arg;
ACPI_PARSE_OBJECT *Parent;
ACPI_OPERAND_OBJECT *ObjDesc = NULL;
UINT32 PackageListLength;
ACPI_STATUS Status = AE_OK;
UINT32 i;
ACPI_FUNCTION_TRACE ("DsBuildInternalPackageObj");
/* Find the parent of a possibly nested package */
Parent = Op->Common.Parent;
while ((Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
(Parent->Common.AmlOpcode == AML_VAR_PACKAGE_OP))
{
Parent = Parent->Common.Parent;
}
ObjDesc = *ObjDescPtr;
if (ObjDesc)
{
/*
* We are evaluating a Named package object "Name (xxxx, Package)".
* Get the existing package object from the NS node
*/
}
else
{
ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_PACKAGE);
*ObjDescPtr = ObjDesc;
if (!ObjDesc)
{
return_ACPI_STATUS (AE_NO_MEMORY);
}
ObjDesc->Package.Node = Parent->Common.Node;
}
ObjDesc->Package.Count = PackageLength;
/* Count the number of items in the package list */
PackageListLength = 0;
Arg = Op->Common.Value.Arg;
Arg = Arg->Common.Next;
while (Arg)
{
PackageListLength++;
Arg = Arg->Common.Next;
}
/*
* The package length (number of elements) will be the greater
* of the specified length and the length of the initializer list
*/
if (PackageListLength > PackageLength)
{
ObjDesc->Package.Count = PackageListLength;
}
/*
* Allocate the pointer array (array of pointers to the
* individual objects). Add an extra pointer slot so
* that the list is always null terminated.
*/
ObjDesc->Package.Elements = ACPI_MEM_CALLOCATE (
((ACPI_SIZE) ObjDesc->Package.Count + 1) * sizeof (void *));
if (!ObjDesc->Package.Elements)
{
AcpiUtDeleteObjectDesc (ObjDesc);
return_ACPI_STATUS (AE_NO_MEMORY);
}
/*
* Now init the elements of the package
*/
i = 0;
Arg = Op->Common.Value.Arg;
Arg = Arg->Common.Next;
while (Arg)
{
if (Arg->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP)
{
/* Object (package or buffer) is already built */
ObjDesc->Package.Elements[i] = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Arg->Common.Node);
}
else
{
Status = AcpiDsBuildInternalObject (WalkState, Arg,
//.........这里部分代码省略.........
开发者ID:UnitedMarsupials,项目名称:kame,代码行数:101,代码来源:dsobject.c
注:本文中的AcpiUtDeleteObjectDesc函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论