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