ACPICA: Add exception descriptions to exception info table

Descriptions to be compiled/used by the acpihelp utility only. Not
compiled for the kernel ACPICA code.

Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Lv Zheng <lv.zheng@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
Bob Moore 2013-03-08 09:22:39 +00:00 committed by Rafael J. Wysocki
parent 995b9a9d44
commit ae1b476998
3 changed files with 183 additions and 115 deletions

View File

@ -483,7 +483,8 @@ acpi_ut_short_divide(u64 in_dividend,
/* /*
* utmisc * utmisc
*/ */
const char *acpi_ut_validate_exception(acpi_status status); const struct acpi_exception_info *acpi_ut_validate_exception(acpi_status
status);
u8 acpi_ut_is_pci_root_bridge(char *id); u8 acpi_ut_is_pci_root_bridge(char *id);

View File

@ -64,7 +64,7 @@ ACPI_MODULE_NAME("utexcep")
******************************************************************************/ ******************************************************************************/
const char *acpi_format_exception(acpi_status status) const char *acpi_format_exception(acpi_status status)
{ {
const char *exception = NULL; const struct acpi_exception_info *exception;
ACPI_FUNCTION_ENTRY(); ACPI_FUNCTION_ENTRY();
@ -76,10 +76,10 @@ const char *acpi_format_exception(acpi_status status)
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
"Unknown exception code: 0x%8.8X", status)); "Unknown exception code: 0x%8.8X", status));
exception = "UNKNOWN_STATUS_CODE"; return ("UNKNOWN_STATUS_CODE");
} }
return (ACPI_CAST_PTR(const char, exception)); return (exception->name);
} }
ACPI_EXPORT_SYMBOL(acpi_format_exception) ACPI_EXPORT_SYMBOL(acpi_format_exception)
@ -97,10 +97,10 @@ ACPI_EXPORT_SYMBOL(acpi_format_exception)
* an ASCII string. * an ASCII string.
* *
******************************************************************************/ ******************************************************************************/
const char *acpi_ut_validate_exception(acpi_status status) const struct acpi_exception_info *acpi_ut_validate_exception(acpi_status status)
{ {
u32 sub_status; u32 sub_status;
const char *exception = NULL; const struct acpi_exception_info *exception = NULL;
ACPI_FUNCTION_ENTRY(); ACPI_FUNCTION_ENTRY();
@ -113,35 +113,35 @@ const char *acpi_ut_validate_exception(acpi_status status)
case AE_CODE_ENVIRONMENTAL: case AE_CODE_ENVIRONMENTAL:
if (sub_status <= AE_CODE_ENV_MAX) { if (sub_status <= AE_CODE_ENV_MAX) {
exception = acpi_gbl_exception_names_env[sub_status]; exception = &acpi_gbl_exception_names_env[sub_status];
} }
break; break;
case AE_CODE_PROGRAMMER: case AE_CODE_PROGRAMMER:
if (sub_status <= AE_CODE_PGM_MAX) { if (sub_status <= AE_CODE_PGM_MAX) {
exception = acpi_gbl_exception_names_pgm[sub_status]; exception = &acpi_gbl_exception_names_pgm[sub_status];
} }
break; break;
case AE_CODE_ACPI_TABLES: case AE_CODE_ACPI_TABLES:
if (sub_status <= AE_CODE_TBL_MAX) { if (sub_status <= AE_CODE_TBL_MAX) {
exception = acpi_gbl_exception_names_tbl[sub_status]; exception = &acpi_gbl_exception_names_tbl[sub_status];
} }
break; break;
case AE_CODE_AML: case AE_CODE_AML:
if (sub_status <= AE_CODE_AML_MAX) { if (sub_status <= AE_CODE_AML_MAX) {
exception = acpi_gbl_exception_names_aml[sub_status]; exception = &acpi_gbl_exception_names_aml[sub_status];
} }
break; break;
case AE_CODE_CONTROL: case AE_CODE_CONTROL:
if (sub_status <= AE_CODE_CTRL_MAX) { if (sub_status <= AE_CODE_CTRL_MAX) {
exception = acpi_gbl_exception_names_ctrl[sub_status]; exception = &acpi_gbl_exception_names_ctrl[sub_status];
} }
break; break;
@ -149,5 +149,9 @@ const char *acpi_ut_validate_exception(acpi_status status)
break; break;
} }
return (ACPI_CAST_PTR(const char, exception)); if (!exception || !exception->name) {
return (NULL);
}
return (exception);
} }

