[PATCH] lib: fwts_acpi_object_eval: report better advice on exec failure (LP: #1296710)
Colin King
colin.king at canonical.com
Mon Mar 24 13:07:44 UTC 2014
From: Colin Ian King <colin.king at canonical.com>
The feedback given when an ACPI evaluation fails was rather limited and
poor, so add a per-error advice text to explain the error.
Signed-off-by: Colin Ian King <colin.king at canonical.com>
---
src/lib/src/fwts_acpi_object_eval.c | 298 +++++++++++++++++++++++++++---------
1 file changed, 229 insertions(+), 69 deletions(-)
diff --git a/src/lib/src/fwts_acpi_object_eval.c b/src/lib/src/fwts_acpi_object_eval.c
index c61e7c8..08bc865 100644
--- a/src/lib/src/fwts_acpi_object_eval.c
+++ b/src/lib/src/fwts_acpi_object_eval.c
@@ -32,81 +32,239 @@ typedef struct {
const fwts_log_level level;
const char *error_type;
const char *error_text;
+ const char *advice;
} acpi_eval_error;
static const acpi_eval_error errors[] = {
/* ACPI_STATUS fwts_log_level error_type error_text */
- { AE_ERROR, LOG_LEVEL_HIGH, "AEError", "Environment error" },
- { AE_NO_ACPI_TABLES, LOG_LEVEL_HIGH, "AENoACPITables", "NO ACPI tables" },
- { AE_NO_NAMESPACE, LOG_LEVEL_HIGH, "AENoNamespace", "No namespace" },
- { AE_NO_MEMORY, LOG_LEVEL_CRITICAL, "AENoMemory", "Out of memory" },
- { AE_NOT_FOUND, LOG_LEVEL_CRITICAL, "AENotFound", "Not found" },
- { AE_NOT_EXIST, LOG_LEVEL_CRITICAL, "AENotExist", "Not exist" },
- { AE_ALREADY_EXISTS, LOG_LEVEL_HIGH, "AEAlreadyExists", "Already exists" },
- { AE_TYPE, LOG_LEVEL_CRITICAL, "AETtype", "Type" },
- { AE_NULL_OBJECT, LOG_LEVEL_CRITICAL, "AENullObject", "Null object" },
- { AE_NULL_ENTRY, LOG_LEVEL_CRITICAL, "AENullEntry", "Null entry" },
- { AE_BUFFER_OVERFLOW, LOG_LEVEL_CRITICAL, "AEBufferOverflow", "Buffer overflow" },
- { AE_STACK_OVERFLOW, LOG_LEVEL_CRITICAL, "AEStackOverflow", "Stack overflow" },
- { AE_STACK_UNDERFLOW, LOG_LEVEL_CRITICAL, "AEStackUnderflow", "Stack underflow" },
- { AE_NOT_IMPLEMENTED, LOG_LEVEL_HIGH, "AENotImplemented", "Not implemented" },
- { AE_SUPPORT, LOG_LEVEL_HIGH, "AESupport", "Support" },
- { AE_LIMIT, LOG_LEVEL_CRITICAL, "AELimit", "Limit" },
- { AE_TIME, LOG_LEVEL_HIGH, "AETime", "Timeout" },
- { AE_ACQUIRE_DEADLOCK, LOG_LEVEL_CRITICAL, "AEAcqDeadlock", "Acquire deadlock" },
- { AE_RELEASE_DEADLOCK, LOG_LEVEL_CRITICAL, "AERelDeadlock", "Release deadlock" },
- { AE_NOT_ACQUIRED, LOG_LEVEL_CRITICAL, "AENotAcq", "Not acquired" },
- { AE_ALREADY_ACQUIRED, LOG_LEVEL_CRITICAL, "AEAlreadyAcq", "Already acquired" },
- { AE_NO_HARDWARE_RESPONSE, LOG_LEVEL_HIGH, "AENoHWResponse", "No hardware response" },
- { AE_NO_GLOBAL_LOCK, LOG_LEVEL_HIGH, "AENoGlobalLock", "No global lock" },
- { AE_ABORT_METHOD, LOG_LEVEL_CRITICAL, "AEAbortMethod", "Abort method" },
- { AE_SAME_HANDLER, LOG_LEVEL_HIGH, "AESameHandler", "Same handler" },
- { AE_NO_HANDLER, LOG_LEVEL_CRITICAL, "AENoHandler", "No handler" },
- { AE_OWNER_ID_LIMIT, LOG_LEVEL_HIGH, "AEOwnerIDLimit", "Owner ID limit" },
+ { AE_ERROR, LOG_LEVEL_HIGH, "AEError", "Unspecified error",
+ "An internal unspecified ACPICA execution error has occurred."
+ },
+ { AE_NO_ACPI_TABLES, LOG_LEVEL_HIGH, "AENoACPITables", "No ACPI tables",
+ "No ACPI tables could be found. Normally this indicates the tables could not be loaded "
+ "from firmware or a provided firmware dump file."
+ },
+ { AE_NO_NAMESPACE, LOG_LEVEL_HIGH, "AENoNamespace", "No namespace",
+ "An ACPI namespace was not loaded. This happens if an ACPI root node could not be found."
+ },
+ { AE_NO_MEMORY, LOG_LEVEL_CRITICAL, "AENoMemory", "Out of memory",
+ "No more memory could be allocated from the heap."
+ },
+ { AE_NOT_FOUND, LOG_LEVEL_CRITICAL, "AENotFound", "Not found",
+ "An ACPI object or entity was requested but could not be found. Running fwts with the "
+ "--acpica=slack option may work around this issue."
+ },
+ { AE_NOT_EXIST, LOG_LEVEL_CRITICAL, "AENotExist", "Not exist",
+ "An ACPI object or entity was requested but does not exist.",
+ },
+ { AE_ALREADY_EXISTS, LOG_LEVEL_HIGH, "AEAlreadyExists", "Already exists",
+ "An ACPI object or entity already exists. Sometimes this occurs when code is not "
+ "serialized and it has been created a second time by another thread. ACPICA can detect "
+ "these errors and enable auto serialization to try to work around this error. "
+ },
+ { AE_TYPE, LOG_LEVEL_CRITICAL, "AETtype", "Type",
+ "The type of an object is incorrect and does not match the expected type. ACPI will "
+ "generally abort execution of the AML op-code that causes this error."
+ },
+ { AE_NULL_OBJECT, LOG_LEVEL_CRITICAL, "AENullObject", "Null object",
+ "An ACPI object is NULL when it was expected to be non-NULL."
+ },
+ { AE_NULL_ENTRY, LOG_LEVEL_CRITICAL, "AENullEntry", "Null entry",
+ "The requested ACPI object did not exist. This can occur when a root entry is "
+ "NULL."
+ },
+ { AE_BUFFER_OVERFLOW, LOG_LEVEL_CRITICAL, "AEBufferOverflow", "Buffer overflow",
+ "An ACPI buffer that was provided was too small to contain the data to be copied "
+ "into it. This generally indicates an AML bug."
+ },
+ { AE_STACK_OVERFLOW, LOG_LEVEL_CRITICAL, "AEStackOverflow", "Stack overflow",
+ "An ACPI method call failed because the call nesting was too deep and the "
+ "internal APCI execution stack overflowed. This generally occurs with AML that "
+ "may be recursing too deeply."
+ },
+ { AE_STACK_UNDERFLOW, LOG_LEVEL_CRITICAL, "AEStackUnderflow", "Stack underflow",
+ "An ACPI method call failed because the internal ACPI execution stack underflowed. "
+ "This occurred while walking the object stack and popping off an object from an empty stack."
+ },
+ { AE_NOT_IMPLEMENTED, LOG_LEVEL_HIGH, "AENotImplemented", "Not implemented",
+ "The ACPICA execution engine has not implemented a feature."
+ },
+ { AE_SUPPORT, LOG_LEVEL_HIGH, "AESupport", "Support",
+ "Normally this occurs when AML attempts to perform an action that is not supported, "
+ "such as converting objects in an unsupported way or attempting to access memory using "
+ "an unsupported address space type."
+ },
+ { AE_LIMIT, LOG_LEVEL_CRITICAL, "AELimit", "Limit",
+ "A predefined limit was reached, for example, attempting to access an I/O port above the "
+ "allowed 64K limit or a semaphore handle is out of range."
+ },
+ { AE_TIME, LOG_LEVEL_HIGH, "AETime", "Timeout",
+ "A timeout has been reached, for example a semaphore has timed out."
+ },
+ { AE_ACQUIRE_DEADLOCK, LOG_LEVEL_CRITICAL, "AEAcqDeadlock", "Acquire deadlock",
+ "A mutex acquire was aborted because a potential deadlock was detected."
+ },
+ { AE_RELEASE_DEADLOCK, LOG_LEVEL_CRITICAL, "AERelDeadlock", "Release deadlock",
+ "A mutex release was aborted because a potential deadlock was detected."
+ },
+ { AE_NOT_ACQUIRED, LOG_LEVEL_CRITICAL, "AENotAcq", "Not acquired",
+ "An attempt to release a mutex or an ACPI global lock failed because it "
+ "had not previously acquired. This normally indicates an AML programming bug."
+ },
+ { AE_ALREADY_ACQUIRED, LOG_LEVEL_CRITICAL, "AEAlreadyAcq", "Already acquired",
+ "An attempt to re-acquire mutex or an ACPI global lock failed because it "
+ "had not previously acquired. This normally indicates an AML programming bug."
+ },
+ { AE_NO_HARDWARE_RESPONSE, LOG_LEVEL_HIGH, "AENoHWResponse", "No hardware response",
+ "ACPI gave up waiting for hardware to respond. For example, a SMI_CMD failed or "
+ "the platform does not have an ACPI global lock defined or an ACPI event could "
+ "not be enabled."
+ },
+ { AE_NO_GLOBAL_LOCK, LOG_LEVEL_HIGH, "AENoGlobalLock", "No global lock",
+ "The platform does not define an ACPI global lock in the FADT."
+ },
+ { AE_ABORT_METHOD, LOG_LEVEL_CRITICAL, "AEAbortMethod", "Abort method",
+ "Execution of an ACPI method was aborted because the internal ACPICA AcpiGbl_AbortMethod "
+ "flag was set to true. This should not occur."
+ },
+ { AE_SAME_HANDLER, LOG_LEVEL_HIGH, "AESameHandler", "Same handler",
+ "An attempt was made to install the same handler that is already installed."
+ },
+ { AE_NO_HANDLER, LOG_LEVEL_CRITICAL, "AENoHandler", "No handler",
+ "A handler for a General Purpose Event operation was not installed."
+ },
+ { AE_OWNER_ID_LIMIT, LOG_LEVEL_HIGH, "AEOwnerIDLimit", "Owner ID limit",
+ "A maximum of 255 OwnerIds have been used. There are no more Owner IDs available for "
+ "ACPI tables or control methods."
+ },
- { AE_BAD_PARAMETER, LOG_LEVEL_HIGH, "AEBadParam", "Args: Bad paramater" },
- { AE_BAD_CHARACTER, LOG_LEVEL_HIGH, "AEBadChar", "Args: Bad character" },
- { AE_BAD_PATHNAME, LOG_LEVEL_HIGH, "AEBadPathname", "Args: Bad pathname" },
- { AE_BAD_DATA, LOG_LEVEL_HIGH, "AEBadData", "Args: Bad data" },
- { AE_BAD_HEX_CONSTANT, LOG_LEVEL_HIGH, "AEBadHexConst", "Args: Bad hex constant" },
- { AE_BAD_OCTAL_CONSTANT, LOG_LEVEL_HIGH, "AEBadOctConst", "Args: Bad octal constant" },
- { AE_BAD_DECIMAL_CONSTANT, LOG_LEVEL_HIGH, "AEBadDecConst", "Args: Bad decimal constant" },
- { AE_MISSING_ARGUMENTS, LOG_LEVEL_CRITICAL, "AEMissingArgs", "Args: Missing arguments" },
- { AE_BAD_ADDRESS, LOG_LEVEL_CRITICAL, "AEBadAddr", "Args: Bad address" },
+ { AE_BAD_PARAMETER, LOG_LEVEL_HIGH, "AEBadParam", "Args: Bad paramater",
+ "A parameter passed is out of range or invalid."
+ },
+ { AE_BAD_CHARACTER, LOG_LEVEL_HIGH, "AEBadChar", "Args: Bad character",
+ "An invalid character was found in an ACPI name."
+ },
+ { AE_BAD_PATHNAME, LOG_LEVEL_HIGH, "AEBadPathname", "Args: Bad pathname",
+ "An internal AML namestring could not be built because of an invalid pathname."
+ },
+ { AE_BAD_DATA, LOG_LEVEL_HIGH, "AEBadData", "Args: Bad data",
+ "A buffer or package contained some incorrect data."
+ },
+ { AE_BAD_HEX_CONSTANT, LOG_LEVEL_HIGH, "AEBadHexConst", "Args: Bad hex constant",
+ "An invalid character was found in a hexadecimal constant."
+ },
+ { AE_BAD_OCTAL_CONSTANT, LOG_LEVEL_HIGH, "AEBadOctConst", "Args: Bad octal constant",
+ "An invalid character was found in an octal constant."
+ },
+ { AE_BAD_DECIMAL_CONSTANT, LOG_LEVEL_HIGH, "AEBadDecConst", "Args: Bad decimal constant",
+ "An invalid character was found in a decimal constant."
+ },
+ { AE_MISSING_ARGUMENTS, LOG_LEVEL_CRITICAL, "AEMissingArgs", "Args: Missing arguments",
+ "Too few arguments were passed into an ACPI control method."
+ },
+ { AE_BAD_ADDRESS, LOG_LEVEL_CRITICAL, "AEBadAddr", "Args: Bad address",
+ "An illegal null I/O address was referenced by the AML."
+ },
- { AE_AML_BAD_OPCODE, LOG_LEVEL_CRITICAL, "AEAMLBadOpCode", "Bad AML opcode" },
- { AE_AML_NO_OPERAND, LOG_LEVEL_HIGH, "AEAMLNoOperand", "Missing operand" },
- { AE_AML_OPERAND_TYPE, LOG_LEVEL_HIGH, "AEAMLOperandType", "Incorrect operand type" },
- { AE_AML_OPERAND_VALUE, LOG_LEVEL_HIGH, "AEAMLOperandValue", "Incorrect operand value" },
- { AE_AML_UNINITIALIZED_LOCAL, LOG_LEVEL_HIGH, "AEAMLUninitLocal", "Uninitialized local variable" },
- { AE_AML_UNINITIALIZED_ARG, LOG_LEVEL_HIGH, "AEAMLUninitArg", "Uninitialized argument" },
- { AE_AML_UNINITIALIZED_ELEMENT, LOG_LEVEL_HIGH, "AEAMLUninitElement", "Uninitialized element" },
- { AE_AML_NUMERIC_OVERFLOW, LOG_LEVEL_HIGH, "AEAMLNumericOverflow", "Numeric overflow" },
- { AE_AML_REGION_LIMIT, LOG_LEVEL_CRITICAL, "AEAMLRegionLimit", "Region limit" },
- { AE_AML_BUFFER_LIMIT, LOG_LEVEL_CRITICAL, "AEAMLBufferLimit", "Buffer limit" },
- { AE_AML_PACKAGE_LIMIT, LOG_LEVEL_CRITICAL, "AEAMLPackgeLimit", "Package limit" },
- { AE_AML_DIVIDE_BY_ZERO, LOG_LEVEL_CRITICAL, "AEAMLDivideByZero", "Division by zero" },
- { AE_AML_NAME_NOT_FOUND, LOG_LEVEL_HIGH, "AEAMLNameNotFound", "Name not found" },
- { AE_AML_INTERNAL, LOG_LEVEL_HIGH, "AEAMLInternal", "Internal ACPICA execution engine error" },
- { AE_AML_INVALID_SPACE_ID, LOG_LEVEL_HIGH, "AEAMLInvalidSpaceID", "Invalid space ID error" },
- { AE_AML_STRING_LIMIT, LOG_LEVEL_HIGH, "AEAMLStringLimit", "String limit" },
- { AE_AML_NO_RETURN_VALUE, LOG_LEVEL_HIGH, "AEAMLNoReturnValue", "No return value" },
- { AE_AML_METHOD_LIMIT, LOG_LEVEL_HIGH, "AEAMLMethodLimit", "Method limit" },
- { AE_AML_NOT_OWNER, LOG_LEVEL_HIGH, "AEAMLNotOwner", "Not owner" },
- { AE_AML_MUTEX_ORDER, LOG_LEVEL_HIGH, "AEAMLMutexOrder", "Mutex order" },
- { AE_AML_MUTEX_NOT_ACQUIRED, LOG_LEVEL_HIGH, "AEAMLMutexNotAcq", "Mutux not acquired" },
- { AE_AML_INVALID_RESOURCE_TYPE, LOG_LEVEL_HIGH, "AEAMLInvResourceType", "Invalid resource type" },
- { AE_AML_INVALID_INDEX, LOG_LEVEL_HIGH, "AEAMLInvIndex", "Invalid index" },
- { AE_AML_REGISTER_LIMIT, LOG_LEVEL_HIGH, "AEAMLRegisterLimit", "Register limit" },
- { AE_AML_NO_WHILE, LOG_LEVEL_CRITICAL, "AEAMLNoWhile", "No while" },
- { AE_AML_ALIGNMENT, LOG_LEVEL_CRITICAL, "AEAMLAlignment", "Misaligmnent" },
- { AE_AML_NO_RESOURCE_END_TAG, LOG_LEVEL_HIGH, "AEAMLNoResEndTag", "No resource end tag"},
- { AE_AML_BAD_RESOURCE_VALUE, LOG_LEVEL_HIGH, "AEAMLBadResValue", "Bad resource value" },
- { AE_AML_CIRCULAR_REFERENCE, LOG_LEVEL_CRITICAL, "AEAMLCircularRef", "Circular reference" },
- { AE_AML_BAD_RESOURCE_LENGTH, LOG_LEVEL_HIGH, "AEAMLBadResLength", "Bad resource length" },
- { AE_AML_ILLEGAL_ADDRESS, LOG_LEVEL_CRITICAL, "AEAMLIllegalAddr", "Illegal address" },
- /* { AE_AML_INFINITE_LOOP, LOG_LEVEL_HIGH, "AEAMLInfiniteLoop", "Infinite loop" }, */
- { 0, 0, NULL, NULL }
+ { AE_AML_BAD_OPCODE, LOG_LEVEL_CRITICAL, "AEAMLBadOpCode", "Bad AML opcode",
+ "An invalid AML opcode encountered during AML execution."
+ },
+ { AE_AML_NO_OPERAND, LOG_LEVEL_HIGH, "AEAMLNoOperand", "Missing operand",
+ "An AML opcode was missing a required operand."
+ },
+ { AE_AML_OPERAND_TYPE, LOG_LEVEL_HIGH, "AEAMLOperandType", "Incorrect operand type",
+ "An AML opcode had an operand of an incorrect type."
+ },
+ { AE_AML_OPERAND_VALUE, LOG_LEVEL_HIGH, "AEAMLOperandValue", "Incorrect operand value",
+ "An AML opcode has an operand of an inappropriate or invalid value.",
+ },
+ { AE_AML_UNINITIALIZED_LOCAL, LOG_LEVEL_HIGH, "AEAMLUninitLocal", "Uninitialized local variable",
+ "A method attempted to use a local variable that was not initialized."
+ },
+ { AE_AML_UNINITIALIZED_ARG, LOG_LEVEL_HIGH, "AEAMLUninitArg", "Uninitialized argument",
+ "A method attempted to use an uninitialized argument."
+ },
+ { AE_AML_UNINITIALIZED_ELEMENT, LOG_LEVEL_HIGH, "AEAMLUninitElement", "Uninitialized element",
+ "A method attempted to use an empty element in an ACPI package."
+ },
+ { AE_AML_NUMERIC_OVERFLOW, LOG_LEVEL_HIGH, "AEAMLNumericOverflow", "Numeric overflow",
+ "A numeric overflow occurred, for example when coverting a BCD value."
+ },
+ { AE_AML_REGION_LIMIT, LOG_LEVEL_CRITICAL, "AEAMLRegionLimit", "Region limit",
+ "An attempt to access beyond the end of an ACPI Operation Region occurred."
+ },
+ { AE_AML_BUFFER_LIMIT, LOG_LEVEL_CRITICAL, "AEAMLBufferLimit", "Buffer limit",
+ "An attempt to access beyond the end of an ACPI buffer occurred."
+ },
+ { AE_AML_PACKAGE_LIMIT, LOG_LEVEL_CRITICAL, "AEAMLPackgeLimit", "Package limit",
+ "An attempt to access beyond the endof an ACPI package occurred."
+ },
+ { AE_AML_DIVIDE_BY_ZERO, LOG_LEVEL_CRITICAL, "AEAMLDivideByZero", "Division by zero",
+ "A division by zero error occurred while excuting the AML Divide op-code"
+ },
+ { AE_AML_NAME_NOT_FOUND, LOG_LEVEL_HIGH, "AEAMLNameNotFound", "Name not found",
+ "An ACPI named reference could not be resolved."
+ },
+ { AE_AML_INTERNAL, LOG_LEVEL_HIGH, "AEAMLInternal", "Internal ACPICA execution engine error",
+ "An internal error occurred in the ACPICA execution interpreter. A bug report should "
+ "be filed against fwts so that this can be resolved."
+ },
+ { AE_AML_INVALID_SPACE_ID, LOG_LEVEL_HIGH, "AEAMLInvalidSpaceID", "Invalid space ID error",
+ "An invalid ACPI Operation Region Space ID has been encountered."
+ },
+ { AE_AML_STRING_LIMIT, LOG_LEVEL_HIGH, "AEAMLStringLimit", "String limit",
+ "A string more than 200 characters long has been used."
+ },
+ { AE_AML_NO_RETURN_VALUE, LOG_LEVEL_HIGH, "AEAMLNoReturnValue", "No return value",
+ "A method did not return the required value that was expected."
+ },
+ { AE_AML_METHOD_LIMIT, LOG_LEVEL_HIGH, "AEAMLMethodLimit", "Method limit",
+ "A control method reached a limit of 255 concurrent thread executions and hit the ACPICA "
+ "re-entrancy limit."
+ },
+ { AE_AML_NOT_OWNER, LOG_LEVEL_HIGH, "AEAMLNotOwner", "Not owner",
+ "A thread attempted to release a mutex that it did not own.",
+ },
+ { AE_AML_MUTEX_ORDER, LOG_LEVEL_HIGH, "AEAMLMutexOrder", "Mutex order",
+ "Deadlock prevention has detected that the current mutex sync level is too large."
+ },
+ { AE_AML_MUTEX_NOT_ACQUIRED, LOG_LEVEL_HIGH, "AEAMLMutexNotAcq", "Mutux not acquired",
+ "An attempt was made to release a mutex that had not been acquired."
+ },
+ { AE_AML_INVALID_RESOURCE_TYPE, LOG_LEVEL_HIGH, "AEAMLInvResourceType", "Invalid resource type",
+ "An ACPI resource list contained an invalid resource type."
+ },
+ { AE_AML_INVALID_INDEX, LOG_LEVEL_HIGH, "AEAMLInvIndex", "Invalid index",
+ "An attempt to get a node with an index that was too large occurred, for example an ACPI "
+ "ArgN or LocalN were N was out of range."
+ },
+ { AE_AML_REGISTER_LIMIT, LOG_LEVEL_HIGH, "AEAMLRegisterLimit", "Register limit",
+ "An attempt to use a bank value that is beyong the capacity of a register occurred."
+ },
+ { AE_AML_NO_WHILE, LOG_LEVEL_CRITICAL, "AEAMLNoWhile", "No while",
+ "A Break or Continue op-code was reached without a matching While op-code."
+ },
+ { AE_AML_ALIGNMENT, LOG_LEVEL_CRITICAL, "AEAMLAlignment", "Misaligmnent",
+ "A non-aligned memory transfer was attempted on a machine that does not "
+ "support it."
+ },
+ { AE_AML_NO_RESOURCE_END_TAG, LOG_LEVEL_HIGH, "AEAMLNoResEndTag", "No resource end tag",
+ "An ACPI resource list had a missing End Tag."
+ },
+ { AE_AML_BAD_RESOURCE_VALUE, LOG_LEVEL_HIGH, "AEAMLBadResValue", "Bad resource value",
+ "An ACPI resource element had an invalid value."
+ },
+ { AE_AML_CIRCULAR_REFERENCE, LOG_LEVEL_CRITICAL, "AEAMLCircularRef", "Circular reference",
+ "Two references refer to each other, which is not allowed."
+ },
+ { AE_AML_BAD_RESOURCE_LENGTH, LOG_LEVEL_HIGH, "AEAMLBadResLength", "Bad resource length",
+ "The length of an ACPI Resource Descriptor was incorrect."
+ },
+ { AE_AML_ILLEGAL_ADDRESS, LOG_LEVEL_CRITICAL, "AEAMLIllegalAddr", "Illegal address",
+ "An memory, PCI configuration or I/O address was encountered with an illegal address."
+ },
+ /* { AE_AML_INFINITE_LOOP, LOG_LEVEL_HIGH, "AEAMLInfiniteLoop", "Infinite loop", NULL }, */
+ { 0, 0, NULL, NULL , NULL}
};
static fwts_list *fwts_object_names;
@@ -250,6 +408,8 @@ void fwts_acpi_object_evaluate_report_error(
fwts_failed(fw, errors[i].level, errors[i].error_type,
"Detected error '%s' when evaluating '%s'.",
errors[i].error_text, name);
+ if (errors[i].advice != NULL)
+ fwts_advice(fw, "%s", errors[i].advice);
return;
}
}
--
1.9.1
More information about the fwts-devel
mailing list