ACPICA: iASL: Enhance error detection
Enhance error detection by validating that all name_seg elements within a name_path actually exist. The previous behavior was spotty at best, and such errors could be improperly ignored at compile time (never at runtime, however). There are two new error messages. Signed-off-by: Bob Moore <robert.moore@intel.com> Signed-off-by: Erik Schmauss <erik.schmauss@intel.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
c159597ca9
commit
927a6abf02
|
@ -34,6 +34,7 @@
|
|||
#define ACPI_NS_TEMPORARY 0x0040
|
||||
#define ACPI_NS_OVERRIDE_IF_FOUND 0x0080
|
||||
#define ACPI_NS_EARLY_INIT 0x0100
|
||||
#define ACPI_NS_PREFIX_MUST_EXIST 0x0200
|
||||
|
||||
/* Flags for acpi_ns_walk_namespace */
|
||||
|
||||
|
|
|
@ -296,6 +296,14 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state,
|
|||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* For name creation opcodes, the full namepath prefix must
|
||||
* exist, except for the final (new) nameseg.
|
||||
*/
|
||||
if (walk_state->op_info->flags & AML_NAMED) {
|
||||
flags |= ACPI_NS_PREFIX_MUST_EXIST;
|
||||
}
|
||||
|
||||
/* Add new entry or lookup existing entry */
|
||||
|
||||
status =
|
||||
|
|
|
@ -267,6 +267,7 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
|
|||
acpi_object_type this_search_type;
|
||||
u32 search_parent_flag = ACPI_NS_SEARCH_PARENT;
|
||||
u32 local_flags;
|
||||
acpi_interpreter_mode local_interpreter_mode;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ns_lookup);
|
||||
|
||||
|
@ -506,6 +507,7 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
|
|||
*/
|
||||
this_search_type = ACPI_TYPE_ANY;
|
||||
current_node = this_node;
|
||||
|
||||
while (num_segments && current_node) {
|
||||
num_segments--;
|
||||
if (!num_segments) {
|
||||
|
@ -536,6 +538,16 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
|
|||
}
|
||||
}
|
||||
|
||||
/* Handle opcodes that create a new name_seg via a full name_path */
|
||||
|
||||
local_interpreter_mode = interpreter_mode;
|
||||
if ((flags & ACPI_NS_PREFIX_MUST_EXIST) && (num_segments > 0)) {
|
||||
|
||||
/* Every element of the path must exist (except for the final name_seg) */
|
||||
|
||||
local_interpreter_mode = ACPI_IMODE_EXECUTE;
|
||||
}
|
||||
|
||||
/* Extract one ACPI name from the front of the pathname */
|
||||
|
||||
ACPI_MOVE_32_TO_32(&simple_name, path);
|
||||
|
@ -544,12 +556,19 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
|
|||
|
||||
status =
|
||||
acpi_ns_search_and_enter(simple_name, walk_state,
|
||||
current_node, interpreter_mode,
|
||||
current_node,
|
||||
local_interpreter_mode,
|
||||
this_search_type, local_flags,
|
||||
&this_node);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
if (status == AE_NOT_FOUND) {
|
||||
|
||||
#if !defined ACPI_ASL_COMPILER /* Note: iASL reports this error by itself, not needed here */
|
||||
if (flags & ACPI_NS_PREFIX_MUST_EXIST) {
|
||||
acpi_os_printf(ACPI_MSG_BIOS_ERROR
|
||||
"Object does not exist: %4.4s\n",
|
||||
&simple_name);
|
||||
}
|
||||
#endif
|
||||
/* Name not found in ACPI namespace */
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
|
||||
|
|
|
@ -508,7 +508,8 @@ acpi_status acpi_ps_parse_loop(struct acpi_walk_state *walk_state)
|
|||
*/
|
||||
if ((walk_state->
|
||||
parse_flags & ACPI_PARSE_MODULE_LEVEL)
|
||||
&& status == AE_ALREADY_EXISTS) {
|
||||
&& ((status == AE_ALREADY_EXISTS)
|
||||
|| (status == AE_NOT_FOUND))) {
|
||||
status = AE_OK;
|
||||
}
|
||||
if (status == AE_CTRL_PARSE_CONTINUE) {
|
||||
|
@ -537,10 +538,7 @@ acpi_status acpi_ps_parse_loop(struct acpi_walk_state *walk_state)
|
|||
* the scope op because the parse failure indicates that
|
||||
* the device may not exist.
|
||||
*/
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Skip parsing opcode %s",
|
||||
acpi_ps_get_opcode_name
|
||||
(walk_state->opcode)));
|
||||
ACPI_INFO(("Skipping parse of AML opcode: %s (0x%4.4X)", acpi_ps_get_opcode_name(walk_state->opcode), walk_state->opcode));
|
||||
|
||||
/*
|
||||
* Determine the opcode length before skipping the opcode.
|
||||
|
|
|
@ -600,8 +600,7 @@ acpi_ps_complete_op(struct acpi_walk_state *walk_state,
|
|||
* because there could be correct AML beyond the parts that caused
|
||||
* the runtime error.
|
||||
*/
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Ignore error and continue table load"));
|
||||
ACPI_INFO(("Ignoring error and continuing table load"));
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
return_ACPI_STATUS(status);
|
||||
|
|
Loading…
Reference in New Issue