📄 cmobject.c
字号:
return;
}
/*******************************************************************************
*
* FUNCTION: Acpi_cm_init_static_object
*
* PARAMETERS: Obj_desc - Pointer to a "static" object - on stack
* or in the data segment.
*
* RETURN: None.
*
* DESCRIPTION: Initialize a static object. Sets flags to disallow dynamic
* deletion of the object.
*
******************************************************************************/
void
acpi_cm_init_static_object (
ACPI_OPERAND_OBJECT *obj_desc)
{
if (!obj_desc) {
return;
}
/*
* Clear the entire descriptor
*/
MEMSET ((void *) obj_desc, 0, sizeof (ACPI_OPERAND_OBJECT));
/*
* Initialize the header fields
* 1) This is an ACPI_OPERAND_OBJECT descriptor
* 2) The size is the full object (worst case)
* 3) The flags field indicates static allocation
* 4) Reference count starts at one (not really necessary since the
* object can't be deleted, but keeps everything sane)
*/
obj_desc->common.data_type = ACPI_DESC_TYPE_INTERNAL;
obj_desc->common.flags = AOPOBJ_STATIC_ALLOCATION;
obj_desc->common.reference_count = 1;
return;
}
/*******************************************************************************
*
* FUNCTION: Acpi_cm_get_simple_object_size
*
* PARAMETERS: *Internal_object - Pointer to the object we are examining
* *Ret_length - Where the length is returned
*
* RETURN: Status
*
* DESCRIPTION: This function is called to determine the space required to
* contain a simple object for return to an API user.
*
* The length includes the object structure plus any additional
* needed space.
*
******************************************************************************/
ACPI_STATUS
acpi_cm_get_simple_object_size (
ACPI_OPERAND_OBJECT *internal_object,
u32 *obj_length)
{
u32 length;
ACPI_STATUS status = AE_OK;
/* Handle a null object (Could be a uninitialized package element -- which is legal) */
if (!internal_object) {
*obj_length = 0;
return (AE_OK);
}
/* Start with the length of the Acpi object */
length = sizeof (ACPI_OBJECT);
if (VALID_DESCRIPTOR_TYPE (internal_object, ACPI_DESC_TYPE_NAMED)) {
/* Object is a named object (reference), just return the length */
*obj_length = (u32) ROUND_UP_TO_NATIVE_WORD (length);
return (status);
}
/*
* The final length depends on the object type
* Strings and Buffers are packed right up against the parent object and
* must be accessed bytewise or there may be alignment problems on
* certain processors
*/
switch (internal_object->common.type) {
case ACPI_TYPE_STRING:
length += internal_object->string.length + 1;
break;
case ACPI_TYPE_BUFFER:
length += internal_object->buffer.length;
break;
case ACPI_TYPE_INTEGER:
case ACPI_TYPE_PROCESSOR:
case ACPI_TYPE_POWER:
/*
* No extra data for these types
*/
break;
case INTERNAL_TYPE_REFERENCE:
/*
* The only type that should be here is opcode AML_NAMEPATH_OP -- since
* this means an object reference
*/
if (internal_object->reference.opcode != AML_NAMEPATH_OP) {
status = AE_TYPE;
}
else {
/*
* Get the actual length of the full pathname to this object.
* The reference will be converted to the pathname to the object
*/
length += ROUND_UP_TO_NATIVE_WORD (acpi_ns_get_pathname_length (internal_object->reference.node));
}
break;
default:
status = AE_TYPE;
break;
}
/*
* Account for the space required by the object rounded up to the next
* multiple of the machine word size. This keeps each object aligned
* on a machine word boundary. (preventing alignment faults on some
* machines.)
*/
*obj_length = (u32) ROUND_UP_TO_NATIVE_WORD (length);
return (status);
}
/*******************************************************************************
*
* FUNCTION: Acpi_cm_get_element_length
*
* PARAMETERS: ACPI_PKG_CALLBACK
*
* RETURN: Status - the status of the call
*
* DESCRIPTION: Get the length of one package element.
*
******************************************************************************/
ACPI_STATUS
acpi_cm_get_element_length (
u8 object_type,
ACPI_OPERAND_OBJECT *source_object,
ACPI_GENERIC_STATE *state,
void *context)
{
ACPI_STATUS status = AE_OK;
ACPI_PKG_INFO *info = (ACPI_PKG_INFO *) context;
u32 object_space;
switch (object_type) {
case 0:
/*
* Simple object - just get the size (Null object/entry is handled
* here also) and sum it into the running package length
*/
status = acpi_cm_get_simple_object_size (source_object, &object_space);
if (ACPI_FAILURE (status)) {
return (status);
}
info->length += object_space;
break;
case 1:
/* Package - nothing much to do here, let the walk handle it */
info->num_packages++;
state->pkg.this_target_obj = NULL;
break;
default:
return (AE_BAD_PARAMETER);
}
return (status);
}
/*******************************************************************************
*
* FUNCTION: Acpi_cm_get_package_object_size
*
* PARAMETERS: *Internal_object - Pointer to the object we are examining
* *Ret_length - Where the length is returned
*
* RETURN: Status
*
* DESCRIPTION: This function is called to determine the space required to
* contain a package object for return to an API user.
*
* This is moderately complex since a package contains other
* objects including packages.
*
******************************************************************************/
ACPI_STATUS
acpi_cm_get_package_object_size (
ACPI_OPERAND_OBJECT *internal_object,
u32 *obj_length)
{
ACPI_STATUS status;
ACPI_PKG_INFO info;
info.length = 0;
info.object_space = 0;
info.num_packages = 1;
status = acpi_cm_walk_package_tree (internal_object, NULL,
acpi_cm_get_element_length, &info);
/*
* We have handled all of the objects in all levels of the package.
* just add the length of the package objects themselves.
* Round up to the next machine word.
*/
info.length += ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT)) *
info.num_packages;
/* Return the total package length */
*obj_length = info.length;
return (status);
}
/*******************************************************************************
*
* FUNCTION: Acpi_cm_get_object_size
*
* PARAMETERS: *Internal_object - Pointer to the object we are examining
* *Ret_length - Where the length will be returned
*
* RETURN: Status
*
* DESCRIPTION: This function is called to determine the space required to
* contain an object for return to an API user.
*
******************************************************************************/
ACPI_STATUS
acpi_cm_get_object_size(
ACPI_OPERAND_OBJECT *internal_object,
u32 *obj_length)
{
ACPI_STATUS status;
if ((VALID_DESCRIPTOR_TYPE (internal_object, ACPI_DESC_TYPE_INTERNAL)) &&
(IS_THIS_OBJECT_TYPE (internal_object, ACPI_TYPE_PACKAGE))) {
status = acpi_cm_get_package_object_size (internal_object, obj_length);
}
else {
status = acpi_cm_get_simple_object_size (internal_object, obj_length);
}
return (status);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -