1 | // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 |
---|---|
2 | /******************************************************************************* |
3 | * |
4 | * Module Name: utexcep - Exception code support |
5 | * |
6 | ******************************************************************************/ |
7 | |
8 | #define EXPORT_ACPI_INTERFACES |
9 | |
10 | #define ACPI_DEFINE_EXCEPTION_TABLE |
11 | #include <acpi/acpi.h> |
12 | #include "accommon.h" |
13 | |
14 | #define _COMPONENT ACPI_UTILITIES |
15 | ACPI_MODULE_NAME("utexcep") |
16 | |
17 | /******************************************************************************* |
18 | * |
19 | * FUNCTION: acpi_format_exception |
20 | * |
21 | * PARAMETERS: status - The acpi_status code to be formatted |
22 | * |
23 | * RETURN: A string containing the exception text. A valid pointer is |
24 | * always returned. |
25 | * |
26 | * DESCRIPTION: This function translates an ACPI exception into an ASCII |
27 | * string. Returns "unknown status" string for invalid codes. |
28 | * |
29 | ******************************************************************************/ |
30 | const char *acpi_format_exception(acpi_status status) |
31 | { |
32 | const struct acpi_exception_info *exception; |
33 | |
34 | ACPI_FUNCTION_ENTRY(); |
35 | |
36 | exception = acpi_ut_validate_exception(status); |
37 | if (!exception) { |
38 | |
39 | /* Exception code was not recognized */ |
40 | |
41 | ACPI_ERROR((AE_INFO, |
42 | "Unknown exception code: 0x%8.8X", status)); |
43 | |
44 | return ("UNKNOWN_STATUS_CODE"); |
45 | } |
46 | |
47 | return (exception->name); |
48 | } |
49 | |
50 | ACPI_EXPORT_SYMBOL(acpi_format_exception) |
51 | |
52 | /******************************************************************************* |
53 | * |
54 | * FUNCTION: acpi_ut_validate_exception |
55 | * |
56 | * PARAMETERS: status - The acpi_status code to be formatted |
57 | * |
58 | * RETURN: A string containing the exception text. NULL if exception is |
59 | * not valid. |
60 | * |
61 | * DESCRIPTION: This function validates and translates an ACPI exception into |
62 | * an ASCII string. |
63 | * |
64 | ******************************************************************************/ |
65 | const struct acpi_exception_info *acpi_ut_validate_exception(acpi_status status) |
66 | { |
67 | u32 sub_status; |
68 | const struct acpi_exception_info *exception = NULL; |
69 | |
70 | ACPI_FUNCTION_ENTRY(); |
71 | |
72 | /* |
73 | * Status is composed of two parts, a "type" and an actual code |
74 | */ |
75 | sub_status = (status & ~AE_CODE_MASK); |
76 | |
77 | switch (status & AE_CODE_MASK) { |
78 | case AE_CODE_ENVIRONMENTAL: |
79 | |
80 | if (sub_status <= AE_CODE_ENV_MAX) { |
81 | exception = &acpi_gbl_exception_names_env[sub_status]; |
82 | } |
83 | break; |
84 | |
85 | case AE_CODE_PROGRAMMER: |
86 | |
87 | if (sub_status <= AE_CODE_PGM_MAX) { |
88 | exception = &acpi_gbl_exception_names_pgm[sub_status]; |
89 | } |
90 | break; |
91 | |
92 | case AE_CODE_ACPI_TABLES: |
93 | |
94 | if (sub_status <= AE_CODE_TBL_MAX) { |
95 | exception = &acpi_gbl_exception_names_tbl[sub_status]; |
96 | } |
97 | break; |
98 | |
99 | case AE_CODE_AML: |
100 | |
101 | if (sub_status <= AE_CODE_AML_MAX) { |
102 | exception = &acpi_gbl_exception_names_aml[sub_status]; |
103 | } |
104 | break; |
105 | |
106 | case AE_CODE_CONTROL: |
107 | |
108 | if (sub_status <= AE_CODE_CTRL_MAX) { |
109 | exception = &acpi_gbl_exception_names_ctrl[sub_status]; |
110 | } |
111 | break; |
112 | |
113 | default: |
114 | |
115 | break; |
116 | } |
117 | |
118 | if (!exception || !exception->name) { |
119 | return (NULL); |
120 | } |
121 | |
122 | return (exception); |
123 | } |
124 |