📄 dswload.c
字号:
*
* RETURN: Status
*
* DESCRIPTION: Ascending callback used during the loading of the namespace,
* both control methods and everything else.
*
******************************************************************************/
ACPI_STATUS
acpi_ds_load2_end_op (
ACPI_WALK_STATE *walk_state,
ACPI_PARSE_OBJECT *op)
{
ACPI_STATUS status = AE_OK;
OBJECT_TYPE_INTERNAL data_type;
ACPI_NAMESPACE_NODE *node;
ACPI_PARSE_OBJECT *arg;
ACPI_NAMESPACE_NODE *new_node;
if (!acpi_ps_is_namespace_object_op (op->opcode)) {
return (AE_OK);
}
if (op->opcode == AML_SCOPE_OP) {
if (((ACPI_PARSE2_OBJECT *)op)->name == -1) {
return (AE_OK);
}
}
data_type = acpi_ds_map_named_opcode_to_data_type (op->opcode);
/*
* Get the Node/name from the earlier lookup
* (It was saved in the *op structure)
*/
node = op->node;
/*
* Put the Node on the object stack (Contains the ACPI Name of
* this object)
*/
walk_state->operands[0] = (void *) node;
walk_state->num_operands = 1;
/* Pop the scope stack */
if (acpi_ns_opens_scope (data_type)) {
acpi_ds_scope_stack_pop (walk_state);
}
/*
* Named operations are as follows:
*
* AML_SCOPE
* AML_DEVICE
* AML_THERMALZONE
* AML_METHOD
* AML_POWERRES
* AML_PROCESSOR
* AML_FIELD
* AML_INDEXFIELD
* AML_BANKFIELD
* AML_NAMEDFIELD
* AML_NAME
* AML_ALIAS
* AML_MUTEX
* AML_EVENT
* AML_OPREGION
* AML_CREATEFIELD
* AML_CREATEBITFIELD
* AML_CREATEBYTEFIELD
* AML_CREATEWORDFIELD
* AML_CREATEDWORDFIELD
* AML_METHODCALL
*/
/* Decode the opcode */
arg = op->value.arg;
switch (op->opcode) {
case AML_CREATE_FIELD_OP:
case AML_BIT_FIELD_OP:
case AML_BYTE_FIELD_OP:
case AML_WORD_FIELD_OP:
case AML_DWORD_FIELD_OP:
/*
* Create the field object, but the field buffer and index must
* be evaluated later during the execution phase
*/
/* Get the Name_string argument */
if (op->opcode == AML_CREATE_FIELD_OP) {
arg = acpi_ps_get_arg (op, 3);
}
else {
/* Create Bit/Byte/Word/Dword field */
arg = acpi_ps_get_arg (op, 2);
}
/*
* Enter the Name_string into the namespace
*/
status = acpi_ns_lookup (walk_state->scope_info,
arg->value.string,
INTERNAL_TYPE_DEF_ANY,
IMODE_LOAD_PASS1,
NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE,
walk_state, &(new_node));
if (ACPI_SUCCESS (status)) {
/* We could put the returned object (Node) on the object stack for later, but
* for now, we will put it in the "op" object that the parser uses, so we
* can get it again at the end of this scope
*/
op->node = new_node;
/*
* If there is no object attached to the node, this node was just created and
* we need to create the field object. Otherwise, this was a lookup of an
* existing node and we don't want to create the field object again.
*/
if (!new_node->object) {
/*
* The Field definition is not fully parsed at this time.
* (We must save the address of the AML for the buffer and index operands)
*/
status = acpi_aml_exec_create_field (((ACPI_PARSE2_OBJECT *) op)->data,
((ACPI_PARSE2_OBJECT *) op)->length,
new_node, walk_state);
}
}
break;
case AML_METHODCALL_OP:
/*
* Lookup the method name and save the Node
*/
status = acpi_ns_lookup (walk_state->scope_info, arg->value.string,
ACPI_TYPE_ANY, IMODE_LOAD_PASS2,
NS_SEARCH_PARENT | NS_DONT_OPEN_SCOPE,
walk_state, &(new_node));
if (ACPI_SUCCESS (status)) {
/* has name already been resolved by here ??*/
/* TBD: [Restructure] Make sure that what we found is indeed a method! */
/* We didn't search for a method on purpose, to see if the name would resolve! */
/* We could put the returned object (Node) on the object stack for later, but
* for now, we will put it in the "op" object that the parser uses, so we
* can get it again at the end of this scope
*/
op->node = new_node;
}
break;
case AML_PROCESSOR_OP:
/* Nothing to do other than enter object into namespace */
status = acpi_aml_exec_create_processor (op, (ACPI_HANDLE) node);
if (ACPI_FAILURE (status)) {
goto cleanup;
}
break;
case AML_POWER_RES_OP:
/* Nothing to do other than enter object into namespace */
status = acpi_aml_exec_create_power_resource (op, (ACPI_HANDLE) node);
if (ACPI_FAILURE (status)) {
goto cleanup;
}
break;
case AML_THERMAL_ZONE_OP:
/* Nothing to do other than enter object into namespace */
break;
case AML_DEF_FIELD_OP:
arg = op->value.arg;
status = acpi_ds_create_field (op, arg->node, walk_state);
break;
case AML_INDEX_FIELD_OP:
arg = op->value.arg;
status = acpi_ds_create_index_field (op, (ACPI_HANDLE) arg->node,
walk_state);
break;
case AML_BANK_FIELD_OP:
arg = op->value.arg;
status = acpi_ds_create_bank_field (op, arg->node, walk_state);
break;
/*
* Method_op Pkg_length Names_string Method_flags Term_list
*/
case AML_METHOD_OP:
if (!node->object) {
status = acpi_aml_exec_create_method (((ACPI_PARSE2_OBJECT *) op)->data,
((ACPI_PARSE2_OBJECT *) op)->length,
arg->value.integer, (ACPI_HANDLE) node);
}
break;
case AML_MUTEX_OP:
status = acpi_ds_create_operands (walk_state, arg);
if (ACPI_FAILURE (status)) {
goto cleanup;
}
status = acpi_aml_exec_create_mutex (walk_state);
break;
case AML_EVENT_OP:
status = acpi_ds_create_operands (walk_state, arg);
if (ACPI_FAILURE (status)) {
goto cleanup;
}
status = acpi_aml_exec_create_event (walk_state);
break;
case AML_REGION_OP:
if (node->object) {
break;
}
/*
* The Op_region is not fully parsed at this time. Only valid argument is the Space_id.
* (We must save the address of the AML of the address and length operands)
*/
status = acpi_aml_exec_create_region (((ACPI_PARSE2_OBJECT *) op)->data,
((ACPI_PARSE2_OBJECT *) op)->length,
(ACPI_ADDRESS_SPACE_TYPE) arg->value.integer,
walk_state);
break;
/* Namespace Modifier Opcodes */
case AML_ALIAS_OP:
status = acpi_ds_create_operands (walk_state, arg);
if (ACPI_FAILURE (status)) {
goto cleanup;
}
status = acpi_aml_exec_create_alias (walk_state);
break;
case AML_NAME_OP:
/*
* Because of the execution pass through the non-control-method
* parts of the table, we can arrive here twice. Only init
* the named object node the first time through
*/
if (!node->object) {
status = acpi_ds_create_node (walk_state, node, op);
}
break;
case AML_NAMEPATH_OP:
break;
default:
break;
}
cleanup:
/* Remove the Node pushed at the very beginning */
acpi_ds_obj_stack_pop (1, walk_state);
return (status);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -