aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBob Moore <robert.moore@intel.com>2013-03-08 04:22:39 -0500
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2013-03-11 19:45:05 -0400
commitae1b4769989f8707a1f092db191fa2f9a0fc8604 (patch)
treea6f05a11c411b1b2a5da2d136e5d2df3b2d7da5d
parent995b9a9d44acaf9e551be6f1fe606af179b9753f (diff)
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>
-rw-r--r--drivers/acpi/acpica/acutils.h3
-rw-r--r--drivers/acpi/acpica/utexcep.c26
-rw-r--r--include/acpi/acexcep.h269
3 files changed, 183 insertions, 115 deletions
diff --git a/drivers/acpi/acpica/acutils.h b/drivers/acpi/acpica/acutils.h
index 0082fa0a6139..c01f1a10a9d7 100644
--- a/drivers/acpi/acpica/acutils.h
+++ b/drivers/acpi/acpica/acutils.h
@@ -483,7 +483,8 @@ acpi_ut_short_divide(u64 in_dividend,
483/* 483/*
484 * utmisc 484 * utmisc
485 */ 485 */
486const char *acpi_ut_validate_exception(acpi_status status); 486const struct acpi_exception_info *acpi_ut_validate_exception(acpi_status
487 status);
487 488
488u8 acpi_ut_is_pci_root_bridge(char *id); 489u8 acpi_ut_is_pci_root_bridge(char *id);
489 490
diff --git a/drivers/acpi/acpica/utexcep.c b/drivers/acpi/acpica/utexcep.c
index a0ab7c02e87c..b543a144941a 100644
--- a/drivers/acpi/acpica/utexcep.c
+++ b/drivers/acpi/acpica/utexcep.c
@@ -64,7 +64,7 @@ ACPI_MODULE_NAME("utexcep")
64 ******************************************************************************/ 64 ******************************************************************************/
65const char *acpi_format_exception(acpi_status status) 65const char *acpi_format_exception(acpi_status status)
66{ 66{
67 const char *exception = NULL; 67 const struct acpi_exception_info *exception;
68 68
69 ACPI_FUNCTION_ENTRY(); 69 ACPI_FUNCTION_ENTRY();
70 70
@@ -76,10 +76,10 @@ const char *acpi_format_exception(acpi_status status)
76 ACPI_ERROR((AE_INFO, 76 ACPI_ERROR((AE_INFO,
77 "Unknown exception code: 0x%8.8X", status)); 77 "Unknown exception code: 0x%8.8X", status));
78 78
79 exception = "UNKNOWN_STATUS_CODE"; 79 return ("UNKNOWN_STATUS_CODE");
80 } 80 }
81 81
82 return (ACPI_CAST_PTR(const char, exception)); 82 return (exception->name);
83} 83}
84 84
85ACPI_EXPORT_SYMBOL(acpi_format_exception) 85ACPI_EXPORT_SYMBOL(acpi_format_exception)
@@ -97,10 +97,10 @@ ACPI_EXPORT_SYMBOL(acpi_format_exception)
97 * an ASCII string. 97 * an ASCII string.
98 * 98 *
99 ******************************************************************************/ 99 ******************************************************************************/
100const char *acpi_ut_validate_exception(acpi_status status) 100const struct acpi_exception_info *acpi_ut_validate_exception(acpi_status status)
101{ 101{
102 u32 sub_status; 102 u32 sub_status;
103 const char *exception = NULL; 103 const struct acpi_exception_info *exception = NULL;
104 104
105 ACPI_FUNCTION_ENTRY(); 105 ACPI_FUNCTION_ENTRY();
106 106
@@ -113,35 +113,35 @@ const char *acpi_ut_validate_exception(acpi_status status)
113 case AE_CODE_ENVIRONMENTAL: 113 case AE_CODE_ENVIRONMENTAL:
114 114
115 if (sub_status <= AE_CODE_ENV_MAX) { 115 if (sub_status <= AE_CODE_ENV_MAX) {
116 exception = acpi_gbl_exception_names_env[sub_status]; 116 exception = &acpi_gbl_exception_names_env[sub_status];
117 } 117 }
118 break; 118 break;
119 119
120 case AE_CODE_PROGRAMMER: 120 case AE_CODE_PROGRAMMER:
121 121
122 if (sub_status <= AE_CODE_PGM_MAX) { 122 if (sub_status <= AE_CODE_PGM_MAX) {
123 exception = acpi_gbl_exception_names_pgm[sub_status]; 123 exception = &acpi_gbl_exception_names_pgm[sub_status];
124 } 124 }
125 break; 125 break;
126 126
127 case AE_CODE_ACPI_TABLES: 127 case AE_CODE_ACPI_TABLES:
128 128
129 if (sub_status <= AE_CODE_TBL_MAX) { 129 if (sub_status <= AE_CODE_TBL_MAX) {
130 exception = acpi_gbl_exception_names_tbl[sub_status]; 130 exception = &acpi_gbl_exception_names_tbl[sub_status];
131 } 131 }
132 break; 132 break;
133 133
134 case AE_CODE_AML: 134 case AE_CODE_AML:
135 135
136 if (sub_status <= AE_CODE_AML_MAX) { 136 if (sub_status <= AE_CODE_AML_MAX) {
137 exception = acpi_gbl_exception_names_aml[sub_status]; 137 exception = &acpi_gbl_exception_names_aml[sub_status];
138 } 138 }
139 break; 139 break;
140 140
141 case AE_CODE_CONTROL: 141 case AE_CODE_CONTROL:
142 142
143 if (sub_status <= AE_CODE_CTRL_MAX) { 143 if (sub_status <= AE_CODE_CTRL_MAX) {
144 exception = acpi_gbl_exception_names_ctrl[sub_status]; 144 exception = &acpi_gbl_exception_names_ctrl[sub_status];
145 } 145 }
146 break; 146 break;
147 147
@@ -149,5 +149,9 @@ const char *acpi_ut_validate_exception(acpi_status status)
149 break; 149 break;
150 } 150 }
151 151
152 return (ACPI_CAST_PTR(const char, exception)); 152 if (!exception || !exception->name) {
153 return (NULL);
154 }
155
156 return (exception);
153} 157}
diff --git a/include/acpi/acexcep.h b/include/acpi/acexcep.h
index 3e6b163ee15f..cf051e05a8fe 100644
--- a/include/acpi/acexcep.h
+++ b/include/acpi/acexcep.h
@@ -49,11 +49,12 @@
49/* 49/*
50 * Exception code classes 50 * Exception code classes
51 */ 51 */
52#define AE_CODE_ENVIRONMENTAL 0x0000 52#define AE_CODE_ENVIRONMENTAL 0x0000 /* General ACPICA environment */
53#define AE_CODE_PROGRAMMER 0x1000 53#define AE_CODE_PROGRAMMER 0x1000 /* External ACPICA interface caller */
54#define AE_CODE_ACPI_TABLES 0x2000 54#define AE_CODE_ACPI_TABLES 0x2000 /* ACPI tables */
55#define AE_CODE_AML 0x3000 55#define AE_CODE_AML 0x3000 /* From executing AML code */
56#define AE_CODE_CONTROL 0x4000 56#define AE_CODE_CONTROL 0x4000 /* Internal control codes */
57
57#define AE_CODE_MAX 0x4000 58#define AE_CODE_MAX 0x4000
58#define AE_CODE_MASK 0xF000 59#define AE_CODE_MASK 0xF000
59 60
@@ -67,6 +68,24 @@
67#define EXCEP_CTL(code) ((acpi_status) (code | AE_CODE_CONTROL)) 68#define EXCEP_CTL(code) ((acpi_status) (code | AE_CODE_CONTROL))
68 69
69/* 70/*
71 * Exception info table. The "Description" field is used only by the
72 * ACPICA help application (acpihelp).
73 */
74struct acpi_exception_info {
75 char *name;
76
77#ifdef ACPI_HELP_APP
78 char *description;
79#endif
80};
81
82#ifdef ACPI_HELP_APP
83#define EXCEP_TXT(name,description) {name, description}
84#else
85#define EXCEP_TXT(name,description) {name}
86#endif
87
88/*
70 * Success is always zero, failure is non-zero 89 * Success is always zero, failure is non-zero
71 */ 90 */
72#define ACPI_SUCCESS(a) (!(a)) 91#define ACPI_SUCCESS(a) (!(a))
@@ -202,112 +221,156 @@
202 * String versions of the exception codes above 221 * String versions of the exception codes above
203 * These strings must match the corresponding defines exactly 222 * These strings must match the corresponding defines exactly
204 */ 223 */
205char const *acpi_gbl_exception_names_env[] = { 224static const struct acpi_exception_info acpi_gbl_exception_names_env[] = {
206 "AE_OK", 225 EXCEP_TXT("AE_OK", "No error"),
207 "AE_ERROR", 226 EXCEP_TXT("AE_ERROR", "Unspecified error"),
208 "AE_NO_ACPI_TABLES", 227 EXCEP_TXT("AE_NO_ACPI_TABLES", "ACPI tables could not be found"),
209 "AE_NO_NAMESPACE", 228 EXCEP_TXT("AE_NO_NAMESPACE", "A namespace has not been loaded"),
210 "AE_NO_MEMORY", 229 EXCEP_TXT("AE_NO_MEMORY", "Insufficient dynamic memory"),
211 "AE_NOT_FOUND", 230 EXCEP_TXT("AE_NOT_FOUND", "The name was not found in the namespace"),
212 "AE_NOT_EXIST", 231 EXCEP_TXT("AE_NOT_EXIST", "A required entity does not exist"),
213 "AE_ALREADY_EXISTS", 232 EXCEP_TXT("AE_ALREADY_EXISTS", "An entity already exists"),
214 "AE_TYPE", 233 EXCEP_TXT("AE_TYPE", "The object type is incorrect"),
215 "AE_NULL_OBJECT", 234 EXCEP_TXT("AE_NULL_OBJECT", "A required object was missing"),
216 "AE_NULL_ENTRY", 235 EXCEP_TXT("AE_NULL_ENTRY", "The requested object does not exist"),
217 "AE_BUFFER_OVERFLOW", 236 EXCEP_TXT("AE_BUFFER_OVERFLOW", "The buffer provided is too small"),
218 "AE_STACK_OVERFLOW", 237 EXCEP_TXT("AE_STACK_OVERFLOW", "An internal stack overflowed"),
219 "AE_STACK_UNDERFLOW", 238 EXCEP_TXT("AE_STACK_UNDERFLOW", "An internal stack underflowed"),
220 "AE_NOT_IMPLEMENTED", 239 EXCEP_TXT("AE_NOT_IMPLEMENTED", "The feature is not implemented"),
221 "AE_SUPPORT", 240 EXCEP_TXT("AE_SUPPORT", "The feature is not supported"),
222 "AE_LIMIT", 241 EXCEP_TXT("AE_LIMIT", "A predefined limit was exceeded"),
223 "AE_TIME", 242 EXCEP_TXT("AE_TIME", "A time limit or timeout expired"),
224 "AE_ACQUIRE_DEADLOCK", 243 EXCEP_TXT("AE_ACQUIRE_DEADLOCK",
225 "AE_RELEASE_DEADLOCK", 244 "Internal error, attempt was made to acquire a mutex in improper order"),
226 "AE_NOT_ACQUIRED", 245 EXCEP_TXT("AE_RELEASE_DEADLOCK",
227 "AE_ALREADY_ACQUIRED", 246 "Internal error, attempt was made to release a mutex in improper order"),
228 "AE_NO_HARDWARE_RESPONSE", 247 EXCEP_TXT("AE_NOT_ACQUIRED",
229 "AE_NO_GLOBAL_LOCK", 248 "An attempt to release a mutex or Global Lock without a previous acquire"),
230 "AE_ABORT_METHOD", 249 EXCEP_TXT("AE_ALREADY_ACQUIRED",
231 "AE_SAME_HANDLER", 250 "Internal error, attempt was made to acquire a mutex twice"),
232 "AE_NO_HANDLER", 251 EXCEP_TXT("AE_NO_HARDWARE_RESPONSE",
233 "AE_OWNER_ID_LIMIT", 252 "Hardware did not respond after an I/O operation"),
234 "AE_NOT_CONFIGURED" 253 EXCEP_TXT("AE_NO_GLOBAL_LOCK", "There is no FACS Global Lock"),
254 EXCEP_TXT("AE_ABORT_METHOD", "A control method was aborted"),
255 EXCEP_TXT("AE_SAME_HANDLER",
256 "Attempt was made to install the same handler that is already installed"),
257 EXCEP_TXT("AE_NO_HANDLER",
258 "A handler for the operation is not installed"),
259 EXCEP_TXT("AE_OWNER_ID_LIMIT",
260 "There are no more Owner IDs available for ACPI tables or control methods"),
261 EXCEP_TXT("AE_NOT_CONFIGURED",
262 "The interface is not part of the current subsystem configuration")
235}; 263};
236 264
237char const *acpi_gbl_exception_names_pgm[] = { 265static const struct acpi_exception_info acpi_gbl_exception_names_pgm[] = {
238 NULL, 266 EXCEP_TXT(NULL, NULL),
239 "AE_BAD_PARAMETER", 267 EXCEP_TXT("AE_BAD_PARAMETER", "A parameter is out of range or invalid"),
240 "AE_BAD_CHARACTER", 268 EXCEP_TXT("AE_BAD_CHARACTER",
241 "AE_BAD_PATHNAME", 269 "An invalid character was found in a name"),
242 "AE_BAD_DATA", 270 EXCEP_TXT("AE_BAD_PATHNAME",
243 "AE_BAD_HEX_CONSTANT", 271 "An invalid character was found in a pathname"),
244 "AE_BAD_OCTAL_CONSTANT", 272 EXCEP_TXT("AE_BAD_DATA",
245 "AE_BAD_DECIMAL_CONSTANT", 273 "A package or buffer contained incorrect data"),
246 "AE_MISSING_ARGUMENTS", 274 EXCEP_TXT("AE_BAD_HEX_CONSTANT", "Invalid character in a Hex constant"),
247 "AE_BAD_ADDRESS" 275 EXCEP_TXT("AE_BAD_OCTAL_CONSTANT",
276 "Invalid character in an Octal constant"),
277 EXCEP_TXT("AE_BAD_DECIMAL_CONSTANT",
278 "Invalid character in a Decimal constant"),
279 EXCEP_TXT("AE_MISSING_ARGUMENTS",
280 "Too few arguments were passed to a control method"),
281 EXCEP_TXT("AE_BAD_ADDRESS", "An illegal null I/O address")
248}; 282};
249 283
250char const *acpi_gbl_exception_names_tbl[] = { 284static const struct acpi_exception_info acpi_gbl_exception_names_tbl[] = {
251 NULL, 285 EXCEP_TXT(NULL, NULL),
252 "AE_BAD_SIGNATURE", 286 EXCEP_TXT("AE_BAD_SIGNATURE", "An ACPI table has an invalid signature"),
253 "AE_BAD_HEADER", 287 EXCEP_TXT("AE_BAD_HEADER", "Invalid field in an ACPI table header"),
254 "AE_BAD_CHECKSUM", 288 EXCEP_TXT("AE_BAD_CHECKSUM", "An ACPI table checksum is not correct"),
255 "AE_BAD_VALUE", 289 EXCEP_TXT("AE_BAD_VALUE", "An invalid value was found in a table"),
256 "AE_INVALID_TABLE_LENGTH" 290 EXCEP_TXT("AE_INVALID_TABLE_LENGTH",
291 "The FADT or FACS has improper length")
257}; 292};
258 293
259char const *acpi_gbl_exception_names_aml[] = { 294static const struct acpi_exception_info acpi_gbl_exception_names_aml[] = {
260 NULL, 295 EXCEP_TXT(NULL, NULL),
261 "AE_AML_BAD_OPCODE", 296 EXCEP_TXT("AE_AML_BAD_OPCODE", "Invalid AML opcode encountered"),
262 "AE_AML_NO_OPERAND", 297 EXCEP_TXT("AE_AML_NO_OPERAND", "A required operand is missing"),
263 "AE_AML_OPERAND_TYPE", 298 EXCEP_TXT("AE_AML_OPERAND_TYPE",
264 "AE_AML_OPERAND_VALUE", 299 "An operand of an incorrect type was encountered"),
265 "AE_AML_UNINITIALIZED_LOCAL", 300 EXCEP_TXT("AE_AML_OPERAND_VALUE",
266 "AE_AML_UNINITIALIZED_ARG", 301 "The operand had an inappropriate or invalid value"),
267 "AE_AML_UNINITIALIZED_ELEMENT", 302 EXCEP_TXT("AE_AML_UNINITIALIZED_LOCAL",
268 "AE_AML_NUMERIC_OVERFLOW", 303 "Method tried to use an uninitialized local variable"),
269 "AE_AML_REGION_LIMIT", 304 EXCEP_TXT("AE_AML_UNINITIALIZED_ARG",
270 "AE_AML_BUFFER_LIMIT", 305 "Method tried to use an uninitialized argument"),
271 "AE_AML_PACKAGE_LIMIT", 306 EXCEP_TXT("AE_AML_UNINITIALIZED_ELEMENT",
272 "AE_AML_DIVIDE_BY_ZERO", 307 "Method tried to use an empty package element"),
273 "AE_AML_BAD_NAME", 308 EXCEP_TXT("AE_AML_NUMERIC_OVERFLOW",
274 "AE_AML_NAME_NOT_FOUND", 309 "Overflow during BCD conversion or other"),
275 "AE_AML_INTERNAL", 310 EXCEP_TXT("AE_AML_REGION_LIMIT",
276 "AE_AML_INVALID_SPACE_ID", 311 "Tried to access beyond the end of an Operation Region"),
277 "AE_AML_STRING_LIMIT", 312 EXCEP_TXT("AE_AML_BUFFER_LIMIT",
278 "AE_AML_NO_RETURN_VALUE", 313 "Tried to access beyond the end of a buffer"),
279 "AE_AML_METHOD_LIMIT", 314 EXCEP_TXT("AE_AML_PACKAGE_LIMIT",
280 "AE_AML_NOT_OWNER", 315 "Tried to access beyond the end of a package"),
281 "AE_AML_MUTEX_ORDER", 316 EXCEP_TXT("AE_AML_DIVIDE_BY_ZERO",
282 "AE_AML_MUTEX_NOT_ACQUIRED", 317 "During execution of AML Divide operator"),
283 "AE_AML_INVALID_RESOURCE_TYPE", 318 EXCEP_TXT("AE_AML_BAD_NAME",
284 "AE_AML_INVALID_INDEX", 319 "An ACPI name contains invalid character(s)"),
285 "AE_AML_REGISTER_LIMIT", 320 EXCEP_TXT("AE_AML_NAME_NOT_FOUND",
286 "AE_AML_NO_WHILE", 321 "Could not resolve a named reference"),
287 "AE_AML_ALIGNMENT", 322 EXCEP_TXT("AE_AML_INTERNAL", "An internal error within the interprete"),
288 "AE_AML_NO_RESOURCE_END_TAG", 323 EXCEP_TXT("AE_AML_INVALID_SPACE_ID",
289 "AE_AML_BAD_RESOURCE_VALUE", 324 "An Operation Region SpaceID is invalid"),
290 "AE_AML_CIRCULAR_REFERENCE", 325 EXCEP_TXT("AE_AML_STRING_LIMIT",
291 "AE_AML_BAD_RESOURCE_LENGTH", 326 "String is longer than 200 characters"),
292 "AE_AML_ILLEGAL_ADDRESS", 327 EXCEP_TXT("AE_AML_NO_RETURN_VALUE",
293 "AE_AML_INFINITE_LOOP" 328 "A method did not return a required value"),
329 EXCEP_TXT("AE_AML_METHOD_LIMIT",
330 "A control method reached the maximum reentrancy limit of 255"),
331 EXCEP_TXT("AE_AML_NOT_OWNER",
332 "A thread tried to release a mutex that it does not own"),
333 EXCEP_TXT("AE_AML_MUTEX_ORDER", "Mutex SyncLevel release mismatch"),
334 EXCEP_TXT("AE_AML_MUTEX_NOT_ACQUIRED",
335 "Attempt to release a mutex that was not previously acquired"),
336 EXCEP_TXT("AE_AML_INVALID_RESOURCE_TYPE",
337 "Invalid resource type in resource list"),
338 EXCEP_TXT("AE_AML_INVALID_INDEX",
339 "Invalid Argx or Localx (x too large)"),
340 EXCEP_TXT("AE_AML_REGISTER_LIMIT",
341 "Bank value or Index value beyond range of register"),
342 EXCEP_TXT("AE_AML_NO_WHILE", "Break or Continue without a While"),
343 EXCEP_TXT("AE_AML_ALIGNMENT",
344 "Non-aligned memory transfer on platform that does not support this"),
345 EXCEP_TXT("AE_AML_NO_RESOURCE_END_TAG",
346 "No End Tag in a resource list"),
347 EXCEP_TXT("AE_AML_BAD_RESOURCE_VALUE",
348 "Invalid value of a resource element"),
349 EXCEP_TXT("AE_AML_CIRCULAR_REFERENCE",
350 "Two references refer to each other"),
351 EXCEP_TXT("AE_AML_BAD_RESOURCE_LENGTH",
352 "The length of a Resource Descriptor in the AML is incorrect"),
353 EXCEP_TXT("AE_AML_ILLEGAL_ADDRESS",
354 "A memory, I/O, or PCI configuration address is invalid"),
355 EXCEP_TXT("AE_AML_INFINITE_LOOP",
356 "An apparent infinite AML While loop, method was aborted")
294}; 357};
295 358
296char const *acpi_gbl_exception_names_ctrl[] = { 359static const struct acpi_exception_info acpi_gbl_exception_names_ctrl[] = {
297 NULL, 360 EXCEP_TXT(NULL, NULL),
298 "AE_CTRL_RETURN_VALUE", 361 EXCEP_TXT("AE_CTRL_RETURN_VALUE", "A Method returned a value"),
299 "AE_CTRL_PENDING", 362 EXCEP_TXT("AE_CTRL_PENDING", "Method is calling another method"),
300 "AE_CTRL_TERMINATE", 363 EXCEP_TXT("AE_CTRL_TERMINATE", "Terminate the executing method"),
301 "AE_CTRL_TRUE", 364 EXCEP_TXT("AE_CTRL_TRUE", "An If or While predicate result"),
302 "AE_CTRL_FALSE", 365 EXCEP_TXT("AE_CTRL_FALSE", "An If or While predicate result"),
303 "AE_CTRL_DEPTH", 366 EXCEP_TXT("AE_CTRL_DEPTH", "Maximum search depth has been reached"),
304 "AE_CTRL_END", 367 EXCEP_TXT("AE_CTRL_END", "An If or While predicate is false"),
305 "AE_CTRL_TRANSFER", 368 EXCEP_TXT("AE_CTRL_TRANSFER", "Transfer control to called method"),
306 "AE_CTRL_BREAK", 369 EXCEP_TXT("AE_CTRL_BREAK", "A Break has been executed"),
307 "AE_CTRL_CONTINUE", 370 EXCEP_TXT("AE_CTRL_CONTINUE", "A Continue has been executed"),
308 "AE_CTRL_SKIP", 371 EXCEP_TXT("AE_CTRL_SKIP", "Not currently used"),
309 "AE_CTRL_PARSE_CONTINUE", 372 EXCEP_TXT("AE_CTRL_PARSE_CONTINUE", "Used to skip over bad opcodes"),
310 "AE_CTRL_PARSE_PENDING" 373 EXCEP_TXT("AE_CTRL_PARSE_PENDING", "Used to implement AML While loops")
311}; 374};
312 375
313#endif /* EXCEPTION_TABLE */ 376#endif /* EXCEPTION_TABLE */