nspredef.c revision d57b23ad0ca7a46931e4d98eb6b4b73b112f0969
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/* 9b4e104eaeb8cd4329a23e0e4ebf166681b1d182dBob Moore * Copyright (C) 2000 - 2011, 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; 2210444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore data->node_flags = node->flags; 2220444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore data->pathname = pathname; 223e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 224e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 225465da9eb75665203a826f961de74a817b870850aBob Moore * Check that the type of the main return object is what is expected 226465da9eb75665203a826f961de74a817b870850aBob Moore * for this predefined name 227e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 2280444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore status = acpi_ns_check_object_type(data, return_object_ptr, 229e8707b340fb5b6313cde784b944a568dfd770dddBob Moore predefined->info.expected_btypes, 2300444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_NOT_PACKAGE_ELEMENT); 231465da9eb75665203a826f961de74a817b870850aBob Moore if (ACPI_FAILURE(status)) { 232465da9eb75665203a826f961de74a817b870850aBob Moore goto exit; 233465da9eb75665203a826f961de74a817b870850aBob Moore } 234465da9eb75665203a826f961de74a817b870850aBob Moore 235465da9eb75665203a826f961de74a817b870850aBob Moore /* 236465da9eb75665203a826f961de74a817b870850aBob Moore * For returned Package objects, check the type of all sub-objects. 237465da9eb75665203a826f961de74a817b870850aBob Moore * Note: Package may have been newly created by call above. 238465da9eb75665203a826f961de74a817b870850aBob Moore */ 239465da9eb75665203a826f961de74a817b870850aBob Moore if ((*return_object_ptr)->common.type == ACPI_TYPE_PACKAGE) { 240091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore data->parent_package = *return_object_ptr; 241465da9eb75665203a826f961de74a817b870850aBob Moore status = acpi_ns_check_package(data, return_object_ptr); 242465da9eb75665203a826f961de74a817b870850aBob Moore if (ACPI_FAILURE(status)) { 243465da9eb75665203a826f961de74a817b870850aBob Moore goto exit; 24434c39c755347c1ca3d06284bad2273c6a9c3108aBob Moore } 245e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 246e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 247ad5babeed8d3082406c5b67ae558b95a479ddb6fBob Moore /* 248465da9eb75665203a826f961de74a817b870850aBob Moore * The return object was OK, or it was successfully repaired above. 249465da9eb75665203a826f961de74a817b870850aBob Moore * Now make some additional checks such as verifying that package 250465da9eb75665203a826f961de74a817b870850aBob Moore * objects are sorted correctly (if required) or buffer objects have 251465da9eb75665203a826f961de74a817b870850aBob Moore * the correct data width (bytes vs. dwords). These repairs are 252465da9eb75665203a826f961de74a817b870850aBob Moore * performed on a per-name basis, i.e., the code is specific to 253465da9eb75665203a826f961de74a817b870850aBob Moore * particular predefined names. 254ad5babeed8d3082406c5b67ae558b95a479ddb6fBob Moore */ 255ad5babeed8d3082406c5b67ae558b95a479ddb6fBob Moore status = acpi_ns_complex_repairs(data, node, status, return_object_ptr); 256ad5babeed8d3082406c5b67ae558b95a479ddb6fBob Moore 257465da9eb75665203a826f961de74a817b870850aBob Mooreexit: 2580444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore /* 2590444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * If the object validation failed or if we successfully repaired one 2600444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * or more objects, mark the parent node to suppress further warning 2610444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * messages during the next evaluation of the same method/object. 2620444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore */ 2630444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore if (ACPI_FAILURE(status) || (data->flags & ACPI_OBJECT_REPAIRED)) { 2640444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore node->flags |= ANOBJ_EVALUATED; 2650444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore } 2660444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_FREE(data); 2670444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore 2680444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moorecleanup: 26965259094c3e038519a2d8fa6fbc6256f04ad6535Bob Moore ACPI_FREE(pathname); 270e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 271e8707b340fb5b6313cde784b944a568dfd770dddBob Moore} 272e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 273e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/******************************************************************************* 274e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 275e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * FUNCTION: acpi_ns_check_parameter_count 276e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 277e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * PARAMETERS: Pathname - Full pathname to the node (for error msgs) 278e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Node - Namespace node for the method/object 279eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * user_param_count - Number of args passed in by the caller 280e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Predefined - Pointer to entry in predefined name table 281e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 282e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * RETURN: None 283e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 284e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * DESCRIPTION: Check that the declared (in ASL/AML) parameter count for a 285e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * predefined name is what is expected (i.e., what is defined in 286e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * the ACPI specification for this predefined name.) 287e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 288e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ******************************************************************************/ 289e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 290e8707b340fb5b6313cde784b944a568dfd770dddBob Moorevoid 291e8707b340fb5b6313cde784b944a568dfd770dddBob Mooreacpi_ns_check_parameter_count(char *pathname, 292e8707b340fb5b6313cde784b944a568dfd770dddBob Moore struct acpi_namespace_node *node, 293eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore u32 user_param_count, 294e8707b340fb5b6313cde784b944a568dfd770dddBob Moore const union acpi_predefined_info *predefined) 295e8707b340fb5b6313cde784b944a568dfd770dddBob Moore{ 296e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 param_count; 297e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 required_params_current; 298e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 required_params_old; 299e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 300eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore /* Methods have 0-7 parameters. All other types have zero. */ 301eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore 302e8707b340fb5b6313cde784b944a568dfd770dddBob Moore param_count = 0; 303e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (node->type == ACPI_TYPE_METHOD) { 304e8707b340fb5b6313cde784b944a568dfd770dddBob Moore param_count = node->object->method.param_count; 305e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 306e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 307eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore if (!predefined) { 308eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore /* 3090444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * Check the parameter count for non-predefined methods/objects. 3100444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * 311eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * Warning if too few or too many arguments have been passed by the 312eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * caller. An incorrect number of arguments may not cause the method 313eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * to fail. However, the method will fail if there are too few 314eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * arguments and the method attempts to use one of the missing ones. 315eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore */ 316eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore if (user_param_count < param_count) { 3170444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_PREDEFINED((AE_INFO, pathname, 3180444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_ALWAYS, 3190444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "Insufficient arguments - needs %u, found %u", 3200444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore param_count, user_param_count)); 321eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore } else if (user_param_count > param_count) { 3220444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_PREDEFINED((AE_INFO, pathname, 3230444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_ALWAYS, 3240444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "Excess arguments - needs %u, found %u", 3250444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore param_count, user_param_count)); 326eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore } 327eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore return; 328eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore } 329eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore 3300444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore /* 3310444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * Validate the user-supplied parameter count. 3320444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * Allow two different legal argument counts (_SCP, etc.) 3330444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore */ 334e8707b340fb5b6313cde784b944a568dfd770dddBob Moore required_params_current = predefined->info.param_count & 0x0F; 335e8707b340fb5b6313cde784b944a568dfd770dddBob Moore required_params_old = predefined->info.param_count >> 4; 336e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 337eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore if (user_param_count != ACPI_UINT32_MAX) { 338eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore if ((user_param_count != required_params_current) && 339eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore (user_param_count != required_params_old)) { 3400444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_PREDEFINED((AE_INFO, pathname, 3410444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_ALWAYS, 3420444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "Parameter count mismatch - " 3430444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "caller passed %u, ACPI requires %u", 3440444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore user_param_count, 3450444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore required_params_current)); 346eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore } 347eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore } 348eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore 349eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore /* 350eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * Check that the ASL-defined parameter count is what is expected for 3510444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * this predefined name (parameter count as defined by the ACPI 3520444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * specification) 353eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore */ 354e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if ((param_count != required_params_current) && 355e8707b340fb5b6313cde784b944a568dfd770dddBob Moore (param_count != required_params_old)) { 3560444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_PREDEFINED((AE_INFO, pathname, node->flags, 3570444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "Parameter count mismatch - ASL declared %u, ACPI requires %u", 3580444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore param_count, required_params_current)); 359e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 360e8707b340fb5b6313cde784b944a568dfd770dddBob Moore} 361e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 362e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/******************************************************************************* 363e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 364e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * FUNCTION: acpi_ns_check_for_predefined_name 365e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 366e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * PARAMETERS: Node - Namespace node for the method/object 367e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 368e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * RETURN: Pointer to entry in predefined table. NULL indicates not found. 369e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 370e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * DESCRIPTION: Check an object name against the predefined object list. 371e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 372e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ******************************************************************************/ 373e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 374e8707b340fb5b6313cde784b944a568dfd770dddBob Mooreconst union acpi_predefined_info *acpi_ns_check_for_predefined_name(struct 375e8707b340fb5b6313cde784b944a568dfd770dddBob Moore acpi_namespace_node 376e8707b340fb5b6313cde784b944a568dfd770dddBob Moore *node) 377e8707b340fb5b6313cde784b944a568dfd770dddBob Moore{ 378e8707b340fb5b6313cde784b944a568dfd770dddBob Moore const union acpi_predefined_info *this_name; 379e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 380e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Quick check for a predefined name, first character must be underscore */ 381e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 382e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (node->name.ascii[0] != '_') { 383e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (NULL); 384e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 385e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 386e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Search info table for a predefined method/object name */ 387e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 388e8707b340fb5b6313cde784b944a568dfd770dddBob Moore this_name = predefined_names; 389e8707b340fb5b6313cde784b944a568dfd770dddBob Moore while (this_name->info.name[0]) { 390e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_COMPARE_NAME(node->name.ascii, this_name->info.name)) { 391e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (this_name); 392e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 393e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 394e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 395e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Skip next entry in the table if this name returns a Package 396e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * (next entry contains the package info) 397e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 398e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (this_name->info.expected_btypes & ACPI_RTYPE_PACKAGE) { 399e8707b340fb5b6313cde784b944a568dfd770dddBob Moore this_name++; 400e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 401e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 402e8707b340fb5b6313cde784b944a568dfd770dddBob Moore this_name++; 403e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 404e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 4050444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore return (NULL); /* Not found */ 406e8707b340fb5b6313cde784b944a568dfd770dddBob Moore} 407e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 408e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/******************************************************************************* 409e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 410e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * FUNCTION: acpi_ns_check_package 411e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 4120444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * PARAMETERS: Data - Pointer to validation data structure 413a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * return_object_ptr - Pointer to the object returned from the 414a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * evaluation of a method or object 415e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 416e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * RETURN: Status 417e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 418e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * DESCRIPTION: Check a returned package object for the correct count and 419e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * correct type of all sub-objects. 420e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 421e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ******************************************************************************/ 422e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 423e8707b340fb5b6313cde784b944a568dfd770dddBob Moorestatic acpi_status 4240444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Mooreacpi_ns_check_package(struct acpi_predefined_data *data, 4250444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore union acpi_operand_object **return_object_ptr) 426e8707b340fb5b6313cde784b944a568dfd770dddBob Moore{ 427a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore union acpi_operand_object *return_object = *return_object_ptr; 428e8707b340fb5b6313cde784b944a568dfd770dddBob Moore const union acpi_predefined_info *package; 429e8707b340fb5b6313cde784b944a568dfd770dddBob Moore union acpi_operand_object **elements; 43053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore acpi_status status = AE_OK; 431e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 expected_count; 432e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 count; 433e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 i; 434e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 435e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ACPI_FUNCTION_NAME(ns_check_package); 436e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 437e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* The package info for this name is in the next table entry */ 438e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 4390444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore package = data->predefined + 1; 440e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 441e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ACPI_DEBUG_PRINT((ACPI_DB_NAMES, 442e8707b340fb5b6313cde784b944a568dfd770dddBob Moore "%s Validating return Package of Type %X, Count %X\n", 4430444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore data->pathname, package->ret_info.type, 444e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return_object->package.count)); 445e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 446d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore /* 447d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore * For variable-length Packages, we can safely remove all embedded 448d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore * and trailing NULL package elements 449d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore */ 450d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore acpi_ns_remove_null_elements(data, package->ret_info.type, 451d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore return_object); 452d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore 453e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Extract package count and elements array */ 454e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 455e8707b340fb5b6313cde784b944a568dfd770dddBob Moore elements = return_object->package.elements; 456e8707b340fb5b6313cde784b944a568dfd770dddBob Moore count = return_object->package.count; 457e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 458e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* The package must have at least one element, else invalid */ 459e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 460e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (!count) { 4610444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, 4620444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "Return Package has no elements (empty)")); 463e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 464e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (AE_AML_OPERAND_VALUE); 465e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 466e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 467e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 468e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Decode the type of the expected package contents 469e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 470e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * PTYPE1 packages contain no subpackages 471e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * PTYPE2 packages contain sub-packages 472e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 473e8707b340fb5b6313cde784b944a568dfd770dddBob Moore switch (package->ret_info.type) { 474e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE1_FIXED: 475e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 476e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 477e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * The package count is fixed and there are no sub-packages 478e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 479e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * If package is too small, exit. 480e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * If package is larger than expected, issue warning but continue 481e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 482e8707b340fb5b6313cde784b944a568dfd770dddBob Moore expected_count = 483e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package->ret_info.count1 + package->ret_info.count2; 484e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (count < expected_count) { 485e8707b340fb5b6313cde784b944a568dfd770dddBob Moore goto package_too_small; 486e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } else if (count > expected_count) { 4873a58176e4fa47d8232e04131b023f3f2ecd7084bBob Moore ACPI_DEBUG_PRINT((ACPI_DB_REPAIR, 4883a58176e4fa47d8232e04131b023f3f2ecd7084bBob Moore "%s: Return Package is larger than needed - " 4893a58176e4fa47d8232e04131b023f3f2ecd7084bBob Moore "found %u, expected %u\n", 4903a58176e4fa47d8232e04131b023f3f2ecd7084bBob Moore data->pathname, count, 4913a58176e4fa47d8232e04131b023f3f2ecd7084bBob Moore expected_count)); 492e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 493e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 494e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Validate all elements of the returned package */ 495e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 4960444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore status = acpi_ns_check_package_elements(data, elements, 497e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package->ret_info. 498e8707b340fb5b6313cde784b944a568dfd770dddBob Moore object_type1, 499e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package->ret_info. 500e8707b340fb5b6313cde784b944a568dfd770dddBob Moore count1, 501e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package->ret_info. 502e8707b340fb5b6313cde784b944a568dfd770dddBob Moore object_type2, 503e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package->ret_info. 50403ef132b7258bbea4858be4b1bd6cb6c3fdd3253Bob Moore count2, 0); 505e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 506e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 507e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE1_VAR: 508e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 509e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 510e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * The package count is variable, there are no sub-packages, and all 511e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * elements must be of the same type 512e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 513e8707b340fb5b6313cde784b944a568dfd770dddBob Moore for (i = 0; i < count; i++) { 5140444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore status = acpi_ns_check_object_type(data, elements, 515e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package->ret_info. 516e8707b340fb5b6313cde784b944a568dfd770dddBob Moore object_type1, i); 517e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 518e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 519e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 520e8707b340fb5b6313cde784b944a568dfd770dddBob Moore elements++; 521e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 522e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 523e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 524e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE1_OPTION: 525e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 526e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 527e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * The package count is variable, there are no sub-packages. There are 528e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * a fixed number of required elements, and a variable number of 529e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * optional elements. 530e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 531e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Check if package is at least as large as the minimum required 532e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 533e8707b340fb5b6313cde784b944a568dfd770dddBob Moore expected_count = package->ret_info3.count; 534e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (count < expected_count) { 535e8707b340fb5b6313cde784b944a568dfd770dddBob Moore goto package_too_small; 536e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 537e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 538e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Variable number of sub-objects */ 539e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 540e8707b340fb5b6313cde784b944a568dfd770dddBob Moore for (i = 0; i < count; i++) { 541e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (i < package->ret_info3.count) { 542e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 543e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* These are the required package elements (0, 1, or 2) */ 544e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 545e8707b340fb5b6313cde784b944a568dfd770dddBob Moore status = 5460444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore acpi_ns_check_object_type(data, elements, 547e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package-> 548e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ret_info3. 549e8707b340fb5b6313cde784b944a568dfd770dddBob Moore object_type[i], 550e8707b340fb5b6313cde784b944a568dfd770dddBob Moore i); 551e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 552e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 553e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 554e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } else { 555e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* These are the optional package elements */ 556e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 557e8707b340fb5b6313cde784b944a568dfd770dddBob Moore status = 5580444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore acpi_ns_check_object_type(data, elements, 559e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package-> 560e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ret_info3. 561e8707b340fb5b6313cde784b944a568dfd770dddBob Moore tail_object_type, 562e8707b340fb5b6313cde784b944a568dfd770dddBob Moore i); 563e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 564e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 565e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 566e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 567e8707b340fb5b6313cde784b944a568dfd770dddBob Moore elements++; 568e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 569e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 570e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 57153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore case ACPI_PTYPE2_REV_FIXED: 57253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 57353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* First element is the (Integer) revision */ 57453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 57553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore status = acpi_ns_check_object_type(data, elements, 57653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore ACPI_RTYPE_INTEGER, 0); 57753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore if (ACPI_FAILURE(status)) { 57853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore return (status); 57953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 58053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 58153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore elements++; 58253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore count--; 58353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 58453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Examine the sub-packages */ 58553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 58653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore status = 58753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore acpi_ns_check_package_list(data, package, elements, count); 58853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore break; 58953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 590e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE2_PKG_COUNT: 591e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 592e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* First element is the (Integer) count of sub-packages to follow */ 593e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 5940444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore status = acpi_ns_check_object_type(data, elements, 595e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ACPI_RTYPE_INTEGER, 0); 596e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 597e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 598e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 599e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 600e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 601e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Count cannot be larger than the parent package length, but allow it 602e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * to be smaller. The >= accounts for the Integer above. 603e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 604e8707b340fb5b6313cde784b944a568dfd770dddBob Moore expected_count = (u32) (*elements)->integer.value; 605e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (expected_count >= count) { 606e8707b340fb5b6313cde784b944a568dfd770dddBob Moore goto package_too_small; 607e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 608e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 609e8707b340fb5b6313cde784b944a568dfd770dddBob Moore count = expected_count; 610e8707b340fb5b6313cde784b944a568dfd770dddBob Moore elements++; 611e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 61253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Examine the sub-packages */ 613e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 61453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore status = 61553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore acpi_ns_check_package_list(data, package, elements, count); 61653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore break; 617e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 618e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE2: 619e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE2_FIXED: 620e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE2_MIN: 621e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE2_COUNT: 622e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 623e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 624e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore * These types all return a single Package that consists of a 625e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore * variable number of sub-Packages. 626e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore * 627e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore * First, ensure that the first element is a sub-Package. If not, 628e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore * the BIOS may have incorrectly returned the object as a single 629e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore * package instead of a Package of Packages (a common error if 630e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore * there is only one entry). We may be able to repair this by 631e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore * wrapping the returned Package with a new outer Package. 632e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 633419a909dd10142d015dd96457db1b1eda643f89eBob Moore if (*elements 634419a909dd10142d015dd96457db1b1eda643f89eBob Moore && ((*elements)->common.type != ACPI_TYPE_PACKAGE)) { 635e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore 636e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore /* Create the new outer package and populate it */ 637e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore 638e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore status = 639e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore acpi_ns_repair_package_list(data, 640e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore return_object_ptr); 641e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore if (ACPI_FAILURE(status)) { 642e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore return (status); 643e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore } 644e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore 645e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore /* Update locals to point to the new package (of 1 element) */ 646e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore 647e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore return_object = *return_object_ptr; 648e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore elements = return_object->package.elements; 649e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore count = 1; 650e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore } 651e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore 65253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Examine the sub-packages */ 653e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore 65453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore status = 65553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore acpi_ns_check_package_list(data, package, elements, count); 65653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore break; 657e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 65853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore default: 659e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 66053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Should not get here if predefined info table is correct */ 661e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 66253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, 66353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore "Invalid internal return type in table entry: %X", 66453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore package->ret_info.type)); 665e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 66653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore return (AE_AML_INTERNAL); 66753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 668e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 66953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore return (status); 670e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 67153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moorepackage_too_small: 672e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 67353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Error exit for the case with an incorrect package count */ 674e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 67553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, 67653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore "Return Package is too small - found %u elements, expected %u", 67753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore count, expected_count)); 678e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 67953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore return (AE_AML_OPERAND_VALUE); 68053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore} 681e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 68253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore/******************************************************************************* 68353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * 68453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * FUNCTION: acpi_ns_check_package_list 68553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * 68653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * PARAMETERS: Data - Pointer to validation data structure 68753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * Package - Pointer to package-specific info for method 68853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * Elements - Element list of parent package. All elements 68953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * of this list should be of type Package. 69053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * Count - Count of subpackages 69153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * 69253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * RETURN: Status 69353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * 69453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * DESCRIPTION: Examine a list of subpackages 69553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * 69653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore ******************************************************************************/ 697e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 69853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moorestatic acpi_status 69953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Mooreacpi_ns_check_package_list(struct acpi_predefined_data *data, 70053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore const union acpi_predefined_info *package, 70153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore union acpi_operand_object **elements, u32 count) 70253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore{ 70353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore union acpi_operand_object *sub_package; 70453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore union acpi_operand_object **sub_elements; 70553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore acpi_status status; 70653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore u32 expected_count; 70753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore u32 i; 70853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore u32 j; 709e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 710d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore /* 711d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore * Validate each sub-Package in the parent Package 712d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore * 713d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore * NOTE: assumes list of sub-packages contains no NULL elements. 714d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore * Any NULL elements should have been removed by earlier call 715d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore * to acpi_ns_remove_null_elements. 716d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore */ 71753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore for (i = 0; i < count; i++) { 71853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore sub_package = *elements; 71953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore sub_elements = sub_package->package.elements; 720091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore data->parent_package = sub_package; 721e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 72253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Each sub-object must be of type Package */ 723e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 72453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore status = acpi_ns_check_object_type(data, &sub_package, 72553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore ACPI_RTYPE_PACKAGE, i); 72653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore if (ACPI_FAILURE(status)) { 72753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore return (status); 72853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 729e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 73053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Examine the different types of expected sub-packages */ 731e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 732091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore data->parent_package = sub_package; 73353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore switch (package->ret_info.type) { 73453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore case ACPI_PTYPE2: 73553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore case ACPI_PTYPE2_PKG_COUNT: 73653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore case ACPI_PTYPE2_REV_FIXED: 73753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 73853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Each subpackage has a fixed number of elements */ 73953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 74053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore expected_count = 74153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore package->ret_info.count1 + package->ret_info.count2; 74253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore if (sub_package->package.count < expected_count) { 74353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore goto package_too_small; 74453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 74553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 74653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore status = 74753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore acpi_ns_check_package_elements(data, sub_elements, 74853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore package->ret_info. 74953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore object_type1, 75053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore package->ret_info. 75153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore count1, 75253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore package->ret_info. 75353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore object_type2, 75453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore package->ret_info. 75553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore count2, 0); 75653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore if (ACPI_FAILURE(status)) { 75753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore return (status); 75853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 75953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore break; 76053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 76153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore case ACPI_PTYPE2_FIXED: 76253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 76353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Each sub-package has a fixed length */ 764e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 76553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore expected_count = package->ret_info2.count; 76653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore if (sub_package->package.count < expected_count) { 76753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore goto package_too_small; 76853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 769e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 77053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Check the type of each sub-package element */ 771e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 77253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore for (j = 0; j < expected_count; j++) { 773e8707b340fb5b6313cde784b944a568dfd770dddBob Moore status = 7740444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore acpi_ns_check_object_type(data, 77553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore &sub_elements[j], 77653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore package-> 77753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore ret_info2. 77853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore object_type[j], 77953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore j); 780e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 781e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 782e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 78353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 78453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore break; 785e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 78653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore case ACPI_PTYPE2_MIN: 787e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 78853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Each sub-package has a variable but minimum length */ 789e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 79053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore expected_count = package->ret_info.count1; 79153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore if (sub_package->package.count < expected_count) { 79253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore goto package_too_small; 79353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 794e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 79553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Check the type of each sub-package element */ 796e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 79753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore status = 79853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore acpi_ns_check_package_elements(data, sub_elements, 79953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore package->ret_info. 80053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore object_type1, 80153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore sub_package->package. 80253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore count, 0, 0, 0); 80353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore if (ACPI_FAILURE(status)) { 80453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore return (status); 805e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 80653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore break; 807e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 80853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore case ACPI_PTYPE2_COUNT: 809e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 81053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* 81153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * First element is the (Integer) count of elements, including 812091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore * the count field (the ACPI name is num_elements) 81353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore */ 81453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore status = acpi_ns_check_object_type(data, sub_elements, 81553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore ACPI_RTYPE_INTEGER, 81653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 0); 81753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore if (ACPI_FAILURE(status)) { 81853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore return (status); 81953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 820e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 82153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* 82253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * Make sure package is large enough for the Count and is 82353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * is as large as the minimum size 82453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore */ 82553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore expected_count = (u32)(*sub_elements)->integer.value; 82653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore if (sub_package->package.count < expected_count) { 82753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore goto package_too_small; 82853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 82953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore if (sub_package->package.count < 83053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore package->ret_info.count1) { 83153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore expected_count = package->ret_info.count1; 83253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore goto package_too_small; 83353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 834091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore if (expected_count == 0) { 835091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore /* 836091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore * Either the num_entries element was originally zero or it was 837091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore * a NULL element and repaired to an Integer of value zero. 838091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore * In either case, repair it by setting num_entries to be the 839091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore * actual size of the subpackage. 840091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore */ 841091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore expected_count = sub_package->package.count; 842091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore (*sub_elements)->integer.value = expected_count; 843091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore } 844e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 84553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Check the type of each sub-package element */ 846e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 84753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore status = 84853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore acpi_ns_check_package_elements(data, 84953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore (sub_elements + 1), 85053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore package->ret_info. 85153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore object_type1, 85253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore (expected_count - 1), 85353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 0, 0, 1); 85453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore if (ACPI_FAILURE(status)) { 85553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore return (status); 85653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 85753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore break; 85853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 85953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore default: /* Should not get here, type was validated by caller */ 86053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 86153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore return (AE_AML_INTERNAL); 86253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 86353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 86453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore elements++; 865e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 866e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 867e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (AE_OK); 868e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 86953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moorepackage_too_small: 870e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 87153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* The sub-package count was smaller than required */ 872e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 8730444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, 87453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore "Return Sub-Package[%u] is too small - found %u elements, expected %u", 87553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore i, sub_package->package.count, expected_count)); 876e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 877e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (AE_AML_OPERAND_VALUE); 878e8707b340fb5b6313cde784b944a568dfd770dddBob Moore} 879e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 880e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/******************************************************************************* 881e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 882e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * FUNCTION: acpi_ns_check_package_elements 883e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 8840444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * PARAMETERS: Data - Pointer to validation data structure 885e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Elements - Pointer to the package elements array 886e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Type1 - Object type for first group 887e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Count1 - Count for first group 888e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Type2 - Object type for second group 889e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Count2 - Count for second group 89003ef132b7258bbea4858be4b1bd6cb6c3fdd3253Bob Moore * start_index - Start of the first group of elements 891e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 892e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * RETURN: Status 893e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 894e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * DESCRIPTION: Check that all elements of a package are of the correct object 895e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * type. Supports up to two groups of different object types. 896e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 897e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ******************************************************************************/ 898e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 899e8707b340fb5b6313cde784b944a568dfd770dddBob Moorestatic acpi_status 9000444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Mooreacpi_ns_check_package_elements(struct acpi_predefined_data *data, 901e8707b340fb5b6313cde784b944a568dfd770dddBob Moore union acpi_operand_object **elements, 90203ef132b7258bbea4858be4b1bd6cb6c3fdd3253Bob Moore u8 type1, 90303ef132b7258bbea4858be4b1bd6cb6c3fdd3253Bob Moore u32 count1, 90403ef132b7258bbea4858be4b1bd6cb6c3fdd3253Bob Moore u8 type2, u32 count2, u32 start_index) 905e8707b340fb5b6313cde784b944a568dfd770dddBob Moore{ 906e8707b340fb5b6313cde784b944a568dfd770dddBob Moore union acpi_operand_object **this_element = elements; 907e8707b340fb5b6313cde784b944a568dfd770dddBob Moore acpi_status status; 908e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 i; 909e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 910e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 911e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Up to two groups of package elements are supported by the data 912e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * structure. All elements in each group must be of the same type. 913e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * The second group can have a count of zero. 914e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 915e8707b340fb5b6313cde784b944a568dfd770dddBob Moore for (i = 0; i < count1; i++) { 9160444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore status = acpi_ns_check_object_type(data, this_element, 91703ef132b7258bbea4858be4b1bd6cb6c3fdd3253Bob Moore type1, i + start_index); 918e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 919e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 920e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 921e8707b340fb5b6313cde784b944a568dfd770dddBob Moore this_element++; 922e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 923e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 924e8707b340fb5b6313cde784b944a568dfd770dddBob Moore for (i = 0; i < count2; i++) { 9250444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore status = acpi_ns_check_object_type(data, this_element, 92603ef132b7258bbea4858be4b1bd6cb6c3fdd3253Bob Moore type2, 92703ef132b7258bbea4858be4b1bd6cb6c3fdd3253Bob Moore (i + count1 + start_index)); 928e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 929e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 930e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 931e8707b340fb5b6313cde784b944a568dfd770dddBob Moore this_element++; 932e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 933e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 934e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (AE_OK); 935e8707b340fb5b6313cde784b944a568dfd770dddBob Moore} 936e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 937e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/******************************************************************************* 938e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 939e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * FUNCTION: acpi_ns_check_object_type 940e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 9410444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * PARAMETERS: Data - Pointer to validation data structure 942a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * return_object_ptr - Pointer to the object returned from the 943a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * evaluation of a method or object 944e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * expected_btypes - Bitmap of expected return type(s) 945e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * package_index - Index of object within parent package (if 9460444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * applicable - ACPI_NOT_PACKAGE_ELEMENT 9470444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * otherwise) 948e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 949e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * RETURN: Status 950e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 951e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * DESCRIPTION: Check the type of the return object against the expected object 952e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * type(s). Use of Btype allows multiple expected object types. 953e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 954e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ******************************************************************************/ 955e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 956e8707b340fb5b6313cde784b944a568dfd770dddBob Moorestatic acpi_status 9570444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Mooreacpi_ns_check_object_type(struct acpi_predefined_data *data, 958a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore union acpi_operand_object **return_object_ptr, 959e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 expected_btypes, u32 package_index) 960e8707b340fb5b6313cde784b944a568dfd770dddBob Moore{ 961a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore union acpi_operand_object *return_object = *return_object_ptr; 962e8707b340fb5b6313cde784b944a568dfd770dddBob Moore acpi_status status = AE_OK; 963e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 return_btype; 964e8707b340fb5b6313cde784b944a568dfd770dddBob Moore char type_buffer[48]; /* Room for 5 types */ 965e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 966e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 967091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore * If we get a NULL return_object here, it is a NULL package element. 968091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore * Since all extraneous NULL package elements were removed earlier by a 969091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore * call to acpi_ns_remove_null_elements, this is an unexpected NULL element. 970091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore * We will attempt to repair it. 971e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 972e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (!return_object) { 973091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore status = acpi_ns_repair_null_element(data, expected_btypes, 974091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore package_index, 975091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore return_object_ptr); 976091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore if (ACPI_SUCCESS(status)) { 977091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore return (AE_OK); /* Repair was successful */ 978091f4d718620a79698e1c8ca3e9acbf78eb62da3Bob Moore } 979e8707b340fb5b6313cde784b944a568dfd770dddBob Moore goto type_error_exit; 980e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 981e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 982e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* A Namespace node should not get here, but make sure */ 983e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 984e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_GET_DESCRIPTOR_TYPE(return_object) == ACPI_DESC_TYPE_NAMED) { 9850444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, 9860444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "Invalid return type - Found a Namespace node [%4.4s] type %s", 9870444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore return_object->node.name.ascii, 9880444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore acpi_ut_get_type_name(return_object->node. 9890444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore type))); 990e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (AE_AML_OPERAND_TYPE); 991e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 992e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 993e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 994e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Convert the object type (ACPI_TYPE_xxx) to a bitmapped object type. 995e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * The bitmapped type allows multiple possible return types. 996e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 997e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Note, the cases below must handle all of the possible types returned 998e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * from all of the predefined names (including elements of returned 999e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * packages) 1000e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 10013371c19c294a4cb3649aa4e84606be8a1d999e61Bob Moore switch (return_object->common.type) { 1002e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_TYPE_INTEGER: 1003e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return_btype = ACPI_RTYPE_INTEGER; 1004e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 1005e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1006e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_TYPE_BUFFER: 1007e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return_btype = ACPI_RTYPE_BUFFER; 1008e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 1009e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1010e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_TYPE_STRING: 1011e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return_btype = ACPI_RTYPE_STRING; 1012e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 1013e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1014e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_TYPE_PACKAGE: 1015e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return_btype = ACPI_RTYPE_PACKAGE; 1016e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 1017e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1018e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_TYPE_LOCAL_REFERENCE: 1019e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return_btype = ACPI_RTYPE_REFERENCE; 1020e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 1021e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1022e8707b340fb5b6313cde784b944a568dfd770dddBob Moore default: 1023e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Not one of the supported objects, must be incorrect */ 1024e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1025e8707b340fb5b6313cde784b944a568dfd770dddBob Moore goto type_error_exit; 1026e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 1027e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1028e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Is the object one of the expected types? */ 1029e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 10302147d3f00f85c9e993786863d8138694672da01bBob Moore if (return_btype & expected_btypes) { 1031a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore 10322147d3f00f85c9e993786863d8138694672da01bBob Moore /* For reference objects, check that the reference type is correct */ 1033a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore 10342147d3f00f85c9e993786863d8138694672da01bBob Moore if (return_object->common.type == ACPI_TYPE_LOCAL_REFERENCE) { 10352147d3f00f85c9e993786863d8138694672da01bBob Moore status = acpi_ns_check_reference(data, return_object); 1036a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore } 10372147d3f00f85c9e993786863d8138694672da01bBob Moore 10382147d3f00f85c9e993786863d8138694672da01bBob Moore return (status); 1039e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 1040e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 10412147d3f00f85c9e993786863d8138694672da01bBob Moore /* Type mismatch -- attempt repair of the returned object */ 1042e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 10432147d3f00f85c9e993786863d8138694672da01bBob Moore status = acpi_ns_repair_object(data, expected_btypes, 10442147d3f00f85c9e993786863d8138694672da01bBob Moore package_index, return_object_ptr); 10452147d3f00f85c9e993786863d8138694672da01bBob Moore if (ACPI_SUCCESS(status)) { 10462147d3f00f85c9e993786863d8138694672da01bBob Moore return (AE_OK); /* Repair was successful */ 1047e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 1048e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1049e8707b340fb5b6313cde784b944a568dfd770dddBob Moore type_error_exit: 1050e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1051e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Create a string with all expected types for this predefined object */ 1052e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 10530444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore acpi_ns_get_expected_types(type_buffer, expected_btypes); 1054e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 10550444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore if (package_index == ACPI_NOT_PACKAGE_ELEMENT) { 10560444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, 10570444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "Return type mismatch - found %s, expected %s", 10580444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore acpi_ut_get_object_type_name 10590444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore (return_object), type_buffer)); 1060e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } else { 10610444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, 10620444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "Return Package type mismatch at index %u - " 10630444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "found %s, expected %s", package_index, 10640444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore acpi_ut_get_object_type_name 10650444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore (return_object), type_buffer)); 1066e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 1067e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1068e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (AE_AML_OPERAND_TYPE); 1069e8707b340fb5b6313cde784b944a568dfd770dddBob Moore} 1070e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1071e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/******************************************************************************* 1072e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 1073e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * FUNCTION: acpi_ns_check_reference 1074e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 10750444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * PARAMETERS: Data - Pointer to validation data structure 1076e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * return_object - Object returned from the evaluation of a 1077e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * method or object 1078e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 1079e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * RETURN: Status 1080e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 1081e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * DESCRIPTION: Check a returned reference object for the correct reference 1082e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * type. The only reference type that can be returned from a 1083e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * predefined method is a named reference. All others are invalid. 1084e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 1085e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ******************************************************************************/ 1086e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1087e8707b340fb5b6313cde784b944a568dfd770dddBob Moorestatic acpi_status 10880444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Mooreacpi_ns_check_reference(struct acpi_predefined_data *data, 1089e8707b340fb5b6313cde784b944a568dfd770dddBob Moore union acpi_operand_object *return_object) 1090e8707b340fb5b6313cde784b944a568dfd770dddBob Moore{ 1091e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1092e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 1093e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Check the reference object for the correct reference type (opcode). 1094e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * The only type of reference that can be converted to an union acpi_object is 1095e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * a reference to a named object (reference class: NAME) 1096e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 1097e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (return_object->reference.class == ACPI_REFCLASS_NAME) { 1098e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (AE_OK); 1099e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 1100e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 11010444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, 11020444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "Return type mismatch - unexpected reference object type [%s] %2.2X", 11030444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore acpi_ut_get_reference_name(return_object), 11040444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore return_object->reference.class)); 1105e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1106e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (AE_AML_OPERAND_TYPE); 1107e8707b340fb5b6313cde784b944a568dfd770dddBob Moore} 1108a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore 1109a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore/******************************************************************************* 11100444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * 11110444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * FUNCTION: acpi_ns_get_expected_types 11120444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * 11130444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * PARAMETERS: Buffer - Pointer to where the string is returned 11140444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * expected_btypes - Bitmap of expected return type(s) 11150444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * 11160444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * RETURN: Buffer is populated with type names. 11170444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * 11180444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * DESCRIPTION: Translate the expected types bitmap into a string of ascii 11190444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * names of expected types, for use in warning messages. 11200444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * 11210444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ******************************************************************************/ 11220444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore 11230444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moorestatic void acpi_ns_get_expected_types(char *buffer, u32 expected_btypes) 11240444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore{ 11250444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore u32 this_rtype; 11260444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore u32 i; 11270444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore u32 j; 11280444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore 11290444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore j = 1; 11300444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore buffer[0] = 0; 11310444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore this_rtype = ACPI_RTYPE_INTEGER; 11320444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore 11330444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore for (i = 0; i < ACPI_NUM_RTYPES; i++) { 11340444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore 11350444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore /* If one of the expected types, concatenate the name of this type */ 11360444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore 11370444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore if (expected_btypes & this_rtype) { 11380444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_STRCAT(buffer, &acpi_rtype_names[i][j]); 11390444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore j = 0; /* Use name separator from now on */ 11400444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore } 11410444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore this_rtype <<= 1; /* Next Rtype */ 11420444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore } 11430444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore} 1144