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/* 977848130e53b06c22fe37a7b6acbb82bb3e9bfbaBob Moore * Copyright (C) 2000 - 2012, 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 45999e08f99846a1fd6ee9642ec306a2d318925116Bob Moore#define ACPI_CREATE_PREDEFINED_TABLE 46999e08f99846a1fd6ee9642ec306a2d318925116Bob Moore 47e8707b340fb5b6313cde784b944a568dfd770dddBob Moore#include <acpi/acpi.h> 48e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "accommon.h" 49e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "acnamesp.h" 50e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "acpredef.h" 51e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 52e8707b340fb5b6313cde784b944a568dfd770dddBob Moore#define _COMPONENT ACPI_NAMESPACE 53e8707b340fb5b6313cde784b944a568dfd770dddBob MooreACPI_MODULE_NAME("nspredef") 54e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 55e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/******************************************************************************* 56e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 57e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * This module validates predefined ACPI objects that appear in the namespace, 58e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * at the time they are evaluated (via acpi_evaluate_object). The purpose of this 59e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * validation is to detect problems with BIOS-exposed predefined ACPI objects 60e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * before the results are returned to the ACPI-related drivers. 61e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 62e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * There are several areas that are validated: 63e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 64e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 1) The number of input arguments as defined by the method/object in the 65e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * ASL is validated against the ACPI specification. 66e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 2) The type of the return object (if any) is validated against the ACPI 67e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * specification. 68e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 3) For returned package objects, the count of package elements is 69e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * validated, as well as the type of each package element. Nested 70e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * packages are supported. 71e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 72e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * For any problems found, a warning message is issued. 73e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 74e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ******************************************************************************/ 75e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/* Local prototypes */ 76e8707b340fb5b6313cde784b944a568dfd770dddBob Moorestatic acpi_status 770444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Mooreacpi_ns_check_package(struct acpi_predefined_data *data, 780444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore union acpi_operand_object **return_object_ptr); 79e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 80e8707b340fb5b6313cde784b944a568dfd770dddBob Moorestatic acpi_status 8153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Mooreacpi_ns_check_package_list(struct acpi_predefined_data *data, 8253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore const union acpi_predefined_info *package, 8353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore union acpi_operand_object **elements, u32 count); 8453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 8553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moorestatic acpi_status 860444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Mooreacpi_ns_check_package_elements(struct acpi_predefined_data *data, 87e8707b340fb5b6313cde784b944a568dfd770dddBob Moore union acpi_operand_object **elements, 8803ef132b7258bbea4858be4b1bd6cb6c3fdd3253Bob Moore u8 type1, 8903ef132b7258bbea4858be4b1bd6cb6c3fdd3253Bob Moore u32 count1, 9003ef132b7258bbea4858be4b1bd6cb6c3fdd3253Bob Moore u8 type2, u32 count2, u32 start_index); 91e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 92e8707b340fb5b6313cde784b944a568dfd770dddBob Moorestatic acpi_status 930444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Mooreacpi_ns_check_object_type(struct acpi_predefined_data *data, 94a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore union acpi_operand_object **return_object_ptr, 95e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 expected_btypes, u32 package_index); 96e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 97e8707b340fb5b6313cde784b944a568dfd770dddBob Moorestatic acpi_status 980444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Mooreacpi_ns_check_reference(struct acpi_predefined_data *data, 99e8707b340fb5b6313cde784b944a568dfd770dddBob Moore union acpi_operand_object *return_object); 100e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1010444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moorestatic void acpi_ns_get_expected_types(char *buffer, u32 expected_btypes); 1020444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore 103e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/* 104e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Names for the types that can be returned by the predefined objects. 105e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Used for warning messages. Must be in the same order as the ACPI_RTYPEs 106e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 107e8707b340fb5b6313cde784b944a568dfd770dddBob Moorestatic const char *acpi_rtype_names[] = { 108e8707b340fb5b6313cde784b944a568dfd770dddBob Moore "/Integer", 109e8707b340fb5b6313cde784b944a568dfd770dddBob Moore "/String", 110e8707b340fb5b6313cde784b944a568dfd770dddBob Moore "/Buffer", 111e8707b340fb5b6313cde784b944a568dfd770dddBob Moore "/Package", 112e8707b340fb5b6313cde784b944a568dfd770dddBob Moore "/Reference", 113e8707b340fb5b6313cde784b944a568dfd770dddBob Moore}; 114e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 115e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/******************************************************************************* 116e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 117e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * FUNCTION: acpi_ns_check_predefined_names 118e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 119e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * PARAMETERS: Node - Namespace node for the method/object 1200444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * user_param_count - Number of parameters actually passed 1210444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * return_status - Status from the object evaluation 122a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * return_object_ptr - Pointer to the object returned from the 123a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * evaluation of a method or object 124e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 125e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * RETURN: Status 126e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 127e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * DESCRIPTION: Check an ACPI name for a match in the predefined name list. 128e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 129e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ******************************************************************************/ 130e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 131e8707b340fb5b6313cde784b944a568dfd770dddBob Mooreacpi_status 132e8707b340fb5b6313cde784b944a568dfd770dddBob Mooreacpi_ns_check_predefined_names(struct acpi_namespace_node *node, 133eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore u32 user_param_count, 134eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore acpi_status return_status, 135a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore union acpi_operand_object **return_object_ptr) 136e8707b340fb5b6313cde784b944a568dfd770dddBob Moore{ 137a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore union acpi_operand_object *return_object = *return_object_ptr; 138e8707b340fb5b6313cde784b944a568dfd770dddBob Moore acpi_status status = AE_OK; 139e8707b340fb5b6313cde784b944a568dfd770dddBob Moore const union acpi_predefined_info *predefined; 140e8707b340fb5b6313cde784b944a568dfd770dddBob Moore char *pathname; 1410444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore struct acpi_predefined_data *data; 142e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 143e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Match the name for this method/object against the predefined list */ 144e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 145e8707b340fb5b6313cde784b944a568dfd770dddBob Moore predefined = acpi_ns_check_for_predefined_name(node); 146e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1470444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore /* Get the full pathname to the object, for use in warning messages */ 148e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 149e8707b340fb5b6313cde784b944a568dfd770dddBob Moore pathname = acpi_ns_get_external_pathname(node); 150e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (!pathname) { 15165259094c3e038519a2d8fa6fbc6256f04ad6535Bob Moore return AE_OK; /* Could not get pathname, ignore */ 152e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 153e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 154e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 155eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * Check that the parameter count for this method matches the ASL 156eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * definition. For predefined names, ensure that both the caller and 157eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * the method itself are in accordance with the ACPI specification. 158eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore */ 159eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore acpi_ns_check_parameter_count(pathname, node, user_param_count, 160eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore predefined); 161eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore 162eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore /* If not a predefined name, we cannot validate the return object */ 163eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore 164eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore if (!predefined) { 1650444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore goto cleanup; 166eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore } 167eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore 168eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore /* 1690444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * If the method failed or did not actually return an object, we cannot 1700444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * validate the return object 171e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 1720444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore if ((return_status != AE_OK) && (return_status != AE_CTRL_RETURN_VALUE)) { 1730444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore goto cleanup; 174eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore } 175eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore 176e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 177e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * If there is no return value, check if we require a return value for 178e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * this predefined name. Either one return value is expected, or none, 179e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * for both methods and other objects. 180e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 181e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Exit now if there is no return object. Warning if one was expected. 182e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 183e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (!return_object) { 184e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if ((predefined->info.expected_btypes) && 185e8707b340fb5b6313cde784b944a568dfd770dddBob Moore (!(predefined->info.expected_btypes & ACPI_RTYPE_NONE))) { 1860444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_PREDEFINED((AE_INFO, pathname, 1870444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_ALWAYS, 1880444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "Missing expected return value")); 189e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 190e8707b340fb5b6313cde784b944a568dfd770dddBob Moore status = AE_AML_NO_RETURN_VALUE; 191e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 1920444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore goto cleanup; 193e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 194e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 195e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 196d57b23ad0ca7a46931e4d98eb6b4b73b112f0969Bob Moore * Return value validation and possible repair. 197307a042416dfc2216251a85b79e8578b65fdc0e7Bob Moore * 198d57b23ad0ca7a46931e4d98eb6b4b73b112f0969Bob Moore * 1) Don't perform return value validation/repair if this feature 199d57b23ad0ca7a46931e4d98eb6b4b73b112f0969Bob Moore * has been disabled via a global option. 200d57b23ad0ca7a46931e4d98eb6b4b73b112f0969Bob Moore * 201d57b23ad0ca7a46931e4d98eb6b4b73b112f0969Bob Moore * 2) We have a return value, but if one wasn't expected, just exit, 202d57b23ad0ca7a46931e4d98eb6b4b73b112f0969Bob Moore * this is not a problem. For example, if the "Implicit Return" 203d57b23ad0ca7a46931e4d98eb6b4b73b112f0969Bob Moore * feature is enabled, methods will always return a value. 204d57b23ad0ca7a46931e4d98eb6b4b73b112f0969Bob Moore * 205d57b23ad0ca7a46931e4d98eb6b4b73b112f0969Bob Moore * 3) If the return value can be of any type, then we cannot perform 206d57b23ad0ca7a46931e4d98eb6b4b73b112f0969Bob Moore * any validation, just exit. 207e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 208d57b23ad0ca7a46931e4d98eb6b4b73b112f0969Bob Moore if (acpi_gbl_disable_auto_repair || 209d57b23ad0ca7a46931e4d98eb6b4b73b112f0969Bob Moore (!predefined->info.expected_btypes) || 210307a042416dfc2216251a85b79e8578b65fdc0e7Bob Moore (predefined->info.expected_btypes == ACPI_RTYPE_ALL)) { 2110444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore goto cleanup; 2120444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore } 2130444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore 2140444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore /* Create the parameter data block for object validation */ 2150444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore 2160444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore data = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_predefined_data)); 2170444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore if (!data) { 2180444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore goto cleanup; 219e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 2200444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore data->predefined = predefined; 2218f9c91273e36e5762c617c23e4fd48d5172e0dacFenghua Yu data->node = node; 2220444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore data->node_flags = node->flags; 2230444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore data->pathname = pathname; 224e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 225e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 226465da9eb75665203a826f961de74a817b870850aBob Moore * Check that the type of the main return object is what is expected 227465da9eb75665203a826f961de74a817b870850aBob Moore * for this predefined name 228e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 2290444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore status = acpi_ns_check_object_type(data, return_object_ptr, 230e8707b340fb5b6313cde784b944a568dfd770dddBob Moore predefined->info.expected_btypes, 2310444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_NOT_PACKAGE_ELEMENT); 232465da9eb75665203a826f961de74a817b870850aBob Moore if (ACPI_FAILURE(status)) { 233465da9eb75665203a826f961de74a817b870850aBob Moore goto exit; 234465da9eb75665203a826f961de74a817b870850aBob Moore } 235465da9eb75665203a826f961de74a817b870850aBob Moore 236465da9eb75665203a826f961de74a817b870850aBob Moore /* 237465da9eb75665203a826f961de74a817b870850aBob Moore * For returned Package objects, check the type of all sub-objects. 238465da9eb75665203a826f961de74a817b870850aBob Moore * Note: Package may have been newly created by call above. 239465da9eb75665203a826f961de74a817b870850aBob Moore */ 240465da9eb75665203a826f961de74a817b870850aBob Moore if ((*return_object_ptr)->common.type == ACPI_TYPE_PACKAGE) { 241091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore data->parent_package = *return_object_ptr; 242465da9eb75665203a826f961de74a817b870850aBob Moore status = acpi_ns_check_package(data, return_object_ptr); 243465da9eb75665203a826f961de74a817b870850aBob Moore if (ACPI_FAILURE(status)) { 244465da9eb75665203a826f961de74a817b870850aBob Moore goto exit; 24534c39c755347c1ca3d06284bad2273c6a9c3108aBob Moore } 246e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 247e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 248ad5babeed8d3082406c5b67ae558b95a479ddb6fBob Moore /* 249465da9eb75665203a826f961de74a817b870850aBob Moore * The return object was OK, or it was successfully repaired above. 250465da9eb75665203a826f961de74a817b870850aBob Moore * Now make some additional checks such as verifying that package 251465da9eb75665203a826f961de74a817b870850aBob Moore * objects are sorted correctly (if required) or buffer objects have 252465da9eb75665203a826f961de74a817b870850aBob Moore * the correct data width (bytes vs. dwords). These repairs are 253465da9eb75665203a826f961de74a817b870850aBob Moore * performed on a per-name basis, i.e., the code is specific to 254465da9eb75665203a826f961de74a817b870850aBob Moore * particular predefined names. 255ad5babeed8d3082406c5b67ae558b95a479ddb6fBob Moore */ 256ad5babeed8d3082406c5b67ae558b95a479ddb6fBob Moore status = acpi_ns_complex_repairs(data, node, status, return_object_ptr); 257ad5babeed8d3082406c5b67ae558b95a479ddb6fBob Moore 258465da9eb75665203a826f961de74a817b870850aBob Mooreexit: 2590444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore /* 2600444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * If the object validation failed or if we successfully repaired one 2610444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * or more objects, mark the parent node to suppress further warning 2620444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * messages during the next evaluation of the same method/object. 2630444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore */ 2640444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore if (ACPI_FAILURE(status) || (data->flags & ACPI_OBJECT_REPAIRED)) { 2650444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore node->flags |= ANOBJ_EVALUATED; 2660444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore } 2670444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_FREE(data); 2680444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore 2690444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moorecleanup: 27065259094c3e038519a2d8fa6fbc6256f04ad6535Bob Moore ACPI_FREE(pathname); 271e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 272e8707b340fb5b6313cde784b944a568dfd770dddBob Moore} 273e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 274e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/******************************************************************************* 275e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 276e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * FUNCTION: acpi_ns_check_parameter_count 277e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 278e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * PARAMETERS: Pathname - Full pathname to the node (for error msgs) 279e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Node - Namespace node for the method/object 280eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * user_param_count - Number of args passed in by the caller 281e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Predefined - Pointer to entry in predefined name table 282e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 283e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * RETURN: None 284e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 285e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * DESCRIPTION: Check that the declared (in ASL/AML) parameter count for a 286e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * predefined name is what is expected (i.e., what is defined in 287e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * the ACPI specification for this predefined name.) 288e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 289e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ******************************************************************************/ 290e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 291e8707b340fb5b6313cde784b944a568dfd770dddBob Moorevoid 292e8707b340fb5b6313cde784b944a568dfd770dddBob Mooreacpi_ns_check_parameter_count(char *pathname, 293e8707b340fb5b6313cde784b944a568dfd770dddBob Moore struct acpi_namespace_node *node, 294eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore u32 user_param_count, 295e8707b340fb5b6313cde784b944a568dfd770dddBob Moore const union acpi_predefined_info *predefined) 296e8707b340fb5b6313cde784b944a568dfd770dddBob Moore{ 297e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 param_count; 298e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 required_params_current; 299e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 required_params_old; 300e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 301eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore /* Methods have 0-7 parameters. All other types have zero. */ 302eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore 303e8707b340fb5b6313cde784b944a568dfd770dddBob Moore param_count = 0; 304e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (node->type == ACPI_TYPE_METHOD) { 305e8707b340fb5b6313cde784b944a568dfd770dddBob Moore param_count = node->object->method.param_count; 306e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 307e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 308eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore if (!predefined) { 309eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore /* 3100444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * Check the parameter count for non-predefined methods/objects. 3110444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * 312eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * Warning if too few or too many arguments have been passed by the 313eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * caller. An incorrect number of arguments may not cause the method 314eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * to fail. However, the method will fail if there are too few 315eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * arguments and the method attempts to use one of the missing ones. 316eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore */ 317eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore if (user_param_count < param_count) { 3180444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_PREDEFINED((AE_INFO, pathname, 3190444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_ALWAYS, 3200444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "Insufficient arguments - needs %u, found %u", 3210444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore param_count, user_param_count)); 322eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore } else if (user_param_count > param_count) { 3230444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_PREDEFINED((AE_INFO, pathname, 3240444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_ALWAYS, 3250444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "Excess arguments - needs %u, found %u", 3260444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore param_count, user_param_count)); 327eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore } 328eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore return; 329eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore } 330eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore 3310444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore /* 3320444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * Validate the user-supplied parameter count. 3330444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * Allow two different legal argument counts (_SCP, etc.) 3340444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore */ 335e8707b340fb5b6313cde784b944a568dfd770dddBob Moore required_params_current = predefined->info.param_count & 0x0F; 336e8707b340fb5b6313cde784b944a568dfd770dddBob Moore required_params_old = predefined->info.param_count >> 4; 337e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 338eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore if (user_param_count != ACPI_UINT32_MAX) { 339eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore if ((user_param_count != required_params_current) && 340eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore (user_param_count != required_params_old)) { 3410444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_PREDEFINED((AE_INFO, pathname, 3420444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_ALWAYS, 3430444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "Parameter count mismatch - " 3440444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "caller passed %u, ACPI requires %u", 3450444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore user_param_count, 3460444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore required_params_current)); 347eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore } 348eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore } 349eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore 350eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore /* 351eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * Check that the ASL-defined parameter count is what is expected for 3520444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * this predefined name (parameter count as defined by the ACPI 3530444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * specification) 354eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore */ 355e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if ((param_count != required_params_current) && 356e8707b340fb5b6313cde784b944a568dfd770dddBob Moore (param_count != required_params_old)) { 3570444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_PREDEFINED((AE_INFO, pathname, node->flags, 3580444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "Parameter count mismatch - ASL declared %u, ACPI requires %u", 3590444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore param_count, required_params_current)); 360e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 361e8707b340fb5b6313cde784b944a568dfd770dddBob Moore} 362e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 363e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/******************************************************************************* 364e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 365e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * FUNCTION: acpi_ns_check_for_predefined_name 366e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 367e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * PARAMETERS: Node - Namespace node for the method/object 368e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 369e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * RETURN: Pointer to entry in predefined table. NULL indicates not found. 370e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 371e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * DESCRIPTION: Check an object name against the predefined object list. 372e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 373e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ******************************************************************************/ 374e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 375e8707b340fb5b6313cde784b944a568dfd770dddBob Mooreconst union acpi_predefined_info *acpi_ns_check_for_predefined_name(struct 376e8707b340fb5b6313cde784b944a568dfd770dddBob Moore acpi_namespace_node 377e8707b340fb5b6313cde784b944a568dfd770dddBob Moore *node) 378e8707b340fb5b6313cde784b944a568dfd770dddBob Moore{ 379e8707b340fb5b6313cde784b944a568dfd770dddBob Moore const union acpi_predefined_info *this_name; 380e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 381e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Quick check for a predefined name, first character must be underscore */ 382e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 383e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (node->name.ascii[0] != '_') { 384e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (NULL); 385e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 386e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 387e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Search info table for a predefined method/object name */ 388e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 389e8707b340fb5b6313cde784b944a568dfd770dddBob Moore this_name = predefined_names; 390e8707b340fb5b6313cde784b944a568dfd770dddBob Moore while (this_name->info.name[0]) { 391e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_COMPARE_NAME(node->name.ascii, this_name->info.name)) { 392e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (this_name); 393e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 394e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 395e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 396e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Skip next entry in the table if this name returns a Package 397e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * (next entry contains the package info) 398e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 399e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (this_name->info.expected_btypes & ACPI_RTYPE_PACKAGE) { 400e8707b340fb5b6313cde784b944a568dfd770dddBob Moore this_name++; 401e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 402e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 403e8707b340fb5b6313cde784b944a568dfd770dddBob Moore this_name++; 404e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 405e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 4060444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore return (NULL); /* Not found */ 407e8707b340fb5b6313cde784b944a568dfd770dddBob Moore} 408e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 409e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/******************************************************************************* 410e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 411e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * FUNCTION: acpi_ns_check_package 412e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 4130444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * PARAMETERS: Data - Pointer to validation data structure 414a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * return_object_ptr - Pointer to the object returned from the 415a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * evaluation of a method or object 416e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 417e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * RETURN: Status 418e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 419e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * DESCRIPTION: Check a returned package object for the correct count and 420e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * correct type of all sub-objects. 421e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 422e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ******************************************************************************/ 423e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 424e8707b340fb5b6313cde784b944a568dfd770dddBob Moorestatic acpi_status 4250444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Mooreacpi_ns_check_package(struct acpi_predefined_data *data, 4260444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore union acpi_operand_object **return_object_ptr) 427e8707b340fb5b6313cde784b944a568dfd770dddBob Moore{ 428a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore union acpi_operand_object *return_object = *return_object_ptr; 429e8707b340fb5b6313cde784b944a568dfd770dddBob Moore const union acpi_predefined_info *package; 430e8707b340fb5b6313cde784b944a568dfd770dddBob Moore union acpi_operand_object **elements; 43153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore acpi_status status = AE_OK; 432e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 expected_count; 433e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 count; 434e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 i; 435e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 436e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ACPI_FUNCTION_NAME(ns_check_package); 437e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 438e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* The package info for this name is in the next table entry */ 439e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 4400444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore package = data->predefined + 1; 441e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 442e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ACPI_DEBUG_PRINT((ACPI_DB_NAMES, 443e8707b340fb5b6313cde784b944a568dfd770dddBob Moore "%s Validating return Package of Type %X, Count %X\n", 4440444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore data->pathname, package->ret_info.type, 445e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return_object->package.count)); 446e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 447d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore /* 448d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore * For variable-length Packages, we can safely remove all embedded 449d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore * and trailing NULL package elements 450d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore */ 451d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore acpi_ns_remove_null_elements(data, package->ret_info.type, 452d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore return_object); 453d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore 454e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Extract package count and elements array */ 455e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 456e8707b340fb5b6313cde784b944a568dfd770dddBob Moore elements = return_object->package.elements; 457e8707b340fb5b6313cde784b944a568dfd770dddBob Moore count = return_object->package.count; 458e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 459e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* The package must have at least one element, else invalid */ 460e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 461e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (!count) { 4620444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, 4630444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "Return Package has no elements (empty)")); 464e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 465e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (AE_AML_OPERAND_VALUE); 466e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 467e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 468e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 469e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Decode the type of the expected package contents 470e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 471e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * PTYPE1 packages contain no subpackages 472e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * PTYPE2 packages contain sub-packages 473e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 474e8707b340fb5b6313cde784b944a568dfd770dddBob Moore switch (package->ret_info.type) { 475e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE1_FIXED: 476e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 477e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 478e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * The package count is fixed and there are no sub-packages 479e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 480e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * If package is too small, exit. 481e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * If package is larger than expected, issue warning but continue 482e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 483e8707b340fb5b6313cde784b944a568dfd770dddBob Moore expected_count = 484e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package->ret_info.count1 + package->ret_info.count2; 485e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (count < expected_count) { 486e8707b340fb5b6313cde784b944a568dfd770dddBob Moore goto package_too_small; 487e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } else if (count > expected_count) { 4883a58176e4fa47d8232e04131b023f3f2ecd7084bBob Moore ACPI_DEBUG_PRINT((ACPI_DB_REPAIR, 4893a58176e4fa47d8232e04131b023f3f2ecd7084bBob Moore "%s: Return Package is larger than needed - " 4903a58176e4fa47d8232e04131b023f3f2ecd7084bBob Moore "found %u, expected %u\n", 4913a58176e4fa47d8232e04131b023f3f2ecd7084bBob Moore data->pathname, count, 4923a58176e4fa47d8232e04131b023f3f2ecd7084bBob Moore expected_count)); 493e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 494e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 495e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Validate all elements of the returned package */ 496e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 4970444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore status = acpi_ns_check_package_elements(data, elements, 498e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package->ret_info. 499e8707b340fb5b6313cde784b944a568dfd770dddBob Moore object_type1, 500e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package->ret_info. 501e8707b340fb5b6313cde784b944a568dfd770dddBob Moore count1, 502e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package->ret_info. 503e8707b340fb5b6313cde784b944a568dfd770dddBob Moore object_type2, 504e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package->ret_info. 50503ef132b7258bbea4858be4b1bd6cb6c3fdd3253Bob Moore count2, 0); 506e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 507e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 508e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE1_VAR: 509e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 510e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 511e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * The package count is variable, there are no sub-packages, and all 512e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * elements must be of the same type 513e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 514e8707b340fb5b6313cde784b944a568dfd770dddBob Moore for (i = 0; i < count; i++) { 5150444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore status = acpi_ns_check_object_type(data, elements, 516e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package->ret_info. 517e8707b340fb5b6313cde784b944a568dfd770dddBob Moore object_type1, i); 518e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 519e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 520e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 521e8707b340fb5b6313cde784b944a568dfd770dddBob Moore elements++; 522e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 523e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 524e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 525e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE1_OPTION: 526e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 527e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 528e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * The package count is variable, there are no sub-packages. There are 529e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * a fixed number of required elements, and a variable number of 530e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * optional elements. 531e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 532e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Check if package is at least as large as the minimum required 533e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 534e8707b340fb5b6313cde784b944a568dfd770dddBob Moore expected_count = package->ret_info3.count; 535e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (count < expected_count) { 536e8707b340fb5b6313cde784b944a568dfd770dddBob Moore goto package_too_small; 537e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 538e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 539e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Variable number of sub-objects */ 540e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 541e8707b340fb5b6313cde784b944a568dfd770dddBob Moore for (i = 0; i < count; i++) { 542e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (i < package->ret_info3.count) { 543e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 544e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* These are the required package elements (0, 1, or 2) */ 545e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 546e8707b340fb5b6313cde784b944a568dfd770dddBob Moore status = 5470444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore acpi_ns_check_object_type(data, elements, 548e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package-> 549e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ret_info3. 550e8707b340fb5b6313cde784b944a568dfd770dddBob Moore object_type[i], 551e8707b340fb5b6313cde784b944a568dfd770dddBob Moore i); 552e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 553e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 554e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 555e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } else { 556e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* These are the optional package elements */ 557e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 558e8707b340fb5b6313cde784b944a568dfd770dddBob Moore status = 5590444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore acpi_ns_check_object_type(data, elements, 560e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package-> 561e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ret_info3. 562e8707b340fb5b6313cde784b944a568dfd770dddBob Moore tail_object_type, 563e8707b340fb5b6313cde784b944a568dfd770dddBob Moore i); 564e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 565e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 566e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 567e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 568e8707b340fb5b6313cde784b944a568dfd770dddBob Moore elements++; 569e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 570e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 571e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 57253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore case ACPI_PTYPE2_REV_FIXED: 57353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 57453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* First element is the (Integer) revision */ 57553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 57653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore status = acpi_ns_check_object_type(data, elements, 57753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore ACPI_RTYPE_INTEGER, 0); 57853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore if (ACPI_FAILURE(status)) { 57953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore return (status); 58053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 58153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 58253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore elements++; 58353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore count--; 58453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 58553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Examine the sub-packages */ 58653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 58753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore status = 58853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore acpi_ns_check_package_list(data, package, elements, count); 58953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore break; 59053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 591e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE2_PKG_COUNT: 592e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 593e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* First element is the (Integer) count of sub-packages to follow */ 594e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 5950444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore status = acpi_ns_check_object_type(data, elements, 596e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ACPI_RTYPE_INTEGER, 0); 597e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 598e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 599e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 600e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 601e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 602e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Count cannot be larger than the parent package length, but allow it 603e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * to be smaller. The >= accounts for the Integer above. 604e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 605e8707b340fb5b6313cde784b944a568dfd770dddBob Moore expected_count = (u32) (*elements)->integer.value; 606e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (expected_count >= count) { 607e8707b340fb5b6313cde784b944a568dfd770dddBob Moore goto package_too_small; 608e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 609e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 610e8707b340fb5b6313cde784b944a568dfd770dddBob Moore count = expected_count; 611e8707b340fb5b6313cde784b944a568dfd770dddBob Moore elements++; 612e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 61353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Examine the sub-packages */ 614e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 61553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore status = 61653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore acpi_ns_check_package_list(data, package, elements, count); 61753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore break; 618e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 619e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE2: 620e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE2_FIXED: 621e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE2_MIN: 622e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE2_COUNT: 6237fce7a4b0db7d90db553faf568853d56cd908c39Bob Moore case ACPI_PTYPE2_FIX_VAR: 624e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 625e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 626e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore * These types all return a single Package that consists of a 627e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore * variable number of sub-Packages. 628e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore * 629e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore * First, ensure that the first element is a sub-Package. If not, 630e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore * the BIOS may have incorrectly returned the object as a single 631e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore * package instead of a Package of Packages (a common error if 632e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore * there is only one entry). We may be able to repair this by 633e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore * wrapping the returned Package with a new outer Package. 634e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 635419a909dd10142d015dd96457db1b1eda643f89eBob Moore if (*elements 636419a909dd10142d015dd96457db1b1eda643f89eBob Moore && ((*elements)->common.type != ACPI_TYPE_PACKAGE)) { 637e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore 638e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore /* Create the new outer package and populate it */ 639e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore 640e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore status = 6416a99b1c94d053b3420eaa4a4bc8b2883dd90a2f9Bob Moore acpi_ns_wrap_with_package(data, *elements, 6426a99b1c94d053b3420eaa4a4bc8b2883dd90a2f9Bob Moore return_object_ptr); 643e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore if (ACPI_FAILURE(status)) { 644e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore return (status); 645e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore } 646e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore 647e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore /* Update locals to point to the new package (of 1 element) */ 648e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore 649e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore return_object = *return_object_ptr; 650e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore elements = return_object->package.elements; 651e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore count = 1; 652e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore } 653e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore 65453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Examine the sub-packages */ 655e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore 65653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore status = 65753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore acpi_ns_check_package_list(data, package, elements, count); 65853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore break; 659e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 66053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore default: 661e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 66253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Should not get here if predefined info table is correct */ 663e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 66453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, 66553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore "Invalid internal return type in table entry: %X", 66653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore package->ret_info.type)); 667e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 66853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore return (AE_AML_INTERNAL); 66953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 670e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 67153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore return (status); 672e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 67353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moorepackage_too_small: 674e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 67553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Error exit for the case with an incorrect package count */ 676e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 67753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, 67853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore "Return Package is too small - found %u elements, expected %u", 67953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore count, expected_count)); 680e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 68153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore return (AE_AML_OPERAND_VALUE); 68253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore} 683e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 68453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore/******************************************************************************* 68553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * 68653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * FUNCTION: acpi_ns_check_package_list 68753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * 68853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * PARAMETERS: Data - Pointer to validation data structure 68953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * Package - Pointer to package-specific info for method 69053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * Elements - Element list of parent package. All elements 69153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * of this list should be of type Package. 69253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * Count - Count of subpackages 69353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * 69453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * RETURN: Status 69553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * 69653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * DESCRIPTION: Examine a list of subpackages 69753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * 69853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore ******************************************************************************/ 699e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 70053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moorestatic acpi_status 70153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Mooreacpi_ns_check_package_list(struct acpi_predefined_data *data, 70253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore const union acpi_predefined_info *package, 70353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore union acpi_operand_object **elements, u32 count) 70453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore{ 70553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore union acpi_operand_object *sub_package; 70653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore union acpi_operand_object **sub_elements; 70753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore acpi_status status; 70853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore u32 expected_count; 70953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore u32 i; 71053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore u32 j; 711e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 712d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore /* 713d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore * Validate each sub-Package in the parent Package 714d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore * 715d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore * NOTE: assumes list of sub-packages contains no NULL elements. 716d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore * Any NULL elements should have been removed by earlier call 717d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore * to acpi_ns_remove_null_elements. 718d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore */ 71953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore for (i = 0; i < count; i++) { 72053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore sub_package = *elements; 72153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore sub_elements = sub_package->package.elements; 722091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore data->parent_package = sub_package; 723e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 72453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Each sub-object must be of type Package */ 725e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 72653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore status = acpi_ns_check_object_type(data, &sub_package, 72753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore ACPI_RTYPE_PACKAGE, i); 72853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore if (ACPI_FAILURE(status)) { 72953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore return (status); 73053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 731e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 73253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Examine the different types of expected sub-packages */ 733e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 734091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore data->parent_package = sub_package; 73553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore switch (package->ret_info.type) { 73653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore case ACPI_PTYPE2: 73753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore case ACPI_PTYPE2_PKG_COUNT: 73853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore case ACPI_PTYPE2_REV_FIXED: 73953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 74053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Each subpackage has a fixed number of elements */ 74153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 74253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore expected_count = 74353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore package->ret_info.count1 + package->ret_info.count2; 74453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore if (sub_package->package.count < expected_count) { 74553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore goto package_too_small; 74653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 74753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 74853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore status = 74953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore acpi_ns_check_package_elements(data, sub_elements, 75053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore package->ret_info. 75153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore object_type1, 75253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore package->ret_info. 75353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore count1, 75453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore package->ret_info. 75553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore object_type2, 75653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore package->ret_info. 75753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore count2, 0); 75853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore if (ACPI_FAILURE(status)) { 75953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore return (status); 76053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 76153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore break; 76253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 7637fce7a4b0db7d90db553faf568853d56cd908c39Bob Moore case ACPI_PTYPE2_FIX_VAR: 7647fce7a4b0db7d90db553faf568853d56cd908c39Bob Moore /* 7657fce7a4b0db7d90db553faf568853d56cd908c39Bob Moore * Each subpackage has a fixed number of elements and an 7667fce7a4b0db7d90db553faf568853d56cd908c39Bob Moore * optional element 7677fce7a4b0db7d90db553faf568853d56cd908c39Bob Moore */ 7687fce7a4b0db7d90db553faf568853d56cd908c39Bob Moore expected_count = 7697fce7a4b0db7d90db553faf568853d56cd908c39Bob Moore package->ret_info.count1 + package->ret_info.count2; 7707fce7a4b0db7d90db553faf568853d56cd908c39Bob Moore if (sub_package->package.count < expected_count) { 7717fce7a4b0db7d90db553faf568853d56cd908c39Bob Moore goto package_too_small; 7727fce7a4b0db7d90db553faf568853d56cd908c39Bob Moore } 7737fce7a4b0db7d90db553faf568853d56cd908c39Bob Moore 7747fce7a4b0db7d90db553faf568853d56cd908c39Bob Moore status = 7757fce7a4b0db7d90db553faf568853d56cd908c39Bob Moore acpi_ns_check_package_elements(data, sub_elements, 7767fce7a4b0db7d90db553faf568853d56cd908c39Bob Moore package->ret_info. 7777fce7a4b0db7d90db553faf568853d56cd908c39Bob Moore object_type1, 7787fce7a4b0db7d90db553faf568853d56cd908c39Bob Moore package->ret_info. 7797fce7a4b0db7d90db553faf568853d56cd908c39Bob Moore count1, 7807fce7a4b0db7d90db553faf568853d56cd908c39Bob Moore package->ret_info. 7817fce7a4b0db7d90db553faf568853d56cd908c39Bob Moore object_type2, 7827fce7a4b0db7d90db553faf568853d56cd908c39Bob Moore sub_package->package. 7837fce7a4b0db7d90db553faf568853d56cd908c39Bob Moore count - 7847fce7a4b0db7d90db553faf568853d56cd908c39Bob Moore package->ret_info. 7857fce7a4b0db7d90db553faf568853d56cd908c39Bob Moore count1, 0); 7867fce7a4b0db7d90db553faf568853d56cd908c39Bob Moore if (ACPI_FAILURE(status)) { 7877fce7a4b0db7d90db553faf568853d56cd908c39Bob Moore return (status); 7887fce7a4b0db7d90db553faf568853d56cd908c39Bob Moore } 7897fce7a4b0db7d90db553faf568853d56cd908c39Bob Moore break; 7907fce7a4b0db7d90db553faf568853d56cd908c39Bob Moore 79153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore case ACPI_PTYPE2_FIXED: 79253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 79353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Each sub-package has a fixed length */ 794e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 79553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore expected_count = package->ret_info2.count; 79653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore if (sub_package->package.count < expected_count) { 79753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore goto package_too_small; 79853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 799e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 80053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Check the type of each sub-package element */ 801e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 80253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore for (j = 0; j < expected_count; j++) { 803e8707b340fb5b6313cde784b944a568dfd770dddBob Moore status = 8040444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore acpi_ns_check_object_type(data, 80553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore &sub_elements[j], 80653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore package-> 80753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore ret_info2. 80853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore object_type[j], 80953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore j); 810e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 811e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 812e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 81353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 81453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore break; 815e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 81653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore case ACPI_PTYPE2_MIN: 817e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 81853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Each sub-package has a variable but minimum length */ 819e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 82053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore expected_count = package->ret_info.count1; 82153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore if (sub_package->package.count < expected_count) { 82253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore goto package_too_small; 82353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 824e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 82553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Check the type of each sub-package element */ 826e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 82753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore status = 82853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore acpi_ns_check_package_elements(data, sub_elements, 82953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore package->ret_info. 83053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore object_type1, 83153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore sub_package->package. 83253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore count, 0, 0, 0); 83353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore if (ACPI_FAILURE(status)) { 83453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore return (status); 835e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 83653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore break; 837e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 83853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore case ACPI_PTYPE2_COUNT: 839e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 84053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* 84153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * First element is the (Integer) count of elements, including 842091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore * the count field (the ACPI name is num_elements) 84353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore */ 84453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore status = acpi_ns_check_object_type(data, sub_elements, 84553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore ACPI_RTYPE_INTEGER, 84653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 0); 84753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore if (ACPI_FAILURE(status)) { 84853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore return (status); 84953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 850e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 85153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* 85253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * Make sure package is large enough for the Count and is 85353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * is as large as the minimum size 85453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore */ 85553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore expected_count = (u32)(*sub_elements)->integer.value; 85653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore if (sub_package->package.count < expected_count) { 85753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore goto package_too_small; 85853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 85953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore if (sub_package->package.count < 86053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore package->ret_info.count1) { 86153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore expected_count = package->ret_info.count1; 86253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore goto package_too_small; 86353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 864091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore if (expected_count == 0) { 865091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore /* 866091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore * Either the num_entries element was originally zero or it was 867091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore * a NULL element and repaired to an Integer of value zero. 868091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore * In either case, repair it by setting num_entries to be the 869091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore * actual size of the subpackage. 870091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore */ 871091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore expected_count = sub_package->package.count; 872091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore (*sub_elements)->integer.value = expected_count; 873091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore } 874e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 87553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Check the type of each sub-package element */ 876e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 87753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore status = 87853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore acpi_ns_check_package_elements(data, 87953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore (sub_elements + 1), 88053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore package->ret_info. 88153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore object_type1, 88253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore (expected_count - 1), 88353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 0, 0, 1); 88453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore if (ACPI_FAILURE(status)) { 88553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore return (status); 88653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 88753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore break; 88853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 88953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore default: /* Should not get here, type was validated by caller */ 89053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 89153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore return (AE_AML_INTERNAL); 89253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 89353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 89453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore elements++; 895e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 896e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 897e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (AE_OK); 898e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 89953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moorepackage_too_small: 900e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 90153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* The sub-package count was smaller than required */ 902e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 9030444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, 90453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore "Return Sub-Package[%u] is too small - found %u elements, expected %u", 90553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore i, sub_package->package.count, expected_count)); 906e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 907e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (AE_AML_OPERAND_VALUE); 908e8707b340fb5b6313cde784b944a568dfd770dddBob Moore} 909e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 910e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/******************************************************************************* 911e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 912e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * FUNCTION: acpi_ns_check_package_elements 913e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 9140444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * PARAMETERS: Data - Pointer to validation data structure 915e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Elements - Pointer to the package elements array 916e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Type1 - Object type for first group 917e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Count1 - Count for first group 918e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Type2 - Object type for second group 919e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Count2 - Count for second group 92003ef132b7258bbea4858be4b1bd6cb6c3fdd3253Bob Moore * start_index - Start of the first group of elements 921e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 922e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * RETURN: Status 923e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 924e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * DESCRIPTION: Check that all elements of a package are of the correct object 925e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * type. Supports up to two groups of different object types. 926e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 927e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ******************************************************************************/ 928e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 929e8707b340fb5b6313cde784b944a568dfd770dddBob Moorestatic acpi_status 9300444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Mooreacpi_ns_check_package_elements(struct acpi_predefined_data *data, 931e8707b340fb5b6313cde784b944a568dfd770dddBob Moore union acpi_operand_object **elements, 93203ef132b7258bbea4858be4b1bd6cb6c3fdd3253Bob Moore u8 type1, 93303ef132b7258bbea4858be4b1bd6cb6c3fdd3253Bob Moore u32 count1, 93403ef132b7258bbea4858be4b1bd6cb6c3fdd3253Bob Moore u8 type2, u32 count2, u32 start_index) 935e8707b340fb5b6313cde784b944a568dfd770dddBob Moore{ 936e8707b340fb5b6313cde784b944a568dfd770dddBob Moore union acpi_operand_object **this_element = elements; 937e8707b340fb5b6313cde784b944a568dfd770dddBob Moore acpi_status status; 938e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 i; 939e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 940e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 941e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Up to two groups of package elements are supported by the data 942e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * structure. All elements in each group must be of the same type. 943e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * The second group can have a count of zero. 944e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 945e8707b340fb5b6313cde784b944a568dfd770dddBob Moore for (i = 0; i < count1; i++) { 9460444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore status = acpi_ns_check_object_type(data, this_element, 94703ef132b7258bbea4858be4b1bd6cb6c3fdd3253Bob Moore type1, i + start_index); 948e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 949e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 950e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 951e8707b340fb5b6313cde784b944a568dfd770dddBob Moore this_element++; 952e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 953e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 954e8707b340fb5b6313cde784b944a568dfd770dddBob Moore for (i = 0; i < count2; i++) { 9550444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore status = acpi_ns_check_object_type(data, this_element, 95603ef132b7258bbea4858be4b1bd6cb6c3fdd3253Bob Moore type2, 95703ef132b7258bbea4858be4b1bd6cb6c3fdd3253Bob Moore (i + count1 + start_index)); 958e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 959e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 960e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 961e8707b340fb5b6313cde784b944a568dfd770dddBob Moore this_element++; 962e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 963e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 964e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (AE_OK); 965e8707b340fb5b6313cde784b944a568dfd770dddBob Moore} 966e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 967e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/******************************************************************************* 968e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 969e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * FUNCTION: acpi_ns_check_object_type 970e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 9710444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * PARAMETERS: Data - Pointer to validation data structure 972a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * return_object_ptr - Pointer to the object returned from the 973a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * evaluation of a method or object 974e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * expected_btypes - Bitmap of expected return type(s) 975e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * package_index - Index of object within parent package (if 9760444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * applicable - ACPI_NOT_PACKAGE_ELEMENT 9770444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * otherwise) 978e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 979e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * RETURN: Status 980e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 981e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * DESCRIPTION: Check the type of the return object against the expected object 982e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * type(s). Use of Btype allows multiple expected object types. 983e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 984e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ******************************************************************************/ 985e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 986e8707b340fb5b6313cde784b944a568dfd770dddBob Moorestatic acpi_status 9870444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Mooreacpi_ns_check_object_type(struct acpi_predefined_data *data, 988a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore union acpi_operand_object **return_object_ptr, 989e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 expected_btypes, u32 package_index) 990e8707b340fb5b6313cde784b944a568dfd770dddBob Moore{ 991a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore union acpi_operand_object *return_object = *return_object_ptr; 992e8707b340fb5b6313cde784b944a568dfd770dddBob Moore acpi_status status = AE_OK; 993e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 return_btype; 994e8707b340fb5b6313cde784b944a568dfd770dddBob Moore char type_buffer[48]; /* Room for 5 types */ 995e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 996e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 997091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore * If we get a NULL return_object here, it is a NULL package element. 998091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore * Since all extraneous NULL package elements were removed earlier by a 999091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore * call to acpi_ns_remove_null_elements, this is an unexpected NULL element. 1000091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore * We will attempt to repair it. 1001e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 1002e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (!return_object) { 1003091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore status = acpi_ns_repair_null_element(data, expected_btypes, 1004091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore package_index, 1005091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore return_object_ptr); 1006091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore if (ACPI_SUCCESS(status)) { 1007091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore return (AE_OK); /* Repair was successful */ 1008091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore } 1009e8707b340fb5b6313cde784b944a568dfd770dddBob Moore goto type_error_exit; 1010e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 1011e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1012e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* A Namespace node should not get here, but make sure */ 1013e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1014e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_GET_DESCRIPTOR_TYPE(return_object) == ACPI_DESC_TYPE_NAMED) { 10150444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, 10160444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "Invalid return type - Found a Namespace node [%4.4s] type %s", 10170444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore return_object->node.name.ascii, 10180444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore acpi_ut_get_type_name(return_object->node. 10190444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore type))); 1020e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (AE_AML_OPERAND_TYPE); 1021e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 1022e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1023e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 1024e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Convert the object type (ACPI_TYPE_xxx) to a bitmapped object type. 1025e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * The bitmapped type allows multiple possible return types. 1026e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 1027e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Note, the cases below must handle all of the possible types returned 1028e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * from all of the predefined names (including elements of returned 1029e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * packages) 1030e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 10313371c19c294a4cb3649aa4e84606be8a1d999e61Bob Moore switch (return_object->common.type) { 1032e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_TYPE_INTEGER: 1033e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return_btype = ACPI_RTYPE_INTEGER; 1034e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 1035e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1036e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_TYPE_BUFFER: 1037e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return_btype = ACPI_RTYPE_BUFFER; 1038e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 1039e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1040e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_TYPE_STRING: 1041e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return_btype = ACPI_RTYPE_STRING; 1042e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 1043e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1044e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_TYPE_PACKAGE: 1045e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return_btype = ACPI_RTYPE_PACKAGE; 1046e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 1047e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1048e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_TYPE_LOCAL_REFERENCE: 1049e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return_btype = ACPI_RTYPE_REFERENCE; 1050e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 1051e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1052e8707b340fb5b6313cde784b944a568dfd770dddBob Moore default: 1053e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Not one of the supported objects, must be incorrect */ 1054e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1055e8707b340fb5b6313cde784b944a568dfd770dddBob Moore goto type_error_exit; 1056e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 1057e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1058e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Is the object one of the expected types? */ 1059e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 10602147d3f00f85c9e993786863d8138694672da01bBob Moore if (return_btype & expected_btypes) { 1061a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore 10622147d3f00f85c9e993786863d8138694672da01bBob Moore /* For reference objects, check that the reference type is correct */ 1063a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore 10642147d3f00f85c9e993786863d8138694672da01bBob Moore if (return_object->common.type == ACPI_TYPE_LOCAL_REFERENCE) { 10652147d3f00f85c9e993786863d8138694672da01bBob Moore status = acpi_ns_check_reference(data, return_object); 1066a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore } 10672147d3f00f85c9e993786863d8138694672da01bBob Moore 10682147d3f00f85c9e993786863d8138694672da01bBob Moore return (status); 1069e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 1070e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 10712147d3f00f85c9e993786863d8138694672da01bBob Moore /* Type mismatch -- attempt repair of the returned object */ 1072e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 10732147d3f00f85c9e993786863d8138694672da01bBob Moore status = acpi_ns_repair_object(data, expected_btypes, 10742147d3f00f85c9e993786863d8138694672da01bBob Moore package_index, return_object_ptr); 10752147d3f00f85c9e993786863d8138694672da01bBob Moore if (ACPI_SUCCESS(status)) { 10762147d3f00f85c9e993786863d8138694672da01bBob Moore return (AE_OK); /* Repair was successful */ 1077e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 1078e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1079e8707b340fb5b6313cde784b944a568dfd770dddBob Moore type_error_exit: 1080e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1081e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Create a string with all expected types for this predefined object */ 1082e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 10830444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore acpi_ns_get_expected_types(type_buffer, expected_btypes); 1084e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 10850444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore if (package_index == ACPI_NOT_PACKAGE_ELEMENT) { 10860444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, 10870444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "Return type mismatch - found %s, expected %s", 10880444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore acpi_ut_get_object_type_name 10890444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore (return_object), type_buffer)); 1090e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } else { 10910444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, 10920444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "Return Package type mismatch at index %u - " 10930444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "found %s, expected %s", package_index, 10940444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore acpi_ut_get_object_type_name 10950444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore (return_object), type_buffer)); 1096e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 1097e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1098e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (AE_AML_OPERAND_TYPE); 1099e8707b340fb5b6313cde784b944a568dfd770dddBob Moore} 1100e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1101e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/******************************************************************************* 1102e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 1103e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * FUNCTION: acpi_ns_check_reference 1104e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 11050444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * PARAMETERS: Data - Pointer to validation data structure 1106e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * return_object - Object returned from the evaluation of a 1107e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * method or object 1108e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 1109e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * RETURN: Status 1110e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 1111e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * DESCRIPTION: Check a returned reference object for the correct reference 1112e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * type. The only reference type that can be returned from a 1113e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * predefined method is a named reference. All others are invalid. 1114e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 1115e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ******************************************************************************/ 1116e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1117e8707b340fb5b6313cde784b944a568dfd770dddBob Moorestatic acpi_status 11180444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Mooreacpi_ns_check_reference(struct acpi_predefined_data *data, 1119e8707b340fb5b6313cde784b944a568dfd770dddBob Moore union acpi_operand_object *return_object) 1120e8707b340fb5b6313cde784b944a568dfd770dddBob Moore{ 1121e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1122e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 1123e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Check the reference object for the correct reference type (opcode). 1124e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * The only type of reference that can be converted to an union acpi_object is 1125e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * a reference to a named object (reference class: NAME) 1126e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 1127e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (return_object->reference.class == ACPI_REFCLASS_NAME) { 1128e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (AE_OK); 1129e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 1130e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 11310444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, 11320444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "Return type mismatch - unexpected reference object type [%s] %2.2X", 11330444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore acpi_ut_get_reference_name(return_object), 11340444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore return_object->reference.class)); 1135e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1136e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (AE_AML_OPERAND_TYPE); 1137e8707b340fb5b6313cde784b944a568dfd770dddBob Moore} 1138a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore 1139a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore/******************************************************************************* 11400444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * 11410444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * FUNCTION: acpi_ns_get_expected_types 11420444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * 11430444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * PARAMETERS: Buffer - Pointer to where the string is returned 11440444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * expected_btypes - Bitmap of expected return type(s) 11450444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * 11460444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * RETURN: Buffer is populated with type names. 11470444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * 11480444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * DESCRIPTION: Translate the expected types bitmap into a string of ascii 11490444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * names of expected types, for use in warning messages. 11500444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * 11510444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ******************************************************************************/ 11520444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore 11530444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moorestatic void acpi_ns_get_expected_types(char *buffer, u32 expected_btypes) 11540444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore{ 11550444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore u32 this_rtype; 11560444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore u32 i; 11570444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore u32 j; 11580444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore 11590444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore j = 1; 11600444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore buffer[0] = 0; 11610444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore this_rtype = ACPI_RTYPE_INTEGER; 11620444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore 11630444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore for (i = 0; i < ACPI_NUM_RTYPES; i++) { 11640444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore 11650444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore /* If one of the expected types, concatenate the name of this type */ 11660444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore 11670444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore if (expected_btypes & this_rtype) { 11680444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_STRCAT(buffer, &acpi_rtype_names[i][j]); 11690444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore j = 0; /* Use name separator from now on */ 11700444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore } 11710444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore this_rtype <<= 1; /* Next Rtype */ 11720444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore } 11730444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore} 1174