📄 exresop.c
字号:
* Resolve this object to a value */ status = acpi_ex_resolve_to_value(stack_ptr, walk_state); if (ACPI_FAILURE(status)) { return_ACPI_STATUS(status); } /* Get the resolved object */ obj_desc = *stack_ptr; /* * Check the resulting object (value) type */ switch (this_arg_type) { /* * For the simple cases, only one type of resolved object * is allowed */ case ARGI_MUTEX: /* Need an operand of type ACPI_TYPE_MUTEX */ type_needed = ACPI_TYPE_MUTEX; break; case ARGI_EVENT: /* Need an operand of type ACPI_TYPE_EVENT */ type_needed = ACPI_TYPE_EVENT; break; case ARGI_PACKAGE: /* Package */ /* Need an operand of type ACPI_TYPE_PACKAGE */ type_needed = ACPI_TYPE_PACKAGE; break; case ARGI_ANYTYPE: /* Any operand type will do */ type_needed = ACPI_TYPE_ANY; break; case ARGI_DDBHANDLE: /* Need an operand of type ACPI_TYPE_DDB_HANDLE */ type_needed = ACPI_TYPE_LOCAL_REFERENCE; break; /* * The more complex cases allow multiple resolved object types */ case ARGI_INTEGER: /* * Need an operand of type ACPI_TYPE_INTEGER, * But we can implicitly convert from a STRING or BUFFER * Aka - "Implicit Source Operand Conversion" */ status = acpi_ex_convert_to_integer(obj_desc, stack_ptr, 16); if (ACPI_FAILURE(status)) { if (status == AE_TYPE) { ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Needed [Integer/String/Buffer], found [%s] %p\n", acpi_ut_get_object_type_name (obj_desc), obj_desc)); return_ACPI_STATUS(AE_AML_OPERAND_TYPE); } return_ACPI_STATUS(status); } if (obj_desc != *stack_ptr) { acpi_ut_remove_reference(obj_desc); } goto next_operand; case ARGI_BUFFER: /* * Need an operand of type ACPI_TYPE_BUFFER, * But we can implicitly convert from a STRING or INTEGER * Aka - "Implicit Source Operand Conversion" */ status = acpi_ex_convert_to_buffer(obj_desc, stack_ptr); if (ACPI_FAILURE(status)) { if (status == AE_TYPE) { ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Needed [Integer/String/Buffer], found [%s] %p\n", acpi_ut_get_object_type_name (obj_desc), obj_desc)); return_ACPI_STATUS(AE_AML_OPERAND_TYPE); } return_ACPI_STATUS(status); } if (obj_desc != *stack_ptr) { acpi_ut_remove_reference(obj_desc); } goto next_operand; case ARGI_STRING: /* * Need an operand of type ACPI_TYPE_STRING, * But we can implicitly convert from a BUFFER or INTEGER * Aka - "Implicit Source Operand Conversion" */ status = acpi_ex_convert_to_string(obj_desc, stack_ptr, ACPI_IMPLICIT_CONVERT_HEX); if (ACPI_FAILURE(status)) { if (status == AE_TYPE) { ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Needed [Integer/String/Buffer], found [%s] %p\n", acpi_ut_get_object_type_name (obj_desc), obj_desc)); return_ACPI_STATUS(AE_AML_OPERAND_TYPE); } return_ACPI_STATUS(status); } if (obj_desc != *stack_ptr) { acpi_ut_remove_reference(obj_desc); } goto next_operand; case ARGI_COMPUTEDATA: /* Need an operand of type INTEGER, STRING or BUFFER */ switch (ACPI_GET_OBJECT_TYPE(obj_desc)) { case ACPI_TYPE_INTEGER: case ACPI_TYPE_STRING: case ACPI_TYPE_BUFFER: /* Valid operand */ break; default: ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Needed [Integer/String/Buffer], found [%s] %p\n", acpi_ut_get_object_type_name (obj_desc), obj_desc)); return_ACPI_STATUS(AE_AML_OPERAND_TYPE); } goto next_operand; case ARGI_BUFFER_OR_STRING: /* Need an operand of type STRING or BUFFER */ switch (ACPI_GET_OBJECT_TYPE(obj_desc)) { case ACPI_TYPE_STRING: case ACPI_TYPE_BUFFER: /* Valid operand */ break; case ACPI_TYPE_INTEGER: /* Highest priority conversion is to type Buffer */ status = acpi_ex_convert_to_buffer(obj_desc, stack_ptr); if (ACPI_FAILURE(status)) { return_ACPI_STATUS(status); } if (obj_desc != *stack_ptr) { acpi_ut_remove_reference(obj_desc); } break; default: ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Needed [Integer/String/Buffer], found [%s] %p\n", acpi_ut_get_object_type_name (obj_desc), obj_desc)); return_ACPI_STATUS(AE_AML_OPERAND_TYPE); } goto next_operand; case ARGI_DATAOBJECT: /* * ARGI_DATAOBJECT is only used by the size_of operator. * Need a buffer, string, package, or ref_of reference. * * The only reference allowed here is a direct reference to * a namespace node. */ switch (ACPI_GET_OBJECT_TYPE(obj_desc)) { case ACPI_TYPE_PACKAGE: case ACPI_TYPE_STRING: case ACPI_TYPE_BUFFER: case ACPI_TYPE_LOCAL_REFERENCE: /* Valid operand */ break; default: ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Needed [Buffer/String/Package/Reference], found [%s] %p\n", acpi_ut_get_object_type_name (obj_desc), obj_desc)); return_ACPI_STATUS(AE_AML_OPERAND_TYPE); } goto next_operand; case ARGI_COMPLEXOBJ: /* Need a buffer or package or (ACPI 2.0) String */ switch (ACPI_GET_OBJECT_TYPE(obj_desc)) { case ACPI_TYPE_PACKAGE: case ACPI_TYPE_STRING: case ACPI_TYPE_BUFFER: /* Valid operand */ break; default: ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Needed [Buffer/String/Package], found [%s] %p\n", acpi_ut_get_object_type_name (obj_desc), obj_desc)); return_ACPI_STATUS(AE_AML_OPERAND_TYPE); } goto next_operand; case ARGI_REGION_OR_FIELD: /* Need an operand of type REGION or a FIELD in a region */ switch (ACPI_GET_OBJECT_TYPE(obj_desc)) { case ACPI_TYPE_REGION: case ACPI_TYPE_LOCAL_REGION_FIELD: case ACPI_TYPE_LOCAL_BANK_FIELD: case ACPI_TYPE_LOCAL_INDEX_FIELD: /* Valid operand */ break; default: ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Needed [Region/region_field], found [%s] %p\n", acpi_ut_get_object_type_name (obj_desc), obj_desc)); return_ACPI_STATUS(AE_AML_OPERAND_TYPE); } goto next_operand; case ARGI_DATAREFOBJ: /* Used by the Store() operator only */ switch (ACPI_GET_OBJECT_TYPE(obj_desc)) { case ACPI_TYPE_INTEGER: case ACPI_TYPE_PACKAGE: case ACPI_TYPE_STRING: case ACPI_TYPE_BUFFER: case ACPI_TYPE_BUFFER_FIELD: case ACPI_TYPE_LOCAL_REFERENCE: case ACPI_TYPE_LOCAL_REGION_FIELD: case ACPI_TYPE_LOCAL_BANK_FIELD: case ACPI_TYPE_LOCAL_INDEX_FIELD: case ACPI_TYPE_DDB_HANDLE: /* Valid operand */ break; default: if (acpi_gbl_enable_interpreter_slack) { /* * Enable original behavior of Store(), allowing any and all * objects as the source operand. The ACPI spec does not * allow this, however. */ break; } if (target_op == AML_DEBUG_OP) { /* Allow store of any object to the Debug object */ break; } ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Needed Integer/Buffer/String/Package/Ref/Ddb], found [%s] %p\n", acpi_ut_get_object_type_name (obj_desc), obj_desc)); return_ACPI_STATUS(AE_AML_OPERAND_TYPE); } goto next_operand; default: /* Unknown type */ ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Internal - Unknown ARGI (required operand) type %X\n", this_arg_type)); return_ACPI_STATUS(AE_BAD_PARAMETER); } /* * Make sure that the original object was resolved to the * required object type (Simple cases only). */ status = acpi_ex_check_object_type(type_needed, ACPI_GET_OBJECT_TYPE (*stack_ptr), *stack_ptr); if (ACPI_FAILURE(status)) { return_ACPI_STATUS(status); } next_operand: /* * If more operands needed, decrement stack_ptr to point * to next operand on stack */ if (GET_CURRENT_ARG_TYPE(arg_types)) { stack_ptr--; } } return_ACPI_STATUS(status);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -