xref: /freebsd/sys/contrib/dev/acpica/components/namespace/nsconvert.c (revision 5ef5072350492e3ee9aff4303789fc75972b5afe)
19c48c75eSJung-uk Kim /******************************************************************************
29c48c75eSJung-uk Kim  *
39c48c75eSJung-uk Kim  * Module Name: nsconvert - Object conversions for objects returned by
49c48c75eSJung-uk Kim  *                          predefined methods
59c48c75eSJung-uk Kim  *
69c48c75eSJung-uk Kim  *****************************************************************************/
79c48c75eSJung-uk Kim 
89c48c75eSJung-uk Kim /*
91c0e1b6dSJung-uk Kim  * Copyright (C) 2000 - 2015, Intel Corp.
109c48c75eSJung-uk Kim  * All rights reserved.
119c48c75eSJung-uk Kim  *
129c48c75eSJung-uk Kim  * Redistribution and use in source and binary forms, with or without
139c48c75eSJung-uk Kim  * modification, are permitted provided that the following conditions
149c48c75eSJung-uk Kim  * are met:
159c48c75eSJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
169c48c75eSJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
179c48c75eSJung-uk Kim  *    without modification.
189c48c75eSJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
199c48c75eSJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
209c48c75eSJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
219c48c75eSJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
229c48c75eSJung-uk Kim  *    binary redistribution.
239c48c75eSJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
249c48c75eSJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
259c48c75eSJung-uk Kim  *    from this software without specific prior written permission.
269c48c75eSJung-uk Kim  *
279c48c75eSJung-uk Kim  * Alternatively, this software may be distributed under the terms of the
289c48c75eSJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
299c48c75eSJung-uk Kim  * Software Foundation.
309c48c75eSJung-uk Kim  *
319c48c75eSJung-uk Kim  * NO WARRANTY
329c48c75eSJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
339c48c75eSJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
349c48c75eSJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
359c48c75eSJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
369c48c75eSJung-uk Kim  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
379c48c75eSJung-uk Kim  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
389c48c75eSJung-uk Kim  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
399c48c75eSJung-uk Kim  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
409c48c75eSJung-uk Kim  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
419c48c75eSJung-uk Kim  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
429c48c75eSJung-uk Kim  * POSSIBILITY OF SUCH DAMAGES.
439c48c75eSJung-uk Kim  */
449c48c75eSJung-uk Kim 
459c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/acpi.h>
469c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/accommon.h>
479c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h>
489c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/acinterp.h>
499c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/acpredef.h>
509c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/amlresrc.h>
519c48c75eSJung-uk Kim 
529c48c75eSJung-uk Kim #define _COMPONENT          ACPI_NAMESPACE
539c48c75eSJung-uk Kim         ACPI_MODULE_NAME    ("nsconvert")
549c48c75eSJung-uk Kim 
559c48c75eSJung-uk Kim 
569c48c75eSJung-uk Kim /*******************************************************************************
579c48c75eSJung-uk Kim  *
589c48c75eSJung-uk Kim  * FUNCTION:    AcpiNsConvertToInteger
599c48c75eSJung-uk Kim  *
609c48c75eSJung-uk Kim  * PARAMETERS:  OriginalObject      - Object to be converted
619c48c75eSJung-uk Kim  *              ReturnObject        - Where the new converted object is returned
629c48c75eSJung-uk Kim  *
639c48c75eSJung-uk Kim  * RETURN:      Status. AE_OK if conversion was successful.
649c48c75eSJung-uk Kim  *
659c48c75eSJung-uk Kim  * DESCRIPTION: Attempt to convert a String/Buffer object to an Integer.
669c48c75eSJung-uk Kim  *
679c48c75eSJung-uk Kim  ******************************************************************************/
689c48c75eSJung-uk Kim 
699c48c75eSJung-uk Kim ACPI_STATUS
709c48c75eSJung-uk Kim AcpiNsConvertToInteger (
719c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     *OriginalObject,
729c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     **ReturnObject)
739c48c75eSJung-uk Kim {
749c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     *NewObject;
759c48c75eSJung-uk Kim     ACPI_STATUS             Status;
769c48c75eSJung-uk Kim     UINT64                  Value = 0;
779c48c75eSJung-uk Kim     UINT32                  i;
789c48c75eSJung-uk Kim 
799c48c75eSJung-uk Kim 
809c48c75eSJung-uk Kim     switch (OriginalObject->Common.Type)
819c48c75eSJung-uk Kim     {
829c48c75eSJung-uk Kim     case ACPI_TYPE_STRING:
839c48c75eSJung-uk Kim 
849c48c75eSJung-uk Kim         /* String-to-Integer conversion */
859c48c75eSJung-uk Kim 
869c48c75eSJung-uk Kim         Status = AcpiUtStrtoul64 (OriginalObject->String.Pointer,
879c48c75eSJung-uk Kim                     ACPI_ANY_BASE, &Value);
889c48c75eSJung-uk Kim         if (ACPI_FAILURE (Status))
899c48c75eSJung-uk Kim         {
909c48c75eSJung-uk Kim             return (Status);
919c48c75eSJung-uk Kim         }
929c48c75eSJung-uk Kim         break;
939c48c75eSJung-uk Kim 
949c48c75eSJung-uk Kim     case ACPI_TYPE_BUFFER:
959c48c75eSJung-uk Kim 
969c48c75eSJung-uk Kim         /* Buffer-to-Integer conversion. Max buffer size is 64 bits. */
979c48c75eSJung-uk Kim 
989c48c75eSJung-uk Kim         if (OriginalObject->Buffer.Length > 8)
999c48c75eSJung-uk Kim         {
1009c48c75eSJung-uk Kim             return (AE_AML_OPERAND_TYPE);
1019c48c75eSJung-uk Kim         }
1029c48c75eSJung-uk Kim 
1039c48c75eSJung-uk Kim         /* Extract each buffer byte to create the integer */
1049c48c75eSJung-uk Kim 
1059c48c75eSJung-uk Kim         for (i = 0; i < OriginalObject->Buffer.Length; i++)
1069c48c75eSJung-uk Kim         {
1079c48c75eSJung-uk Kim             Value |= ((UINT64) OriginalObject->Buffer.Pointer[i] << (i * 8));
1089c48c75eSJung-uk Kim         }
1099c48c75eSJung-uk Kim         break;
1109c48c75eSJung-uk Kim 
1119c48c75eSJung-uk Kim     default:
112a9d8d09cSJung-uk Kim 
1139c48c75eSJung-uk Kim         return (AE_AML_OPERAND_TYPE);
1149c48c75eSJung-uk Kim     }
1159c48c75eSJung-uk Kim 
1169c48c75eSJung-uk Kim     NewObject = AcpiUtCreateIntegerObject (Value);
1179c48c75eSJung-uk Kim     if (!NewObject)
1189c48c75eSJung-uk Kim     {
1199c48c75eSJung-uk Kim         return (AE_NO_MEMORY);
1209c48c75eSJung-uk Kim     }
1219c48c75eSJung-uk Kim 
1229c48c75eSJung-uk Kim     *ReturnObject = NewObject;
1239c48c75eSJung-uk Kim     return (AE_OK);
1249c48c75eSJung-uk Kim }
1259c48c75eSJung-uk Kim 
1269c48c75eSJung-uk Kim 
1279c48c75eSJung-uk Kim /*******************************************************************************
1289c48c75eSJung-uk Kim  *
1299c48c75eSJung-uk Kim  * FUNCTION:    AcpiNsConvertToString
1309c48c75eSJung-uk Kim  *
1319c48c75eSJung-uk Kim  * PARAMETERS:  OriginalObject      - Object to be converted
1329c48c75eSJung-uk Kim  *              ReturnObject        - Where the new converted object is returned
1339c48c75eSJung-uk Kim  *
1349c48c75eSJung-uk Kim  * RETURN:      Status. AE_OK if conversion was successful.
1359c48c75eSJung-uk Kim  *
1369c48c75eSJung-uk Kim  * DESCRIPTION: Attempt to convert a Integer/Buffer object to a String.
1379c48c75eSJung-uk Kim  *
1389c48c75eSJung-uk Kim  ******************************************************************************/
1399c48c75eSJung-uk Kim 
1409c48c75eSJung-uk Kim ACPI_STATUS
1419c48c75eSJung-uk Kim AcpiNsConvertToString (
1429c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     *OriginalObject,
1439c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     **ReturnObject)
1449c48c75eSJung-uk Kim {
1459c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     *NewObject;
1469c48c75eSJung-uk Kim     ACPI_SIZE               Length;
1479c48c75eSJung-uk Kim     ACPI_STATUS             Status;
1489c48c75eSJung-uk Kim 
1499c48c75eSJung-uk Kim 
1509c48c75eSJung-uk Kim     switch (OriginalObject->Common.Type)
1519c48c75eSJung-uk Kim     {
1529c48c75eSJung-uk Kim     case ACPI_TYPE_INTEGER:
1539c48c75eSJung-uk Kim         /*
1549c48c75eSJung-uk Kim          * Integer-to-String conversion. Commonly, convert
1559c48c75eSJung-uk Kim          * an integer of value 0 to a NULL string. The last element of
1569c48c75eSJung-uk Kim          * _BIF and _BIX packages occasionally need this fix.
1579c48c75eSJung-uk Kim          */
1589c48c75eSJung-uk Kim         if (OriginalObject->Integer.Value == 0)
1599c48c75eSJung-uk Kim         {
1609c48c75eSJung-uk Kim             /* Allocate a new NULL string object */
1619c48c75eSJung-uk Kim 
1629c48c75eSJung-uk Kim             NewObject = AcpiUtCreateStringObject (0);
1639c48c75eSJung-uk Kim             if (!NewObject)
1649c48c75eSJung-uk Kim             {
1659c48c75eSJung-uk Kim                 return (AE_NO_MEMORY);
1669c48c75eSJung-uk Kim             }
1679c48c75eSJung-uk Kim         }
1689c48c75eSJung-uk Kim         else
1699c48c75eSJung-uk Kim         {
1709c48c75eSJung-uk Kim             Status = AcpiExConvertToString (OriginalObject, &NewObject,
1719c48c75eSJung-uk Kim                         ACPI_IMPLICIT_CONVERT_HEX);
1729c48c75eSJung-uk Kim             if (ACPI_FAILURE (Status))
1739c48c75eSJung-uk Kim             {
1749c48c75eSJung-uk Kim                 return (Status);
1759c48c75eSJung-uk Kim             }
1769c48c75eSJung-uk Kim         }
1779c48c75eSJung-uk Kim         break;
1789c48c75eSJung-uk Kim 
1799c48c75eSJung-uk Kim     case ACPI_TYPE_BUFFER:
1809c48c75eSJung-uk Kim         /*
1819c48c75eSJung-uk Kim          * Buffer-to-String conversion. Use a ToString
1829c48c75eSJung-uk Kim          * conversion, no transform performed on the buffer data. The best
1839c48c75eSJung-uk Kim          * example of this is the _BIF method, where the string data from
1849c48c75eSJung-uk Kim          * the battery is often (incorrectly) returned as buffer object(s).
1859c48c75eSJung-uk Kim          */
1869c48c75eSJung-uk Kim         Length = 0;
1879c48c75eSJung-uk Kim         while ((Length < OriginalObject->Buffer.Length) &&
1889c48c75eSJung-uk Kim                 (OriginalObject->Buffer.Pointer[Length]))
1899c48c75eSJung-uk Kim         {
1909c48c75eSJung-uk Kim             Length++;
1919c48c75eSJung-uk Kim         }
1929c48c75eSJung-uk Kim 
1939c48c75eSJung-uk Kim         /* Allocate a new string object */
1949c48c75eSJung-uk Kim 
1959c48c75eSJung-uk Kim         NewObject = AcpiUtCreateStringObject (Length);
1969c48c75eSJung-uk Kim         if (!NewObject)
1979c48c75eSJung-uk Kim         {
1989c48c75eSJung-uk Kim             return (AE_NO_MEMORY);
1999c48c75eSJung-uk Kim         }
2009c48c75eSJung-uk Kim 
2019c48c75eSJung-uk Kim         /*
2029c48c75eSJung-uk Kim          * Copy the raw buffer data with no transform. String is already NULL
2039c48c75eSJung-uk Kim          * terminated at Length+1.
2049c48c75eSJung-uk Kim          */
205*5ef50723SJung-uk Kim         memcpy (NewObject->String.Pointer,
2069c48c75eSJung-uk Kim             OriginalObject->Buffer.Pointer, Length);
2079c48c75eSJung-uk Kim         break;
2089c48c75eSJung-uk Kim 
2099c48c75eSJung-uk Kim     default:
210a9d8d09cSJung-uk Kim 
2119c48c75eSJung-uk Kim         return (AE_AML_OPERAND_TYPE);
2129c48c75eSJung-uk Kim     }
2139c48c75eSJung-uk Kim 
2149c48c75eSJung-uk Kim     *ReturnObject = NewObject;
2159c48c75eSJung-uk Kim     return (AE_OK);
2169c48c75eSJung-uk Kim }
2179c48c75eSJung-uk Kim 
2189c48c75eSJung-uk Kim 
2199c48c75eSJung-uk Kim /*******************************************************************************
2209c48c75eSJung-uk Kim  *
2219c48c75eSJung-uk Kim  * FUNCTION:    AcpiNsConvertToBuffer
2229c48c75eSJung-uk Kim  *
2239c48c75eSJung-uk Kim  * PARAMETERS:  OriginalObject      - Object to be converted
2249c48c75eSJung-uk Kim  *              ReturnObject        - Where the new converted object is returned
2259c48c75eSJung-uk Kim  *
2269c48c75eSJung-uk Kim  * RETURN:      Status. AE_OK if conversion was successful.
2279c48c75eSJung-uk Kim  *
2289c48c75eSJung-uk Kim  * DESCRIPTION: Attempt to convert a Integer/String/Package object to a Buffer.
2299c48c75eSJung-uk Kim  *
2309c48c75eSJung-uk Kim  ******************************************************************************/
2319c48c75eSJung-uk Kim 
2329c48c75eSJung-uk Kim ACPI_STATUS
2339c48c75eSJung-uk Kim AcpiNsConvertToBuffer (
2349c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     *OriginalObject,
2359c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     **ReturnObject)
2369c48c75eSJung-uk Kim {
2379c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     *NewObject;
2389c48c75eSJung-uk Kim     ACPI_STATUS             Status;
2399c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     **Elements;
2409c48c75eSJung-uk Kim     UINT32                  *DwordBuffer;
2419c48c75eSJung-uk Kim     UINT32                  Count;
2429c48c75eSJung-uk Kim     UINT32                  i;
2439c48c75eSJung-uk Kim 
2449c48c75eSJung-uk Kim 
2459c48c75eSJung-uk Kim     switch (OriginalObject->Common.Type)
2469c48c75eSJung-uk Kim     {
2479c48c75eSJung-uk Kim     case ACPI_TYPE_INTEGER:
2489c48c75eSJung-uk Kim         /*
2499c48c75eSJung-uk Kim          * Integer-to-Buffer conversion.
2509c48c75eSJung-uk Kim          * Convert the Integer to a packed-byte buffer. _MAT and other
2519c48c75eSJung-uk Kim          * objects need this sometimes, if a read has been performed on a
2529c48c75eSJung-uk Kim          * Field object that is less than or equal to the global integer
2539c48c75eSJung-uk Kim          * size (32 or 64 bits).
2549c48c75eSJung-uk Kim          */
2559c48c75eSJung-uk Kim         Status = AcpiExConvertToBuffer (OriginalObject, &NewObject);
2569c48c75eSJung-uk Kim         if (ACPI_FAILURE (Status))
2579c48c75eSJung-uk Kim         {
2589c48c75eSJung-uk Kim             return (Status);
2599c48c75eSJung-uk Kim         }
2609c48c75eSJung-uk Kim         break;
2619c48c75eSJung-uk Kim 
2629c48c75eSJung-uk Kim     case ACPI_TYPE_STRING:
2639c48c75eSJung-uk Kim 
2649c48c75eSJung-uk Kim         /* String-to-Buffer conversion. Simple data copy */
2659c48c75eSJung-uk Kim 
2669c48c75eSJung-uk Kim         NewObject = AcpiUtCreateBufferObject (OriginalObject->String.Length);
2679c48c75eSJung-uk Kim         if (!NewObject)
2689c48c75eSJung-uk Kim         {
2699c48c75eSJung-uk Kim             return (AE_NO_MEMORY);
2709c48c75eSJung-uk Kim         }
2719c48c75eSJung-uk Kim 
272*5ef50723SJung-uk Kim         memcpy (NewObject->Buffer.Pointer,
2739c48c75eSJung-uk Kim             OriginalObject->String.Pointer, OriginalObject->String.Length);
2749c48c75eSJung-uk Kim         break;
2759c48c75eSJung-uk Kim 
2769c48c75eSJung-uk Kim     case ACPI_TYPE_PACKAGE:
2779c48c75eSJung-uk Kim         /*
2789c48c75eSJung-uk Kim          * This case is often seen for predefined names that must return a
2799c48c75eSJung-uk Kim          * Buffer object with multiple DWORD integers within. For example,
2809c48c75eSJung-uk Kim          * _FDE and _GTM. The Package can be converted to a Buffer.
2819c48c75eSJung-uk Kim          */
2829c48c75eSJung-uk Kim 
2839c48c75eSJung-uk Kim         /* All elements of the Package must be integers */
2849c48c75eSJung-uk Kim 
2859c48c75eSJung-uk Kim         Elements = OriginalObject->Package.Elements;
2869c48c75eSJung-uk Kim         Count = OriginalObject->Package.Count;
2879c48c75eSJung-uk Kim 
2889c48c75eSJung-uk Kim         for (i = 0; i < Count; i++)
2899c48c75eSJung-uk Kim         {
2909c48c75eSJung-uk Kim             if ((!*Elements) ||
2919c48c75eSJung-uk Kim                 ((*Elements)->Common.Type != ACPI_TYPE_INTEGER))
2929c48c75eSJung-uk Kim             {
2939c48c75eSJung-uk Kim                 return (AE_AML_OPERAND_TYPE);
2949c48c75eSJung-uk Kim             }
2959c48c75eSJung-uk Kim             Elements++;
2969c48c75eSJung-uk Kim         }
2979c48c75eSJung-uk Kim 
2989c48c75eSJung-uk Kim         /* Create the new buffer object to replace the Package */
2999c48c75eSJung-uk Kim 
3009c48c75eSJung-uk Kim         NewObject = AcpiUtCreateBufferObject (ACPI_MUL_4 (Count));
3019c48c75eSJung-uk Kim         if (!NewObject)
3029c48c75eSJung-uk Kim         {
3039c48c75eSJung-uk Kim             return (AE_NO_MEMORY);
3049c48c75eSJung-uk Kim         }
3059c48c75eSJung-uk Kim 
3069c48c75eSJung-uk Kim         /* Copy the package elements (integers) to the buffer as DWORDs */
3079c48c75eSJung-uk Kim 
3089c48c75eSJung-uk Kim         Elements = OriginalObject->Package.Elements;
3099c48c75eSJung-uk Kim         DwordBuffer = ACPI_CAST_PTR (UINT32, NewObject->Buffer.Pointer);
3109c48c75eSJung-uk Kim 
3119c48c75eSJung-uk Kim         for (i = 0; i < Count; i++)
3129c48c75eSJung-uk Kim         {
3139c48c75eSJung-uk Kim             *DwordBuffer = (UINT32) (*Elements)->Integer.Value;
3149c48c75eSJung-uk Kim             DwordBuffer++;
3159c48c75eSJung-uk Kim             Elements++;
3169c48c75eSJung-uk Kim         }
3179c48c75eSJung-uk Kim         break;
3189c48c75eSJung-uk Kim 
3199c48c75eSJung-uk Kim     default:
320a9d8d09cSJung-uk Kim 
3219c48c75eSJung-uk Kim         return (AE_AML_OPERAND_TYPE);
3229c48c75eSJung-uk Kim     }
3239c48c75eSJung-uk Kim 
3249c48c75eSJung-uk Kim     *ReturnObject = NewObject;
3259c48c75eSJung-uk Kim     return (AE_OK);
3269c48c75eSJung-uk Kim }
3279c48c75eSJung-uk Kim 
3289c48c75eSJung-uk Kim 
3299c48c75eSJung-uk Kim /*******************************************************************************
3309c48c75eSJung-uk Kim  *
3319c48c75eSJung-uk Kim  * FUNCTION:    AcpiNsConvertToUnicode
3329c48c75eSJung-uk Kim  *
3339c48c75eSJung-uk Kim  * PARAMETERS:  OriginalObject      - ASCII String Object to be converted
3349c48c75eSJung-uk Kim  *              ReturnObject        - Where the new converted object is returned
3359c48c75eSJung-uk Kim  *
3369c48c75eSJung-uk Kim  * RETURN:      Status. AE_OK if conversion was successful.
3379c48c75eSJung-uk Kim  *
3389c48c75eSJung-uk Kim  * DESCRIPTION: Attempt to convert a String object to a Unicode string Buffer.
3399c48c75eSJung-uk Kim  *
3409c48c75eSJung-uk Kim  ******************************************************************************/
3419c48c75eSJung-uk Kim 
3429c48c75eSJung-uk Kim ACPI_STATUS
3439c48c75eSJung-uk Kim AcpiNsConvertToUnicode (
3449c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     *OriginalObject,
3459c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     **ReturnObject)
3469c48c75eSJung-uk Kim {
3479c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     *NewObject;
3489c48c75eSJung-uk Kim     char                    *AsciiString;
3499c48c75eSJung-uk Kim     UINT16                  *UnicodeBuffer;
3509c48c75eSJung-uk Kim     UINT32                  UnicodeLength;
3519c48c75eSJung-uk Kim     UINT32                  i;
3529c48c75eSJung-uk Kim 
3539c48c75eSJung-uk Kim 
3549c48c75eSJung-uk Kim     if (!OriginalObject)
3559c48c75eSJung-uk Kim     {
3569c48c75eSJung-uk Kim         return (AE_OK);
3579c48c75eSJung-uk Kim     }
3589c48c75eSJung-uk Kim 
3599c48c75eSJung-uk Kim     /* If a Buffer was returned, it must be at least two bytes long */
3609c48c75eSJung-uk Kim 
3619c48c75eSJung-uk Kim     if (OriginalObject->Common.Type == ACPI_TYPE_BUFFER)
3629c48c75eSJung-uk Kim     {
3639c48c75eSJung-uk Kim         if (OriginalObject->Buffer.Length < 2)
3649c48c75eSJung-uk Kim         {
3659c48c75eSJung-uk Kim             return (AE_AML_OPERAND_VALUE);
3669c48c75eSJung-uk Kim         }
3679c48c75eSJung-uk Kim 
3689c48c75eSJung-uk Kim         *ReturnObject = NULL;
3699c48c75eSJung-uk Kim         return (AE_OK);
3709c48c75eSJung-uk Kim     }
3719c48c75eSJung-uk Kim 
3729c48c75eSJung-uk Kim     /*
3739c48c75eSJung-uk Kim      * The original object is an ASCII string. Convert this string to
3749c48c75eSJung-uk Kim      * a unicode buffer.
3759c48c75eSJung-uk Kim      */
3769c48c75eSJung-uk Kim     AsciiString = OriginalObject->String.Pointer;
3779c48c75eSJung-uk Kim     UnicodeLength = (OriginalObject->String.Length * 2) + 2;
3789c48c75eSJung-uk Kim 
3799c48c75eSJung-uk Kim     /* Create a new buffer object for the Unicode data */
3809c48c75eSJung-uk Kim 
3819c48c75eSJung-uk Kim     NewObject = AcpiUtCreateBufferObject (UnicodeLength);
3829c48c75eSJung-uk Kim     if (!NewObject)
3839c48c75eSJung-uk Kim     {
3849c48c75eSJung-uk Kim         return (AE_NO_MEMORY);
3859c48c75eSJung-uk Kim     }
3869c48c75eSJung-uk Kim 
3879c48c75eSJung-uk Kim     UnicodeBuffer = ACPI_CAST_PTR (UINT16, NewObject->Buffer.Pointer);
3889c48c75eSJung-uk Kim 
3899c48c75eSJung-uk Kim     /* Convert ASCII to Unicode */
3909c48c75eSJung-uk Kim 
3919c48c75eSJung-uk Kim     for (i = 0; i < OriginalObject->String.Length; i++)
3929c48c75eSJung-uk Kim     {
3939c48c75eSJung-uk Kim         UnicodeBuffer[i] = (UINT16) AsciiString[i];
3949c48c75eSJung-uk Kim     }
3959c48c75eSJung-uk Kim 
3969c48c75eSJung-uk Kim     *ReturnObject = NewObject;
3979c48c75eSJung-uk Kim     return (AE_OK);
3989c48c75eSJung-uk Kim }
3999c48c75eSJung-uk Kim 
4009c48c75eSJung-uk Kim 
4019c48c75eSJung-uk Kim /*******************************************************************************
4029c48c75eSJung-uk Kim  *
4039c48c75eSJung-uk Kim  * FUNCTION:    AcpiNsConvertToResource
4049c48c75eSJung-uk Kim  *
4059c48c75eSJung-uk Kim  * PARAMETERS:  OriginalObject      - Object to be converted
4069c48c75eSJung-uk Kim  *              ReturnObject        - Where the new converted object is returned
4079c48c75eSJung-uk Kim  *
4089c48c75eSJung-uk Kim  * RETURN:      Status. AE_OK if conversion was successful
4099c48c75eSJung-uk Kim  *
4109c48c75eSJung-uk Kim  * DESCRIPTION: Attempt to convert a Integer object to a ResourceTemplate
4119c48c75eSJung-uk Kim  *              Buffer.
4129c48c75eSJung-uk Kim  *
4139c48c75eSJung-uk Kim  ******************************************************************************/
4149c48c75eSJung-uk Kim 
4159c48c75eSJung-uk Kim ACPI_STATUS
4169c48c75eSJung-uk Kim AcpiNsConvertToResource (
4179c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     *OriginalObject,
4189c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     **ReturnObject)
4199c48c75eSJung-uk Kim {
4209c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     *NewObject;
4219c48c75eSJung-uk Kim     UINT8                   *Buffer;
4229c48c75eSJung-uk Kim 
4239c48c75eSJung-uk Kim 
4249c48c75eSJung-uk Kim     /*
4259c48c75eSJung-uk Kim      * We can fix the following cases for an expected resource template:
4269c48c75eSJung-uk Kim      * 1. No return value (interpreter slack mode is disabled)
4279c48c75eSJung-uk Kim      * 2. A "Return (Zero)" statement
4289c48c75eSJung-uk Kim      * 3. A "Return empty buffer" statement
4299c48c75eSJung-uk Kim      *
4309c48c75eSJung-uk Kim      * We will return a buffer containing a single EndTag
4319c48c75eSJung-uk Kim      * resource descriptor.
4329c48c75eSJung-uk Kim      */
4339c48c75eSJung-uk Kim     if (OriginalObject)
4349c48c75eSJung-uk Kim     {
4359c48c75eSJung-uk Kim         switch (OriginalObject->Common.Type)
4369c48c75eSJung-uk Kim         {
4379c48c75eSJung-uk Kim         case ACPI_TYPE_INTEGER:
4389c48c75eSJung-uk Kim 
4399c48c75eSJung-uk Kim             /* We can only repair an Integer==0 */
4409c48c75eSJung-uk Kim 
4419c48c75eSJung-uk Kim             if (OriginalObject->Integer.Value)
4429c48c75eSJung-uk Kim             {
4439c48c75eSJung-uk Kim                 return (AE_AML_OPERAND_TYPE);
4449c48c75eSJung-uk Kim             }
4459c48c75eSJung-uk Kim             break;
4469c48c75eSJung-uk Kim 
4479c48c75eSJung-uk Kim         case ACPI_TYPE_BUFFER:
4489c48c75eSJung-uk Kim 
4499c48c75eSJung-uk Kim             if (OriginalObject->Buffer.Length)
4509c48c75eSJung-uk Kim             {
4519c48c75eSJung-uk Kim                 /* Additional checks can be added in the future */
4529c48c75eSJung-uk Kim 
4539c48c75eSJung-uk Kim                 *ReturnObject = NULL;
4549c48c75eSJung-uk Kim                 return (AE_OK);
4559c48c75eSJung-uk Kim             }
4569c48c75eSJung-uk Kim             break;
4579c48c75eSJung-uk Kim 
4589c48c75eSJung-uk Kim         case ACPI_TYPE_STRING:
4599c48c75eSJung-uk Kim         default:
4609c48c75eSJung-uk Kim 
4619c48c75eSJung-uk Kim             return (AE_AML_OPERAND_TYPE);
4629c48c75eSJung-uk Kim         }
4639c48c75eSJung-uk Kim     }
4649c48c75eSJung-uk Kim 
4659c48c75eSJung-uk Kim     /* Create the new buffer object for the resource descriptor */
4669c48c75eSJung-uk Kim 
4679c48c75eSJung-uk Kim     NewObject = AcpiUtCreateBufferObject (2);
4689c48c75eSJung-uk Kim     if (!NewObject)
4699c48c75eSJung-uk Kim     {
4709c48c75eSJung-uk Kim         return (AE_NO_MEMORY);
4719c48c75eSJung-uk Kim     }
4729c48c75eSJung-uk Kim 
4739c48c75eSJung-uk Kim     Buffer = ACPI_CAST_PTR (UINT8, NewObject->Buffer.Pointer);
4749c48c75eSJung-uk Kim 
4759c48c75eSJung-uk Kim     /* Initialize the Buffer with a single EndTag descriptor */
4769c48c75eSJung-uk Kim 
4779c48c75eSJung-uk Kim     Buffer[0] = (ACPI_RESOURCE_NAME_END_TAG | ASL_RDESC_END_TAG_SIZE);
4789c48c75eSJung-uk Kim     Buffer[1] = 0x00;
4799c48c75eSJung-uk Kim 
4809c48c75eSJung-uk Kim     *ReturnObject = NewObject;
4819c48c75eSJung-uk Kim     return (AE_OK);
4829c48c75eSJung-uk Kim }
483