nspredef.c revision e2f7a7772880458edff1b1cc5a988947229fac26
1e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/****************************************************************************** 2e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 3e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Module Name: nspredef - Validation of ACPI predefined methods and objects 4e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * $Revision: 1.1 $ 5e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 6e8707b340fb5b6313cde784b944a568dfd770dddBob Moore *****************************************************************************/ 7e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 8e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/* 9e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Copyright (C) 2000 - 2008, Intel Corp. 10e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * All rights reserved. 11e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 12e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Redistribution and use in source and binary forms, with or without 13e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * modification, are permitted provided that the following conditions 14e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * are met: 15e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 1. Redistributions of source code must retain the above copyright 16e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * notice, this list of conditions, and the following disclaimer, 17e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * without modification. 18e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 2. Redistributions in binary form must reproduce at minimum a disclaimer 19e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * substantially similar to the "NO WARRANTY" disclaimer below 20e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * ("Disclaimer") and any redistribution must be conditioned upon 21e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * including a substantially similar Disclaimer requirement for further 22e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * binary redistribution. 23e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 3. Neither the names of the above-listed copyright holders nor the names 24e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * of any contributors may be used to endorse or promote products derived 25e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * from this software without specific prior written permission. 26e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 27e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Alternatively, this software may be distributed under the terms of the 28e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * GNU General Public License ("GPL") version 2 as published by the Free 29e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Software Foundation. 30e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 31e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * NO WARRANTY 32e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 33e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 34e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 35e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 36e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 37e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 38e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 39e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 40e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 41e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 42e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * POSSIBILITY OF SUCH DAMAGES. 43e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 44e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 45e8707b340fb5b6313cde784b944a568dfd770dddBob Moore#include <acpi/acpi.h> 46e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "accommon.h" 47e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "acnamesp.h" 48e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "acpredef.h" 49e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 50e8707b340fb5b6313cde784b944a568dfd770dddBob Moore#define _COMPONENT ACPI_NAMESPACE 51e8707b340fb5b6313cde784b944a568dfd770dddBob MooreACPI_MODULE_NAME("nspredef") 52e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 53e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/******************************************************************************* 54e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 55e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * This module validates predefined ACPI objects that appear in the namespace, 56e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * at the time they are evaluated (via acpi_evaluate_object). The purpose of this 57e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * validation is to detect problems with BIOS-exposed predefined ACPI objects 58e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * before the results are returned to the ACPI-related drivers. 59e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 60e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * There are several areas that are validated: 61e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 62e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 1) The number of input arguments as defined by the method/object in the 63e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * ASL is validated against the ACPI specification. 64e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 2) The type of the return object (if any) is validated against the ACPI 65e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * specification. 66e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 3) For returned package objects, the count of package elements is 67e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * validated, as well as the type of each package element. Nested 68e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * packages are supported. 69e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 70e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * For any problems found, a warning message is issued. 71e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 72e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ******************************************************************************/ 73e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/* Local prototypes */ 74e8707b340fb5b6313cde784b944a568dfd770dddBob Moorestatic acpi_status 75e8707b340fb5b6313cde784b944a568dfd770dddBob Mooreacpi_ns_check_package(char *pathname, 76a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore union acpi_operand_object **return_object_ptr, 77e8707b340fb5b6313cde784b944a568dfd770dddBob Moore const union acpi_predefined_info *predefined); 78e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 79e8707b340fb5b6313cde784b944a568dfd770dddBob Moorestatic acpi_status 80e8707b340fb5b6313cde784b944a568dfd770dddBob Mooreacpi_ns_check_package_elements(char *pathname, 81e8707b340fb5b6313cde784b944a568dfd770dddBob Moore union acpi_operand_object **elements, 82e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u8 type1, u32 count1, u8 type2, u32 count2); 83e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 84e8707b340fb5b6313cde784b944a568dfd770dddBob Moorestatic acpi_status 85e8707b340fb5b6313cde784b944a568dfd770dddBob Mooreacpi_ns_check_object_type(char *pathname, 86a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore union acpi_operand_object **return_object_ptr, 87e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 expected_btypes, u32 package_index); 88e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 89e8707b340fb5b6313cde784b944a568dfd770dddBob Moorestatic acpi_status 90e8707b340fb5b6313cde784b944a568dfd770dddBob Mooreacpi_ns_check_reference(char *pathname, 91e8707b340fb5b6313cde784b944a568dfd770dddBob Moore union acpi_operand_object *return_object); 92e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 93a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moorestatic acpi_status 94a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Mooreacpi_ns_repair_object(u32 expected_btypes, 95a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore u32 package_index, 96a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore union acpi_operand_object **return_object_ptr); 97a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore 98e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/* 99e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Names for the types that can be returned by the predefined objects. 100e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Used for warning messages. Must be in the same order as the ACPI_RTYPEs 101e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 102e8707b340fb5b6313cde784b944a568dfd770dddBob Moorestatic const char *acpi_rtype_names[] = { 103e8707b340fb5b6313cde784b944a568dfd770dddBob Moore "/Integer", 104e8707b340fb5b6313cde784b944a568dfd770dddBob Moore "/String", 105e8707b340fb5b6313cde784b944a568dfd770dddBob Moore "/Buffer", 106e8707b340fb5b6313cde784b944a568dfd770dddBob Moore "/Package", 107e8707b340fb5b6313cde784b944a568dfd770dddBob Moore "/Reference", 108e8707b340fb5b6313cde784b944a568dfd770dddBob Moore}; 109e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 110e8707b340fb5b6313cde784b944a568dfd770dddBob Moore#define ACPI_NOT_PACKAGE ACPI_UINT32_MAX 111e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 112e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/******************************************************************************* 113e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 114e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * FUNCTION: acpi_ns_check_predefined_names 115e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 116e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * PARAMETERS: Node - Namespace node for the method/object 117a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * return_object_ptr - Pointer to the object returned from the 118a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * evaluation of a method or object 119e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 120e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * RETURN: Status 121e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 122e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * DESCRIPTION: Check an ACPI name for a match in the predefined name list. 123e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 124e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ******************************************************************************/ 125e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 126e8707b340fb5b6313cde784b944a568dfd770dddBob Mooreacpi_status 127e8707b340fb5b6313cde784b944a568dfd770dddBob Mooreacpi_ns_check_predefined_names(struct acpi_namespace_node *node, 128eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore u32 user_param_count, 129eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore acpi_status return_status, 130a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore union acpi_operand_object **return_object_ptr) 131e8707b340fb5b6313cde784b944a568dfd770dddBob Moore{ 132a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore union acpi_operand_object *return_object = *return_object_ptr; 133e8707b340fb5b6313cde784b944a568dfd770dddBob Moore acpi_status status = AE_OK; 134e8707b340fb5b6313cde784b944a568dfd770dddBob Moore const union acpi_predefined_info *predefined; 135e8707b340fb5b6313cde784b944a568dfd770dddBob Moore char *pathname; 136e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 137e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Match the name for this method/object against the predefined list */ 138e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 139e8707b340fb5b6313cde784b944a568dfd770dddBob Moore predefined = acpi_ns_check_for_predefined_name(node); 140e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 141e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Get the full pathname to the object, for use in error messages */ 142e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 143e8707b340fb5b6313cde784b944a568dfd770dddBob Moore pathname = acpi_ns_get_external_pathname(node); 144e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (!pathname) { 145e8707b340fb5b6313cde784b944a568dfd770dddBob Moore pathname = ACPI_CAST_PTR(char, predefined->info.name); 146e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 147e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 148e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 149eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * Check that the parameter count for this method matches the ASL 150eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * definition. For predefined names, ensure that both the caller and 151eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * the method itself are in accordance with the ACPI specification. 152eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore */ 153eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore acpi_ns_check_parameter_count(pathname, node, user_param_count, 154eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore predefined); 155eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore 156eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore /* If not a predefined name, we cannot validate the return object */ 157eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore 158eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore if (!predefined) { 159eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore goto exit; 160eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore } 161eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore 162eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore /* If the method failed, we cannot validate the return object */ 163eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore 164eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore if ((return_status != AE_OK) && (return_status != AE_CTRL_RETURN_VALUE)) { 165eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore goto exit; 166eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore } 167eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore 168eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore /* 169eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * Only validate the return value on the first successful evaluation of 170eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * the method. This ensures that any warnings will only be emitted during 171eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * the very first evaluation of the method/object. 172e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 173eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore if (node->flags & ANOBJ_EVALUATED) { 174eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore goto exit; 175eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore } 176eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore 177eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore /* Mark the node as having been successfully evaluated */ 178eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore 179eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore node->flags |= ANOBJ_EVALUATED; 180e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 181e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 182e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * If there is no return value, check if we require a return value for 183e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * this predefined name. Either one return value is expected, or none, 184e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * for both methods and other objects. 185e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 186e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Exit now if there is no return object. Warning if one was expected. 187e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 188e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (!return_object) { 189e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if ((predefined->info.expected_btypes) && 190e8707b340fb5b6313cde784b944a568dfd770dddBob Moore (!(predefined->info.expected_btypes & ACPI_RTYPE_NONE))) { 191e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ACPI_ERROR((AE_INFO, 192e8707b340fb5b6313cde784b944a568dfd770dddBob Moore "%s: Missing expected return value", 193e8707b340fb5b6313cde784b944a568dfd770dddBob Moore pathname)); 194e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 195e8707b340fb5b6313cde784b944a568dfd770dddBob Moore status = AE_AML_NO_RETURN_VALUE; 196e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 197e8707b340fb5b6313cde784b944a568dfd770dddBob Moore goto exit; 198e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 199e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 200e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 201e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * We have a return value, but if one wasn't expected, just exit, this is 202e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * not a problem 203e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 204eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * For example, if the "Implicit Return" feature is enabled, methods will 205e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * always return a value 206e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 207e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (!predefined->info.expected_btypes) { 208e8707b340fb5b6313cde784b944a568dfd770dddBob Moore goto exit; 209e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 210e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 211e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 212e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Check that the type of the return object is what is expected for 213e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * this predefined name 214e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 215a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore status = acpi_ns_check_object_type(pathname, return_object_ptr, 216e8707b340fb5b6313cde784b944a568dfd770dddBob Moore predefined->info.expected_btypes, 217e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ACPI_NOT_PACKAGE); 218e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 219e8707b340fb5b6313cde784b944a568dfd770dddBob Moore goto exit; 220e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 221e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 222e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* For returned Package objects, check the type of all sub-objects */ 223e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 224e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_GET_OBJECT_TYPE(return_object) == ACPI_TYPE_PACKAGE) { 225e8707b340fb5b6313cde784b944a568dfd770dddBob Moore status = 226a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore acpi_ns_check_package(pathname, return_object_ptr, 227a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore predefined); 228e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 229e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 230e8707b340fb5b6313cde784b944a568dfd770dddBob Moore exit: 231eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore if (pathname != predefined->info.name) { 232e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ACPI_FREE(pathname); 233e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 234e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 235e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 236e8707b340fb5b6313cde784b944a568dfd770dddBob Moore} 237e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 238e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/******************************************************************************* 239e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 240e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * FUNCTION: acpi_ns_check_parameter_count 241e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 242e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * PARAMETERS: Pathname - Full pathname to the node (for error msgs) 243e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Node - Namespace node for the method/object 244eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * user_param_count - Number of args passed in by the caller 245e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Predefined - Pointer to entry in predefined name table 246e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 247e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * RETURN: None 248e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 249e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * DESCRIPTION: Check that the declared (in ASL/AML) parameter count for a 250e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * predefined name is what is expected (i.e., what is defined in 251e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * the ACPI specification for this predefined name.) 252e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 253e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ******************************************************************************/ 254e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 255e8707b340fb5b6313cde784b944a568dfd770dddBob Moorevoid 256e8707b340fb5b6313cde784b944a568dfd770dddBob Mooreacpi_ns_check_parameter_count(char *pathname, 257e8707b340fb5b6313cde784b944a568dfd770dddBob Moore struct acpi_namespace_node *node, 258eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore u32 user_param_count, 259e8707b340fb5b6313cde784b944a568dfd770dddBob Moore const union acpi_predefined_info *predefined) 260e8707b340fb5b6313cde784b944a568dfd770dddBob Moore{ 261e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 param_count; 262e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 required_params_current; 263e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 required_params_old; 264e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 265eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore /* Methods have 0-7 parameters. All other types have zero. */ 266eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore 267e8707b340fb5b6313cde784b944a568dfd770dddBob Moore param_count = 0; 268e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (node->type == ACPI_TYPE_METHOD) { 269e8707b340fb5b6313cde784b944a568dfd770dddBob Moore param_count = node->object->method.param_count; 270e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 271e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 272eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore /* Argument count check for non-predefined methods/objects */ 273eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore 274eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore if (!predefined) { 275eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore /* 276eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * Warning if too few or too many arguments have been passed by the 277eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * caller. An incorrect number of arguments may not cause the method 278eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * to fail. However, the method will fail if there are too few 279eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * arguments and the method attempts to use one of the missing ones. 280eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore */ 281eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore if (user_param_count < param_count) { 282eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore ACPI_WARNING((AE_INFO, 283eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore "%s: Insufficient arguments - needs %d, found %d", 284eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore pathname, param_count, user_param_count)); 285eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore } else if (user_param_count > param_count) { 286eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore ACPI_WARNING((AE_INFO, 287eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore "%s: Excess arguments - needs %d, found %d", 288eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore pathname, param_count, user_param_count)); 289eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore } 290eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore return; 291eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore } 292eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore 293eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore /* Allow two different legal argument counts (_SCP, etc.) */ 294e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 295e8707b340fb5b6313cde784b944a568dfd770dddBob Moore required_params_current = predefined->info.param_count & 0x0F; 296e8707b340fb5b6313cde784b944a568dfd770dddBob Moore required_params_old = predefined->info.param_count >> 4; 297e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 298eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore if (user_param_count != ACPI_UINT32_MAX) { 299eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore 300eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore /* Validate the user-supplied parameter count */ 301eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore 302eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore if ((user_param_count != required_params_current) && 303eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore (user_param_count != required_params_old)) { 304eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore ACPI_WARNING((AE_INFO, 305eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore "%s: Parameter count mismatch - caller passed %d, ACPI requires %d", 306eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore pathname, user_param_count, 307eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore required_params_current)); 308eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore } 309eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore } 310eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore 311eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore /* 312eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * Only validate the argument count on the first successful evaluation of 313eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * the method. This ensures that any warnings will only be emitted during 314eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * the very first evaluation of the method/object. 315eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore */ 316eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore if (node->flags & ANOBJ_EVALUATED) { 317eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore return; 318eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore } 319eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore 320eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore /* 321eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * Check that the ASL-defined parameter count is what is expected for 322eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * this predefined name. 323eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore */ 324e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if ((param_count != required_params_current) && 325e8707b340fb5b6313cde784b944a568dfd770dddBob Moore (param_count != required_params_old)) { 326e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ACPI_WARNING((AE_INFO, 327eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore "%s: Parameter count mismatch - ASL declared %d, ACPI requires %d", 328e8707b340fb5b6313cde784b944a568dfd770dddBob Moore pathname, param_count, required_params_current)); 329e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 330e8707b340fb5b6313cde784b944a568dfd770dddBob Moore} 331e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 332e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/******************************************************************************* 333e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 334e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * FUNCTION: acpi_ns_check_for_predefined_name 335e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 336e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * PARAMETERS: Node - Namespace node for the method/object 337e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 338e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * RETURN: Pointer to entry in predefined table. NULL indicates not found. 339e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 340e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * DESCRIPTION: Check an object name against the predefined object list. 341e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 342e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ******************************************************************************/ 343e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 344e8707b340fb5b6313cde784b944a568dfd770dddBob Mooreconst union acpi_predefined_info *acpi_ns_check_for_predefined_name(struct 345e8707b340fb5b6313cde784b944a568dfd770dddBob Moore acpi_namespace_node 346e8707b340fb5b6313cde784b944a568dfd770dddBob Moore *node) 347e8707b340fb5b6313cde784b944a568dfd770dddBob Moore{ 348e8707b340fb5b6313cde784b944a568dfd770dddBob Moore const union acpi_predefined_info *this_name; 349e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 350e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Quick check for a predefined name, first character must be underscore */ 351e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 352e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (node->name.ascii[0] != '_') { 353e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (NULL); 354e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 355e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 356e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Search info table for a predefined method/object name */ 357e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 358e8707b340fb5b6313cde784b944a568dfd770dddBob Moore this_name = predefined_names; 359e8707b340fb5b6313cde784b944a568dfd770dddBob Moore while (this_name->info.name[0]) { 360e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_COMPARE_NAME(node->name.ascii, this_name->info.name)) { 361e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 362e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Return pointer to this table entry */ 363e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 364e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (this_name); 365e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 366e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 367e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 368e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Skip next entry in the table if this name returns a Package 369e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * (next entry contains the package info) 370e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 371e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (this_name->info.expected_btypes & ACPI_RTYPE_PACKAGE) { 372e8707b340fb5b6313cde784b944a568dfd770dddBob Moore this_name++; 373e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 374e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 375e8707b340fb5b6313cde784b944a568dfd770dddBob Moore this_name++; 376e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 377e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 378e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (NULL); 379e8707b340fb5b6313cde784b944a568dfd770dddBob Moore} 380e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 381e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/******************************************************************************* 382e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 383e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * FUNCTION: acpi_ns_check_package 384e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 385e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * PARAMETERS: Pathname - Full pathname to the node (for error msgs) 386a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * return_object_ptr - Pointer to the object returned from the 387a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * evaluation of a method or object 388e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Predefined - Pointer to entry in predefined name table 389e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 390e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * RETURN: Status 391e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 392e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * DESCRIPTION: Check a returned package object for the correct count and 393e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * correct type of all sub-objects. 394e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 395e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ******************************************************************************/ 396e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 397e8707b340fb5b6313cde784b944a568dfd770dddBob Moorestatic acpi_status 398e8707b340fb5b6313cde784b944a568dfd770dddBob Mooreacpi_ns_check_package(char *pathname, 399a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore union acpi_operand_object **return_object_ptr, 400e8707b340fb5b6313cde784b944a568dfd770dddBob Moore const union acpi_predefined_info *predefined) 401e8707b340fb5b6313cde784b944a568dfd770dddBob Moore{ 402a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore union acpi_operand_object *return_object = *return_object_ptr; 403e8707b340fb5b6313cde784b944a568dfd770dddBob Moore const union acpi_predefined_info *package; 404e8707b340fb5b6313cde784b944a568dfd770dddBob Moore union acpi_operand_object *sub_package; 405e8707b340fb5b6313cde784b944a568dfd770dddBob Moore union acpi_operand_object **elements; 406e8707b340fb5b6313cde784b944a568dfd770dddBob Moore union acpi_operand_object **sub_elements; 407e8707b340fb5b6313cde784b944a568dfd770dddBob Moore acpi_status status; 408e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 expected_count; 409e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 count; 410e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 i; 411e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 j; 412e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 413e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ACPI_FUNCTION_NAME(ns_check_package); 414e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 415e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* The package info for this name is in the next table entry */ 416e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 417e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package = predefined + 1; 418e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 419e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ACPI_DEBUG_PRINT((ACPI_DB_NAMES, 420e8707b340fb5b6313cde784b944a568dfd770dddBob Moore "%s Validating return Package of Type %X, Count %X\n", 421e8707b340fb5b6313cde784b944a568dfd770dddBob Moore pathname, package->ret_info.type, 422e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return_object->package.count)); 423e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 424e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Extract package count and elements array */ 425e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 426e8707b340fb5b6313cde784b944a568dfd770dddBob Moore elements = return_object->package.elements; 427e8707b340fb5b6313cde784b944a568dfd770dddBob Moore count = return_object->package.count; 428e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 429e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* The package must have at least one element, else invalid */ 430e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 431e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (!count) { 432e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ACPI_WARNING((AE_INFO, 433e8707b340fb5b6313cde784b944a568dfd770dddBob Moore "%s: Return Package has no elements (empty)", 434e8707b340fb5b6313cde784b944a568dfd770dddBob Moore pathname)); 435e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 436e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (AE_AML_OPERAND_VALUE); 437e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 438e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 439e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 440e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Decode the type of the expected package contents 441e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 442e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * PTYPE1 packages contain no subpackages 443e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * PTYPE2 packages contain sub-packages 444e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 445e8707b340fb5b6313cde784b944a568dfd770dddBob Moore switch (package->ret_info.type) { 446e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE1_FIXED: 447e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 448e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 449e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * The package count is fixed and there are no sub-packages 450e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 451e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * If package is too small, exit. 452e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * If package is larger than expected, issue warning but continue 453e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 454e8707b340fb5b6313cde784b944a568dfd770dddBob Moore expected_count = 455e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package->ret_info.count1 + package->ret_info.count2; 456e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (count < expected_count) { 457e8707b340fb5b6313cde784b944a568dfd770dddBob Moore goto package_too_small; 458e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } else if (count > expected_count) { 459e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ACPI_WARNING((AE_INFO, 460e8707b340fb5b6313cde784b944a568dfd770dddBob Moore "%s: Return Package is larger than needed - " 461e8707b340fb5b6313cde784b944a568dfd770dddBob Moore "found %u, expected %u", pathname, count, 462e8707b340fb5b6313cde784b944a568dfd770dddBob Moore expected_count)); 463e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 464e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 465e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Validate all elements of the returned package */ 466e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 467e8707b340fb5b6313cde784b944a568dfd770dddBob Moore status = acpi_ns_check_package_elements(pathname, elements, 468e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package->ret_info. 469e8707b340fb5b6313cde784b944a568dfd770dddBob Moore object_type1, 470e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package->ret_info. 471e8707b340fb5b6313cde784b944a568dfd770dddBob Moore count1, 472e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package->ret_info. 473e8707b340fb5b6313cde784b944a568dfd770dddBob Moore object_type2, 474e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package->ret_info. 475e8707b340fb5b6313cde784b944a568dfd770dddBob Moore count2); 476e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 477e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 478e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 479e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 480e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 481e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE1_VAR: 482e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 483e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 484e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * The package count is variable, there are no sub-packages, and all 485e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * elements must be of the same type 486e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 487e8707b340fb5b6313cde784b944a568dfd770dddBob Moore for (i = 0; i < count; i++) { 488a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore status = acpi_ns_check_object_type(pathname, elements, 489e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package->ret_info. 490e8707b340fb5b6313cde784b944a568dfd770dddBob Moore object_type1, i); 491e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 492e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 493e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 494e8707b340fb5b6313cde784b944a568dfd770dddBob Moore elements++; 495e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 496e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 497e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 498e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE1_OPTION: 499e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 500e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 501e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * The package count is variable, there are no sub-packages. There are 502e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * a fixed number of required elements, and a variable number of 503e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * optional elements. 504e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 505e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Check if package is at least as large as the minimum required 506e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 507e8707b340fb5b6313cde784b944a568dfd770dddBob Moore expected_count = package->ret_info3.count; 508e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (count < expected_count) { 509e8707b340fb5b6313cde784b944a568dfd770dddBob Moore goto package_too_small; 510e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 511e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 512e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Variable number of sub-objects */ 513e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 514e8707b340fb5b6313cde784b944a568dfd770dddBob Moore for (i = 0; i < count; i++) { 515e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (i < package->ret_info3.count) { 516e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 517e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* These are the required package elements (0, 1, or 2) */ 518e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 519e8707b340fb5b6313cde784b944a568dfd770dddBob Moore status = 520e8707b340fb5b6313cde784b944a568dfd770dddBob Moore acpi_ns_check_object_type(pathname, 521a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore elements, 522e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package-> 523e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ret_info3. 524e8707b340fb5b6313cde784b944a568dfd770dddBob Moore object_type[i], 525e8707b340fb5b6313cde784b944a568dfd770dddBob Moore i); 526e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 527e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 528e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 529e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } else { 530e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* These are the optional package elements */ 531e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 532e8707b340fb5b6313cde784b944a568dfd770dddBob Moore status = 533e8707b340fb5b6313cde784b944a568dfd770dddBob Moore acpi_ns_check_object_type(pathname, 534a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore elements, 535e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package-> 536e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ret_info3. 537e8707b340fb5b6313cde784b944a568dfd770dddBob Moore tail_object_type, 538e8707b340fb5b6313cde784b944a568dfd770dddBob Moore i); 539e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 540e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 541e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 542e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 543e8707b340fb5b6313cde784b944a568dfd770dddBob Moore elements++; 544e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 545e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 546e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 547e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE2_PKG_COUNT: 548e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 549e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* First element is the (Integer) count of sub-packages to follow */ 550e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 551a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore status = acpi_ns_check_object_type(pathname, elements, 552e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ACPI_RTYPE_INTEGER, 0); 553e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 554e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 555e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 556e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 557e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 558e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Count cannot be larger than the parent package length, but allow it 559e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * to be smaller. The >= accounts for the Integer above. 560e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 561e8707b340fb5b6313cde784b944a568dfd770dddBob Moore expected_count = (u32) (*elements)->integer.value; 562e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (expected_count >= count) { 563e8707b340fb5b6313cde784b944a568dfd770dddBob Moore goto package_too_small; 564e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 565e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 566e8707b340fb5b6313cde784b944a568dfd770dddBob Moore count = expected_count; 567e8707b340fb5b6313cde784b944a568dfd770dddBob Moore elements++; 568e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 569e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Now we can walk the sub-packages */ 570e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 571e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /*lint -fallthrough */ 572e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 573e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE2: 574e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE2_FIXED: 575e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE2_MIN: 576e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE2_COUNT: 577e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 578e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 579e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * These types all return a single package that consists of a variable 580e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * number of sub-packages 581e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 582e8707b340fb5b6313cde784b944a568dfd770dddBob Moore for (i = 0; i < count; i++) { 583e8707b340fb5b6313cde784b944a568dfd770dddBob Moore sub_package = *elements; 584e8707b340fb5b6313cde784b944a568dfd770dddBob Moore sub_elements = sub_package->package.elements; 585e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 586e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Each sub-object must be of type Package */ 587e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 588e8707b340fb5b6313cde784b944a568dfd770dddBob Moore status = 589a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore acpi_ns_check_object_type(pathname, &sub_package, 590e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ACPI_RTYPE_PACKAGE, i); 591e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 592e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 593e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 594e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 595e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Examine the different types of sub-packages */ 596e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 597e8707b340fb5b6313cde784b944a568dfd770dddBob Moore switch (package->ret_info.type) { 598e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE2: 599e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE2_PKG_COUNT: 600e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 601e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Each subpackage has a fixed number of elements */ 602e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 603e8707b340fb5b6313cde784b944a568dfd770dddBob Moore expected_count = 604e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package->ret_info.count1 + 605e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package->ret_info.count2; 606e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (sub_package->package.count != 607e8707b340fb5b6313cde784b944a568dfd770dddBob Moore expected_count) { 608e8707b340fb5b6313cde784b944a568dfd770dddBob Moore count = sub_package->package.count; 609e8707b340fb5b6313cde784b944a568dfd770dddBob Moore goto package_too_small; 610e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 611e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 612e8707b340fb5b6313cde784b944a568dfd770dddBob Moore status = 613e8707b340fb5b6313cde784b944a568dfd770dddBob Moore acpi_ns_check_package_elements(pathname, 614e8707b340fb5b6313cde784b944a568dfd770dddBob Moore sub_elements, 615e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package-> 616e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ret_info. 617e8707b340fb5b6313cde784b944a568dfd770dddBob Moore object_type1, 618e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package-> 619e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ret_info. 620e8707b340fb5b6313cde784b944a568dfd770dddBob Moore count1, 621e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package-> 622e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ret_info. 623e8707b340fb5b6313cde784b944a568dfd770dddBob Moore object_type2, 624e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package-> 625e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ret_info. 626e8707b340fb5b6313cde784b944a568dfd770dddBob Moore count2); 627e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 628e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 629e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 630e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 631e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 632e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE2_FIXED: 633e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 634e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Each sub-package has a fixed length */ 635e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 636e8707b340fb5b6313cde784b944a568dfd770dddBob Moore expected_count = package->ret_info2.count; 637e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (sub_package->package.count < expected_count) { 638e8707b340fb5b6313cde784b944a568dfd770dddBob Moore count = sub_package->package.count; 639e8707b340fb5b6313cde784b944a568dfd770dddBob Moore goto package_too_small; 640e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 641e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 642e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Check the type of each sub-package element */ 643e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 644e8707b340fb5b6313cde784b944a568dfd770dddBob Moore for (j = 0; j < expected_count; j++) { 645e8707b340fb5b6313cde784b944a568dfd770dddBob Moore status = 646e8707b340fb5b6313cde784b944a568dfd770dddBob Moore acpi_ns_check_object_type(pathname, 647a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore &sub_elements[j], 648a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore package->ret_info2.object_type[j], j); 649e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 650e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 651e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 652e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 653e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 654e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 655e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE2_MIN: 656e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 657e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Each sub-package has a variable but minimum length */ 658e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 659e8707b340fb5b6313cde784b944a568dfd770dddBob Moore expected_count = package->ret_info.count1; 660e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (sub_package->package.count < expected_count) { 661e8707b340fb5b6313cde784b944a568dfd770dddBob Moore count = sub_package->package.count; 662e8707b340fb5b6313cde784b944a568dfd770dddBob Moore goto package_too_small; 663e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 664e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 665e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Check the type of each sub-package element */ 666e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 667e8707b340fb5b6313cde784b944a568dfd770dddBob Moore status = 668e8707b340fb5b6313cde784b944a568dfd770dddBob Moore acpi_ns_check_package_elements(pathname, 669e8707b340fb5b6313cde784b944a568dfd770dddBob Moore sub_elements, 670e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package-> 671e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ret_info. 672e8707b340fb5b6313cde784b944a568dfd770dddBob Moore object_type1, 673e8707b340fb5b6313cde784b944a568dfd770dddBob Moore sub_package-> 674e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package. 675e8707b340fb5b6313cde784b944a568dfd770dddBob Moore count, 0, 0); 676e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 677e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 678e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 679e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 680e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 681e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE2_COUNT: 682e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 683e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* First element is the (Integer) count of elements to follow */ 684e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 685e8707b340fb5b6313cde784b944a568dfd770dddBob Moore status = 686e8707b340fb5b6313cde784b944a568dfd770dddBob Moore acpi_ns_check_object_type(pathname, 687a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore sub_elements, 688e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ACPI_RTYPE_INTEGER, 689e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 0); 690e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 691e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 692e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 693e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 694e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Make sure package is large enough for the Count */ 695e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 696e8707b340fb5b6313cde784b944a568dfd770dddBob Moore expected_count = 697e8707b340fb5b6313cde784b944a568dfd770dddBob Moore (u32) (*sub_elements)->integer.value; 698e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (sub_package->package.count < expected_count) { 699e8707b340fb5b6313cde784b944a568dfd770dddBob Moore count = sub_package->package.count; 700e8707b340fb5b6313cde784b944a568dfd770dddBob Moore goto package_too_small; 701e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 702e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 703e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Check the type of each sub-package element */ 704e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 705e8707b340fb5b6313cde784b944a568dfd770dddBob Moore status = 706e8707b340fb5b6313cde784b944a568dfd770dddBob Moore acpi_ns_check_package_elements(pathname, 707e8707b340fb5b6313cde784b944a568dfd770dddBob Moore (sub_elements 708e8707b340fb5b6313cde784b944a568dfd770dddBob Moore + 1), 709e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package-> 710e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ret_info. 711e8707b340fb5b6313cde784b944a568dfd770dddBob Moore object_type1, 712e8707b340fb5b6313cde784b944a568dfd770dddBob Moore (expected_count 713e8707b340fb5b6313cde784b944a568dfd770dddBob Moore - 1), 0, 0); 714e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 715e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 716e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 717e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 718e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 719e8707b340fb5b6313cde784b944a568dfd770dddBob Moore default: 720e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 721e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 722e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 723e8707b340fb5b6313cde784b944a568dfd770dddBob Moore elements++; 724e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 725e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 726e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 727e8707b340fb5b6313cde784b944a568dfd770dddBob Moore default: 728e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 729e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Should not get here if predefined info table is correct */ 730e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 731e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ACPI_WARNING((AE_INFO, 732e8707b340fb5b6313cde784b944a568dfd770dddBob Moore "%s: Invalid internal return type in table entry: %X", 733e8707b340fb5b6313cde784b944a568dfd770dddBob Moore pathname, package->ret_info.type)); 734e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 735e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (AE_AML_INTERNAL); 736e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 737e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 738e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (AE_OK); 739e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 740e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package_too_small: 741e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 742e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Error exit for the case with an incorrect package count */ 743e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 744e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ACPI_WARNING((AE_INFO, "%s: Return Package is too small - " 745e8707b340fb5b6313cde784b944a568dfd770dddBob Moore "found %u, expected %u", pathname, count, 746e8707b340fb5b6313cde784b944a568dfd770dddBob Moore expected_count)); 747e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 748e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (AE_AML_OPERAND_VALUE); 749e8707b340fb5b6313cde784b944a568dfd770dddBob Moore} 750e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 751e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/******************************************************************************* 752e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 753e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * FUNCTION: acpi_ns_check_package_elements 754e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 755e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * PARAMETERS: Pathname - Full pathname to the node (for error msgs) 756e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Elements - Pointer to the package elements array 757e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Type1 - Object type for first group 758e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Count1 - Count for first group 759e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Type2 - Object type for second group 760e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Count2 - Count for second group 761e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 762e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * RETURN: Status 763e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 764e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * DESCRIPTION: Check that all elements of a package are of the correct object 765e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * type. Supports up to two groups of different object types. 766e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 767e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ******************************************************************************/ 768e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 769e8707b340fb5b6313cde784b944a568dfd770dddBob Moorestatic acpi_status 770e8707b340fb5b6313cde784b944a568dfd770dddBob Mooreacpi_ns_check_package_elements(char *pathname, 771e8707b340fb5b6313cde784b944a568dfd770dddBob Moore union acpi_operand_object **elements, 772e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u8 type1, u32 count1, u8 type2, u32 count2) 773e8707b340fb5b6313cde784b944a568dfd770dddBob Moore{ 774e8707b340fb5b6313cde784b944a568dfd770dddBob Moore union acpi_operand_object **this_element = elements; 775e8707b340fb5b6313cde784b944a568dfd770dddBob Moore acpi_status status; 776e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 i; 777e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 778e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 779e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Up to two groups of package elements are supported by the data 780e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * structure. All elements in each group must be of the same type. 781e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * The second group can have a count of zero. 782e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 783e8707b340fb5b6313cde784b944a568dfd770dddBob Moore for (i = 0; i < count1; i++) { 784a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore status = acpi_ns_check_object_type(pathname, this_element, 785e8707b340fb5b6313cde784b944a568dfd770dddBob Moore type1, i); 786e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 787e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 788e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 789e8707b340fb5b6313cde784b944a568dfd770dddBob Moore this_element++; 790e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 791e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 792e8707b340fb5b6313cde784b944a568dfd770dddBob Moore for (i = 0; i < count2; i++) { 793a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore status = acpi_ns_check_object_type(pathname, this_element, 794e8707b340fb5b6313cde784b944a568dfd770dddBob Moore type2, (i + count1)); 795e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 796e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 797e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 798e8707b340fb5b6313cde784b944a568dfd770dddBob Moore this_element++; 799e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 800e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 801e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (AE_OK); 802e8707b340fb5b6313cde784b944a568dfd770dddBob Moore} 803e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 804e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/******************************************************************************* 805e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 806e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * FUNCTION: acpi_ns_check_object_type 807e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 808e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * PARAMETERS: Pathname - Full pathname to the node (for error msgs) 809a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * return_object_ptr - Pointer to the object returned from the 810a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * evaluation of a method or object 811e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * expected_btypes - Bitmap of expected return type(s) 812e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * package_index - Index of object within parent package (if 813e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * applicable - ACPI_NOT_PACKAGE otherwise) 814e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 815e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * RETURN: Status 816e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 817e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * DESCRIPTION: Check the type of the return object against the expected object 818e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * type(s). Use of Btype allows multiple expected object types. 819e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 820e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ******************************************************************************/ 821e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 822e8707b340fb5b6313cde784b944a568dfd770dddBob Moorestatic acpi_status 823e8707b340fb5b6313cde784b944a568dfd770dddBob Mooreacpi_ns_check_object_type(char *pathname, 824a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore union acpi_operand_object **return_object_ptr, 825e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 expected_btypes, u32 package_index) 826e8707b340fb5b6313cde784b944a568dfd770dddBob Moore{ 827a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore union acpi_operand_object *return_object = *return_object_ptr; 828e8707b340fb5b6313cde784b944a568dfd770dddBob Moore acpi_status status = AE_OK; 829e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 return_btype; 830e8707b340fb5b6313cde784b944a568dfd770dddBob Moore char type_buffer[48]; /* Room for 5 types */ 831e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 this_rtype; 832e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 i; 833e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 j; 834e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 835e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 836e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * If we get a NULL return_object here, it is a NULL package element, 837e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * and this is always an error. 838e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 839e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (!return_object) { 840e8707b340fb5b6313cde784b944a568dfd770dddBob Moore goto type_error_exit; 841e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 842e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 843e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* A Namespace node should not get here, but make sure */ 844e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 845e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_GET_DESCRIPTOR_TYPE(return_object) == ACPI_DESC_TYPE_NAMED) { 846e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ACPI_WARNING((AE_INFO, 847e8707b340fb5b6313cde784b944a568dfd770dddBob Moore "%s: Invalid return type - Found a Namespace node [%4.4s] type %s", 848e8707b340fb5b6313cde784b944a568dfd770dddBob Moore pathname, return_object->node.name.ascii, 849e8707b340fb5b6313cde784b944a568dfd770dddBob Moore acpi_ut_get_type_name(return_object->node.type))); 850e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (AE_AML_OPERAND_TYPE); 851e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 852e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 853e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 854e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Convert the object type (ACPI_TYPE_xxx) to a bitmapped object type. 855e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * The bitmapped type allows multiple possible return types. 856e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 857e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Note, the cases below must handle all of the possible types returned 858e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * from all of the predefined names (including elements of returned 859e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * packages) 860e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 861e8707b340fb5b6313cde784b944a568dfd770dddBob Moore switch (ACPI_GET_OBJECT_TYPE(return_object)) { 862e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_TYPE_INTEGER: 863e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return_btype = ACPI_RTYPE_INTEGER; 864e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 865e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 866e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_TYPE_BUFFER: 867e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return_btype = ACPI_RTYPE_BUFFER; 868e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 869e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 870e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_TYPE_STRING: 871e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return_btype = ACPI_RTYPE_STRING; 872e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 873e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 874e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_TYPE_PACKAGE: 875e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return_btype = ACPI_RTYPE_PACKAGE; 876e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 877e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 878e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_TYPE_LOCAL_REFERENCE: 879e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return_btype = ACPI_RTYPE_REFERENCE; 880e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 881e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 882e8707b340fb5b6313cde784b944a568dfd770dddBob Moore default: 883e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Not one of the supported objects, must be incorrect */ 884e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 885e8707b340fb5b6313cde784b944a568dfd770dddBob Moore goto type_error_exit; 886e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 887e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 888e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Is the object one of the expected types? */ 889e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 890e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (!(return_btype & expected_btypes)) { 891a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore 892a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore /* Type mismatch -- attempt repair of the returned object */ 893a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore 894a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore status = acpi_ns_repair_object(expected_btypes, package_index, 895a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore return_object_ptr); 896a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore if (ACPI_SUCCESS(status)) { 897a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore return (status); 898a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore } 899e8707b340fb5b6313cde784b944a568dfd770dddBob Moore goto type_error_exit; 900e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 901e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 902e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* For reference objects, check that the reference type is correct */ 903e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 904e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_GET_OBJECT_TYPE(return_object) == ACPI_TYPE_LOCAL_REFERENCE) { 905e8707b340fb5b6313cde784b944a568dfd770dddBob Moore status = acpi_ns_check_reference(pathname, return_object); 906e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 907e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 908e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 909e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 910e8707b340fb5b6313cde784b944a568dfd770dddBob Moore type_error_exit: 911e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 912e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Create a string with all expected types for this predefined object */ 913e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 914e8707b340fb5b6313cde784b944a568dfd770dddBob Moore j = 1; 915e8707b340fb5b6313cde784b944a568dfd770dddBob Moore type_buffer[0] = 0; 916e8707b340fb5b6313cde784b944a568dfd770dddBob Moore this_rtype = ACPI_RTYPE_INTEGER; 917e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 918e8707b340fb5b6313cde784b944a568dfd770dddBob Moore for (i = 0; i < ACPI_NUM_RTYPES; i++) { 919e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 920e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* If one of the expected types, concatenate the name of this type */ 921e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 922e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (expected_btypes & this_rtype) { 923e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ACPI_STRCAT(type_buffer, &acpi_rtype_names[i][j]); 924e8707b340fb5b6313cde784b944a568dfd770dddBob Moore j = 0; /* Use name separator from now on */ 925e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 926e8707b340fb5b6313cde784b944a568dfd770dddBob Moore this_rtype <<= 1; /* Next Rtype */ 927e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 928e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 929e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (package_index == ACPI_NOT_PACKAGE) { 930e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ACPI_WARNING((AE_INFO, 931e8707b340fb5b6313cde784b944a568dfd770dddBob Moore "%s: Return type mismatch - found %s, expected %s", 932e8707b340fb5b6313cde784b944a568dfd770dddBob Moore pathname, 933e8707b340fb5b6313cde784b944a568dfd770dddBob Moore acpi_ut_get_object_type_name(return_object), 934e8707b340fb5b6313cde784b944a568dfd770dddBob Moore type_buffer)); 935e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } else { 936e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ACPI_WARNING((AE_INFO, 937e8707b340fb5b6313cde784b944a568dfd770dddBob Moore "%s: Return Package type mismatch at index %u - " 938e8707b340fb5b6313cde784b944a568dfd770dddBob Moore "found %s, expected %s", pathname, package_index, 939e8707b340fb5b6313cde784b944a568dfd770dddBob Moore acpi_ut_get_object_type_name(return_object), 940e8707b340fb5b6313cde784b944a568dfd770dddBob Moore type_buffer)); 941e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 942e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 943e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (AE_AML_OPERAND_TYPE); 944e8707b340fb5b6313cde784b944a568dfd770dddBob Moore} 945e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 946e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/******************************************************************************* 947e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 948e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * FUNCTION: acpi_ns_check_reference 949e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 950e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * PARAMETERS: Pathname - Full pathname to the node (for error msgs) 951e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * return_object - Object returned from the evaluation of a 952e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * method or object 953e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 954e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * RETURN: Status 955e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 956e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * DESCRIPTION: Check a returned reference object for the correct reference 957e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * type. The only reference type that can be returned from a 958e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * predefined method is a named reference. All others are invalid. 959e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 960e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ******************************************************************************/ 961e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 962e8707b340fb5b6313cde784b944a568dfd770dddBob Moorestatic acpi_status 963e8707b340fb5b6313cde784b944a568dfd770dddBob Mooreacpi_ns_check_reference(char *pathname, 964e8707b340fb5b6313cde784b944a568dfd770dddBob Moore union acpi_operand_object *return_object) 965e8707b340fb5b6313cde784b944a568dfd770dddBob Moore{ 966e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 967e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 968e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Check the reference object for the correct reference type (opcode). 969e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * The only type of reference that can be converted to an union acpi_object is 970e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * a reference to a named object (reference class: NAME) 971e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 972e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (return_object->reference.class == ACPI_REFCLASS_NAME) { 973e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (AE_OK); 974e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 975e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 976e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ACPI_WARNING((AE_INFO, 977e8707b340fb5b6313cde784b944a568dfd770dddBob Moore "%s: Return type mismatch - unexpected reference object type [%s] %2.2X", 978e8707b340fb5b6313cde784b944a568dfd770dddBob Moore pathname, acpi_ut_get_reference_name(return_object), 979e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return_object->reference.class)); 980e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 981e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (AE_AML_OPERAND_TYPE); 982e8707b340fb5b6313cde784b944a568dfd770dddBob Moore} 983a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore 984a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore/******************************************************************************* 985a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * 986a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * FUNCTION: acpi_ns_repair_object 987a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * 988a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * PARAMETERS: Pathname - Full pathname to the node (for error msgs) 989a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * package_index - Used to determine if target is in a package 990a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * return_object_ptr - Pointer to the object returned from the 991a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * evaluation of a method or object 992a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * 993a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * RETURN: Status. AE_OK if repair was successful. 994a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * 995a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * DESCRIPTION: Attempt to repair/convert a return object of a type that was 996a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * not expected. 997a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * 998a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore ******************************************************************************/ 999a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore 1000a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moorestatic acpi_status 1001a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Mooreacpi_ns_repair_object(u32 expected_btypes, 1002a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore u32 package_index, 1003a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore union acpi_operand_object **return_object_ptr) 1004a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore{ 1005a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore union acpi_operand_object *return_object = *return_object_ptr; 1006a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore union acpi_operand_object *new_object; 1007a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore acpi_size length; 1008a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore 1009a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore switch (ACPI_GET_OBJECT_TYPE(return_object)) { 1010a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore case ACPI_TYPE_BUFFER: 1011a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore 1012a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore if (!(expected_btypes & ACPI_RTYPE_STRING)) { 1013a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore return (AE_AML_OPERAND_TYPE); 1014a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore } 1015a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore 1016a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore /* 1017a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * Have a Buffer, expected a String, convert. Use a to_string 1018a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * conversion, no transform performed on the buffer data. The best 1019a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * example of this is the _BIF method, where the string data from 1020a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * the battery is often (incorrectly) returned as buffer object(s). 1021a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore */ 1022a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore length = 0; 1023a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore while ((length < return_object->buffer.length) && 1024a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore (return_object->buffer.pointer[length])) { 1025a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore length++; 1026a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore } 1027a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore 1028a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore /* Allocate a new string object */ 1029a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore 1030a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore new_object = acpi_ut_create_string_object(length); 1031a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore if (!new_object) { 1032a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore return (AE_NO_MEMORY); 1033a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore } 1034a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore 1035a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore /* 1036a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * Copy the raw buffer data with no transform. String is already NULL 1037a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * terminated at Length+1. 1038a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore */ 1039a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore ACPI_MEMCPY(new_object->string.pointer, 1040a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore return_object->buffer.pointer, length); 1041a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore 1042a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore /* Install the new return object */ 1043a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore 1044a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore acpi_ut_remove_reference(return_object); 1045a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore *return_object_ptr = new_object; 1046a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore 1047a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore /* 1048a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * If the object is a package element, we need to: 1049a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * 1. Decrement the reference count of the orignal object, it was 1050a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * incremented when building the package 1051a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * 2. Increment the reference count of the new object, it will be 1052a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * decremented when releasing the package 1053a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore */ 1054a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore if (package_index != ACPI_NOT_PACKAGE) { 1055a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore acpi_ut_remove_reference(return_object); 1056a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore acpi_ut_add_reference(new_object); 1057a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore } 1058a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore return (AE_OK); 1059a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore 1060a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore default: 1061a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore break; 1062a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore } 1063a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore 1064a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore return (AE_AML_OPERAND_TYPE); 1065a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore} 1066