1238367Sjkim/*******************************************************************************
2238367Sjkim *
3238367Sjkim * Module Name: utexcep - Exception code support
4238367Sjkim *
5238367Sjkim ******************************************************************************/
6238367Sjkim
7238367Sjkim/*
8306536Sjkim * Copyright (C) 2000 - 2016, Intel Corp.
9238367Sjkim * All rights reserved.
10238367Sjkim *
11238367Sjkim * Redistribution and use in source and binary forms, with or without
12238367Sjkim * modification, are permitted provided that the following conditions
13238367Sjkim * are met:
14238367Sjkim * 1. Redistributions of source code must retain the above copyright
15238367Sjkim *    notice, this list of conditions, and the following disclaimer,
16238367Sjkim *    without modification.
17238367Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18238367Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19238367Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20238367Sjkim *    including a substantially similar Disclaimer requirement for further
21238367Sjkim *    binary redistribution.
22238367Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23238367Sjkim *    of any contributors may be used to endorse or promote products derived
24238367Sjkim *    from this software without specific prior written permission.
25238367Sjkim *
26238367Sjkim * Alternatively, this software may be distributed under the terms of the
27238367Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28238367Sjkim * Software Foundation.
29238367Sjkim *
30238367Sjkim * NO WARRANTY
31238367Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32238367Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33238367Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34238367Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35238367Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36238367Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37238367Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38238367Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39238367Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40238367Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41238367Sjkim * POSSIBILITY OF SUCH DAMAGES.
42238367Sjkim */
43238367Sjkim
44281075Sdim#define EXPORT_ACPI_INTERFACES
45238367Sjkim
46238367Sjkim#define ACPI_DEFINE_EXCEPTION_TABLE
47238381Sjkim#include <contrib/dev/acpica/include/acpi.h>
48238381Sjkim#include <contrib/dev/acpica/include/accommon.h>
49238367Sjkim
50238367Sjkim
51238367Sjkim#define _COMPONENT          ACPI_UTILITIES
52238367Sjkim        ACPI_MODULE_NAME    ("utexcep")
53238367Sjkim
54238367Sjkim
55238367Sjkim/*******************************************************************************
56238367Sjkim *
57238367Sjkim * FUNCTION:    AcpiFormatException
58238367Sjkim *
59238367Sjkim * PARAMETERS:  Status              - The ACPI_STATUS code to be formatted
60238367Sjkim *
61238367Sjkim * RETURN:      A string containing the exception text. A valid pointer is
62238367Sjkim *              always returned.
63238367Sjkim *
64238367Sjkim * DESCRIPTION: This function translates an ACPI exception into an ASCII
65238367Sjkim *              string. Returns "unknown status" string for invalid codes.
66238367Sjkim *
67238367Sjkim ******************************************************************************/
68238367Sjkim
69238367Sjkimconst char *
70238367SjkimAcpiFormatException (
71238367Sjkim    ACPI_STATUS             Status)
72238367Sjkim{
73246849Sjkim    const ACPI_EXCEPTION_INFO   *Exception;
74238367Sjkim
75238367Sjkim
76238367Sjkim    ACPI_FUNCTION_ENTRY ();
77238367Sjkim
78238367Sjkim
79238367Sjkim    Exception = AcpiUtValidateException (Status);
80238367Sjkim    if (!Exception)
81238367Sjkim    {
82238367Sjkim        /* Exception code was not recognized */
83238367Sjkim
84238367Sjkim        ACPI_ERROR ((AE_INFO,
85238367Sjkim            "Unknown exception code: 0x%8.8X", Status));
86238367Sjkim
87246849Sjkim        return ("UNKNOWN_STATUS_CODE");
88238367Sjkim    }
89238367Sjkim
90246849Sjkim    return (Exception->Name);
91238367Sjkim}
92238367Sjkim
93238367SjkimACPI_EXPORT_SYMBOL (AcpiFormatException)
94238367Sjkim
95238367Sjkim
96238367Sjkim/*******************************************************************************
97238367Sjkim *
98238367Sjkim * FUNCTION:    AcpiUtValidateException
99238367Sjkim *
100238367Sjkim * PARAMETERS:  Status              - The ACPI_STATUS code to be formatted
101238367Sjkim *
102238367Sjkim * RETURN:      A string containing the exception text. NULL if exception is
103238367Sjkim *              not valid.
104238367Sjkim *
105238367Sjkim * DESCRIPTION: This function validates and translates an ACPI exception into
106238367Sjkim *              an ASCII string.
107238367Sjkim *
108238367Sjkim ******************************************************************************/
109238367Sjkim
110246849Sjkimconst ACPI_EXCEPTION_INFO *
111238367SjkimAcpiUtValidateException (
112238367Sjkim    ACPI_STATUS             Status)
113238367Sjkim{
114246849Sjkim    UINT32                      SubStatus;
115246849Sjkim    const ACPI_EXCEPTION_INFO   *Exception = NULL;
116238367Sjkim
117238367Sjkim
118238367Sjkim    ACPI_FUNCTION_ENTRY ();
119238367Sjkim
120238367Sjkim
121238367Sjkim    /*
122238367Sjkim     * Status is composed of two parts, a "type" and an actual code
123238367Sjkim     */
124238367Sjkim    SubStatus = (Status & ~AE_CODE_MASK);
125238367Sjkim
126238367Sjkim    switch (Status & AE_CODE_MASK)
127238367Sjkim    {
128238367Sjkim    case AE_CODE_ENVIRONMENTAL:
129238367Sjkim
130238367Sjkim        if (SubStatus <= AE_CODE_ENV_MAX)
131238367Sjkim        {
132246849Sjkim            Exception = &AcpiGbl_ExceptionNames_Env [SubStatus];
133238367Sjkim        }
134238367Sjkim        break;
135238367Sjkim
136238367Sjkim    case AE_CODE_PROGRAMMER:
137238367Sjkim
138238367Sjkim        if (SubStatus <= AE_CODE_PGM_MAX)
139238367Sjkim        {
140246849Sjkim            Exception = &AcpiGbl_ExceptionNames_Pgm [SubStatus];
141238367Sjkim        }
142238367Sjkim        break;
143238367Sjkim
144238367Sjkim    case AE_CODE_ACPI_TABLES:
145238367Sjkim
146238367Sjkim        if (SubStatus <= AE_CODE_TBL_MAX)
147238367Sjkim        {
148246849Sjkim            Exception = &AcpiGbl_ExceptionNames_Tbl [SubStatus];
149238367Sjkim        }
150238367Sjkim        break;
151238367Sjkim
152238367Sjkim    case AE_CODE_AML:
153238367Sjkim
154238367Sjkim        if (SubStatus <= AE_CODE_AML_MAX)
155238367Sjkim        {
156246849Sjkim            Exception = &AcpiGbl_ExceptionNames_Aml [SubStatus];
157238367Sjkim        }
158238367Sjkim        break;
159238367Sjkim
160238367Sjkim    case AE_CODE_CONTROL:
161238367Sjkim
162238367Sjkim        if (SubStatus <= AE_CODE_CTRL_MAX)
163238367Sjkim        {
164246849Sjkim            Exception = &AcpiGbl_ExceptionNames_Ctrl [SubStatus];
165238367Sjkim        }
166238367Sjkim        break;
167238367Sjkim
168238367Sjkim    default:
169250838Sjkim
170238367Sjkim        break;
171238367Sjkim    }
172238367Sjkim
173246849Sjkim    if (!Exception || !Exception->Name)
174246849Sjkim    {
175246849Sjkim        return (NULL);
176246849Sjkim    }
177246849Sjkim
178246849Sjkim    return (Exception);
179238367Sjkim}
180