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