1b2deadd5SBob Moore /****************************************************************************** 2b2deadd5SBob Moore * 3b2deadd5SBob Moore * Module Name: nsrepair - Repair for objects returned by predefined methods 4b2deadd5SBob Moore * 5b2deadd5SBob Moore *****************************************************************************/ 6b2deadd5SBob Moore 7b2deadd5SBob Moore /* 8b2deadd5SBob Moore * Copyright (C) 2000 - 2009, Intel Corp. 9b2deadd5SBob Moore * All rights reserved. 10b2deadd5SBob Moore * 11b2deadd5SBob Moore * Redistribution and use in source and binary forms, with or without 12b2deadd5SBob Moore * modification, are permitted provided that the following conditions 13b2deadd5SBob Moore * are met: 14b2deadd5SBob Moore * 1. Redistributions of source code must retain the above copyright 15b2deadd5SBob Moore * notice, this list of conditions, and the following disclaimer, 16b2deadd5SBob Moore * without modification. 17b2deadd5SBob Moore * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18b2deadd5SBob Moore * substantially similar to the "NO WARRANTY" disclaimer below 19b2deadd5SBob Moore * ("Disclaimer") and any redistribution must be conditioned upon 20b2deadd5SBob Moore * including a substantially similar Disclaimer requirement for further 21b2deadd5SBob Moore * binary redistribution. 22b2deadd5SBob Moore * 3. Neither the names of the above-listed copyright holders nor the names 23b2deadd5SBob Moore * of any contributors may be used to endorse or promote products derived 24b2deadd5SBob Moore * from this software without specific prior written permission. 25b2deadd5SBob Moore * 26b2deadd5SBob Moore * Alternatively, this software may be distributed under the terms of the 27b2deadd5SBob Moore * GNU General Public License ("GPL") version 2 as published by the Free 28b2deadd5SBob Moore * Software Foundation. 29b2deadd5SBob Moore * 30b2deadd5SBob Moore * NO WARRANTY 31b2deadd5SBob Moore * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32b2deadd5SBob Moore * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33b2deadd5SBob Moore * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34b2deadd5SBob Moore * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35b2deadd5SBob Moore * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36b2deadd5SBob Moore * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37b2deadd5SBob Moore * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38b2deadd5SBob Moore * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39b2deadd5SBob Moore * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40b2deadd5SBob Moore * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41b2deadd5SBob Moore * POSSIBILITY OF SUCH DAMAGES. 42b2deadd5SBob Moore */ 43b2deadd5SBob Moore 44b2deadd5SBob Moore #include <acpi/acpi.h> 45b2deadd5SBob Moore #include "accommon.h" 46b2deadd5SBob Moore #include "acnamesp.h" 47b2deadd5SBob Moore #include "acpredef.h" 48b2deadd5SBob Moore 49b2deadd5SBob Moore #define _COMPONENT ACPI_NAMESPACE 50b2deadd5SBob Moore ACPI_MODULE_NAME("nsrepair") 51b2deadd5SBob Moore 52b2deadd5SBob Moore /******************************************************************************* 53b2deadd5SBob Moore * 54b2deadd5SBob Moore * FUNCTION: acpi_ns_repair_object 55b2deadd5SBob Moore * 56b2deadd5SBob Moore * PARAMETERS: Data - Pointer to validation data structure 57b2deadd5SBob Moore * expected_btypes - Object types expected 58b2deadd5SBob Moore * package_index - Index of object within parent package (if 59b2deadd5SBob Moore * applicable - ACPI_NOT_PACKAGE_ELEMENT 60b2deadd5SBob Moore * otherwise) 61b2deadd5SBob Moore * return_object_ptr - Pointer to the object returned from the 62b2deadd5SBob Moore * evaluation of a method or object 63b2deadd5SBob Moore * 64b2deadd5SBob Moore * RETURN: Status. AE_OK if repair was successful. 65b2deadd5SBob Moore * 66b2deadd5SBob Moore * DESCRIPTION: Attempt to repair/convert a return object of a type that was 67b2deadd5SBob Moore * not expected. 68b2deadd5SBob Moore * 69b2deadd5SBob Moore ******************************************************************************/ 70b2deadd5SBob Moore acpi_status 71b2deadd5SBob Moore acpi_ns_repair_object(struct acpi_predefined_data *data, 72b2deadd5SBob Moore u32 expected_btypes, 73b2deadd5SBob Moore u32 package_index, 74b2deadd5SBob Moore union acpi_operand_object **return_object_ptr) 75b2deadd5SBob Moore { 76b2deadd5SBob Moore union acpi_operand_object *return_object = *return_object_ptr; 77b2deadd5SBob Moore union acpi_operand_object *new_object; 78b2deadd5SBob Moore acpi_size length; 79b2deadd5SBob Moore 80b2deadd5SBob Moore switch (return_object->common.type) { 81b2deadd5SBob Moore case ACPI_TYPE_BUFFER: 82b2deadd5SBob Moore 83b2deadd5SBob Moore /* Does the method/object legally return a string? */ 84b2deadd5SBob Moore 85b2deadd5SBob Moore if (!(expected_btypes & ACPI_RTYPE_STRING)) { 86b2deadd5SBob Moore return (AE_AML_OPERAND_TYPE); 87b2deadd5SBob Moore } 88b2deadd5SBob Moore 89b2deadd5SBob Moore /* 90b2deadd5SBob Moore * Have a Buffer, expected a String, convert. Use a to_string 91b2deadd5SBob Moore * conversion, no transform performed on the buffer data. The best 92b2deadd5SBob Moore * example of this is the _BIF method, where the string data from 93b2deadd5SBob Moore * the battery is often (incorrectly) returned as buffer object(s). 94b2deadd5SBob Moore */ 95b2deadd5SBob Moore length = 0; 96b2deadd5SBob Moore while ((length < return_object->buffer.length) && 97b2deadd5SBob Moore (return_object->buffer.pointer[length])) { 98b2deadd5SBob Moore length++; 99b2deadd5SBob Moore } 100b2deadd5SBob Moore 101b2deadd5SBob Moore /* Allocate a new string object */ 102b2deadd5SBob Moore 103b2deadd5SBob Moore new_object = acpi_ut_create_string_object(length); 104b2deadd5SBob Moore if (!new_object) { 105b2deadd5SBob Moore return (AE_NO_MEMORY); 106b2deadd5SBob Moore } 107b2deadd5SBob Moore 108b2deadd5SBob Moore /* 109b2deadd5SBob Moore * Copy the raw buffer data with no transform. String is already NULL 110b2deadd5SBob Moore * terminated at Length+1. 111b2deadd5SBob Moore */ 112b2deadd5SBob Moore ACPI_MEMCPY(new_object->string.pointer, 113b2deadd5SBob Moore return_object->buffer.pointer, length); 114b2deadd5SBob Moore 115b2deadd5SBob Moore /* 116b2deadd5SBob Moore * If the original object is a package element, we need to: 117b2deadd5SBob Moore * 1. Set the reference count of the new object to match the 118b2deadd5SBob Moore * reference count of the old object. 119b2deadd5SBob Moore * 2. Decrement the reference count of the original object. 120b2deadd5SBob Moore */ 121b2deadd5SBob Moore if (package_index != ACPI_NOT_PACKAGE_ELEMENT) { 122b2deadd5SBob Moore new_object->common.reference_count = 123b2deadd5SBob Moore return_object->common.reference_count; 124b2deadd5SBob Moore 125b2deadd5SBob Moore if (return_object->common.reference_count > 1) { 126b2deadd5SBob Moore return_object->common.reference_count--; 127b2deadd5SBob Moore } 128b2deadd5SBob Moore 129b2deadd5SBob Moore ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, 130b2deadd5SBob Moore data->node_flags, 131b2deadd5SBob Moore "Converted Buffer to expected String at index %u", 132b2deadd5SBob Moore package_index)); 133b2deadd5SBob Moore } else { 134b2deadd5SBob Moore ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, 135b2deadd5SBob Moore data->node_flags, 136b2deadd5SBob Moore "Converted Buffer to expected String")); 137b2deadd5SBob Moore } 138b2deadd5SBob Moore 139b2deadd5SBob Moore /* Delete old object, install the new return object */ 140b2deadd5SBob Moore 141b2deadd5SBob Moore acpi_ut_remove_reference(return_object); 142b2deadd5SBob Moore *return_object_ptr = new_object; 143b2deadd5SBob Moore data->flags |= ACPI_OBJECT_REPAIRED; 144b2deadd5SBob Moore return (AE_OK); 145b2deadd5SBob Moore 146b2deadd5SBob Moore default: 147b2deadd5SBob Moore break; 148b2deadd5SBob Moore } 149b2deadd5SBob Moore 150b2deadd5SBob Moore return (AE_AML_OPERAND_TYPE); 151b2deadd5SBob Moore } 152