xref: /dflybsd-src/sys/contrib/dev/acpica/source/components/executer/exconcat.c (revision 383048aca08c2de51d27aa8638a36982a0d74550)
12ffe9f16SSascha Wildner /******************************************************************************
22ffe9f16SSascha Wildner  *
32ffe9f16SSascha Wildner  * Module Name: exconcat - Concatenate-type AML operators
42ffe9f16SSascha Wildner  *
52ffe9f16SSascha Wildner  *****************************************************************************/
62ffe9f16SSascha Wildner 
7b4315fc7SSascha Wildner /******************************************************************************
8b4315fc7SSascha Wildner  *
9b4315fc7SSascha Wildner  * 1. Copyright Notice
10b4315fc7SSascha Wildner  *
11*383048acSSascha Wildner  * Some or all of this work - Copyright (c) 1999 - 2021, Intel Corp.
122ffe9f16SSascha Wildner  * All rights reserved.
132ffe9f16SSascha Wildner  *
14b4315fc7SSascha Wildner  * 2. License
15b4315fc7SSascha Wildner  *
16b4315fc7SSascha Wildner  * 2.1. This is your license from Intel Corp. under its intellectual property
17b4315fc7SSascha Wildner  * rights. You may have additional license terms from the party that provided
18b4315fc7SSascha Wildner  * you this software, covering your right to use that party's intellectual
19b4315fc7SSascha Wildner  * property rights.
20b4315fc7SSascha Wildner  *
21b4315fc7SSascha Wildner  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22b4315fc7SSascha Wildner  * copy of the source code appearing in this file ("Covered Code") an
23b4315fc7SSascha Wildner  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24b4315fc7SSascha Wildner  * base code distributed originally by Intel ("Original Intel Code") to copy,
25b4315fc7SSascha Wildner  * make derivatives, distribute, use and display any portion of the Covered
26b4315fc7SSascha Wildner  * Code in any form, with the right to sublicense such rights; and
27b4315fc7SSascha Wildner  *
28b4315fc7SSascha Wildner  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29b4315fc7SSascha Wildner  * license (with the right to sublicense), under only those claims of Intel
30b4315fc7SSascha Wildner  * patents that are infringed by the Original Intel Code, to make, use, sell,
31b4315fc7SSascha Wildner  * offer to sell, and import the Covered Code and derivative works thereof
32b4315fc7SSascha Wildner  * solely to the minimum extent necessary to exercise the above copyright
33b4315fc7SSascha Wildner  * license, and in no event shall the patent license extend to any additions
34b4315fc7SSascha Wildner  * to or modifications of the Original Intel Code. No other license or right
35b4315fc7SSascha Wildner  * is granted directly or by implication, estoppel or otherwise;
36b4315fc7SSascha Wildner  *
37b4315fc7SSascha Wildner  * The above copyright and patent license is granted only if the following
38b4315fc7SSascha Wildner  * conditions are met:
39b4315fc7SSascha Wildner  *
40b4315fc7SSascha Wildner  * 3. Conditions
41b4315fc7SSascha Wildner  *
42b4315fc7SSascha Wildner  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43b4315fc7SSascha Wildner  * Redistribution of source code of any substantial portion of the Covered
44b4315fc7SSascha Wildner  * Code or modification with rights to further distribute source must include
45b4315fc7SSascha Wildner  * the above Copyright Notice, the above License, this list of Conditions,
46b4315fc7SSascha Wildner  * and the following Disclaimer and Export Compliance provision. In addition,
47b4315fc7SSascha Wildner  * Licensee must cause all Covered Code to which Licensee contributes to
48b4315fc7SSascha Wildner  * contain a file documenting the changes Licensee made to create that Covered
49b4315fc7SSascha Wildner  * Code and the date of any change. Licensee must include in that file the
50b4315fc7SSascha Wildner  * documentation of any changes made by any predecessor Licensee. Licensee
51b4315fc7SSascha Wildner  * must include a prominent statement that the modification is derived,
52b4315fc7SSascha Wildner  * directly or indirectly, from Original Intel Code.
53b4315fc7SSascha Wildner  *
54b4315fc7SSascha Wildner  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55b4315fc7SSascha Wildner  * Redistribution of source code of any substantial portion of the Covered
56b4315fc7SSascha Wildner  * Code or modification without rights to further distribute source must
57b4315fc7SSascha Wildner  * include the following Disclaimer and Export Compliance provision in the
58b4315fc7SSascha Wildner  * documentation and/or other materials provided with distribution. In
59b4315fc7SSascha Wildner  * addition, Licensee may not authorize further sublicense of source of any
60b4315fc7SSascha Wildner  * portion of the Covered Code, and must include terms to the effect that the
61b4315fc7SSascha Wildner  * license from Licensee to its licensee is limited to the intellectual
62b4315fc7SSascha Wildner  * property embodied in the software Licensee provides to its licensee, and
63b4315fc7SSascha Wildner  * not to intellectual property embodied in modifications its licensee may
64b4315fc7SSascha Wildner  * make.
65b4315fc7SSascha Wildner  *
66b4315fc7SSascha Wildner  * 3.3. Redistribution of Executable. Redistribution in executable form of any
67b4315fc7SSascha Wildner  * substantial portion of the Covered Code or modification must reproduce the
68b4315fc7SSascha Wildner  * above Copyright Notice, and the following Disclaimer and Export Compliance
69b4315fc7SSascha Wildner  * provision in the documentation and/or other materials provided with the
70b4315fc7SSascha Wildner  * distribution.
71b4315fc7SSascha Wildner  *
72b4315fc7SSascha Wildner  * 3.4. Intel retains all right, title, and interest in and to the Original
73b4315fc7SSascha Wildner  * Intel Code.
74b4315fc7SSascha Wildner  *
75b4315fc7SSascha Wildner  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76b4315fc7SSascha Wildner  * Intel shall be used in advertising or otherwise to promote the sale, use or
77b4315fc7SSascha Wildner  * other dealings in products derived from or relating to the Covered Code
78b4315fc7SSascha Wildner  * without prior written authorization from Intel.
79b4315fc7SSascha Wildner  *
80b4315fc7SSascha Wildner  * 4. Disclaimer and Export Compliance
81b4315fc7SSascha Wildner  *
82b4315fc7SSascha Wildner  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83b4315fc7SSascha Wildner  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84b4315fc7SSascha Wildner  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85b4315fc7SSascha Wildner  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86b4315fc7SSascha Wildner 
87b4315fc7SSascha Wildner  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
88b4315fc7SSascha Wildner  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
89b4315fc7SSascha Wildner  * PARTICULAR PURPOSE.
90b4315fc7SSascha Wildner  *
91b4315fc7SSascha Wildner  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
92b4315fc7SSascha Wildner  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
93b4315fc7SSascha Wildner  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
94b4315fc7SSascha Wildner  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
95b4315fc7SSascha Wildner  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
96b4315fc7SSascha Wildner  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
97b4315fc7SSascha Wildner  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
98b4315fc7SSascha Wildner  * LIMITED REMEDY.
99b4315fc7SSascha Wildner  *
100b4315fc7SSascha Wildner  * 4.3. Licensee shall not export, either directly or indirectly, any of this
101b4315fc7SSascha Wildner  * software or system incorporating such software without first obtaining any
102b4315fc7SSascha Wildner  * required license or other approval from the U. S. Department of Commerce or
103b4315fc7SSascha Wildner  * any other agency or department of the United States Government. In the
104b4315fc7SSascha Wildner  * event Licensee exports any such software from the United States or
105b4315fc7SSascha Wildner  * re-exports any such software from a foreign destination, Licensee shall
106b4315fc7SSascha Wildner  * ensure that the distribution and export/re-export of the software is in
107b4315fc7SSascha Wildner  * compliance with all laws, regulations, orders, or other restrictions of the
108b4315fc7SSascha Wildner  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
109b4315fc7SSascha Wildner  * any of its subsidiaries will export/re-export any technical data, process,
110b4315fc7SSascha Wildner  * software, or service, directly or indirectly, to any country for which the
111b4315fc7SSascha Wildner  * United States government or any agency thereof requires an export license,
112b4315fc7SSascha Wildner  * other governmental approval, or letter of assurance, without first obtaining
113b4315fc7SSascha Wildner  * such license, approval or letter.
114b4315fc7SSascha Wildner  *
115b4315fc7SSascha Wildner  *****************************************************************************
116b4315fc7SSascha Wildner  *
117b4315fc7SSascha Wildner  * Alternatively, you may choose to be licensed under the terms of the
118b4315fc7SSascha Wildner  * following license:
119b4315fc7SSascha Wildner  *
1202ffe9f16SSascha Wildner  * Redistribution and use in source and binary forms, with or without
1212ffe9f16SSascha Wildner  * modification, are permitted provided that the following conditions
1222ffe9f16SSascha Wildner  * are met:
1232ffe9f16SSascha Wildner  * 1. Redistributions of source code must retain the above copyright
1242ffe9f16SSascha Wildner  *    notice, this list of conditions, and the following disclaimer,
1252ffe9f16SSascha Wildner  *    without modification.
1262ffe9f16SSascha Wildner  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
1272ffe9f16SSascha Wildner  *    substantially similar to the "NO WARRANTY" disclaimer below
1282ffe9f16SSascha Wildner  *    ("Disclaimer") and any redistribution must be conditioned upon
1292ffe9f16SSascha Wildner  *    including a substantially similar Disclaimer requirement for further
1302ffe9f16SSascha Wildner  *    binary redistribution.
1312ffe9f16SSascha Wildner  * 3. Neither the names of the above-listed copyright holders nor the names
1322ffe9f16SSascha Wildner  *    of any contributors may be used to endorse or promote products derived
1332ffe9f16SSascha Wildner  *    from this software without specific prior written permission.
1342ffe9f16SSascha Wildner  *
135b4315fc7SSascha Wildner  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
136b4315fc7SSascha Wildner  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
137b4315fc7SSascha Wildner  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
138b4315fc7SSascha Wildner  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
139b4315fc7SSascha Wildner  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
140b4315fc7SSascha Wildner  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
141b4315fc7SSascha Wildner  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
142b4315fc7SSascha Wildner  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
143b4315fc7SSascha Wildner  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
144b4315fc7SSascha Wildner  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
145b4315fc7SSascha Wildner  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
146b4315fc7SSascha Wildner  *
147b4315fc7SSascha Wildner  * Alternatively, you may choose to be licensed under the terms of the
1482ffe9f16SSascha Wildner  * GNU General Public License ("GPL") version 2 as published by the Free
1492ffe9f16SSascha Wildner  * Software Foundation.
1502ffe9f16SSascha Wildner  *
151b4315fc7SSascha Wildner  *****************************************************************************/
1522ffe9f16SSascha Wildner 
1532ffe9f16SSascha Wildner #include "acpi.h"
1542ffe9f16SSascha Wildner #include "accommon.h"
1552ffe9f16SSascha Wildner #include "acinterp.h"
1562ffe9f16SSascha Wildner #include "amlresrc.h"
1572ffe9f16SSascha Wildner 
1582ffe9f16SSascha Wildner 
1592ffe9f16SSascha Wildner #define _COMPONENT          ACPI_EXECUTER
1602ffe9f16SSascha Wildner         ACPI_MODULE_NAME    ("exconcat")
1612ffe9f16SSascha Wildner 
1622ffe9f16SSascha Wildner /* Local Prototypes */
1632ffe9f16SSascha Wildner 
1642ffe9f16SSascha Wildner static ACPI_STATUS
1652ffe9f16SSascha Wildner AcpiExConvertToObjectTypeString (
1662ffe9f16SSascha Wildner     ACPI_OPERAND_OBJECT     *ObjDesc,
1672ffe9f16SSascha Wildner     ACPI_OPERAND_OBJECT     **ResultDesc);
1682ffe9f16SSascha Wildner 
1692ffe9f16SSascha Wildner 
1702ffe9f16SSascha Wildner /*******************************************************************************
1712ffe9f16SSascha Wildner  *
1722ffe9f16SSascha Wildner  * FUNCTION:    AcpiExDoConcatenate
1732ffe9f16SSascha Wildner  *
1742ffe9f16SSascha Wildner  * PARAMETERS:  Operand0            - First source object
1752ffe9f16SSascha Wildner  *              Operand1            - Second source object
1762ffe9f16SSascha Wildner  *              ActualReturnDesc    - Where to place the return object
1772ffe9f16SSascha Wildner  *              WalkState           - Current walk state
1782ffe9f16SSascha Wildner  *
1792ffe9f16SSascha Wildner  * RETURN:      Status
1802ffe9f16SSascha Wildner  *
1812ffe9f16SSascha Wildner  * DESCRIPTION: Concatenate two objects with the ACPI-defined conversion
1822ffe9f16SSascha Wildner  *              rules as necessary.
1832ffe9f16SSascha Wildner  * NOTE:
1842ffe9f16SSascha Wildner  * Per the ACPI spec (up to 6.1), Concatenate only supports Integer,
1852ffe9f16SSascha Wildner  * String, and Buffer objects. However, we support all objects here
1862ffe9f16SSascha Wildner  * as an extension. This improves the usefulness of both Concatenate
1872ffe9f16SSascha Wildner  * and the Printf/Fprintf macros. The extension returns a string
1882ffe9f16SSascha Wildner  * describing the object type for the other objects.
1892ffe9f16SSascha Wildner  * 02/2016.
1902ffe9f16SSascha Wildner  *
1912ffe9f16SSascha Wildner  ******************************************************************************/
1922ffe9f16SSascha Wildner 
1932ffe9f16SSascha Wildner ACPI_STATUS
AcpiExDoConcatenate(ACPI_OPERAND_OBJECT * Operand0,ACPI_OPERAND_OBJECT * Operand1,ACPI_OPERAND_OBJECT ** ActualReturnDesc,ACPI_WALK_STATE * WalkState)1942ffe9f16SSascha Wildner AcpiExDoConcatenate (
1952ffe9f16SSascha Wildner     ACPI_OPERAND_OBJECT     *Operand0,
1962ffe9f16SSascha Wildner     ACPI_OPERAND_OBJECT     *Operand1,
1972ffe9f16SSascha Wildner     ACPI_OPERAND_OBJECT     **ActualReturnDesc,
1982ffe9f16SSascha Wildner     ACPI_WALK_STATE         *WalkState)
1992ffe9f16SSascha Wildner {
2002ffe9f16SSascha Wildner     ACPI_OPERAND_OBJECT     *LocalOperand0 = Operand0;
2012ffe9f16SSascha Wildner     ACPI_OPERAND_OBJECT     *LocalOperand1 = Operand1;
2022ffe9f16SSascha Wildner     ACPI_OPERAND_OBJECT     *TempOperand1 = NULL;
2032ffe9f16SSascha Wildner     ACPI_OPERAND_OBJECT     *ReturnDesc;
2042ffe9f16SSascha Wildner     char                    *Buffer;
2052ffe9f16SSascha Wildner     ACPI_OBJECT_TYPE        Operand0Type;
2062ffe9f16SSascha Wildner     ACPI_OBJECT_TYPE        Operand1Type;
2072ffe9f16SSascha Wildner     ACPI_STATUS             Status;
2082ffe9f16SSascha Wildner 
2092ffe9f16SSascha Wildner 
2102ffe9f16SSascha Wildner     ACPI_FUNCTION_TRACE (ExDoConcatenate);
2112ffe9f16SSascha Wildner 
2122ffe9f16SSascha Wildner 
2132ffe9f16SSascha Wildner     /* Operand 0 preprocessing */
2142ffe9f16SSascha Wildner 
2152ffe9f16SSascha Wildner     switch (Operand0->Common.Type)
2162ffe9f16SSascha Wildner     {
2172ffe9f16SSascha Wildner     case ACPI_TYPE_INTEGER:
2182ffe9f16SSascha Wildner     case ACPI_TYPE_STRING:
2192ffe9f16SSascha Wildner     case ACPI_TYPE_BUFFER:
2202ffe9f16SSascha Wildner 
2212ffe9f16SSascha Wildner         Operand0Type = Operand0->Common.Type;
2222ffe9f16SSascha Wildner         break;
2232ffe9f16SSascha Wildner 
2242ffe9f16SSascha Wildner     default:
2252ffe9f16SSascha Wildner 
2262ffe9f16SSascha Wildner         /* For all other types, get the "object type" string */
2272ffe9f16SSascha Wildner 
2282ffe9f16SSascha Wildner         Status = AcpiExConvertToObjectTypeString (
2292ffe9f16SSascha Wildner             Operand0, &LocalOperand0);
2302ffe9f16SSascha Wildner         if (ACPI_FAILURE (Status))
2312ffe9f16SSascha Wildner         {
2322ffe9f16SSascha Wildner             goto Cleanup;
2332ffe9f16SSascha Wildner         }
2342ffe9f16SSascha Wildner 
2352ffe9f16SSascha Wildner         Operand0Type = ACPI_TYPE_STRING;
2362ffe9f16SSascha Wildner         break;
2372ffe9f16SSascha Wildner     }
2382ffe9f16SSascha Wildner 
2392ffe9f16SSascha Wildner     /* Operand 1 preprocessing */
2402ffe9f16SSascha Wildner 
2412ffe9f16SSascha Wildner     switch (Operand1->Common.Type)
2422ffe9f16SSascha Wildner     {
2432ffe9f16SSascha Wildner     case ACPI_TYPE_INTEGER:
2442ffe9f16SSascha Wildner     case ACPI_TYPE_STRING:
2452ffe9f16SSascha Wildner     case ACPI_TYPE_BUFFER:
2462ffe9f16SSascha Wildner 
2472ffe9f16SSascha Wildner         Operand1Type = Operand1->Common.Type;
2482ffe9f16SSascha Wildner         break;
2492ffe9f16SSascha Wildner 
2502ffe9f16SSascha Wildner     default:
2512ffe9f16SSascha Wildner 
2522ffe9f16SSascha Wildner         /* For all other types, get the "object type" string */
2532ffe9f16SSascha Wildner 
2542ffe9f16SSascha Wildner         Status = AcpiExConvertToObjectTypeString (
2552ffe9f16SSascha Wildner             Operand1, &LocalOperand1);
2562ffe9f16SSascha Wildner         if (ACPI_FAILURE (Status))
2572ffe9f16SSascha Wildner         {
2582ffe9f16SSascha Wildner             goto Cleanup;
2592ffe9f16SSascha Wildner         }
2602ffe9f16SSascha Wildner 
2612ffe9f16SSascha Wildner         Operand1Type = ACPI_TYPE_STRING;
2622ffe9f16SSascha Wildner         break;
2632ffe9f16SSascha Wildner     }
2642ffe9f16SSascha Wildner 
2652ffe9f16SSascha Wildner     /*
2662ffe9f16SSascha Wildner      * Convert the second operand if necessary. The first operand (0)
2672ffe9f16SSascha Wildner      * determines the type of the second operand (1) (See the Data Types
2682ffe9f16SSascha Wildner      * section of the ACPI specification). Both object types are
2692ffe9f16SSascha Wildner      * guaranteed to be either Integer/String/Buffer by the operand
2702ffe9f16SSascha Wildner      * resolution mechanism.
2712ffe9f16SSascha Wildner      */
2722ffe9f16SSascha Wildner     switch (Operand0Type)
2732ffe9f16SSascha Wildner     {
2742ffe9f16SSascha Wildner     case ACPI_TYPE_INTEGER:
2752ffe9f16SSascha Wildner 
276e5e174adSSascha Wildner         Status = AcpiExConvertToInteger (LocalOperand1, &TempOperand1,
277cf6b3eb1SSascha Wildner             ACPI_IMPLICIT_CONVERSION);
2782ffe9f16SSascha Wildner         break;
2792ffe9f16SSascha Wildner 
2802ffe9f16SSascha Wildner     case ACPI_TYPE_BUFFER:
2812ffe9f16SSascha Wildner 
2822ffe9f16SSascha Wildner         Status = AcpiExConvertToBuffer (LocalOperand1, &TempOperand1);
2832ffe9f16SSascha Wildner         break;
2842ffe9f16SSascha Wildner 
2852ffe9f16SSascha Wildner     case ACPI_TYPE_STRING:
2862ffe9f16SSascha Wildner 
2872ffe9f16SSascha Wildner         switch (Operand1Type)
2882ffe9f16SSascha Wildner         {
2892ffe9f16SSascha Wildner         case ACPI_TYPE_INTEGER:
2902ffe9f16SSascha Wildner         case ACPI_TYPE_STRING:
2912ffe9f16SSascha Wildner         case ACPI_TYPE_BUFFER:
2922ffe9f16SSascha Wildner 
2932ffe9f16SSascha Wildner             /* Other types have already been converted to string */
2942ffe9f16SSascha Wildner 
2952ffe9f16SSascha Wildner             Status = AcpiExConvertToString (
2962ffe9f16SSascha Wildner                 LocalOperand1, &TempOperand1, ACPI_IMPLICIT_CONVERT_HEX);
2972ffe9f16SSascha Wildner             break;
2982ffe9f16SSascha Wildner 
2992ffe9f16SSascha Wildner         default:
3002ffe9f16SSascha Wildner 
3012ffe9f16SSascha Wildner             Status = AE_OK;
3022ffe9f16SSascha Wildner             break;
3032ffe9f16SSascha Wildner         }
3042ffe9f16SSascha Wildner         break;
3052ffe9f16SSascha Wildner 
3062ffe9f16SSascha Wildner     default:
3072ffe9f16SSascha Wildner 
3082ffe9f16SSascha Wildner         ACPI_ERROR ((AE_INFO, "Invalid object type: 0x%X",
3092ffe9f16SSascha Wildner             Operand0->Common.Type));
3102ffe9f16SSascha Wildner         Status = AE_AML_INTERNAL;
3112ffe9f16SSascha Wildner     }
3122ffe9f16SSascha Wildner 
3132ffe9f16SSascha Wildner     if (ACPI_FAILURE (Status))
3142ffe9f16SSascha Wildner     {
3152ffe9f16SSascha Wildner         goto Cleanup;
3162ffe9f16SSascha Wildner     }
3172ffe9f16SSascha Wildner 
3182ffe9f16SSascha Wildner     /* Take care with any newly created operand objects */
3192ffe9f16SSascha Wildner 
3202ffe9f16SSascha Wildner     if ((LocalOperand1 != Operand1) &&
3212ffe9f16SSascha Wildner         (LocalOperand1 != TempOperand1))
3222ffe9f16SSascha Wildner     {
3232ffe9f16SSascha Wildner         AcpiUtRemoveReference (LocalOperand1);
3242ffe9f16SSascha Wildner     }
3252ffe9f16SSascha Wildner 
3262ffe9f16SSascha Wildner     LocalOperand1 = TempOperand1;
3272ffe9f16SSascha Wildner 
3282ffe9f16SSascha Wildner     /*
3292ffe9f16SSascha Wildner      * Both operands are now known to be the same object type
3302ffe9f16SSascha Wildner      * (Both are Integer, String, or Buffer), and we can now perform
3312ffe9f16SSascha Wildner      * the concatenation.
3322ffe9f16SSascha Wildner      *
3332ffe9f16SSascha Wildner      * There are three cases to handle, as per the ACPI spec:
3342ffe9f16SSascha Wildner      *
3352ffe9f16SSascha Wildner      * 1) Two Integers concatenated to produce a new Buffer
3362ffe9f16SSascha Wildner      * 2) Two Strings concatenated to produce a new String
3372ffe9f16SSascha Wildner      * 3) Two Buffers concatenated to produce a new Buffer
3382ffe9f16SSascha Wildner      */
3392ffe9f16SSascha Wildner     switch (Operand0Type)
3402ffe9f16SSascha Wildner     {
3412ffe9f16SSascha Wildner     case ACPI_TYPE_INTEGER:
3422ffe9f16SSascha Wildner 
3432ffe9f16SSascha Wildner         /* Result of two Integers is a Buffer */
3442ffe9f16SSascha Wildner         /* Need enough buffer space for two integers */
3452ffe9f16SSascha Wildner 
3462ffe9f16SSascha Wildner         ReturnDesc = AcpiUtCreateBufferObject (
3472ffe9f16SSascha Wildner             (ACPI_SIZE) ACPI_MUL_2 (AcpiGbl_IntegerByteWidth));
3482ffe9f16SSascha Wildner         if (!ReturnDesc)
3492ffe9f16SSascha Wildner         {
3502ffe9f16SSascha Wildner             Status = AE_NO_MEMORY;
3512ffe9f16SSascha Wildner             goto Cleanup;
3522ffe9f16SSascha Wildner         }
3532ffe9f16SSascha Wildner 
3542ffe9f16SSascha Wildner         Buffer = (char *) ReturnDesc->Buffer.Pointer;
3552ffe9f16SSascha Wildner 
3562ffe9f16SSascha Wildner         /* Copy the first integer, LSB first */
3572ffe9f16SSascha Wildner 
3582ffe9f16SSascha Wildner         memcpy (Buffer, &Operand0->Integer.Value,
3592ffe9f16SSascha Wildner             AcpiGbl_IntegerByteWidth);
3602ffe9f16SSascha Wildner 
3612ffe9f16SSascha Wildner         /* Copy the second integer (LSB first) after the first */
3622ffe9f16SSascha Wildner 
3632ffe9f16SSascha Wildner         memcpy (Buffer + AcpiGbl_IntegerByteWidth,
3642ffe9f16SSascha Wildner             &LocalOperand1->Integer.Value, AcpiGbl_IntegerByteWidth);
3652ffe9f16SSascha Wildner         break;
3662ffe9f16SSascha Wildner 
3672ffe9f16SSascha Wildner     case ACPI_TYPE_STRING:
3682ffe9f16SSascha Wildner 
3692ffe9f16SSascha Wildner         /* Result of two Strings is a String */
3702ffe9f16SSascha Wildner 
3712ffe9f16SSascha Wildner         ReturnDesc = AcpiUtCreateStringObject (
3722ffe9f16SSascha Wildner             ((ACPI_SIZE) LocalOperand0->String.Length +
3732ffe9f16SSascha Wildner             LocalOperand1->String.Length));
3742ffe9f16SSascha Wildner         if (!ReturnDesc)
3752ffe9f16SSascha Wildner         {
3762ffe9f16SSascha Wildner             Status = AE_NO_MEMORY;
3772ffe9f16SSascha Wildner             goto Cleanup;
3782ffe9f16SSascha Wildner         }
3792ffe9f16SSascha Wildner 
3802ffe9f16SSascha Wildner         Buffer = ReturnDesc->String.Pointer;
3812ffe9f16SSascha Wildner 
3822ffe9f16SSascha Wildner         /* Concatenate the strings */
3832ffe9f16SSascha Wildner 
3842ffe9f16SSascha Wildner         strcpy (Buffer, LocalOperand0->String.Pointer);
3852ffe9f16SSascha Wildner         strcat (Buffer, LocalOperand1->String.Pointer);
3862ffe9f16SSascha Wildner         break;
3872ffe9f16SSascha Wildner 
3882ffe9f16SSascha Wildner     case ACPI_TYPE_BUFFER:
3892ffe9f16SSascha Wildner 
3902ffe9f16SSascha Wildner         /* Result of two Buffers is a Buffer */
3912ffe9f16SSascha Wildner 
3922ffe9f16SSascha Wildner         ReturnDesc = AcpiUtCreateBufferObject (
3932ffe9f16SSascha Wildner             ((ACPI_SIZE) Operand0->Buffer.Length +
3942ffe9f16SSascha Wildner             LocalOperand1->Buffer.Length));
3952ffe9f16SSascha Wildner         if (!ReturnDesc)
3962ffe9f16SSascha Wildner         {
3972ffe9f16SSascha Wildner             Status = AE_NO_MEMORY;
3982ffe9f16SSascha Wildner             goto Cleanup;
3992ffe9f16SSascha Wildner         }
4002ffe9f16SSascha Wildner 
4012ffe9f16SSascha Wildner         Buffer = (char *) ReturnDesc->Buffer.Pointer;
4022ffe9f16SSascha Wildner 
4032ffe9f16SSascha Wildner         /* Concatenate the buffers */
4042ffe9f16SSascha Wildner 
4052ffe9f16SSascha Wildner         memcpy (Buffer, Operand0->Buffer.Pointer,
4062ffe9f16SSascha Wildner             Operand0->Buffer.Length);
4072ffe9f16SSascha Wildner         memcpy (Buffer + Operand0->Buffer.Length,
4082ffe9f16SSascha Wildner             LocalOperand1->Buffer.Pointer,
4092ffe9f16SSascha Wildner             LocalOperand1->Buffer.Length);
4102ffe9f16SSascha Wildner         break;
4112ffe9f16SSascha Wildner 
4122ffe9f16SSascha Wildner     default:
4132ffe9f16SSascha Wildner 
4142ffe9f16SSascha Wildner         /* Invalid object type, should not happen here */
4152ffe9f16SSascha Wildner 
4162ffe9f16SSascha Wildner         ACPI_ERROR ((AE_INFO, "Invalid object type: 0x%X",
4172ffe9f16SSascha Wildner             Operand0->Common.Type));
4182ffe9f16SSascha Wildner         Status = AE_AML_INTERNAL;
4192ffe9f16SSascha Wildner         goto Cleanup;
4202ffe9f16SSascha Wildner     }
4212ffe9f16SSascha Wildner 
4222ffe9f16SSascha Wildner     *ActualReturnDesc = ReturnDesc;
4232ffe9f16SSascha Wildner 
4242ffe9f16SSascha Wildner Cleanup:
4252ffe9f16SSascha Wildner     if (LocalOperand0 != Operand0)
4262ffe9f16SSascha Wildner     {
4272ffe9f16SSascha Wildner         AcpiUtRemoveReference (LocalOperand0);
4282ffe9f16SSascha Wildner     }
4292ffe9f16SSascha Wildner 
4302ffe9f16SSascha Wildner     if (LocalOperand1 != Operand1)
4312ffe9f16SSascha Wildner     {
4322ffe9f16SSascha Wildner         AcpiUtRemoveReference (LocalOperand1);
4332ffe9f16SSascha Wildner     }
4342ffe9f16SSascha Wildner 
4352ffe9f16SSascha Wildner     return_ACPI_STATUS (Status);
4362ffe9f16SSascha Wildner }
4372ffe9f16SSascha Wildner 
4382ffe9f16SSascha Wildner 
4392ffe9f16SSascha Wildner /*******************************************************************************
4402ffe9f16SSascha Wildner  *
4412ffe9f16SSascha Wildner  * FUNCTION:    AcpiExConvertToObjectTypeString
4422ffe9f16SSascha Wildner  *
4432ffe9f16SSascha Wildner  * PARAMETERS:  ObjDesc             - Object to be converted
4442ffe9f16SSascha Wildner  *              ReturnDesc          - Where to place the return object
4452ffe9f16SSascha Wildner  *
4462ffe9f16SSascha Wildner  * RETURN:      Status
4472ffe9f16SSascha Wildner  *
4482ffe9f16SSascha Wildner  * DESCRIPTION: Convert an object of arbitrary type to a string object that
4492ffe9f16SSascha Wildner  *              contains the namestring for the object. Used for the
4502ffe9f16SSascha Wildner  *              concatenate operator.
4512ffe9f16SSascha Wildner  *
4522ffe9f16SSascha Wildner  ******************************************************************************/
4532ffe9f16SSascha Wildner 
4542ffe9f16SSascha Wildner static ACPI_STATUS
AcpiExConvertToObjectTypeString(ACPI_OPERAND_OBJECT * ObjDesc,ACPI_OPERAND_OBJECT ** ResultDesc)4552ffe9f16SSascha Wildner AcpiExConvertToObjectTypeString (
4562ffe9f16SSascha Wildner     ACPI_OPERAND_OBJECT     *ObjDesc,
4572ffe9f16SSascha Wildner     ACPI_OPERAND_OBJECT     **ResultDesc)
4582ffe9f16SSascha Wildner {
4592ffe9f16SSascha Wildner     ACPI_OPERAND_OBJECT     *ReturnDesc;
4602ffe9f16SSascha Wildner     const char              *TypeString;
4612ffe9f16SSascha Wildner 
4622ffe9f16SSascha Wildner 
4632ffe9f16SSascha Wildner     TypeString = AcpiUtGetTypeName (ObjDesc->Common.Type);
4642ffe9f16SSascha Wildner 
4652ffe9f16SSascha Wildner     ReturnDesc = AcpiUtCreateStringObject (
4662ffe9f16SSascha Wildner         ((ACPI_SIZE) strlen (TypeString) + 9)); /* 9 For "[ Object]" */
4672ffe9f16SSascha Wildner     if (!ReturnDesc)
4682ffe9f16SSascha Wildner     {
4692ffe9f16SSascha Wildner         return (AE_NO_MEMORY);
4702ffe9f16SSascha Wildner     }
4712ffe9f16SSascha Wildner 
4722ffe9f16SSascha Wildner     strcpy (ReturnDesc->String.Pointer, "[");
4732ffe9f16SSascha Wildner     strcat (ReturnDesc->String.Pointer, TypeString);
4742ffe9f16SSascha Wildner     strcat (ReturnDesc->String.Pointer, " Object]");
4752ffe9f16SSascha Wildner 
4762ffe9f16SSascha Wildner     *ResultDesc = ReturnDesc;
4772ffe9f16SSascha Wildner     return (AE_OK);
4782ffe9f16SSascha Wildner }
4792ffe9f16SSascha Wildner 
4802ffe9f16SSascha Wildner 
4812ffe9f16SSascha Wildner /*******************************************************************************
4822ffe9f16SSascha Wildner  *
4832ffe9f16SSascha Wildner  * FUNCTION:    AcpiExConcatTemplate
4842ffe9f16SSascha Wildner  *
4852ffe9f16SSascha Wildner  * PARAMETERS:  Operand0            - First source object
4862ffe9f16SSascha Wildner  *              Operand1            - Second source object
4872ffe9f16SSascha Wildner  *              ActualReturnDesc    - Where to place the return object
4882ffe9f16SSascha Wildner  *              WalkState           - Current walk state
4892ffe9f16SSascha Wildner  *
4902ffe9f16SSascha Wildner  * RETURN:      Status
4912ffe9f16SSascha Wildner  *
4922ffe9f16SSascha Wildner  * DESCRIPTION: Concatenate two resource templates
4932ffe9f16SSascha Wildner  *
4942ffe9f16SSascha Wildner  ******************************************************************************/
4952ffe9f16SSascha Wildner 
4962ffe9f16SSascha Wildner ACPI_STATUS
AcpiExConcatTemplate(ACPI_OPERAND_OBJECT * Operand0,ACPI_OPERAND_OBJECT * Operand1,ACPI_OPERAND_OBJECT ** ActualReturnDesc,ACPI_WALK_STATE * WalkState)4972ffe9f16SSascha Wildner AcpiExConcatTemplate (
4982ffe9f16SSascha Wildner     ACPI_OPERAND_OBJECT     *Operand0,
4992ffe9f16SSascha Wildner     ACPI_OPERAND_OBJECT     *Operand1,
5002ffe9f16SSascha Wildner     ACPI_OPERAND_OBJECT     **ActualReturnDesc,
5012ffe9f16SSascha Wildner     ACPI_WALK_STATE         *WalkState)
5022ffe9f16SSascha Wildner {
5032ffe9f16SSascha Wildner     ACPI_STATUS             Status;
5042ffe9f16SSascha Wildner     ACPI_OPERAND_OBJECT     *ReturnDesc;
5052ffe9f16SSascha Wildner     UINT8                   *NewBuf;
5062ffe9f16SSascha Wildner     UINT8                   *EndTag;
5072ffe9f16SSascha Wildner     ACPI_SIZE               Length0;
5082ffe9f16SSascha Wildner     ACPI_SIZE               Length1;
5092ffe9f16SSascha Wildner     ACPI_SIZE               NewLength;
5102ffe9f16SSascha Wildner 
5112ffe9f16SSascha Wildner 
5122ffe9f16SSascha Wildner     ACPI_FUNCTION_TRACE (ExConcatTemplate);
5132ffe9f16SSascha Wildner 
5142ffe9f16SSascha Wildner 
5152ffe9f16SSascha Wildner     /*
5162ffe9f16SSascha Wildner      * Find the EndTag descriptor in each resource template.
5172ffe9f16SSascha Wildner      * Note1: returned pointers point TO the EndTag, not past it.
5182ffe9f16SSascha Wildner      * Note2: zero-length buffers are allowed; treated like one EndTag
5192ffe9f16SSascha Wildner      */
5202ffe9f16SSascha Wildner 
5212ffe9f16SSascha Wildner     /* Get the length of the first resource template */
5222ffe9f16SSascha Wildner 
5232ffe9f16SSascha Wildner     Status = AcpiUtGetResourceEndTag (Operand0, &EndTag);
5242ffe9f16SSascha Wildner     if (ACPI_FAILURE (Status))
5252ffe9f16SSascha Wildner     {
5262ffe9f16SSascha Wildner         return_ACPI_STATUS (Status);
5272ffe9f16SSascha Wildner     }
5282ffe9f16SSascha Wildner 
5292ffe9f16SSascha Wildner     Length0 = ACPI_PTR_DIFF (EndTag, Operand0->Buffer.Pointer);
5302ffe9f16SSascha Wildner 
5312ffe9f16SSascha Wildner     /* Get the length of the second resource template */
5322ffe9f16SSascha Wildner 
5332ffe9f16SSascha Wildner     Status = AcpiUtGetResourceEndTag (Operand1, &EndTag);
5342ffe9f16SSascha Wildner     if (ACPI_FAILURE (Status))
5352ffe9f16SSascha Wildner     {
5362ffe9f16SSascha Wildner         return_ACPI_STATUS (Status);
5372ffe9f16SSascha Wildner     }
5382ffe9f16SSascha Wildner 
5392ffe9f16SSascha Wildner     Length1 = ACPI_PTR_DIFF (EndTag, Operand1->Buffer.Pointer);
5402ffe9f16SSascha Wildner 
5412ffe9f16SSascha Wildner     /* Combine both lengths, minimum size will be 2 for EndTag */
5422ffe9f16SSascha Wildner 
5432ffe9f16SSascha Wildner     NewLength = Length0 + Length1 + sizeof (AML_RESOURCE_END_TAG);
5442ffe9f16SSascha Wildner 
5452ffe9f16SSascha Wildner     /* Create a new buffer object for the result (with one EndTag) */
5462ffe9f16SSascha Wildner 
5472ffe9f16SSascha Wildner     ReturnDesc = AcpiUtCreateBufferObject (NewLength);
5482ffe9f16SSascha Wildner     if (!ReturnDesc)
5492ffe9f16SSascha Wildner     {
5502ffe9f16SSascha Wildner         return_ACPI_STATUS (AE_NO_MEMORY);
5512ffe9f16SSascha Wildner     }
5522ffe9f16SSascha Wildner 
5532ffe9f16SSascha Wildner     /*
5542ffe9f16SSascha Wildner      * Copy the templates to the new buffer, 0 first, then 1 follows. One
5552ffe9f16SSascha Wildner      * EndTag descriptor is copied from Operand1.
5562ffe9f16SSascha Wildner      */
5572ffe9f16SSascha Wildner     NewBuf = ReturnDesc->Buffer.Pointer;
5582ffe9f16SSascha Wildner     memcpy (NewBuf, Operand0->Buffer.Pointer, Length0);
5592ffe9f16SSascha Wildner     memcpy (NewBuf + Length0, Operand1->Buffer.Pointer, Length1);
5602ffe9f16SSascha Wildner 
5612ffe9f16SSascha Wildner     /* Insert EndTag and set the checksum to zero, means "ignore checksum" */
5622ffe9f16SSascha Wildner 
5632ffe9f16SSascha Wildner     NewBuf[NewLength - 1] = 0;
5642ffe9f16SSascha Wildner     NewBuf[NewLength - 2] = ACPI_RESOURCE_NAME_END_TAG | 1;
5652ffe9f16SSascha Wildner 
5662ffe9f16SSascha Wildner     /* Return the completed resource template */
5672ffe9f16SSascha Wildner 
5682ffe9f16SSascha Wildner     *ActualReturnDesc = ReturnDesc;
5692ffe9f16SSascha Wildner     return_ACPI_STATUS (AE_OK);
5702ffe9f16SSascha Wildner }
571