📄 cmutils.c
字号:
* * DESCRIPTION: Pop a state object from a state stack * ******************************************************************************/ACPI_GENERIC_STATE *acpi_cm_pop_generic_state ( ACPI_GENERIC_STATE **list_head){ ACPI_GENERIC_STATE *state; /* Remove the state object at the head of the list (stack) */ state = *list_head; if (state) { /* Update the list head */ *list_head = state->common.next; } return (state);}/******************************************************************************* * * FUNCTION: Acpi_cm_create_generic_state * * PARAMETERS: None * * RETURN: Status * * DESCRIPTION: Create a generic state object. Attempt to obtain one from * the global state cache; If none available, create a new one. * ******************************************************************************/ACPI_GENERIC_STATE *acpi_cm_create_generic_state (void){ ACPI_GENERIC_STATE *state; acpi_cm_acquire_mutex (ACPI_MTX_CACHES); acpi_gbl_state_cache_requests++; /* Check the cache first */ if (acpi_gbl_generic_state_cache) { /* There is an object available, use it */ state = acpi_gbl_generic_state_cache; acpi_gbl_generic_state_cache = state->common.next; state->common.next = NULL; acpi_gbl_state_cache_hits++; acpi_gbl_generic_state_cache_depth--; acpi_cm_release_mutex (ACPI_MTX_CACHES); } else { /* The cache is empty, create a new object */ acpi_cm_release_mutex (ACPI_MTX_CACHES); state = acpi_cm_callocate (sizeof (ACPI_GENERIC_STATE)); } /* Initialize */ if (state) { /* Always zero out the object before init */ MEMSET (state, 0, sizeof (ACPI_GENERIC_STATE)); state->common.data_type = ACPI_DESC_TYPE_STATE; } return (state);}/******************************************************************************* * * FUNCTION: Acpi_cm_create_update_state * * PARAMETERS: Object - Initial Object to be installed in the * state * Action - Update action to be performed * * RETURN: Status * * DESCRIPTION: Create an "Update State" - a flavor of the generic state used * to update reference counts and delete complex objects such * as packages. * ******************************************************************************/ACPI_GENERIC_STATE *acpi_cm_create_update_state ( ACPI_OPERAND_OBJECT *object, u16 action){ ACPI_GENERIC_STATE *state; /* Create the generic state object */ state = acpi_cm_create_generic_state (); if (!state) { return (NULL); } /* Init fields specific to the update struct */ state->update.object = object; state->update.value = action; return (state);}/******************************************************************************* * * FUNCTION: Acpi_cm_create_control_state * * PARAMETERS: None * * RETURN: Status * * DESCRIPTION: Create a "Control State" - a flavor of the generic state used * to support nested IF/WHILE constructs in the AML. * ******************************************************************************/ACPI_GENERIC_STATE *acpi_cm_create_control_state ( void){ ACPI_GENERIC_STATE *state; /* Create the generic state object */ state = acpi_cm_create_generic_state (); if (!state) { return (NULL); } /* Init fields specific to the control struct */ state->common.state = CONTROL_CONDITIONAL_EXECUTING; return (state);}/******************************************************************************* * * FUNCTION: Acpi_cm_delete_generic_state * * PARAMETERS: State - The state object to be deleted * * RETURN: Status * * DESCRIPTION: Put a state object back into the global state cache. The object * is not actually freed at this time. * ******************************************************************************/voidacpi_cm_delete_generic_state ( ACPI_GENERIC_STATE *state){ /* If cache is full, just free this state object */ if (acpi_gbl_generic_state_cache_depth >= MAX_STATE_CACHE_DEPTH) { acpi_cm_free (state); } /* Otherwise put this object back into the cache */ else { acpi_cm_acquire_mutex (ACPI_MTX_CACHES); /* Clear the state */ MEMSET (state, 0, sizeof (ACPI_GENERIC_STATE)); state->common.data_type = ACPI_DESC_TYPE_STATE; /* Put the object at the head of the global cache list */ state->common.next = acpi_gbl_generic_state_cache; acpi_gbl_generic_state_cache = state; acpi_gbl_generic_state_cache_depth++; acpi_cm_release_mutex (ACPI_MTX_CACHES); } return;}/******************************************************************************* * * FUNCTION: Acpi_cm_delete_generic_state_cache * * PARAMETERS: None * * RETURN: Status * * DESCRIPTION: Purge the global state object cache. Used during subsystem * termination. * ******************************************************************************/voidacpi_cm_delete_generic_state_cache ( void){ ACPI_GENERIC_STATE *next; /* Traverse the global cache list */ while (acpi_gbl_generic_state_cache) { /* Delete one cached state object */ next = acpi_gbl_generic_state_cache->common.next; acpi_cm_free (acpi_gbl_generic_state_cache); acpi_gbl_generic_state_cache = next; acpi_gbl_generic_state_cache_depth--; } return;}/******************************************************************************* * * FUNCTION: Acpi_cm_resolve_package_references * * PARAMETERS: Obj_desc - The Package object on which to resolve refs * * RETURN: Status * * DESCRIPTION: Walk through a package and turn internal references into values * ******************************************************************************/ACPI_STATUSacpi_cm_resolve_package_references ( ACPI_OPERAND_OBJECT *obj_desc){ u32 count; ACPI_OPERAND_OBJECT *sub_object; if (obj_desc->common.type != ACPI_TYPE_PACKAGE) { /* Must be a package */ REPORT_ERROR (("Must resolve Package Refs on a Package\n")); return(AE_ERROR); } for (count = 0; count < obj_desc->package.count; count++) { sub_object = obj_desc->package.elements[count]; if (sub_object->common.type == INTERNAL_TYPE_REFERENCE) { if (sub_object->reference.op_code == AML_ZERO_OP) { sub_object->common.type = ACPI_TYPE_NUMBER; sub_object->number.value = 0; } else if (sub_object->reference.op_code == AML_ONE_OP) { sub_object->common.type = ACPI_TYPE_NUMBER; sub_object->number.value = 1; } else if (sub_object->reference.op_code == AML_ONES_OP) { sub_object->common.type = ACPI_TYPE_NUMBER; sub_object->number.value = ACPI_INTEGER_MAX; } } } return(AE_OK);}/******************************************************************************* * * FUNCTION: _Report_error * * PARAMETERS: Module_name - Caller's module name (for error output) * Line_number - Caller's line number (for error output) * Component_id - Caller's component ID (for error output) * Message - Error message to use on failure * * RETURN: None * * DESCRIPTION: Print error message from KD table * ******************************************************************************/void_report_error ( NATIVE_CHAR *module_name, u32 line_number, u32 component_id){ acpi_os_printf ("%8s-%04d: *** Error: ", module_name, line_number);}/******************************************************************************* * * FUNCTION: _Report_warning * * PARAMETERS: Module_name - Caller's module name (for error output) * Line_number - Caller's line number (for error output) * Component_id - Caller's component ID (for error output) * Message - Error message to use on failure * * RETURN: None * * DESCRIPTION: Print warning message from KD table * ******************************************************************************/void_report_warning ( NATIVE_CHAR *module_name, u32 line_number, u32 component_id){ acpi_os_printf ("%8s-%04d: *** Warning: ", module_name, line_number);}/******************************************************************************* * * FUNCTION: _Report_info * * PARAMETERS: Module_name - Caller's module name (for error output) * Line_number - Caller's line number (for error output) * Component_id - Caller's component ID (for error output) * Message - Error message to use on failure * * RETURN: None * * DESCRIPTION: Print information message from KD table * ******************************************************************************/void_report_info ( NATIVE_CHAR *module_name, u32 line_number, u32 component_id){ acpi_os_printf ("%8s-%04d: *** Info: ", module_name, line_number);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -