162306a36Sopenharmony_ci// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
262306a36Sopenharmony_ci/*******************************************************************************
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Module Name: utexcep - Exception code support
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci ******************************************************************************/
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#define EXPORT_ACPI_INTERFACES
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#define ACPI_DEFINE_EXCEPTION_TABLE
1162306a36Sopenharmony_ci#include <acpi/acpi.h>
1262306a36Sopenharmony_ci#include "accommon.h"
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#define _COMPONENT          ACPI_UTILITIES
1562306a36Sopenharmony_ciACPI_MODULE_NAME("utexcep")
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci/*******************************************************************************
1862306a36Sopenharmony_ci *
1962306a36Sopenharmony_ci * FUNCTION:    acpi_format_exception
2062306a36Sopenharmony_ci *
2162306a36Sopenharmony_ci * PARAMETERS:  status              - The acpi_status code to be formatted
2262306a36Sopenharmony_ci *
2362306a36Sopenharmony_ci * RETURN:      A string containing the exception text. A valid pointer is
2462306a36Sopenharmony_ci *              always returned.
2562306a36Sopenharmony_ci *
2662306a36Sopenharmony_ci * DESCRIPTION: This function translates an ACPI exception into an ASCII
2762306a36Sopenharmony_ci *              string. Returns "unknown status" string for invalid codes.
2862306a36Sopenharmony_ci *
2962306a36Sopenharmony_ci ******************************************************************************/
3062306a36Sopenharmony_ciconst char *acpi_format_exception(acpi_status status)
3162306a36Sopenharmony_ci{
3262306a36Sopenharmony_ci	const struct acpi_exception_info *exception;
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	ACPI_FUNCTION_ENTRY();
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci	exception = acpi_ut_validate_exception(status);
3762306a36Sopenharmony_ci	if (!exception) {
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci		/* Exception code was not recognized */
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci		ACPI_ERROR((AE_INFO,
4262306a36Sopenharmony_ci			    "Unknown exception code: 0x%8.8X", status));
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci		return ("UNKNOWN_STATUS_CODE");
4562306a36Sopenharmony_ci	}
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci	return (exception->name);
4862306a36Sopenharmony_ci}
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ciACPI_EXPORT_SYMBOL(acpi_format_exception)
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci/*******************************************************************************
5362306a36Sopenharmony_ci *
5462306a36Sopenharmony_ci * FUNCTION:    acpi_ut_validate_exception
5562306a36Sopenharmony_ci *
5662306a36Sopenharmony_ci * PARAMETERS:  status              - The acpi_status code to be formatted
5762306a36Sopenharmony_ci *
5862306a36Sopenharmony_ci * RETURN:      A string containing the exception text. NULL if exception is
5962306a36Sopenharmony_ci *              not valid.
6062306a36Sopenharmony_ci *
6162306a36Sopenharmony_ci * DESCRIPTION: This function validates and translates an ACPI exception into
6262306a36Sopenharmony_ci *              an ASCII string.
6362306a36Sopenharmony_ci *
6462306a36Sopenharmony_ci ******************************************************************************/
6562306a36Sopenharmony_ciconst struct acpi_exception_info *acpi_ut_validate_exception(acpi_status status)
6662306a36Sopenharmony_ci{
6762306a36Sopenharmony_ci	u32 sub_status;
6862306a36Sopenharmony_ci	const struct acpi_exception_info *exception = NULL;
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci	ACPI_FUNCTION_ENTRY();
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci	/*
7362306a36Sopenharmony_ci	 * Status is composed of two parts, a "type" and an actual code
7462306a36Sopenharmony_ci	 */
7562306a36Sopenharmony_ci	sub_status = (status & ~AE_CODE_MASK);
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci	switch (status & AE_CODE_MASK) {
7862306a36Sopenharmony_ci	case AE_CODE_ENVIRONMENTAL:
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci		if (sub_status <= AE_CODE_ENV_MAX) {
8162306a36Sopenharmony_ci			exception = &acpi_gbl_exception_names_env[sub_status];
8262306a36Sopenharmony_ci		}
8362306a36Sopenharmony_ci		break;
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci	case AE_CODE_PROGRAMMER:
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci		if (sub_status <= AE_CODE_PGM_MAX) {
8862306a36Sopenharmony_ci			exception = &acpi_gbl_exception_names_pgm[sub_status];
8962306a36Sopenharmony_ci		}
9062306a36Sopenharmony_ci		break;
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci	case AE_CODE_ACPI_TABLES:
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci		if (sub_status <= AE_CODE_TBL_MAX) {
9562306a36Sopenharmony_ci			exception = &acpi_gbl_exception_names_tbl[sub_status];
9662306a36Sopenharmony_ci		}
9762306a36Sopenharmony_ci		break;
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci	case AE_CODE_AML:
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci		if (sub_status <= AE_CODE_AML_MAX) {
10262306a36Sopenharmony_ci			exception = &acpi_gbl_exception_names_aml[sub_status];
10362306a36Sopenharmony_ci		}
10462306a36Sopenharmony_ci		break;
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci	case AE_CODE_CONTROL:
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci		if (sub_status <= AE_CODE_CTRL_MAX) {
10962306a36Sopenharmony_ci			exception = &acpi_gbl_exception_names_ctrl[sub_status];
11062306a36Sopenharmony_ci		}
11162306a36Sopenharmony_ci		break;
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci	default:
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci		break;
11662306a36Sopenharmony_ci	}
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ci	if (!exception || !exception->name) {
11962306a36Sopenharmony_ci		return (NULL);
12062306a36Sopenharmony_ci	}
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ci	return (exception);
12362306a36Sopenharmony_ci}
124