Commit a5922a1f authored by Bob Moore's avatar Bob Moore Committed by Rafael J. Wysocki

ACPICA: Improve typechecking, both compile-time and runtime

ACPICA commit 8d0f96e2a11a4ceabb2cae4b41e0ce1f4d3786b9

Adds much stricter typechecking in the iASL compiler, and
also adds some additional checking in the interpreter.

Link: https://github.com/acpica/acpica/commit/8d0f96e2Signed-off-by: default avatarBob Moore <robert.moore@intel.com>
Signed-off-by: default avatarLv Zheng <lv.zheng@intel.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent ca321d1c
...@@ -285,13 +285,17 @@ acpi_status(*acpi_internal_method) (struct acpi_walk_state * walk_state); ...@@ -285,13 +285,17 @@ acpi_status(*acpi_internal_method) (struct acpi_walk_state * walk_state);
#define ACPI_BTYPE_BUFFER_FIELD 0x00002000 #define ACPI_BTYPE_BUFFER_FIELD 0x00002000
#define ACPI_BTYPE_DDB_HANDLE 0x00004000 #define ACPI_BTYPE_DDB_HANDLE 0x00004000
#define ACPI_BTYPE_DEBUG_OBJECT 0x00008000 #define ACPI_BTYPE_DEBUG_OBJECT 0x00008000
#define ACPI_BTYPE_REFERENCE 0x00010000 #define ACPI_BTYPE_REFERENCE_OBJECT 0x00010000 /* From Index(), ref_of(), etc (type6_opcodes) */
#define ACPI_BTYPE_RESOURCE 0x00020000 #define ACPI_BTYPE_RESOURCE 0x00020000
#define ACPI_BTYPE_NAMED_REFERENCE 0x00040000 /* Generic unresolved Name or Namepath */
#define ACPI_BTYPE_COMPUTE_DATA (ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING | ACPI_BTYPE_BUFFER) #define ACPI_BTYPE_COMPUTE_DATA (ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING | ACPI_BTYPE_BUFFER)
#define ACPI_BTYPE_DATA (ACPI_BTYPE_COMPUTE_DATA | ACPI_BTYPE_PACKAGE) #define ACPI_BTYPE_DATA (ACPI_BTYPE_COMPUTE_DATA | ACPI_BTYPE_PACKAGE)
#define ACPI_BTYPE_DATA_REFERENCE (ACPI_BTYPE_DATA | ACPI_BTYPE_REFERENCE | ACPI_BTYPE_DDB_HANDLE)
/* Used by Copy, de_ref_of, Store, Printf, Fprintf */
#define ACPI_BTYPE_DATA_REFERENCE (ACPI_BTYPE_DATA | ACPI_BTYPE_REFERENCE_OBJECT | ACPI_BTYPE_DDB_HANDLE)
#define ACPI_BTYPE_DEVICE_OBJECTS (ACPI_BTYPE_DEVICE | ACPI_BTYPE_THERMAL | ACPI_BTYPE_PROCESSOR) #define ACPI_BTYPE_DEVICE_OBJECTS (ACPI_BTYPE_DEVICE | ACPI_BTYPE_THERMAL | ACPI_BTYPE_PROCESSOR)
#define ACPI_BTYPE_OBJECTS_AND_REFS 0x0001FFFF /* ARG or LOCAL */ #define ACPI_BTYPE_OBJECTS_AND_REFS 0x0001FFFF /* ARG or LOCAL */
#define ACPI_BTYPE_ALL_OBJECTS 0x0000FFFF #define ACPI_BTYPE_ALL_OBJECTS 0x0000FFFF
......
...@@ -211,7 +211,7 @@ ...@@ -211,7 +211,7 @@
#define ARGI_ARG4 ARG_NONE #define ARGI_ARG4 ARG_NONE
#define ARGI_ARG5 ARG_NONE #define ARGI_ARG5 ARG_NONE
#define ARGI_ARG6 ARG_NONE #define ARGI_ARG6 ARG_NONE
#define ARGI_BANK_FIELD_OP ARGI_INVALID_OPCODE #define ARGI_BANK_FIELD_OP ARGI_LIST1 (ARGI_INTEGER)
#define ARGI_BIT_AND_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) #define ARGI_BIT_AND_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF)
#define ARGI_BIT_NAND_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) #define ARGI_BIT_NAND_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF)
#define ARGI_BIT_NOR_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) #define ARGI_BIT_NOR_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF)
...@@ -307,7 +307,7 @@ ...@@ -307,7 +307,7 @@
#define ARGI_SLEEP_OP ARGI_LIST1 (ARGI_INTEGER) #define ARGI_SLEEP_OP ARGI_LIST1 (ARGI_INTEGER)
#define ARGI_STALL_OP ARGI_LIST1 (ARGI_INTEGER) #define ARGI_STALL_OP ARGI_LIST1 (ARGI_INTEGER)
#define ARGI_STATICSTRING_OP ARGI_INVALID_OPCODE #define ARGI_STATICSTRING_OP ARGI_INVALID_OPCODE
#define ARGI_STORE_OP ARGI_LIST2 (ARGI_DATAREFOBJ, ARGI_TARGETREF) #define ARGI_STORE_OP ARGI_LIST2 (ARGI_DATAREFOBJ, ARGI_STORE_TARGET)
#define ARGI_STRING_OP ARGI_INVALID_OPCODE #define ARGI_STRING_OP ARGI_INVALID_OPCODE
#define ARGI_SUBTRACT_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) #define ARGI_SUBTRACT_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF)
#define ARGI_THERMAL_ZONE_OP ARGI_INVALID_OPCODE #define ARGI_THERMAL_ZONE_OP ARGI_INVALID_OPCODE
......
...@@ -277,14 +277,15 @@ ...@@ -277,14 +277,15 @@
#define ARGI_TARGETREF 0x0F /* Target, subject to implicit conversion */ #define ARGI_TARGETREF 0x0F /* Target, subject to implicit conversion */
#define ARGI_FIXED_TARGET 0x10 /* Target, no implicit conversion */ #define ARGI_FIXED_TARGET 0x10 /* Target, no implicit conversion */
#define ARGI_SIMPLE_TARGET 0x11 /* Name, Local, Arg -- no implicit conversion */ #define ARGI_SIMPLE_TARGET 0x11 /* Name, Local, Arg -- no implicit conversion */
#define ARGI_STORE_TARGET 0x12 /* Target for store is TARGETREF + package objects */
/* Multiple/complex types */ /* Multiple/complex types */
#define ARGI_DATAOBJECT 0x12 /* Buffer, String, package or reference to a node - Used only by size_of operator */ #define ARGI_DATAOBJECT 0x13 /* Buffer, String, package or reference to a node - Used only by size_of operator */
#define ARGI_COMPLEXOBJ 0x13 /* Buffer, String, or package (Used by INDEX op only) */ #define ARGI_COMPLEXOBJ 0x14 /* Buffer, String, or package (Used by INDEX op only) */
#define ARGI_REF_OR_STRING 0x14 /* Reference or String (Used by DEREFOF op only) */ #define ARGI_REF_OR_STRING 0x15 /* Reference or String (Used by DEREFOF op only) */
#define ARGI_REGION_OR_BUFFER 0x15 /* Used by LOAD op only */ #define ARGI_REGION_OR_BUFFER 0x16 /* Used by LOAD op only */
#define ARGI_DATAREFOBJ 0x16 #define ARGI_DATAREFOBJ 0x17
/* Note: types above can expand to 0x1F maximum */ /* Note: types above can expand to 0x1F maximum */
......
...@@ -618,6 +618,7 @@ acpi_ex_convert_to_target_type(acpi_object_type destination_type, ...@@ -618,6 +618,7 @@ acpi_ex_convert_to_target_type(acpi_object_type destination_type,
break; break;
case ARGI_TARGETREF: case ARGI_TARGETREF:
case ARGI_STORE_TARGET:
switch (destination_type) { switch (destination_type) {
case ACPI_TYPE_INTEGER: case ACPI_TYPE_INTEGER:
......
...@@ -209,7 +209,6 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr, ...@@ -209,7 +209,6 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr,
* (i.e., dereference the package index) * (i.e., dereference the package index)
* Delete the ref object, increment the returned object * Delete the ref object, increment the returned object
*/ */
acpi_ut_remove_reference(stack_desc);
acpi_ut_add_reference(obj_desc); acpi_ut_add_reference(obj_desc);
*stack_ptr = obj_desc; *stack_ptr = obj_desc;
} else { } else {
......
...@@ -307,6 +307,8 @@ acpi_ex_resolve_operands(u16 opcode, ...@@ -307,6 +307,8 @@ acpi_ex_resolve_operands(u16 opcode,
case ARGI_TARGETREF: /* Allows implicit conversion rules before store */ case ARGI_TARGETREF: /* Allows implicit conversion rules before store */
case ARGI_FIXED_TARGET: /* No implicit conversion before store to target */ case ARGI_FIXED_TARGET: /* No implicit conversion before store to target */
case ARGI_SIMPLE_TARGET: /* Name, Local, or arg - no implicit conversion */ case ARGI_SIMPLE_TARGET: /* Name, Local, or arg - no implicit conversion */
case ARGI_STORE_TARGET:
/* /*
* Need an operand of type ACPI_TYPE_LOCAL_REFERENCE * Need an operand of type ACPI_TYPE_LOCAL_REFERENCE
* A Namespace Node is OK as-is * A Namespace Node is OK as-is
......
...@@ -137,7 +137,7 @@ acpi_ex_store(union acpi_operand_object *source_desc, ...@@ -137,7 +137,7 @@ acpi_ex_store(union acpi_operand_object *source_desc,
/* Destination is not a Reference object */ /* Destination is not a Reference object */
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
"Target is not a Reference or Constant object - %s [%p]", "Target is not a Reference or Constant object - [%s] %p",
acpi_ut_get_object_type_name(dest_desc), acpi_ut_get_object_type_name(dest_desc),
dest_desc)); dest_desc));
...@@ -189,7 +189,7 @@ acpi_ex_store(union acpi_operand_object *source_desc, ...@@ -189,7 +189,7 @@ acpi_ex_store(union acpi_operand_object *source_desc,
* displayed and otherwise has no effect -- see ACPI Specification * displayed and otherwise has no effect -- see ACPI Specification
*/ */
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
"**** Write to Debug Object: Object %p %s ****:\n\n", "**** Write to Debug Object: Object %p [%s] ****:\n\n",
source_desc, source_desc,
acpi_ut_get_object_type_name(source_desc))); acpi_ut_get_object_type_name(source_desc)));
...@@ -341,7 +341,7 @@ acpi_ex_store_object_to_index(union acpi_operand_object *source_desc, ...@@ -341,7 +341,7 @@ acpi_ex_store_object_to_index(union acpi_operand_object *source_desc,
/* All other types are invalid */ /* All other types are invalid */
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
"Source must be Integer/Buffer/String type, not %s", "Source must be type [Integer/Buffer/String], found [%s]",
acpi_ut_get_object_type_name(source_desc))); acpi_ut_get_object_type_name(source_desc)));
return_ACPI_STATUS(AE_AML_OPERAND_TYPE); return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
} }
...@@ -352,8 +352,9 @@ acpi_ex_store_object_to_index(union acpi_operand_object *source_desc, ...@@ -352,8 +352,9 @@ acpi_ex_store_object_to_index(union acpi_operand_object *source_desc,
break; break;
default: default:
ACPI_ERROR((AE_INFO, "Target is not a Package or BufferField")); ACPI_ERROR((AE_INFO,
status = AE_AML_OPERAND_TYPE; "Target is not of type [Package/BufferField]"));
status = AE_AML_TARGET_TYPE;
break; break;
} }
...@@ -373,20 +374,20 @@ acpi_ex_store_object_to_index(union acpi_operand_object *source_desc, ...@@ -373,20 +374,20 @@ acpi_ex_store_object_to_index(union acpi_operand_object *source_desc,
* *
* DESCRIPTION: Store the object to the named object. * DESCRIPTION: Store the object to the named object.
* *
* The Assignment of an object to a named object is handled here * The assignment of an object to a named object is handled here.
* The value passed in will replace the current value (if any) * The value passed in will replace the current value (if any)
* with the input value. * with the input value.
* *
* When storing into an object the data is converted to the * When storing into an object the data is converted to the
* target object type then stored in the object. This means * target object type then stored in the object. This means
* that the target object type (for an initialized target) will * that the target object type (for an initialized target) will
* not be changed by a store operation. A copy_object can change * not be changed by a store operation. A copy_object can change
* the target type, however. * the target type, however.
* *
* The implicit_conversion flag is set to NO/FALSE only when * The implicit_conversion flag is set to NO/FALSE only when
* storing to an arg_x -- as per the rules of the ACPI spec. * storing to an arg_x -- as per the rules of the ACPI spec.
* *
* Assumes parameters are already validated. * Assumes parameters are already validated.
* *
******************************************************************************/ ******************************************************************************/
...@@ -408,11 +409,75 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc, ...@@ -408,11 +409,75 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc,
target_type = acpi_ns_get_type(node); target_type = acpi_ns_get_type(node);
target_desc = acpi_ns_get_attached_object(node); target_desc = acpi_ns_get_attached_object(node);
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Storing %p (%s) to node %p (%s)\n", ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Storing %p [%s] to node %p [%s]\n",
source_desc, source_desc,
acpi_ut_get_object_type_name(source_desc), node, acpi_ut_get_object_type_name(source_desc), node,
acpi_ut_get_type_name(target_type))); acpi_ut_get_type_name(target_type)));
/* Only limited target types possible for everything except copy_object */
if (walk_state->opcode != AML_COPY_OP) {
/*
* Only copy_object allows all object types to be overwritten. For
* target_ref(s), there are restrictions on the object types that
* are allowed.
*
* Allowable operations/typing for Store:
*
* 1) Simple Store
* Integer --> Integer (Named/Local/Arg)
* String --> String (Named/Local/Arg)
* Buffer --> Buffer (Named/Local/Arg)
* Package --> Package (Named/Local/Arg)
*
* 2) Store with implicit conversion
* Integer --> String or Buffer (Named)
* String --> Integer or Buffer (Named)
* Buffer --> Integer or String (Named)
*/
switch (target_type) {
case ACPI_TYPE_PACKAGE:
/*
* Here, can only store a package to an existing package.
* Storing a package to a Local/Arg is OK, and handled
* elsewhere.
*/
if (walk_state->opcode == AML_STORE_OP) {
if (source_desc->common.type !=
ACPI_TYPE_PACKAGE) {
ACPI_ERROR((AE_INFO,
"Cannot assign type [%s] to [Package] "
"(source must be type Pkg)",
acpi_ut_get_object_type_name
(source_desc)));
return_ACPI_STATUS(AE_AML_TARGET_TYPE);
}
break;
}
/* Fallthrough */
case ACPI_TYPE_DEVICE:
case ACPI_TYPE_EVENT:
case ACPI_TYPE_MUTEX:
case ACPI_TYPE_REGION:
case ACPI_TYPE_POWER:
case ACPI_TYPE_PROCESSOR:
case ACPI_TYPE_THERMAL:
ACPI_ERROR((AE_INFO,
"Target must be [Buffer/Integer/String/Reference], found [%s] (%4.4s)",
acpi_ut_get_type_name(node->type),
node->name.ascii));
return_ACPI_STATUS(AE_AML_TARGET_TYPE);
default:
break;
}
}
/* /*
* Resolve the source object to an actual value * Resolve the source object to an actual value
* (If it is a reference object) * (If it is a reference object)
...@@ -425,13 +490,13 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc, ...@@ -425,13 +490,13 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc,
/* Do the actual store operation */ /* Do the actual store operation */
switch (target_type) { switch (target_type) {
case ACPI_TYPE_INTEGER:
case ACPI_TYPE_STRING:
case ACPI_TYPE_BUFFER:
/* /*
* The simple data types all support implicit source operand * The simple data types all support implicit source operand
* conversion before the store. * conversion before the store.
*/ */
case ACPI_TYPE_INTEGER:
case ACPI_TYPE_STRING:
case ACPI_TYPE_BUFFER:
if ((walk_state->opcode == AML_COPY_OP) || !implicit_conversion) { if ((walk_state->opcode == AML_COPY_OP) || !implicit_conversion) {
/* /*
...@@ -467,7 +532,7 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc, ...@@ -467,7 +532,7 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc,
new_desc->common.type); new_desc->common.type);
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
"Store %s into %s via Convert/Attach\n", "Store type [%s] into [%s] via Convert/Attach\n",
acpi_ut_get_object_type_name acpi_ut_get_object_type_name
(source_desc), (source_desc),
acpi_ut_get_object_type_name acpi_ut_get_object_type_name
...@@ -491,15 +556,12 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc, ...@@ -491,15 +556,12 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc,
default: default:
/* /*
* No conversions for all other types. Directly store a copy of * copy_object operator: No conversions for all other types.
* the source object. This is the ACPI spec-defined behavior for * Instead, directly store a copy of the source object.
* the copy_object operator.
* *
* NOTE: For the Store operator, this is a departure from the * This is the ACPI spec-defined behavior for the copy_object
* ACPI spec, which states "If conversion is impossible, abort * operator. (Note, for this default case, all normal
* the running control method". Instead, this code implements * Store/Target operations exited above with an error).
* "If conversion is impossible, treat the Store operation as
* a CopyObject".
*/ */
status = acpi_ex_store_direct_to_node(source_desc, node, status = acpi_ex_store_direct_to_node(source_desc, node,
walk_state); walk_state);
......
...@@ -122,9 +122,10 @@ acpi_ex_resolve_object(union acpi_operand_object **source_desc_ptr, ...@@ -122,9 +122,10 @@ acpi_ex_resolve_object(union acpi_operand_object **source_desc_ptr,
/* Conversion successful but still not a valid type */ /* Conversion successful but still not a valid type */
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
"Cannot assign type %s to %s (must be type Int/Str/Buf)", "Cannot assign type [%s] to [%s] (must be type Int/Str/Buf)",
acpi_ut_get_object_type_name(source_desc), acpi_ut_get_object_type_name(source_desc),
acpi_ut_get_type_name(target_type))); acpi_ut_get_type_name(target_type)));
status = AE_AML_OPERAND_TYPE; status = AE_AML_OPERAND_TYPE;
} }
break; break;
...@@ -275,7 +276,7 @@ acpi_ex_store_object_to_object(union acpi_operand_object *source_desc, ...@@ -275,7 +276,7 @@ acpi_ex_store_object_to_object(union acpi_operand_object *source_desc,
/* /*
* All other types come here. * All other types come here.
*/ */
ACPI_WARNING((AE_INFO, "Store into type %s not implemented", ACPI_WARNING((AE_INFO, "Store into type [%s] not implemented",
acpi_ut_get_object_type_name(dest_desc))); acpi_ut_get_object_type_name(dest_desc)));
status = AE_NOT_IMPLEMENTED; status = AE_NOT_IMPLEMENTED;
......
...@@ -226,7 +226,7 @@ acpi_ns_check_object_type(struct acpi_evaluate_info *info, ...@@ -226,7 +226,7 @@ acpi_ns_check_object_type(struct acpi_evaluate_info *info,
{ {
union acpi_operand_object *return_object = *return_object_ptr; union acpi_operand_object *return_object = *return_object_ptr;
acpi_status status = AE_OK; acpi_status status = AE_OK;
char type_buffer[48]; /* Room for 5 types */ char type_buffer[96]; /* Room for 10 types */
/* A Namespace node should not get here, but make sure */ /* A Namespace node should not get here, but make sure */
......
...@@ -232,12 +232,27 @@ char *acpi_ut_get_type_name(acpi_object_type type) ...@@ -232,12 +232,27 @@ char *acpi_ut_get_type_name(acpi_object_type type)
char *acpi_ut_get_object_type_name(union acpi_operand_object *obj_desc) char *acpi_ut_get_object_type_name(union acpi_operand_object *obj_desc)
{ {
ACPI_FUNCTION_TRACE(ut_get_object_type_name);
if (!obj_desc) { if (!obj_desc) {
return ("[NULL Object Descriptor]"); ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Null Object Descriptor\n"));
return_PTR("[NULL Object Descriptor]");
} }
return (acpi_ut_get_type_name(obj_desc->common.type)); /* These descriptor types share a common area */
if ((ACPI_GET_DESCRIPTOR_TYPE(obj_desc) != ACPI_DESC_TYPE_OPERAND) &&
(ACPI_GET_DESCRIPTOR_TYPE(obj_desc) != ACPI_DESC_TYPE_NAMED)) {
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
"Invalid object descriptor type: 0x%2.2X [%s] (%p)\n",
ACPI_GET_DESCRIPTOR_TYPE(obj_desc),
acpi_ut_get_descriptor_name(obj_desc),
obj_desc));
return_PTR("Invalid object");
}
return_PTR(acpi_ut_get_type_name(obj_desc->common.type));
} }
/******************************************************************************* /*******************************************************************************
......
...@@ -193,8 +193,9 @@ struct acpi_exception_info { ...@@ -193,8 +193,9 @@ struct acpi_exception_info {
#define AE_AML_ILLEGAL_ADDRESS EXCEP_AML (0x0020) #define AE_AML_ILLEGAL_ADDRESS EXCEP_AML (0x0020)
#define AE_AML_INFINITE_LOOP EXCEP_AML (0x0021) #define AE_AML_INFINITE_LOOP EXCEP_AML (0x0021)
#define AE_AML_UNINITIALIZED_NODE EXCEP_AML (0x0022) #define AE_AML_UNINITIALIZED_NODE EXCEP_AML (0x0022)
#define AE_AML_TARGET_TYPE EXCEP_AML (0x0023)
#define AE_CODE_AML_MAX 0x0022 #define AE_CODE_AML_MAX 0x0023
/* /*
* Internal exceptions used for control * Internal exceptions used for control
...@@ -358,7 +359,9 @@ static const struct acpi_exception_info acpi_gbl_exception_names_aml[] = { ...@@ -358,7 +359,9 @@ static const struct acpi_exception_info acpi_gbl_exception_names_aml[] = {
EXCEP_TXT("AE_AML_INFINITE_LOOP", EXCEP_TXT("AE_AML_INFINITE_LOOP",
"An apparent infinite AML While loop, method was aborted"), "An apparent infinite AML While loop, method was aborted"),
EXCEP_TXT("AE_AML_UNINITIALIZED_NODE", EXCEP_TXT("AE_AML_UNINITIALIZED_NODE",
"A namespace node is uninitialized or unresolved") "A namespace node is uninitialized or unresolved"),
EXCEP_TXT("AE_AML_TARGET_TYPE",
"A target operand of an incorrect type was encountered")
}; };
static const struct acpi_exception_info acpi_gbl_exception_names_ctrl[] = { static const struct acpi_exception_info acpi_gbl_exception_names_ctrl[] = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment