xref: /freebsd/sys/contrib/dev/acpica/components/namespace/nsconvert.c (revision a9d8d09c46ec699e45f3fd46ca9abcf02e5baca9)
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 /*
99c48c75eSJung-uk Kim  * Copyright (C) 2000 - 2013, 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 #define __NSCONVERT_C__
469c48c75eSJung-uk Kim 
479c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/acpi.h>
489c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/accommon.h>
499c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h>
509c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/acinterp.h>
519c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/acpredef.h>
529c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/amlresrc.h>
539c48c75eSJung-uk Kim 
549c48c75eSJung-uk Kim #define _COMPONENT          ACPI_NAMESPACE
559c48c75eSJung-uk Kim         ACPI_MODULE_NAME    ("nsconvert")
569c48c75eSJung-uk Kim 
579c48c75eSJung-uk Kim 
589c48c75eSJung-uk Kim /*******************************************************************************
599c48c75eSJung-uk Kim  *
609c48c75eSJung-uk Kim  * FUNCTION:    AcpiNsConvertToInteger
619c48c75eSJung-uk Kim  *
629c48c75eSJung-uk Kim  * PARAMETERS:  OriginalObject      - Object to be converted
639c48c75eSJung-uk Kim  *              ReturnObject        - Where the new converted object is returned
649c48c75eSJung-uk Kim  *
659c48c75eSJung-uk Kim  * RETURN:      Status. AE_OK if conversion was successful.
669c48c75eSJung-uk Kim  *
679c48c75eSJung-uk Kim  * DESCRIPTION: Attempt to convert a String/Buffer object to an Integer.
689c48c75eSJung-uk Kim  *
699c48c75eSJung-uk Kim  ******************************************************************************/
709c48c75eSJung-uk Kim 
719c48c75eSJung-uk Kim ACPI_STATUS
729c48c75eSJung-uk Kim AcpiNsConvertToInteger (
739c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     *OriginalObject,
749c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     **ReturnObject)
759c48c75eSJung-uk Kim {
769c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     *NewObject;
779c48c75eSJung-uk Kim     ACPI_STATUS             Status;
789c48c75eSJung-uk Kim     UINT64                  Value = 0;
799c48c75eSJung-uk Kim     UINT32                  i;
809c48c75eSJung-uk Kim 
819c48c75eSJung-uk Kim 
829c48c75eSJung-uk Kim     switch (OriginalObject->Common.Type)
839c48c75eSJung-uk Kim     {
849c48c75eSJung-uk Kim     case ACPI_TYPE_STRING:
859c48c75eSJung-uk Kim 
869c48c75eSJung-uk Kim         /* String-to-Integer conversion */
879c48c75eSJung-uk Kim 
889c48c75eSJung-uk Kim         Status = AcpiUtStrtoul64 (OriginalObject->String.Pointer,
899c48c75eSJung-uk Kim                     ACPI_ANY_BASE, &Value);
909c48c75eSJung-uk Kim         if (ACPI_FAILURE (Status))
919c48c75eSJung-uk Kim         {
929c48c75eSJung-uk Kim             return (Status);
939c48c75eSJung-uk Kim         }
949c48c75eSJung-uk Kim         break;
959c48c75eSJung-uk Kim 
969c48c75eSJung-uk Kim     case ACPI_TYPE_BUFFER:
979c48c75eSJung-uk Kim 
989c48c75eSJung-uk Kim         /* Buffer-to-Integer conversion. Max buffer size is 64 bits. */
999c48c75eSJung-uk Kim 
1009c48c75eSJung-uk Kim         if (OriginalObject->Buffer.Length > 8)
1019c48c75eSJung-uk Kim         {
1029c48c75eSJung-uk Kim             return (AE_AML_OPERAND_TYPE);
1039c48c75eSJung-uk Kim         }
1049c48c75eSJung-uk Kim 
1059c48c75eSJung-uk Kim         /* Extract each buffer byte to create the integer */
1069c48c75eSJung-uk Kim 
1079c48c75eSJung-uk Kim         for (i = 0; i < OriginalObject->Buffer.Length; i++)
1089c48c75eSJung-uk Kim         {
1099c48c75eSJung-uk Kim             Value |= ((UINT64) OriginalObject->Buffer.Pointer[i] << (i * 8));
1109c48c75eSJung-uk Kim         }
1119c48c75eSJung-uk Kim         break;
1129c48c75eSJung-uk Kim 
1139c48c75eSJung-uk Kim     default:
114*a9d8d09cSJung-uk Kim 
1159c48c75eSJung-uk Kim         return (AE_AML_OPERAND_TYPE);
1169c48c75eSJung-uk Kim     }
1179c48c75eSJung-uk Kim 
1189c48c75eSJung-uk Kim     NewObject = AcpiUtCreateIntegerObject (Value);
1199c48c75eSJung-uk Kim     if (!NewObject)
1209c48c75eSJung-uk Kim     {
1219c48c75eSJung-uk Kim         return (AE_NO_MEMORY);
1229c48c75eSJung-uk Kim     }
1239c48c75eSJung-uk Kim 
1249c48c75eSJung-uk Kim     *ReturnObject = NewObject;
1259c48c75eSJung-uk Kim     return (AE_OK);
1269c48c75eSJung-uk Kim }
1279c48c75eSJung-uk Kim 
1289c48c75eSJung-uk Kim 
1299c48c75eSJung-uk Kim /*******************************************************************************
1309c48c75eSJung-uk Kim  *
1319c48c75eSJung-uk Kim  * FUNCTION:    AcpiNsConvertToString
1329c48c75eSJung-uk Kim  *
1339c48c75eSJung-uk Kim  * PARAMETERS:  OriginalObject      - Object to be converted
1349c48c75eSJung-uk Kim  *              ReturnObject        - Where the new converted object is returned
1359c48c75eSJung-uk Kim  *
1369c48c75eSJung-uk Kim  * RETURN:      Status. AE_OK if conversion was successful.
1379c48c75eSJung-uk Kim  *
1389c48c75eSJung-uk Kim  * DESCRIPTION: Attempt to convert a Integer/Buffer object to a String.
1399c48c75eSJung-uk Kim  *
1409c48c75eSJung-uk Kim  ******************************************************************************/
1419c48c75eSJung-uk Kim 
1429c48c75eSJung-uk Kim ACPI_STATUS
1439c48c75eSJung-uk Kim AcpiNsConvertToString (
1449c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     *OriginalObject,
1459c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     **ReturnObject)
1469c48c75eSJung-uk Kim {
1479c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     *NewObject;
1489c48c75eSJung-uk Kim     ACPI_SIZE               Length;
1499c48c75eSJung-uk Kim     ACPI_STATUS             Status;
1509c48c75eSJung-uk Kim 
1519c48c75eSJung-uk Kim 
1529c48c75eSJung-uk Kim     switch (OriginalObject->Common.Type)
1539c48c75eSJung-uk Kim     {
1549c48c75eSJung-uk Kim     case ACPI_TYPE_INTEGER:
1559c48c75eSJung-uk Kim         /*
1569c48c75eSJung-uk Kim          * Integer-to-String conversion. Commonly, convert
1579c48c75eSJung-uk Kim          * an integer of value 0 to a NULL string. The last element of
1589c48c75eSJung-uk Kim          * _BIF and _BIX packages occasionally need this fix.
1599c48c75eSJung-uk Kim          */
1609c48c75eSJung-uk Kim         if (OriginalObject->Integer.Value == 0)
1619c48c75eSJung-uk Kim         {
1629c48c75eSJung-uk Kim             /* Allocate a new NULL string object */
1639c48c75eSJung-uk Kim 
1649c48c75eSJung-uk Kim             NewObject = AcpiUtCreateStringObject (0);
1659c48c75eSJung-uk Kim             if (!NewObject)
1669c48c75eSJung-uk Kim             {
1679c48c75eSJung-uk Kim                 return (AE_NO_MEMORY);
1689c48c75eSJung-uk Kim             }
1699c48c75eSJung-uk Kim         }
1709c48c75eSJung-uk Kim         else
1719c48c75eSJung-uk Kim         {
1729c48c75eSJung-uk Kim             Status = AcpiExConvertToString (OriginalObject, &NewObject,
1739c48c75eSJung-uk Kim                         ACPI_IMPLICIT_CONVERT_HEX);
1749c48c75eSJung-uk Kim             if (ACPI_FAILURE (Status))
1759c48c75eSJung-uk Kim             {
1769c48c75eSJung-uk Kim                 return (Status);
1779c48c75eSJung-uk Kim             }
1789c48c75eSJung-uk Kim         }
1799c48c75eSJung-uk Kim         break;
1809c48c75eSJung-uk Kim 
1819c48c75eSJung-uk Kim     case ACPI_TYPE_BUFFER:
1829c48c75eSJung-uk Kim         /*
1839c48c75eSJung-uk Kim          * Buffer-to-String conversion. Use a ToString
1849c48c75eSJung-uk Kim          * conversion, no transform performed on the buffer data. The best
1859c48c75eSJung-uk Kim          * example of this is the _BIF method, where the string data from
1869c48c75eSJung-uk Kim          * the battery is often (incorrectly) returned as buffer object(s).
1879c48c75eSJung-uk Kim          */
1889c48c75eSJung-uk Kim         Length = 0;
1899c48c75eSJung-uk Kim         while ((Length < OriginalObject->Buffer.Length) &&
1909c48c75eSJung-uk Kim                 (OriginalObject->Buffer.Pointer[Length]))
1919c48c75eSJung-uk Kim         {
1929c48c75eSJung-uk Kim             Length++;
1939c48c75eSJung-uk Kim         }
1949c48c75eSJung-uk Kim 
1959c48c75eSJung-uk Kim         /* Allocate a new string object */
1969c48c75eSJung-uk Kim 
1979c48c75eSJung-uk Kim         NewObject = AcpiUtCreateStringObject (Length);
1989c48c75eSJung-uk Kim         if (!NewObject)
1999c48c75eSJung-uk Kim         {
2009c48c75eSJung-uk Kim             return (AE_NO_MEMORY);
2019c48c75eSJung-uk Kim         }
2029c48c75eSJung-uk Kim 
2039c48c75eSJung-uk Kim         /*
2049c48c75eSJung-uk Kim          * Copy the raw buffer data with no transform. String is already NULL
2059c48c75eSJung-uk Kim          * terminated at Length+1.
2069c48c75eSJung-uk Kim          */
2079c48c75eSJung-uk Kim         ACPI_MEMCPY (NewObject->String.Pointer,
2089c48c75eSJung-uk Kim             OriginalObject->Buffer.Pointer, Length);
2099c48c75eSJung-uk Kim         break;
2109c48c75eSJung-uk Kim 
2119c48c75eSJung-uk Kim     default:
212*a9d8d09cSJung-uk Kim 
2139c48c75eSJung-uk Kim         return (AE_AML_OPERAND_TYPE);
2149c48c75eSJung-uk Kim     }
2159c48c75eSJung-uk Kim 
2169c48c75eSJung-uk Kim     *ReturnObject = NewObject;
2179c48c75eSJung-uk Kim     return (AE_OK);
2189c48c75eSJung-uk Kim }
2199c48c75eSJung-uk Kim 
2209c48c75eSJung-uk Kim 
2219c48c75eSJung-uk Kim /*******************************************************************************
2229c48c75eSJung-uk Kim  *
2239c48c75eSJung-uk Kim  * FUNCTION:    AcpiNsConvertToBuffer
2249c48c75eSJung-uk Kim  *
2259c48c75eSJung-uk Kim  * PARAMETERS:  OriginalObject      - Object to be converted
2269c48c75eSJung-uk Kim  *              ReturnObject        - Where the new converted object is returned
2279c48c75eSJung-uk Kim  *
2289c48c75eSJung-uk Kim  * RETURN:      Status. AE_OK if conversion was successful.
2299c48c75eSJung-uk Kim  *
2309c48c75eSJung-uk Kim  * DESCRIPTION: Attempt to convert a Integer/String/Package object to a Buffer.
2319c48c75eSJung-uk Kim  *
2329c48c75eSJung-uk Kim  ******************************************************************************/
2339c48c75eSJung-uk Kim 
2349c48c75eSJung-uk Kim ACPI_STATUS
2359c48c75eSJung-uk Kim AcpiNsConvertToBuffer (
2369c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     *OriginalObject,
2379c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     **ReturnObject)
2389c48c75eSJung-uk Kim {
2399c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     *NewObject;
2409c48c75eSJung-uk Kim     ACPI_STATUS             Status;
2419c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     **Elements;
2429c48c75eSJung-uk Kim     UINT32                  *DwordBuffer;
2439c48c75eSJung-uk Kim     UINT32                  Count;
2449c48c75eSJung-uk Kim     UINT32                  i;
2459c48c75eSJung-uk Kim 
2469c48c75eSJung-uk Kim 
2479c48c75eSJung-uk Kim     switch (OriginalObject->Common.Type)
2489c48c75eSJung-uk Kim     {
2499c48c75eSJung-uk Kim     case ACPI_TYPE_INTEGER:
2509c48c75eSJung-uk Kim         /*
2519c48c75eSJung-uk Kim          * Integer-to-Buffer conversion.
2529c48c75eSJung-uk Kim          * Convert the Integer to a packed-byte buffer. _MAT and other
2539c48c75eSJung-uk Kim          * objects need this sometimes, if a read has been performed on a
2549c48c75eSJung-uk Kim          * Field object that is less than or equal to the global integer
2559c48c75eSJung-uk Kim          * size (32 or 64 bits).
2569c48c75eSJung-uk Kim          */
2579c48c75eSJung-uk Kim         Status = AcpiExConvertToBuffer (OriginalObject, &NewObject);
2589c48c75eSJung-uk Kim         if (ACPI_FAILURE (Status))
2599c48c75eSJung-uk Kim         {
2609c48c75eSJung-uk Kim             return (Status);
2619c48c75eSJung-uk Kim         }
2629c48c75eSJung-uk Kim         break;
2639c48c75eSJung-uk Kim 
2649c48c75eSJung-uk Kim     case ACPI_TYPE_STRING:
2659c48c75eSJung-uk Kim 
2669c48c75eSJung-uk Kim         /* String-to-Buffer conversion. Simple data copy */
2679c48c75eSJung-uk Kim 
2689c48c75eSJung-uk Kim         NewObject = AcpiUtCreateBufferObject (OriginalObject->String.Length);
2699c48c75eSJung-uk Kim         if (!NewObject)
2709c48c75eSJung-uk Kim         {
2719c48c75eSJung-uk Kim             return (AE_NO_MEMORY);
2729c48c75eSJung-uk Kim         }
2739c48c75eSJung-uk Kim 
2749c48c75eSJung-uk Kim         ACPI_MEMCPY (NewObject->Buffer.Pointer,
2759c48c75eSJung-uk Kim             OriginalObject->String.Pointer, OriginalObject->String.Length);
2769c48c75eSJung-uk Kim         break;
2779c48c75eSJung-uk Kim 
2789c48c75eSJung-uk Kim     case ACPI_TYPE_PACKAGE:
2799c48c75eSJung-uk Kim         /*
2809c48c75eSJung-uk Kim          * This case is often seen for predefined names that must return a
2819c48c75eSJung-uk Kim          * Buffer object with multiple DWORD integers within. For example,
2829c48c75eSJung-uk Kim          * _FDE and _GTM. The Package can be converted to a Buffer.
2839c48c75eSJung-uk Kim          */
2849c48c75eSJung-uk Kim 
2859c48c75eSJung-uk Kim         /* All elements of the Package must be integers */
2869c48c75eSJung-uk Kim 
2879c48c75eSJung-uk Kim         Elements = OriginalObject->Package.Elements;
2889c48c75eSJung-uk Kim         Count = OriginalObject->Package.Count;
2899c48c75eSJung-uk Kim 
2909c48c75eSJung-uk Kim         for (i = 0; i < Count; i++)
2919c48c75eSJung-uk Kim         {
2929c48c75eSJung-uk Kim             if ((!*Elements) ||
2939c48c75eSJung-uk Kim                 ((*Elements)->Common.Type != ACPI_TYPE_INTEGER))
2949c48c75eSJung-uk Kim             {
2959c48c75eSJung-uk Kim                 return (AE_AML_OPERAND_TYPE);
2969c48c75eSJung-uk Kim             }
2979c48c75eSJung-uk Kim             Elements++;
2989c48c75eSJung-uk Kim         }
2999c48c75eSJung-uk Kim 
3009c48c75eSJung-uk Kim         /* Create the new buffer object to replace the Package */
3019c48c75eSJung-uk Kim 
3029c48c75eSJung-uk Kim         NewObject = AcpiUtCreateBufferObject (ACPI_MUL_4 (Count));
3039c48c75eSJung-uk Kim         if (!NewObject)
3049c48c75eSJung-uk Kim         {
3059c48c75eSJung-uk Kim             return (AE_NO_MEMORY);
3069c48c75eSJung-uk Kim         }
3079c48c75eSJung-uk Kim 
3089c48c75eSJung-uk Kim         /* Copy the package elements (integers) to the buffer as DWORDs */
3099c48c75eSJung-uk Kim 
3109c48c75eSJung-uk Kim         Elements = OriginalObject->Package.Elements;
3119c48c75eSJung-uk Kim         DwordBuffer = ACPI_CAST_PTR (UINT32, NewObject->Buffer.Pointer);
3129c48c75eSJung-uk Kim 
3139c48c75eSJung-uk Kim         for (i = 0; i < Count; i++)
3149c48c75eSJung-uk Kim         {
3159c48c75eSJung-uk Kim             *DwordBuffer = (UINT32) (*Elements)->Integer.Value;
3169c48c75eSJung-uk Kim             DwordBuffer++;
3179c48c75eSJung-uk Kim             Elements++;
3189c48c75eSJung-uk Kim         }
3199c48c75eSJung-uk Kim         break;
3209c48c75eSJung-uk Kim 
3219c48c75eSJung-uk Kim     default:
322*a9d8d09cSJung-uk Kim 
3239c48c75eSJung-uk Kim         return (AE_AML_OPERAND_TYPE);
3249c48c75eSJung-uk Kim     }
3259c48c75eSJung-uk Kim 
3269c48c75eSJung-uk Kim     *ReturnObject = NewObject;
3279c48c75eSJung-uk Kim     return (AE_OK);
3289c48c75eSJung-uk Kim }
3299c48c75eSJung-uk Kim 
3309c48c75eSJung-uk Kim 
3319c48c75eSJung-uk Kim /*******************************************************************************
3329c48c75eSJung-uk Kim  *
3339c48c75eSJung-uk Kim  * FUNCTION:    AcpiNsConvertToUnicode
3349c48c75eSJung-uk Kim  *
3359c48c75eSJung-uk Kim  * PARAMETERS:  OriginalObject      - ASCII String Object to be converted
3369c48c75eSJung-uk Kim  *              ReturnObject        - Where the new converted object is returned
3379c48c75eSJung-uk Kim  *
3389c48c75eSJung-uk Kim  * RETURN:      Status. AE_OK if conversion was successful.
3399c48c75eSJung-uk Kim  *
3409c48c75eSJung-uk Kim  * DESCRIPTION: Attempt to convert a String object to a Unicode string Buffer.
3419c48c75eSJung-uk Kim  *
3429c48c75eSJung-uk Kim  ******************************************************************************/
3439c48c75eSJung-uk Kim 
3449c48c75eSJung-uk Kim ACPI_STATUS
3459c48c75eSJung-uk Kim AcpiNsConvertToUnicode (
3469c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     *OriginalObject,
3479c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     **ReturnObject)
3489c48c75eSJung-uk Kim {
3499c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     *NewObject;
3509c48c75eSJung-uk Kim     char                    *AsciiString;
3519c48c75eSJung-uk Kim     UINT16                  *UnicodeBuffer;
3529c48c75eSJung-uk Kim     UINT32                  UnicodeLength;
3539c48c75eSJung-uk Kim     UINT32                  i;
3549c48c75eSJung-uk Kim 
3559c48c75eSJung-uk Kim 
3569c48c75eSJung-uk Kim     if (!OriginalObject)
3579c48c75eSJung-uk Kim     {
3589c48c75eSJung-uk Kim         return (AE_OK);
3599c48c75eSJung-uk Kim     }
3609c48c75eSJung-uk Kim 
3619c48c75eSJung-uk Kim     /* If a Buffer was returned, it must be at least two bytes long */
3629c48c75eSJung-uk Kim 
3639c48c75eSJung-uk Kim     if (OriginalObject->Common.Type == ACPI_TYPE_BUFFER)
3649c48c75eSJung-uk Kim     {
3659c48c75eSJung-uk Kim         if (OriginalObject->Buffer.Length < 2)
3669c48c75eSJung-uk Kim         {
3679c48c75eSJung-uk Kim             return (AE_AML_OPERAND_VALUE);
3689c48c75eSJung-uk Kim         }
3699c48c75eSJung-uk Kim 
3709c48c75eSJung-uk Kim         *ReturnObject = NULL;
3719c48c75eSJung-uk Kim         return (AE_OK);
3729c48c75eSJung-uk Kim     }
3739c48c75eSJung-uk Kim 
3749c48c75eSJung-uk Kim     /*
3759c48c75eSJung-uk Kim      * The original object is an ASCII string. Convert this string to
3769c48c75eSJung-uk Kim      * a unicode buffer.
3779c48c75eSJung-uk Kim      */
3789c48c75eSJung-uk Kim     AsciiString = OriginalObject->String.Pointer;
3799c48c75eSJung-uk Kim     UnicodeLength = (OriginalObject->String.Length * 2) + 2;
3809c48c75eSJung-uk Kim 
3819c48c75eSJung-uk Kim     /* Create a new buffer object for the Unicode data */
3829c48c75eSJung-uk Kim 
3839c48c75eSJung-uk Kim     NewObject = AcpiUtCreateBufferObject (UnicodeLength);
3849c48c75eSJung-uk Kim     if (!NewObject)
3859c48c75eSJung-uk Kim     {
3869c48c75eSJung-uk Kim         return (AE_NO_MEMORY);
3879c48c75eSJung-uk Kim     }
3889c48c75eSJung-uk Kim 
3899c48c75eSJung-uk Kim     UnicodeBuffer = ACPI_CAST_PTR (UINT16, NewObject->Buffer.Pointer);
3909c48c75eSJung-uk Kim 
3919c48c75eSJung-uk Kim     /* Convert ASCII to Unicode */
3929c48c75eSJung-uk Kim 
3939c48c75eSJung-uk Kim     for (i = 0; i < OriginalObject->String.Length; i++)
3949c48c75eSJung-uk Kim     {
3959c48c75eSJung-uk Kim         UnicodeBuffer[i] = (UINT16) AsciiString[i];
3969c48c75eSJung-uk Kim     }
3979c48c75eSJung-uk Kim 
3989c48c75eSJung-uk Kim     *ReturnObject = NewObject;
3999c48c75eSJung-uk Kim     return (AE_OK);
4009c48c75eSJung-uk Kim }
4019c48c75eSJung-uk Kim 
4029c48c75eSJung-uk Kim 
4039c48c75eSJung-uk Kim /*******************************************************************************
4049c48c75eSJung-uk Kim  *
4059c48c75eSJung-uk Kim  * FUNCTION:    AcpiNsConvertToResource
4069c48c75eSJung-uk Kim  *
4079c48c75eSJung-uk Kim  * PARAMETERS:  OriginalObject      - Object to be converted
4089c48c75eSJung-uk Kim  *              ReturnObject        - Where the new converted object is returned
4099c48c75eSJung-uk Kim  *
4109c48c75eSJung-uk Kim  * RETURN:      Status. AE_OK if conversion was successful
4119c48c75eSJung-uk Kim  *
4129c48c75eSJung-uk Kim  * DESCRIPTION: Attempt to convert a Integer object to a ResourceTemplate
4139c48c75eSJung-uk Kim  *              Buffer.
4149c48c75eSJung-uk Kim  *
4159c48c75eSJung-uk Kim  ******************************************************************************/
4169c48c75eSJung-uk Kim 
4179c48c75eSJung-uk Kim ACPI_STATUS
4189c48c75eSJung-uk Kim AcpiNsConvertToResource (
4199c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     *OriginalObject,
4209c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     **ReturnObject)
4219c48c75eSJung-uk Kim {
4229c48c75eSJung-uk Kim     ACPI_OPERAND_OBJECT     *NewObject;
4239c48c75eSJung-uk Kim     UINT8                   *Buffer;
4249c48c75eSJung-uk Kim 
4259c48c75eSJung-uk Kim 
4269c48c75eSJung-uk Kim     /*
4279c48c75eSJung-uk Kim      * We can fix the following cases for an expected resource template:
4289c48c75eSJung-uk Kim      * 1. No return value (interpreter slack mode is disabled)
4299c48c75eSJung-uk Kim      * 2. A "Return (Zero)" statement
4309c48c75eSJung-uk Kim      * 3. A "Return empty buffer" statement
4319c48c75eSJung-uk Kim      *
4329c48c75eSJung-uk Kim      * We will return a buffer containing a single EndTag
4339c48c75eSJung-uk Kim      * resource descriptor.
4349c48c75eSJung-uk Kim      */
4359c48c75eSJung-uk Kim     if (OriginalObject)
4369c48c75eSJung-uk Kim     {
4379c48c75eSJung-uk Kim         switch (OriginalObject->Common.Type)
4389c48c75eSJung-uk Kim         {
4399c48c75eSJung-uk Kim         case ACPI_TYPE_INTEGER:
4409c48c75eSJung-uk Kim 
4419c48c75eSJung-uk Kim             /* We can only repair an Integer==0 */
4429c48c75eSJung-uk Kim 
4439c48c75eSJung-uk Kim             if (OriginalObject->Integer.Value)
4449c48c75eSJung-uk Kim             {
4459c48c75eSJung-uk Kim                 return (AE_AML_OPERAND_TYPE);
4469c48c75eSJung-uk Kim             }
4479c48c75eSJung-uk Kim             break;
4489c48c75eSJung-uk Kim 
4499c48c75eSJung-uk Kim         case ACPI_TYPE_BUFFER:
4509c48c75eSJung-uk Kim 
4519c48c75eSJung-uk Kim             if (OriginalObject->Buffer.Length)
4529c48c75eSJung-uk Kim             {
4539c48c75eSJung-uk Kim                 /* Additional checks can be added in the future */
4549c48c75eSJung-uk Kim 
4559c48c75eSJung-uk Kim                 *ReturnObject = NULL;
4569c48c75eSJung-uk Kim                 return (AE_OK);
4579c48c75eSJung-uk Kim             }
4589c48c75eSJung-uk Kim             break;
4599c48c75eSJung-uk Kim 
4609c48c75eSJung-uk Kim         case ACPI_TYPE_STRING:
4619c48c75eSJung-uk Kim         default:
4629c48c75eSJung-uk Kim 
4639c48c75eSJung-uk Kim             return (AE_AML_OPERAND_TYPE);
4649c48c75eSJung-uk Kim         }
4659c48c75eSJung-uk Kim     }
4669c48c75eSJung-uk Kim 
4679c48c75eSJung-uk Kim     /* Create the new buffer object for the resource descriptor */
4689c48c75eSJung-uk Kim 
4699c48c75eSJung-uk Kim     NewObject = AcpiUtCreateBufferObject (2);
4709c48c75eSJung-uk Kim     if (!NewObject)
4719c48c75eSJung-uk Kim     {
4729c48c75eSJung-uk Kim         return (AE_NO_MEMORY);
4739c48c75eSJung-uk Kim     }
4749c48c75eSJung-uk Kim 
4759c48c75eSJung-uk Kim     Buffer = ACPI_CAST_PTR (UINT8, NewObject->Buffer.Pointer);
4769c48c75eSJung-uk Kim 
4779c48c75eSJung-uk Kim     /* Initialize the Buffer with a single EndTag descriptor */
4789c48c75eSJung-uk Kim 
4799c48c75eSJung-uk Kim     Buffer[0] = (ACPI_RESOURCE_NAME_END_TAG | ASL_RDESC_END_TAG_SIZE);
4809c48c75eSJung-uk Kim     Buffer[1] = 0x00;
4819c48c75eSJung-uk Kim 
4829c48c75eSJung-uk Kim     *ReturnObject = NewObject;
4839c48c75eSJung-uk Kim     return (AE_OK);
4849c48c75eSJung-uk Kim }
485