View File

@ -49,11 +49,12 @@
/* /*
* Exception code classes * Exception code classes
*/ */
#define AE_CODE_ENVIRONMENTAL 0x0000 #define AE_CODE_ENVIRONMENTAL 0x0000 /* General ACPICA environment */
#define AE_CODE_PROGRAMMER 0x1000 #define AE_CODE_PROGRAMMER 0x1000 /* External ACPICA interface caller */
#define AE_CODE_ACPI_TABLES 0x2000 #define AE_CODE_ACPI_TABLES 0x2000 /* ACPI tables */
#define AE_CODE_AML 0x3000 #define AE_CODE_AML 0x3000 /* From executing AML code */
#define AE_CODE_CONTROL 0x4000 #define AE_CODE_CONTROL 0x4000 /* Internal control codes */
#define AE_CODE_MAX 0x4000 #define AE_CODE_MAX 0x4000
#define AE_CODE_MASK 0xF000 #define AE_CODE_MASK 0xF000
@ -66,6 +67,24 @@
#define EXCEP_AML(code) ((acpi_status) (code | AE_CODE_AML)) #define EXCEP_AML(code) ((acpi_status) (code | AE_CODE_AML))
#define EXCEP_CTL(code) ((acpi_status) (code | AE_CODE_CONTROL)) #define EXCEP_CTL(code) ((acpi_status) (code | AE_CODE_CONTROL))
/*
* Exception info table. The "Description" field is used only by the
* ACPICA help application (acpihelp).
*/
struct acpi_exception_info {
char *name;
#ifdef ACPI_HELP_APP
char *description;
#endif
};
#ifdef ACPI_HELP_APP
#define EXCEP_TXT(name,description) {name, description}
#else
#define EXCEP_TXT(name,description) {name}
#endif
/* /*
* Success is always zero, failure is non-zero * Success is always zero, failure is non-zero
*/ */
@ -202,112 +221,156 @@
* String versions of the exception codes above * String versions of the exception codes above
* These strings must match the corresponding defines exactly * These strings must match the corresponding defines exactly
*/ */
char const *acpi_gbl_exception_names_env[] = { static const struct acpi_exception_info acpi_gbl_exception_names_env[] = {
"AE_OK", EXCEP_TXT("AE_OK", "No error"),
"AE_ERROR", EXCEP_TXT("AE_ERROR", "Unspecified error"),
"AE_NO_ACPI_TABLES", EXCEP_TXT("AE_NO_ACPI_TABLES", "ACPI tables could not be found"),
"AE_NO_NAMESPACE", EXCEP_TXT("AE_NO_NAMESPACE", "A namespace has not been loaded"),
"AE_NO_MEMORY", EXCEP_TXT("AE_NO_MEMORY", "Insufficient dynamic memory"),
"AE_NOT_FOUND", EXCEP_TXT("AE_NOT_FOUND", "The name was not found in the namespace"),
"AE_NOT_EXIST", EXCEP_TXT("AE_NOT_EXIST", "A required entity does not exist"),
"AE_ALREADY_EXISTS", EXCEP_TXT("AE_ALREADY_EXISTS", "An entity already exists"),
"AE_TYPE", EXCEP_TXT("AE_TYPE", "The object type is incorrect"),
"AE_NULL_OBJECT", EXCEP_TXT("AE_NULL_OBJECT", "A required object was missing"),
"AE_NULL_ENTRY", EXCEP_TXT("AE_NULL_ENTRY", "The requested object does not exist"),
"AE_BUFFER_OVERFLOW", EXCEP_TXT("AE_BUFFER_OVERFLOW", "The buffer provided is too small"),
"AE_STACK_OVERFLOW", EXCEP_TXT("AE_STACK_OVERFLOW", "An internal stack overflowed"),
"AE_STACK_UNDERFLOW", EXCEP_TXT("AE_STACK_UNDERFLOW", "An internal stack underflowed"),
"AE_NOT_IMPLEMENTED", EXCEP_TXT("AE_NOT_IMPLEMENTED", "The feature is not implemented"),
"AE_SUPPORT", EXCEP_TXT("AE_SUPPORT", "The feature is not supported"),
"AE_LIMIT", EXCEP_TXT("AE_LIMIT", "A predefined limit was exceeded"),
"AE_TIME", EXCEP_TXT("AE_TIME", "A time limit or timeout expired"),
"AE_ACQUIRE_DEADLOCK", EXCEP_TXT("AE_ACQUIRE_DEADLOCK",
"AE_RELEASE_DEADLOCK", "Internal error, attempt was made to acquire a mutex in improper order"),
"AE_NOT_ACQUIRED", EXCEP_TXT("AE_RELEASE_DEADLOCK",
"AE_ALREADY_ACQUIRED", "Internal error, attempt was made to release a mutex in improper order"),
"AE_NO_HARDWARE_RESPONSE", EXCEP_TXT("AE_NOT_ACQUIRED",
"AE_NO_GLOBAL_LOCK", "An attempt to release a mutex or Global Lock without a previous acquire"),
"AE_ABORT_METHOD", EXCEP_TXT("AE_ALREADY_ACQUIRED",
"AE_SAME_HANDLER", "Internal error, attempt was made to acquire a mutex twice"),
"AE_NO_HANDLER", EXCEP_TXT("AE_NO_HARDWARE_RESPONSE",
"AE_OWNER_ID_LIMIT", "Hardware did not respond after an I/O operation"),
"AE_NOT_CONFIGURED" EXCEP_TXT("AE_NO_GLOBAL_LOCK", "There is no FACS Global Lock"),
EXCEP_TXT("AE_ABORT_METHOD", "A control method was aborted"),
EXCEP_TXT("AE_SAME_HANDLER",
"Attempt was made to install the same handler that is already installed"),
EXCEP_TXT("AE_NO_HANDLER",
"A handler for the operation is not installed"),
EXCEP_TXT("AE_OWNER_ID_LIMIT",
"There are no more Owner IDs available for ACPI tables or control methods"),
EXCEP_TXT("AE_NOT_CONFIGURED",
"The interface is not part of the current subsystem configuration")
}; };
char const *acpi_gbl_exception_names_pgm[] = { static const struct acpi_exception_info acpi_gbl_exception_names_pgm[] = {
NULL, EXCEP_TXT(NULL, NULL),
"AE_BAD_PARAMETER", EXCEP_TXT("AE_BAD_PARAMETER", "A parameter is out of range or invalid"),
"AE_BAD_CHARACTER", EXCEP_TXT("AE_BAD_CHARACTER",
"AE_BAD_PATHNAME", "An invalid character was found in a name"),
"AE_BAD_DATA", EXCEP_TXT("AE_BAD_PATHNAME",
"AE_BAD_HEX_CONSTANT", "An invalid character was found in a pathname"),
"AE_BAD_OCTAL_CONSTANT", EXCEP_TXT("AE_BAD_DATA",
"AE_BAD_DECIMAL_CONSTANT", "A package or buffer contained incorrect data"),
"AE_MISSING_ARGUMENTS", EXCEP_TXT("AE_BAD_HEX_CONSTANT", "Invalid character in a Hex constant"),
"AE_BAD_ADDRESS" EXCEP_TXT("AE_BAD_OCTAL_CONSTANT",
"Invalid character in an Octal constant"),
EXCEP_TXT("AE_BAD_DECIMAL_CONSTANT",
"Invalid character in a Decimal constant"),
EXCEP_TXT("AE_MISSING_ARGUMENTS",
"Too few arguments were passed to a control method"),
EXCEP_TXT("AE_BAD_ADDRESS", "An illegal null I/O address")
}; };
char const *acpi_gbl_exception_names_tbl[] = { static const struct acpi_exception_info acpi_gbl_exception_names_tbl[] = {
NULL, EXCEP_TXT(NULL, NULL),
"AE_BAD_SIGNATURE", EXCEP_TXT("AE_BAD_SIGNATURE", "An ACPI table has an invalid signature"),
"AE_BAD_HEADER", EXCEP_TXT("AE_BAD_HEADER", "Invalid field in an ACPI table header"),
"AE_BAD_CHECKSUM", EXCEP_TXT("AE_BAD_CHECKSUM", "An ACPI table checksum is not correct"),
"AE_BAD_VALUE", EXCEP_TXT("AE_BAD_VALUE", "An invalid value was found in a table"),
"AE_INVALID_TABLE_LENGTH" EXCEP_TXT("AE_INVALID_TABLE_LENGTH",
"The FADT or FACS has improper length")
}; };
char const *acpi_gbl_exception_names_aml[] = { static const struct acpi_exception_info acpi_gbl_exception_names_aml[] = {
NULL, EXCEP_TXT(NULL, NULL),
"AE_AML_BAD_OPCODE", EXCEP_TXT("AE_AML_BAD_OPCODE", "Invalid AML opcode encountered"),
"AE_AML_NO_OPERAND", EXCEP_TXT("AE_AML_NO_OPERAND", "A required operand is missing"),
"AE_AML_OPERAND_TYPE", EXCEP_TXT("AE_AML_OPERAND_TYPE",
"AE_AML_OPERAND_VALUE", "An operand of an incorrect type was encountered"),
"AE_AML_UNINITIALIZED_LOCAL", EXCEP_TXT("AE_AML_OPERAND_VALUE",
"AE_AML_UNINITIALIZED_ARG", "The operand had an inappropriate or invalid value"),
"AE_AML_UNINITIALIZED_ELEMENT", EXCEP_TXT("AE_AML_UNINITIALIZED_LOCAL",
"AE_AML_NUMERIC_OVERFLOW", "Method tried to use an uninitialized local variable"),
"AE_AML_REGION_LIMIT", EXCEP_TXT("AE_AML_UNINITIALIZED_ARG",
"AE_AML_BUFFER_LIMIT", "Method tried to use an uninitialized argument"),
"AE_AML_PACKAGE_LIMIT", EXCEP_TXT("AE_AML_UNINITIALIZED_ELEMENT",
"AE_AML_DIVIDE_BY_ZERO", "Method tried to use an empty package element"),
"AE_AML_BAD_NAME", EXCEP_TXT("AE_AML_NUMERIC_OVERFLOW",
"AE_AML_NAME_NOT_FOUND", "Overflow during BCD conversion or other"),
"AE_AML_INTERNAL", EXCEP_TXT("AE_AML_REGION_LIMIT",
"AE_AML_INVALID_SPACE_ID", "Tried to access beyond the end of an Operation Region"),
"AE_AML_STRING_LIMIT", EXCEP_TXT("AE_AML_BUFFER_LIMIT",
"AE_AML_NO_RETURN_VALUE", "Tried to access beyond the end of a buffer"),
"AE_AML_METHOD_LIMIT", EXCEP_TXT("AE_AML_PACKAGE_LIMIT",
"AE_AML_NOT_OWNER", "Tried to access beyond the end of a package"),
"AE_AML_MUTEX_ORDER", EXCEP_TXT("AE_AML_DIVIDE_BY_ZERO",
"AE_AML_MUTEX_NOT_ACQUIRED", "During execution of AML Divide operator"),
"AE_AML_INVALID_RESOURCE_TYPE", EXCEP_TXT("AE_AML_BAD_NAME",
"AE_AML_INVALID_INDEX", "An ACPI name contains invalid character(s)"),
"AE_AML_REGISTER_LIMIT", EXCEP_TXT("AE_AML_NAME_NOT_FOUND",
"AE_AML_NO_WHILE", "Could not resolve a named reference"),
"AE_AML_ALIGNMENT", EXCEP_TXT("AE_AML_INTERNAL", "An internal error within the interprete"),
"AE_AML_NO_RESOURCE_END_TAG", EXCEP_TXT("AE_AML_INVALID_SPACE_ID",
"AE_AML_BAD_RESOURCE_VALUE", "An Operation Region SpaceID is invalid"),
"AE_AML_CIRCULAR_REFERENCE", EXCEP_TXT("AE_AML_STRING_LIMIT",
"AE_AML_BAD_RESOURCE_LENGTH", "String is longer than 200 characters"),
"AE_AML_ILLEGAL_ADDRESS", EXCEP_TXT("AE_AML_NO_RETURN_VALUE",
"AE_AML_INFINITE_LOOP" "A method did not return a required value"),
EXCEP_TXT("AE_AML_METHOD_LIMIT",
"A control method reached the maximum reentrancy limit of 255"),
EXCEP_TXT("AE_AML_NOT_OWNER",
"A thread tried to release a mutex that it does not own"),
EXCEP_TXT("AE_AML_MUTEX_ORDER", "Mutex SyncLevel release mismatch"),
EXCEP_TXT("AE_AML_MUTEX_NOT_ACQUIRED",
"Attempt to release a mutex that was not previously acquired"),
EXCEP_TXT("AE_AML_INVALID_RESOURCE_TYPE",
"Invalid resource type in resource list"),
EXCEP_TXT("AE_AML_INVALID_INDEX",
"Invalid Argx or Localx (x too large)"),
EXCEP_TXT("AE_AML_REGISTER_LIMIT",
"Bank value or Index value beyond range of register"),
EXCEP_TXT("AE_AML_NO_WHILE", "Break or Continue without a While"),
EXCEP_TXT("AE_AML_ALIGNMENT",
"Non-aligned memory transfer on platform that does not support this"),
EXCEP_TXT("AE_AML_NO_RESOURCE_END_TAG",
"No End Tag in a resource list"),
EXCEP_TXT("AE_AML_BAD_RESOURCE_VALUE",
"Invalid value of a resource element"),
EXCEP_TXT("AE_AML_CIRCULAR_REFERENCE",
"Two references refer to each other"),
EXCEP_TXT("AE_AML_BAD_RESOURCE_LENGTH",
"The length of a Resource Descriptor in the AML is incorrect"),
EXCEP_TXT("AE_AML_ILLEGAL_ADDRESS",
"A memory, I/O, or PCI configuration address is invalid"),
EXCEP_TXT("AE_AML_INFINITE_LOOP",
"An apparent infinite AML While loop, method was aborted")
}; };
char const *acpi_gbl_exception_names_ctrl[] = { static const struct acpi_exception_info acpi_gbl_exception_names_ctrl[] = {
NULL, EXCEP_TXT(NULL, NULL),
"AE_CTRL_RETURN_VALUE", EXCEP_TXT("AE_CTRL_RETURN_VALUE", "A Method returned a value"),
"AE_CTRL_PENDING", EXCEP_TXT("AE_CTRL_PENDING", "Method is calling another method"),
"AE_CTRL_TERMINATE", EXCEP_TXT("AE_CTRL_TERMINATE", "Terminate the executing method"),
"AE_CTRL_TRUE", EXCEP_TXT("AE_CTRL_TRUE", "An If or While predicate result"),
"AE_CTRL_FALSE", EXCEP_TXT("AE_CTRL_FALSE", "An If or While predicate result"),
"AE_CTRL_DEPTH", EXCEP_TXT("AE_CTRL_DEPTH", "Maximum search depth has been reached"),
"AE_CTRL_END", EXCEP_TXT("AE_CTRL_END", "An If or While predicate is false"),
"AE_CTRL_TRANSFER", EXCEP_TXT("AE_CTRL_TRANSFER", "Transfer control to called method"),
"AE_CTRL_BREAK", EXCEP_TXT("AE_CTRL_BREAK", "A Break has been executed"),
"AE_CTRL_CONTINUE", EXCEP_TXT("AE_CTRL_CONTINUE", "A Continue has been executed"),
"AE_CTRL_SKIP", EXCEP_TXT("AE_CTRL_SKIP", "Not currently used"),
"AE_CTRL_PARSE_CONTINUE", EXCEP_TXT("AE_CTRL_PARSE_CONTINUE", "Used to skip over bad opcodes"),
"AE_CTRL_PARSE_PENDING" EXCEP_TXT("AE_CTRL_PARSE_PENDING", "Used to implement AML While loops")
}; };
#endif /* EXCEPTION_TABLE */ #endif /* EXCEPTION_TABLE */