utcopy.c revision 52fc0b026e99b5d5d585095148d997d5634bbc25
11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/****************************************************************************** 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Module Name: utcopy - Internal to external object translation utilities 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *****************************************************************************/ 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 84a90c7e86202f46fa9af011bdbcdf36e355d1721Bob Moore * Copyright (C) 2000 - 2006, R. Byron Moore 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * All rights reserved. 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Redistribution and use in source and binary forms, with or without 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * modification, are permitted provided that the following conditions 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * are met: 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1. Redistributions of source code must retain the above copyright 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * notice, this list of conditions, and the following disclaimer, 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * without modification. 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2. Redistributions in binary form must reproduce at minimum a disclaimer 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * substantially similar to the "NO WARRANTY" disclaimer below 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ("Disclaimer") and any redistribution must be conditioned upon 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * including a substantially similar Disclaimer requirement for further 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * binary redistribution. 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3. Neither the names of the above-listed copyright holders nor the names 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * of any contributors may be used to endorse or promote products derived 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * from this software without specific prior written permission. 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Alternatively, this software may be distributed under the terms of the 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * GNU General Public License ("GPL") version 2 as published by the Free 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Software Foundation. 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * NO WARRANTY 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * POSSIBILITY OF SUCH DAMAGES. 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <acpi/acpi.h> 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <acpi/amlcode.h> 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _COMPONENT ACPI_UTILITIES 484be44fcd3bf648b782f4460fd06dfae6c42ded4bLen BrownACPI_MODULE_NAME("utcopy") 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5044f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore/* Local prototypes */ 5144f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status 524be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_isimple_to_esimple(union acpi_operand_object *internal_object, 534be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_object *external_object, 544be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u8 * data_space, acpi_size * buffer_space_used); 5544f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore 5644f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status 574be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_ielement_to_ielement(u8 object_type, 584be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *source_object, 594be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_generic_state *state, 604be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown void *context); 6144f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore 6244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status 634be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_ipackage_to_epackage(union acpi_operand_object *internal_object, 644be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u8 * buffer, acpi_size * space_used); 6544f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore 6644f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status 674be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_esimple_to_isimple(union acpi_object *user_obj, 684be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object **return_obj); 6944f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore 7044f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status 714be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_simple_object(union acpi_operand_object *source_desc, 724be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *dest_desc); 7344f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore 7444f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status 754be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_ielement_to_eelement(u8 object_type, 764be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *source_object, 774be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_generic_state *state, 784be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown void *context); 7944f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore 8044f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status 814be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_ipackage_to_ipackage(union acpi_operand_object *source_obj, 824be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *dest_obj, 834be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown struct acpi_walk_state *walk_state); 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_copy_isimple_to_esimple 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 8944f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * PARAMETERS: internal_object - Source object to be copied 9044f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * external_object - Where to return the copied object 9144f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * data_space - Where object data is returned (such as 9244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * buffer and string data) 9344f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * buffer_space_used - Length of data_space that was used 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 9744f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * DESCRIPTION: This function is called to copy a simple internal object to 9844f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * an external object. 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 10044f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * The data_space buffer is assumed to have sufficient space for 10144f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * the object. 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic acpi_status 1064be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_isimple_to_esimple(union acpi_operand_object *internal_object, 1074be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_object *external_object, 1084be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u8 * data_space, acpi_size * buffer_space_used) 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1104be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status = AE_OK; 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1124be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_FUNCTION_TRACE("ut_copy_isimple_to_esimple"); 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *buffer_space_used = 0; 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Check for NULL object case (could be an uninitialized 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * package element) 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!internal_object) { 1214be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_OK); 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Always clear the external object */ 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1264be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_MEMSET(external_object, 0, sizeof(union acpi_object)); 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * In general, the external object will be the same type as 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the internal object 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1324be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown external_object->type = ACPI_GET_OBJECT_TYPE(internal_object); 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* However, only a limited number of external types are supported */ 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1364be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown switch (ACPI_GET_OBJECT_TYPE(internal_object)) { 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_STRING: 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1394be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown external_object->string.pointer = (char *)data_space; 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds external_object->string.length = internal_object->string.length; 1414be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown *buffer_space_used = ACPI_ROUND_UP_TO_NATIVE_WORD((acpi_size) 1424be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown internal_object-> 1434be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown string. 1444be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown length + 1); 1454be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown 1464be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_MEMCPY((void *)data_space, 1474be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown (void *)internal_object->string.pointer, 1484be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown (acpi_size) internal_object->string.length + 1); 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_BUFFER: 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds external_object->buffer.pointer = data_space; 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds external_object->buffer.length = internal_object->buffer.length; 1554be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown *buffer_space_used = 1564be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_ROUND_UP_TO_NATIVE_WORD(internal_object->string. 1574be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown length); 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1594be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_MEMCPY((void *)data_space, 1604be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown (void *)internal_object->buffer.pointer, 1614be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown internal_object->buffer.length); 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_INTEGER: 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds external_object->integer.value = internal_object->integer.value; 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_LOCAL_REFERENCE: 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This is an object reference. Attempt to dereference it. 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (internal_object->reference.opcode) { 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AML_INT_NAMEPATH_OP: 1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* For namepath, return the object handle ("reference") */ 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Use the object type of "Any" to indicate a reference 1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * to object containing a handle to an ACPI named object. 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds external_object->type = ACPI_TYPE_ANY; 1854be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown external_object->reference.handle = 1864be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown internal_object->reference.node; 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_PROCESSOR: 1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1934be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown external_object->processor.proc_id = 1944be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown internal_object->processor.proc_id; 1954be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown external_object->processor.pblk_address = 1964be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown internal_object->processor.address; 1974be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown external_object->processor.pblk_length = 1984be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown internal_object->processor.length; 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_POWER: 2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds external_object->power_resource.system_level = 2044be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown internal_object->power_resource.system_level; 2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds external_object->power_resource.resource_order = 2074be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown internal_object->power_resource.resource_order; 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * There is no corresponding external object type 2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2144be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_SUPPORT); 2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2174be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_copy_ielement_to_eelement 2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS: acpi_pkg_callback 2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Copy one package element to another package element 2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 23244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status 2334be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_ielement_to_eelement(u8 object_type, 2344be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *source_object, 2354be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_generic_state *state, 2364be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown void *context) 2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2384be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status = AE_OK; 2394be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown struct acpi_pkg_info *info = (struct acpi_pkg_info *)context; 2404be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_size object_space; 2414be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u32 this_index; 2424be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_object *target_object; 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2444be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_FUNCTION_ENTRY(); 2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2464be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown this_index = state->pkg.index; 2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds target_object = (union acpi_object *) 2484be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown &((union acpi_object *)(state->pkg.dest_object))->package. 2494be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown elements[this_index]; 2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (object_type) { 2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_COPY_TYPE_SIMPLE: 2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This is a simple or null object 2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2574be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = acpi_ut_copy_isimple_to_esimple(source_object, 2584be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown target_object, 2594be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown info->free_space, 2604be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown &object_space); 2614be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (status); 2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_COPY_TYPE_PACKAGE: 2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Build the package object 2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2714be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown target_object->type = ACPI_TYPE_PACKAGE; 2724be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown target_object->package.count = source_object->package.count; 27344f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore target_object->package.elements = 2744be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_CAST_PTR(union acpi_object, info->free_space); 2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Pass the new package object back to the package walk routine 2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds state->pkg.this_target_obj = target_object; 2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Save space for the array of objects (Package elements) 2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * update the buffer length counter 2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2854be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown object_space = ACPI_ROUND_UP_TO_NATIVE_WORD((acpi_size) 2864be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown target_object-> 2874be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown package.count * 2884be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown sizeof(union 2894be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_object)); 2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (AE_BAD_PARAMETER); 2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2964be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown info->free_space += object_space; 2974be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown info->length += object_space; 2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (status); 2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_copy_ipackage_to_epackage 3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 30544f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * PARAMETERS: internal_object - Pointer to the object we are returning 30644f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * Buffer - Where the object is returned 30744f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * space_used - Where the object length is returned 3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: This function is called to place a package object in a user 3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * buffer. A package object by definition contains other objects. 3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The buffer is assumed to have sufficient space for the object. 3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The caller must have verified the buffer length needed using the 3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * acpi_ut_get_object_size function before calling this function. 3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic acpi_status 3214be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_ipackage_to_epackage(union acpi_operand_object *internal_object, 3224be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u8 * buffer, acpi_size * space_used) 3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3244be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_object *external_object; 3254be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status; 3264be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown struct acpi_pkg_info info; 3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3284be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_FUNCTION_TRACE("ut_copy_ipackage_to_epackage"); 3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * First package at head of the buffer 3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3334be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown external_object = ACPI_CAST_PTR(union acpi_object, buffer); 3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Free space begins right after the first package 3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3384be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown info.length = ACPI_ROUND_UP_TO_NATIVE_WORD(sizeof(union acpi_object)); 3394be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown info.free_space = 3404be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown buffer + ACPI_ROUND_UP_TO_NATIVE_WORD(sizeof(union acpi_object)); 3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds info.object_space = 0; 3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds info.num_packages = 1; 3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3444be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown external_object->type = ACPI_GET_OBJECT_TYPE(internal_object); 3454be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown external_object->package.count = internal_object->package.count; 3464be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown external_object->package.elements = ACPI_CAST_PTR(union acpi_object, 3474be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown info.free_space); 3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Leave room for an array of ACPI_OBJECTS in the buffer 3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * and move the free space past it 3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3534be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown info.length += (acpi_size) external_object->package.count * 3544be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_ROUND_UP_TO_NATIVE_WORD(sizeof(union acpi_object)); 3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds info.free_space += external_object->package.count * 3564be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_ROUND_UP_TO_NATIVE_WORD(sizeof(union acpi_object)); 3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3584be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = acpi_ut_walk_package_tree(internal_object, external_object, 3594be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_copy_ielement_to_eelement, 3604be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown &info); 3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *space_used = info.length; 3634be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_copy_iobject_to_eobject 3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 37044f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * PARAMETERS: internal_object - The internal object to be converted 37144f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * buffer_ptr - Where the object is returned 3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: This function is called to build an API object to be returned to 3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the caller. 3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status 3814be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_iobject_to_eobject(union acpi_operand_object *internal_object, 3824be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown struct acpi_buffer *ret_buffer) 3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3844be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status; 3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3864be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_FUNCTION_TRACE("ut_copy_iobject_to_eobject"); 3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3884be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_GET_OBJECT_TYPE(internal_object) == ACPI_TYPE_PACKAGE) { 3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Package object: Copy all subobjects (including 3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * nested packages) 3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3934be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = acpi_ut_copy_ipackage_to_epackage(internal_object, 3944be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ret_buffer->pointer, 3954be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown &ret_buffer->length); 3964be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown } else { 3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Build a simple object (no nested objects) 3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4004be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = acpi_ut_copy_isimple_to_esimple(internal_object, 401c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore ACPI_CAST_PTR(union 402c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore acpi_object, 403c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore ret_buffer-> 404c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore pointer), 405c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore ACPI_ADD_PTR(u8, 406c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore ret_buffer-> 407c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore pointer, 408c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore ACPI_ROUND_UP_TO_NATIVE_WORD 409c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore (sizeof 410c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore (union 411c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore acpi_object))), 4124be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown &ret_buffer->length); 4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * build simple does not include the object size in the length 4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * so we add it in here 4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4174be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ret_buffer->length += sizeof(union acpi_object); 4181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4204be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_copy_esimple_to_isimple 4261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 42744f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * PARAMETERS: external_object - The external object to be converted 42844f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * ret_internal_object - Where the internal object is returned 4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: This function copies an external object to an internal one. 4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * NOTE: Pointers can be copied, we don't need to copy data. 4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (The pointers have to be valid in our address space no matter 4351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * what we do with them!) 4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 43944f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status 4404be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_esimple_to_isimple(union acpi_object *external_object, 4414be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object **ret_internal_object) 4421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4434be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *internal_object; 4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4454be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_FUNCTION_TRACE("ut_copy_esimple_to_isimple"); 4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Simple types supported are: String, Buffer, Integer 4491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (external_object->type) { 4511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_STRING: 4521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_BUFFER: 4531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_INTEGER: 4541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4554be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown internal_object = acpi_ut_create_internal_object((u8) 4564be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown external_object-> 4574be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown type); 4581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!internal_object) { 4594be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_NO_MEMORY); 4601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 4641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* All other types are not supported */ 4651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4664be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_SUPPORT); 4671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Must COPY string and buffer contents */ 4701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (external_object->type) { 4721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_STRING: 4731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds internal_object->string.pointer = 4754be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_MEM_CALLOCATE((acpi_size) external_object->string. 4764be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown length + 1); 4771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!internal_object->string.pointer) { 4781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds goto error_exit; 4791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4814be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_MEMCPY(internal_object->string.pointer, 4824be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown external_object->string.pointer, 4834be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown external_object->string.length); 4841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds internal_object->string.length = external_object->string.length; 4861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_BUFFER: 4891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds internal_object->buffer.pointer = 4914be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_MEM_CALLOCATE(external_object->buffer.length); 4921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!internal_object->buffer.pointer) { 4931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds goto error_exit; 4941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4964be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_MEMCPY(internal_object->buffer.pointer, 4974be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown external_object->buffer.pointer, 4984be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown external_object->buffer.length); 4991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds internal_object->buffer.length = external_object->buffer.length; 5011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_INTEGER: 5041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5054be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown internal_object->integer.value = external_object->integer.value; 5061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 5091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Other types can't get here */ 5101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *ret_internal_object = internal_object; 5144be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_OK); 5151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5164be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown error_exit: 5174be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_remove_reference(internal_object); 5184be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_NO_MEMORY); 5191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 5201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef ACPI_FUTURE_IMPLEMENTATION 5221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Code to convert packages that are parameters to control methods */ 5231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 5251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_copy_epackage_to_ipackage 5271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS: *internal_object - Pointer to the object we are returning 5291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * *Buffer - Where the object is returned 5301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * *space_used - Where the length of the object is returned 5311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 5331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: This function is called to place a package object in a user 5351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * buffer. A package object by definition contains other objects. 5361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The buffer is assumed to have sufficient space for the object. 5381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The caller must have verified the buffer length needed using the 5391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * acpi_ut_get_object_size function before calling this function. 5401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 5421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic acpi_status 5444be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_epackage_to_ipackage(union acpi_operand_object *internal_object, 5454be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u8 * buffer, u32 * space_used) 5461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 5474be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u8 *free_space; 5484be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_object *external_object; 5494be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u32 length = 0; 5504be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u32 this_index; 5514be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u32 object_space = 0; 5524be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *this_internal_obj; 5534be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_object *this_external_obj; 5541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5554be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_FUNCTION_TRACE("ut_copy_epackage_to_ipackage"); 5561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 5581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * First package at head of the buffer 5591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds external_object = (union acpi_object *)buffer; 5611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 5631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Free space begins right after the first package 5641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds free_space = buffer + sizeof(union acpi_object); 5661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5674be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown external_object->type = ACPI_GET_OBJECT_TYPE(internal_object); 5684be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown external_object->package.count = internal_object->package.count; 5694be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown external_object->package.elements = (union acpi_object *)free_space; 5701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 5721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Build an array of ACPI_OBJECTS in the buffer 5731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * and move the free space past it 5741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5754be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown free_space += 5764be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown external_object->package.count * sizeof(union acpi_object); 5771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Call walk_package */ 5791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 5811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5824be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown#endif /* Future implementation */ 5831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 5851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_copy_eobject_to_iobject 5871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS: *internal_object - The external object to be converted 5891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * *buffer_ptr - Where the internal object is returned 5901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status - the status of the call 5921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Converts an external object to an internal object. 5941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 5961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status 5984be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_eobject_to_iobject(union acpi_object *external_object, 5994be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object **internal_object) 6001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 6014be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status; 6021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6034be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_FUNCTION_TRACE("ut_copy_eobject_to_iobject"); 6041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (external_object->type == ACPI_TYPE_PACKAGE) { 6061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 6071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Packages as external input to control methods are not supported, 6081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 609b8e4d89357fc434618a59c1047cac72641191805Bob Moore ACPI_ERROR((AE_INFO, 610b8e4d89357fc434618a59c1047cac72641191805Bob Moore "Packages as parameters not implemented!")); 6111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6124be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_NOT_IMPLEMENTED); 6131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else { 6161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 6171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Build a simple object (no nested objects) 6181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6194be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = 6204be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_copy_esimple_to_isimple(external_object, 6214be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown internal_object); 6221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6244be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 6251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 6261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 6281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_copy_simple_object 6301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS: source_desc - The internal object to be copied 6321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * dest_desc - New target object 6331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 6351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Simple copy of one internal object to another. Reference count 6371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * of the destination object is preserved. 6381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 6401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 64144f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status 6424be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_simple_object(union acpi_operand_object *source_desc, 6434be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *dest_desc) 6441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 6454be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u16 reference_count; 6464be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *next_object; 6471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Save fields from destination that we don't want to overwrite */ 6491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds reference_count = dest_desc->common.reference_count; 6511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds next_object = dest_desc->common.next_object; 6521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6534be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown /* Copy the entire source object over the destination object */ 6541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6554be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_MEMCPY((char *)dest_desc, (char *)source_desc, 6564be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown sizeof(union acpi_operand_object)); 6571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Restore the saved fields */ 6591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dest_desc->common.reference_count = reference_count; 6611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dest_desc->common.next_object = next_object; 6621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6636f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore /* New object is not static, regardless of source */ 6646f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore 6656f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore dest_desc->common.flags &= ~AOPOBJ_STATIC_POINTER; 6666f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore 6671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Handle the objects with extra data */ 6681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6694be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown switch (ACPI_GET_OBJECT_TYPE(dest_desc)) { 6701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_BUFFER: 6711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 6721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Allocate and copy the actual buffer if and only if: 6731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1) There is a valid buffer pointer 6746f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore * 2) The buffer has a length > 0 6751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((source_desc->buffer.pointer) && 6774be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown (source_desc->buffer.length)) { 6786f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore dest_desc->buffer.pointer = 6794be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_MEM_ALLOCATE(source_desc->buffer.length); 6806f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore if (!dest_desc->buffer.pointer) { 6816f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore return (AE_NO_MEMORY); 6826f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore } 6831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6846f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore /* Copy the actual buffer data */ 6851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6864be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_MEMCPY(dest_desc->buffer.pointer, 6874be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown source_desc->buffer.pointer, 6884be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown source_desc->buffer.length); 6891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 6911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_STRING: 6931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 6941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Allocate and copy the actual string if and only if: 6951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1) There is a valid string pointer 6966f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore * (Pointer to a NULL string is allowed) 6971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6986f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore if (source_desc->string.pointer) { 6991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dest_desc->string.pointer = 7004be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_MEM_ALLOCATE((acpi_size) source_desc->string. 7014be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown length + 1); 7021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!dest_desc->string.pointer) { 7031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (AE_NO_MEMORY); 7041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7066f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore /* Copy the actual string data */ 7076f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore 7084be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_MEMCPY(dest_desc->string.pointer, 7094be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown source_desc->string.pointer, 7104be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown (acpi_size) source_desc->string.length + 1); 7111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 7131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_LOCAL_REFERENCE: 7151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 7161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * We copied the reference object, so we now must add a reference 7171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * to the object pointed to by the reference 7181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7194be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_add_reference(source_desc->reference.object); 7201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 7211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 7231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Nothing to do for other simple objects */ 7241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 7251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (AE_OK); 7281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 7291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 7311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 7321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_copy_ielement_to_ielement 7331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 7341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS: acpi_pkg_callback 7351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 7361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 7371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 7381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Copy one package element to another package element 7391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 7401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 7411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 74244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status 7434be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_ielement_to_ielement(u8 object_type, 7444be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *source_object, 7454be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_generic_state *state, 7464be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown void *context) 7471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 7484be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status = AE_OK; 7494be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u32 this_index; 7504be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object **this_target_ptr; 7514be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *target_object; 7521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7534be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_FUNCTION_ENTRY(); 7541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7554be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown this_index = state->pkg.index; 7561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds this_target_ptr = (union acpi_operand_object **) 7574be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown &state->pkg.dest_object->package.elements[this_index]; 7581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (object_type) { 7601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_COPY_TYPE_SIMPLE: 7611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* A null source object indicates a (legal) null package element */ 7631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (source_object) { 7651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 7661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This is a simple object, just copy it 7671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7684be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown target_object = 7694be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_create_internal_object(ACPI_GET_OBJECT_TYPE 7704be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown (source_object)); 7711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!target_object) { 7721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (AE_NO_MEMORY); 7731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7754be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = 7764be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_copy_simple_object(source_object, 7774be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown target_object); 7784be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 7791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds goto error_exit; 7801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *this_target_ptr = target_object; 7834be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown } else { 7841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Pass through a null element */ 7851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *this_target_ptr = NULL; 7871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 7891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_COPY_TYPE_PACKAGE: 7911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 7931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This object is a package - go down another nesting level 7941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Create and build the package object 7951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7964be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown target_object = 7974be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_create_internal_object(ACPI_TYPE_PACKAGE); 7981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!target_object) { 7991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (AE_NO_MEMORY); 8001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 8011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds target_object->package.count = source_object->package.count; 8031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds target_object->common.flags = source_object->common.flags; 8041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 8061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Create the object array 8071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds target_object->package.elements = 8094be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_MEM_CALLOCATE(((acpi_size) source_object->package. 8104be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown count + 1) * sizeof(void *)); 8111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!target_object->package.elements) { 8121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds status = AE_NO_MEMORY; 8131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds goto error_exit; 8141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 8151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 8171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Pass the new package object back to the package walk routine 8181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds state->pkg.this_target_obj = target_object; 8201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 8221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Store the object pointer in the parent package object 8231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *this_target_ptr = target_object; 8251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 8261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 8281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (AE_BAD_PARAMETER); 8291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 8301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (status); 8321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8334be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown error_exit: 8344be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_remove_reference(target_object); 8351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (status); 8361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 8371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 8391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 8401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_copy_ipackage_to_ipackage 8411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 8421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS: *source_obj - Pointer to the source package object 8431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * *dest_obj - Where the internal object is returned 8441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 8451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status - the status of the call 8461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 8471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: This function is called to copy an internal package object 8481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * into another internal package object. 8491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 8501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 8511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 85244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status 8534be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_ipackage_to_ipackage(union acpi_operand_object *source_obj, 8544be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *dest_obj, 8554be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown struct acpi_walk_state *walk_state) 8561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 8574be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status = AE_OK; 8581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8594be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_FUNCTION_TRACE("ut_copy_ipackage_to_ipackage"); 8601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8614be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown dest_obj->common.type = ACPI_GET_OBJECT_TYPE(source_obj); 8624be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown dest_obj->common.flags = source_obj->common.flags; 8631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dest_obj->package.count = source_obj->package.count; 8641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 8661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Create the object array and walk the source package tree 8671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8684be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown dest_obj->package.elements = ACPI_MEM_CALLOCATE(((acpi_size) 8694be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown source_obj->package. 8704be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown count + 8714be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown 1) * sizeof(void *)); 8721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!dest_obj->package.elements) { 873b8e4d89357fc434618a59c1047cac72641191805Bob Moore ACPI_ERROR((AE_INFO, "Package allocation failure")); 8744be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_NO_MEMORY); 8751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 8761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 8781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copy the package element-by-element by walking the package "tree". 8791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This handles nested packages of arbitrary depth. 8801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8814be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = acpi_ut_walk_package_tree(source_obj, dest_obj, 8824be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_copy_ielement_to_ielement, 8834be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown walk_state); 8844be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 88552fc0b026e99b5d5d585095148d997d5634bbc25Bob Moore 8861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* On failure, delete the destination package object */ 8871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8884be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_remove_reference(dest_obj); 8891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 8901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8914be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 8921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 8931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 8951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 8961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_copy_iobject_to_iobject 8971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 8981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS: walk_state - Current walk state 8991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * source_desc - The internal object to be copied 9001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * dest_desc - Where the copied object is returned 9011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 9021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 9031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 9041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Copy an internal object to a new internal object 9051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 9061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 9071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status 9094be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_iobject_to_iobject(union acpi_operand_object *source_desc, 9104be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object **dest_desc, 9114be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown struct acpi_walk_state *walk_state) 9121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 9134be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status = AE_OK; 9141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9154be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_FUNCTION_TRACE("ut_copy_iobject_to_iobject"); 9161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Create the top level object */ 9181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9194be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown *dest_desc = 9204be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_create_internal_object(ACPI_GET_OBJECT_TYPE(source_desc)); 9211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!*dest_desc) { 9224be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_NO_MEMORY); 9231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 9241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Copy the object and possible subobjects */ 9261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9274be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_GET_OBJECT_TYPE(source_desc) == ACPI_TYPE_PACKAGE) { 9284be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = 9294be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_copy_ipackage_to_ipackage(source_desc, *dest_desc, 9304be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown walk_state); 9314be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown } else { 9324be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = acpi_ut_copy_simple_object(source_desc, *dest_desc); 9331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 9341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9354be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 9361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 937