nspredef.c revision d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627
1e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/****************************************************************************** 2e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 3e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Module Name: nspredef - Validation of ACPI predefined methods and objects 4e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * $Revision: 1.1 $ 5e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 6e8707b340fb5b6313cde784b944a568dfd770dddBob Moore *****************************************************************************/ 7e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 8e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/* 9e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Copyright (C) 2000 - 2008, Intel Corp. 10e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * All rights reserved. 11e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 12e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Redistribution and use in source and binary forms, with or without 13e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * modification, are permitted provided that the following conditions 14e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * are met: 15e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 1. Redistributions of source code must retain the above copyright 16e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * notice, this list of conditions, and the following disclaimer, 17e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * without modification. 18e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 2. Redistributions in binary form must reproduce at minimum a disclaimer 19e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * substantially similar to the "NO WARRANTY" disclaimer below 20e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * ("Disclaimer") and any redistribution must be conditioned upon 21e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * including a substantially similar Disclaimer requirement for further 22e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * binary redistribution. 23e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 3. Neither the names of the above-listed copyright holders nor the names 24e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * of any contributors may be used to endorse or promote products derived 25e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * from this software without specific prior written permission. 26e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 27e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Alternatively, this software may be distributed under the terms of the 28e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * GNU General Public License ("GPL") version 2 as published by the Free 29e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Software Foundation. 30e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 31e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * NO WARRANTY 32e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 33e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 34e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 35e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 36e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 37e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 38e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 39e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 40e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 41e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 42e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * POSSIBILITY OF SUCH DAMAGES. 43e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 44e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 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 /* 196307a042416dfc2216251a85b79e8578b65fdc0e7Bob Moore * 1) We have a return value, but if one wasn't expected, just exit, this is 1970444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * not a problem. For example, if the "Implicit Return" feature is 1980444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * enabled, methods will always return a value. 199307a042416dfc2216251a85b79e8578b65fdc0e7Bob Moore * 200307a042416dfc2216251a85b79e8578b65fdc0e7Bob Moore * 2) If the return value can be of any type, then we cannot perform any 201307a042416dfc2216251a85b79e8578b65fdc0e7Bob Moore * validation, exit. 202e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 203307a042416dfc2216251a85b79e8578b65fdc0e7Bob Moore if ((!predefined->info.expected_btypes) || 204307a042416dfc2216251a85b79e8578b65fdc0e7Bob Moore (predefined->info.expected_btypes == ACPI_RTYPE_ALL)) { 2050444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore goto cleanup; 2060444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore } 2070444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore 2080444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore /* Create the parameter data block for object validation */ 2090444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore 2100444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore data = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_predefined_data)); 2110444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore if (!data) { 2120444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore goto cleanup; 213e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 2140444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore data->predefined = predefined; 2150444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore data->node_flags = node->flags; 2160444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore data->pathname = pathname; 217e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 218e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 219465da9eb75665203a826f961de74a817b870850aBob Moore * Check that the type of the main return object is what is expected 220465da9eb75665203a826f961de74a817b870850aBob Moore * for this predefined name 221e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 2220444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore status = acpi_ns_check_object_type(data, return_object_ptr, 223e8707b340fb5b6313cde784b944a568dfd770dddBob Moore predefined->info.expected_btypes, 2240444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_NOT_PACKAGE_ELEMENT); 225465da9eb75665203a826f961de74a817b870850aBob Moore if (ACPI_FAILURE(status)) { 226465da9eb75665203a826f961de74a817b870850aBob Moore goto exit; 227465da9eb75665203a826f961de74a817b870850aBob Moore } 228465da9eb75665203a826f961de74a817b870850aBob Moore 229465da9eb75665203a826f961de74a817b870850aBob Moore /* 230465da9eb75665203a826f961de74a817b870850aBob Moore * For returned Package objects, check the type of all sub-objects. 231465da9eb75665203a826f961de74a817b870850aBob Moore * Note: Package may have been newly created by call above. 232465da9eb75665203a826f961de74a817b870850aBob Moore */ 233465da9eb75665203a826f961de74a817b870850aBob Moore if ((*return_object_ptr)->common.type == ACPI_TYPE_PACKAGE) { 234465da9eb75665203a826f961de74a817b870850aBob Moore status = acpi_ns_check_package(data, return_object_ptr); 235465da9eb75665203a826f961de74a817b870850aBob Moore if (ACPI_FAILURE(status)) { 236465da9eb75665203a826f961de74a817b870850aBob Moore goto exit; 23734c39c755347c1ca3d06284bad2273c6a9c3108aBob Moore } 238e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 239e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 240ad5babeed8d3082406c5b67ae558b95a479ddb6fBob Moore /* 241465da9eb75665203a826f961de74a817b870850aBob Moore * The return object was OK, or it was successfully repaired above. 242465da9eb75665203a826f961de74a817b870850aBob Moore * Now make some additional checks such as verifying that package 243465da9eb75665203a826f961de74a817b870850aBob Moore * objects are sorted correctly (if required) or buffer objects have 244465da9eb75665203a826f961de74a817b870850aBob Moore * the correct data width (bytes vs. dwords). These repairs are 245465da9eb75665203a826f961de74a817b870850aBob Moore * performed on a per-name basis, i.e., the code is specific to 246465da9eb75665203a826f961de74a817b870850aBob Moore * particular predefined names. 247ad5babeed8d3082406c5b67ae558b95a479ddb6fBob Moore */ 248ad5babeed8d3082406c5b67ae558b95a479ddb6fBob Moore status = acpi_ns_complex_repairs(data, node, status, return_object_ptr); 249ad5babeed8d3082406c5b67ae558b95a479ddb6fBob Moore 250465da9eb75665203a826f961de74a817b870850aBob Mooreexit: 2510444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore /* 2520444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * If the object validation failed or if we successfully repaired one 2530444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * or more objects, mark the parent node to suppress further warning 2540444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * messages during the next evaluation of the same method/object. 2550444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore */ 2560444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore if (ACPI_FAILURE(status) || (data->flags & ACPI_OBJECT_REPAIRED)) { 2570444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore node->flags |= ANOBJ_EVALUATED; 2580444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore } 2590444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_FREE(data); 2600444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore 2610444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moorecleanup: 26265259094c3e038519a2d8fa6fbc6256f04ad6535Bob Moore ACPI_FREE(pathname); 263e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 264e8707b340fb5b6313cde784b944a568dfd770dddBob Moore} 265e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 266e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/******************************************************************************* 267e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 268e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * FUNCTION: acpi_ns_check_parameter_count 269e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 270e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * PARAMETERS: Pathname - Full pathname to the node (for error msgs) 271e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Node - Namespace node for the method/object 272eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * user_param_count - Number of args passed in by the caller 273e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Predefined - Pointer to entry in predefined name table 274e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 275e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * RETURN: None 276e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 277e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * DESCRIPTION: Check that the declared (in ASL/AML) parameter count for a 278e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * predefined name is what is expected (i.e., what is defined in 279e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * the ACPI specification for this predefined name.) 280e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 281e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ******************************************************************************/ 282e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 283e8707b340fb5b6313cde784b944a568dfd770dddBob Moorevoid 284e8707b340fb5b6313cde784b944a568dfd770dddBob Mooreacpi_ns_check_parameter_count(char *pathname, 285e8707b340fb5b6313cde784b944a568dfd770dddBob Moore struct acpi_namespace_node *node, 286eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore u32 user_param_count, 287e8707b340fb5b6313cde784b944a568dfd770dddBob Moore const union acpi_predefined_info *predefined) 288e8707b340fb5b6313cde784b944a568dfd770dddBob Moore{ 289e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 param_count; 290e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 required_params_current; 291e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 required_params_old; 292e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 293eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore /* Methods have 0-7 parameters. All other types have zero. */ 294eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore 295e8707b340fb5b6313cde784b944a568dfd770dddBob Moore param_count = 0; 296e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (node->type == ACPI_TYPE_METHOD) { 297e8707b340fb5b6313cde784b944a568dfd770dddBob Moore param_count = node->object->method.param_count; 298e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 299e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 300eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore if (!predefined) { 301eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore /* 3020444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * Check the parameter count for non-predefined methods/objects. 3030444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * 304eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * Warning if too few or too many arguments have been passed by the 305eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * caller. An incorrect number of arguments may not cause the method 306eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * to fail. However, the method will fail if there are too few 307eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * arguments and the method attempts to use one of the missing ones. 308eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore */ 309eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore if (user_param_count < param_count) { 3100444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_PREDEFINED((AE_INFO, pathname, 3110444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_ALWAYS, 3120444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "Insufficient arguments - needs %u, found %u", 3130444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore param_count, user_param_count)); 314eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore } else if (user_param_count > param_count) { 3150444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_PREDEFINED((AE_INFO, pathname, 3160444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_ALWAYS, 3170444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "Excess arguments - needs %u, found %u", 3180444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore param_count, user_param_count)); 319eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore } 320eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore return; 321eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore } 322eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore 3230444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore /* 3240444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * Validate the user-supplied parameter count. 3250444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * Allow two different legal argument counts (_SCP, etc.) 3260444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore */ 327e8707b340fb5b6313cde784b944a568dfd770dddBob Moore required_params_current = predefined->info.param_count & 0x0F; 328e8707b340fb5b6313cde784b944a568dfd770dddBob Moore required_params_old = predefined->info.param_count >> 4; 329e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 330eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore if (user_param_count != ACPI_UINT32_MAX) { 331eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore if ((user_param_count != required_params_current) && 332eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore (user_param_count != required_params_old)) { 3330444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_PREDEFINED((AE_INFO, pathname, 3340444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_ALWAYS, 3350444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "Parameter count mismatch - " 3360444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "caller passed %u, ACPI requires %u", 3370444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore user_param_count, 3380444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore required_params_current)); 339eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore } 340eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore } 341eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore 342eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore /* 343eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore * Check that the ASL-defined parameter count is what is expected for 3440444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * this predefined name (parameter count as defined by the ACPI 3450444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * specification) 346eeb4437e63c39ce19cf9b2de36a1dddbf12910c4Bob Moore */ 347e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if ((param_count != required_params_current) && 348e8707b340fb5b6313cde784b944a568dfd770dddBob Moore (param_count != required_params_old)) { 3490444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_PREDEFINED((AE_INFO, pathname, node->flags, 3500444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "Parameter count mismatch - ASL declared %u, ACPI requires %u", 3510444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore param_count, required_params_current)); 352e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 353e8707b340fb5b6313cde784b944a568dfd770dddBob Moore} 354e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 355e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/******************************************************************************* 356e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 357e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * FUNCTION: acpi_ns_check_for_predefined_name 358e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 359e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * PARAMETERS: Node - Namespace node for the method/object 360e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 361e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * RETURN: Pointer to entry in predefined table. NULL indicates not found. 362e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 363e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * DESCRIPTION: Check an object name against the predefined object list. 364e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 365e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ******************************************************************************/ 366e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 367e8707b340fb5b6313cde784b944a568dfd770dddBob Mooreconst union acpi_predefined_info *acpi_ns_check_for_predefined_name(struct 368e8707b340fb5b6313cde784b944a568dfd770dddBob Moore acpi_namespace_node 369e8707b340fb5b6313cde784b944a568dfd770dddBob Moore *node) 370e8707b340fb5b6313cde784b944a568dfd770dddBob Moore{ 371e8707b340fb5b6313cde784b944a568dfd770dddBob Moore const union acpi_predefined_info *this_name; 372e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 373e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Quick check for a predefined name, first character must be underscore */ 374e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 375e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (node->name.ascii[0] != '_') { 376e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (NULL); 377e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 378e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 379e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Search info table for a predefined method/object name */ 380e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 381e8707b340fb5b6313cde784b944a568dfd770dddBob Moore this_name = predefined_names; 382e8707b340fb5b6313cde784b944a568dfd770dddBob Moore while (this_name->info.name[0]) { 383e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_COMPARE_NAME(node->name.ascii, this_name->info.name)) { 384e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (this_name); 385e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 386e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 387e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 388e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Skip next entry in the table if this name returns a Package 389e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * (next entry contains the package info) 390e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 391e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (this_name->info.expected_btypes & ACPI_RTYPE_PACKAGE) { 392e8707b340fb5b6313cde784b944a568dfd770dddBob Moore this_name++; 393e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 394e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 395e8707b340fb5b6313cde784b944a568dfd770dddBob Moore this_name++; 396e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 397e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 3980444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore return (NULL); /* Not found */ 399e8707b340fb5b6313cde784b944a568dfd770dddBob Moore} 400e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 401e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/******************************************************************************* 402e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 403e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * FUNCTION: acpi_ns_check_package 404e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 4050444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * PARAMETERS: Data - Pointer to validation data structure 406a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * return_object_ptr - Pointer to the object returned from the 407a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * evaluation of a method or object 408e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 409e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * RETURN: Status 410e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 411e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * DESCRIPTION: Check a returned package object for the correct count and 412e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * correct type of all sub-objects. 413e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 414e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ******************************************************************************/ 415e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 416e8707b340fb5b6313cde784b944a568dfd770dddBob Moorestatic acpi_status 4170444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Mooreacpi_ns_check_package(struct acpi_predefined_data *data, 4180444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore union acpi_operand_object **return_object_ptr) 419e8707b340fb5b6313cde784b944a568dfd770dddBob Moore{ 420a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore union acpi_operand_object *return_object = *return_object_ptr; 421e8707b340fb5b6313cde784b944a568dfd770dddBob Moore const union acpi_predefined_info *package; 422e8707b340fb5b6313cde784b944a568dfd770dddBob Moore union acpi_operand_object **elements; 42353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore acpi_status status = AE_OK; 424e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 expected_count; 425e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 count; 426e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 i; 427e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 428e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ACPI_FUNCTION_NAME(ns_check_package); 429e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 430e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* The package info for this name is in the next table entry */ 431e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 4320444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore package = data->predefined + 1; 433e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 434e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ACPI_DEBUG_PRINT((ACPI_DB_NAMES, 435e8707b340fb5b6313cde784b944a568dfd770dddBob Moore "%s Validating return Package of Type %X, Count %X\n", 4360444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore data->pathname, package->ret_info.type, 437e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return_object->package.count)); 438e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 439d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore /* 440d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore * For variable-length Packages, we can safely remove all embedded 441d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore * and trailing NULL package elements 442d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore */ 443d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore acpi_ns_remove_null_elements(data, package->ret_info.type, 444d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore return_object); 445d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore 446e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Extract package count and elements array */ 447e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 448e8707b340fb5b6313cde784b944a568dfd770dddBob Moore elements = return_object->package.elements; 449e8707b340fb5b6313cde784b944a568dfd770dddBob Moore count = return_object->package.count; 450e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 451e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* The package must have at least one element, else invalid */ 452e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 453e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (!count) { 4540444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, 4550444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "Return Package has no elements (empty)")); 456e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 457e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (AE_AML_OPERAND_VALUE); 458e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 459e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 460e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 461e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Decode the type of the expected package contents 462e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 463e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * PTYPE1 packages contain no subpackages 464e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * PTYPE2 packages contain sub-packages 465e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 466e8707b340fb5b6313cde784b944a568dfd770dddBob Moore switch (package->ret_info.type) { 467e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE1_FIXED: 468e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 469e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 470e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * The package count is fixed and there are no sub-packages 471e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 472e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * If package is too small, exit. 473e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * If package is larger than expected, issue warning but continue 474e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 475e8707b340fb5b6313cde784b944a568dfd770dddBob Moore expected_count = 476e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package->ret_info.count1 + package->ret_info.count2; 477e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (count < expected_count) { 478e8707b340fb5b6313cde784b944a568dfd770dddBob Moore goto package_too_small; 479e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } else if (count > expected_count) { 4803a58176e4fa47d8232e04131b023f3f2ecd7084bBob Moore ACPI_DEBUG_PRINT((ACPI_DB_REPAIR, 4813a58176e4fa47d8232e04131b023f3f2ecd7084bBob Moore "%s: Return Package is larger than needed - " 4823a58176e4fa47d8232e04131b023f3f2ecd7084bBob Moore "found %u, expected %u\n", 4833a58176e4fa47d8232e04131b023f3f2ecd7084bBob Moore data->pathname, count, 4843a58176e4fa47d8232e04131b023f3f2ecd7084bBob Moore expected_count)); 485e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 486e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 487e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Validate all elements of the returned package */ 488e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 4890444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore status = acpi_ns_check_package_elements(data, elements, 490e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package->ret_info. 491e8707b340fb5b6313cde784b944a568dfd770dddBob Moore object_type1, 492e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package->ret_info. 493e8707b340fb5b6313cde784b944a568dfd770dddBob Moore count1, 494e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package->ret_info. 495e8707b340fb5b6313cde784b944a568dfd770dddBob Moore object_type2, 496e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package->ret_info. 49703ef132b7258bbea4858be4b1bd6cb6c3fdd3253Bob Moore count2, 0); 498e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 499e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 500e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE1_VAR: 501e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 502e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 503e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * The package count is variable, there are no sub-packages, and all 504e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * elements must be of the same type 505e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 506e8707b340fb5b6313cde784b944a568dfd770dddBob Moore for (i = 0; i < count; i++) { 5070444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore status = acpi_ns_check_object_type(data, elements, 508e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package->ret_info. 509e8707b340fb5b6313cde784b944a568dfd770dddBob Moore object_type1, i); 510e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 511e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 512e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 513e8707b340fb5b6313cde784b944a568dfd770dddBob Moore elements++; 514e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 515e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 516e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 517e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE1_OPTION: 518e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 519e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 520e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * The package count is variable, there are no sub-packages. There are 521e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * a fixed number of required elements, and a variable number of 522e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * optional elements. 523e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 524e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Check if package is at least as large as the minimum required 525e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 526e8707b340fb5b6313cde784b944a568dfd770dddBob Moore expected_count = package->ret_info3.count; 527e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (count < expected_count) { 528e8707b340fb5b6313cde784b944a568dfd770dddBob Moore goto package_too_small; 529e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 530e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 531e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Variable number of sub-objects */ 532e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 533e8707b340fb5b6313cde784b944a568dfd770dddBob Moore for (i = 0; i < count; i++) { 534e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (i < package->ret_info3.count) { 535e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 536e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* These are the required package elements (0, 1, or 2) */ 537e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 538e8707b340fb5b6313cde784b944a568dfd770dddBob Moore status = 5390444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore acpi_ns_check_object_type(data, elements, 540e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package-> 541e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ret_info3. 542e8707b340fb5b6313cde784b944a568dfd770dddBob Moore object_type[i], 543e8707b340fb5b6313cde784b944a568dfd770dddBob Moore i); 544e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 545e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 546e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 547e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } else { 548e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* These are the optional package elements */ 549e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 550e8707b340fb5b6313cde784b944a568dfd770dddBob Moore status = 5510444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore acpi_ns_check_object_type(data, elements, 552e8707b340fb5b6313cde784b944a568dfd770dddBob Moore package-> 553e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ret_info3. 554e8707b340fb5b6313cde784b944a568dfd770dddBob Moore tail_object_type, 555e8707b340fb5b6313cde784b944a568dfd770dddBob Moore i); 556e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 557e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 558e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 559e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 560e8707b340fb5b6313cde784b944a568dfd770dddBob Moore elements++; 561e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 562e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 563e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 56453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore case ACPI_PTYPE2_REV_FIXED: 56553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 56653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* First element is the (Integer) revision */ 56753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 56853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore status = acpi_ns_check_object_type(data, elements, 56953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore ACPI_RTYPE_INTEGER, 0); 57053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore if (ACPI_FAILURE(status)) { 57153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore return (status); 57253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 57353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 57453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore elements++; 57553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore count--; 57653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 57753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Examine the sub-packages */ 57853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 57953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore status = 58053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore acpi_ns_check_package_list(data, package, elements, count); 58153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore break; 58253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 583e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE2_PKG_COUNT: 584e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 585e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* First element is the (Integer) count of sub-packages to follow */ 586e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 5870444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore status = acpi_ns_check_object_type(data, elements, 588e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ACPI_RTYPE_INTEGER, 0); 589e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 590e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 591e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 592e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 593e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 594e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Count cannot be larger than the parent package length, but allow it 595e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * to be smaller. The >= accounts for the Integer above. 596e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 597e8707b340fb5b6313cde784b944a568dfd770dddBob Moore expected_count = (u32) (*elements)->integer.value; 598e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (expected_count >= count) { 599e8707b340fb5b6313cde784b944a568dfd770dddBob Moore goto package_too_small; 600e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 601e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 602e8707b340fb5b6313cde784b944a568dfd770dddBob Moore count = expected_count; 603e8707b340fb5b6313cde784b944a568dfd770dddBob Moore elements++; 604e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 60553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Examine the sub-packages */ 606e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 60753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore status = 60853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore acpi_ns_check_package_list(data, package, elements, count); 60953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore break; 610e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 611e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE2: 612e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE2_FIXED: 613e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE2_MIN: 614e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_PTYPE2_COUNT: 615e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 616e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 617e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore * These types all return a single Package that consists of a 618e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore * variable number of sub-Packages. 619e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore * 620e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore * First, ensure that the first element is a sub-Package. If not, 621e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore * the BIOS may have incorrectly returned the object as a single 622e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore * package instead of a Package of Packages (a common error if 623e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore * there is only one entry). We may be able to repair this by 624e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore * wrapping the returned Package with a new outer Package. 625e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 626419a909dd10142d015dd96457db1b1eda643f89eBob Moore if (*elements 627419a909dd10142d015dd96457db1b1eda643f89eBob Moore && ((*elements)->common.type != ACPI_TYPE_PACKAGE)) { 628e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore 629e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore /* Create the new outer package and populate it */ 630e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore 631e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore status = 632e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore acpi_ns_repair_package_list(data, 633e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore return_object_ptr); 634e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore if (ACPI_FAILURE(status)) { 635e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore return (status); 636e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore } 637e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore 638e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore /* Update locals to point to the new package (of 1 element) */ 639e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore 640e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore return_object = *return_object_ptr; 641e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore elements = return_object->package.elements; 642e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore count = 1; 643e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore } 644e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore 64553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Examine the sub-packages */ 646e5f69d6ef7a6b0dbad8d4c00d83009960be02155Bob Moore 64753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore status = 64853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore acpi_ns_check_package_list(data, package, elements, count); 64953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore break; 650e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 65153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore default: 652e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 65353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Should not get here if predefined info table is correct */ 654e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 65553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, 65653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore "Invalid internal return type in table entry: %X", 65753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore package->ret_info.type)); 658e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 65953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore return (AE_AML_INTERNAL); 66053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 661e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 66253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore return (status); 663e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 66453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moorepackage_too_small: 665e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 66653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Error exit for the case with an incorrect package count */ 667e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 66853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, 66953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore "Return Package is too small - found %u elements, expected %u", 67053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore count, expected_count)); 671e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 67253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore return (AE_AML_OPERAND_VALUE); 67353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore} 674e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 67553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore/******************************************************************************* 67653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * 67753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * FUNCTION: acpi_ns_check_package_list 67853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * 67953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * PARAMETERS: Data - Pointer to validation data structure 68053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * Package - Pointer to package-specific info for method 68153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * Elements - Element list of parent package. All elements 68253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * of this list should be of type Package. 68353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * Count - Count of subpackages 68453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * 68553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * RETURN: Status 68653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * 68753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * DESCRIPTION: Examine a list of subpackages 68853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * 68953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore ******************************************************************************/ 690e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 69153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moorestatic acpi_status 69253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Mooreacpi_ns_check_package_list(struct acpi_predefined_data *data, 69353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore const union acpi_predefined_info *package, 69453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore union acpi_operand_object **elements, u32 count) 69553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore{ 69653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore union acpi_operand_object *sub_package; 69753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore union acpi_operand_object **sub_elements; 69853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore acpi_status status; 69953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore u32 expected_count; 70053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore u32 i; 70153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore u32 j; 702e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 703d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore /* 704d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore * Validate each sub-Package in the parent Package 705d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore * 706d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore * NOTE: assumes list of sub-packages contains no NULL elements. 707d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore * Any NULL elements should have been removed by earlier call 708d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore * to acpi_ns_remove_null_elements. 709d4085a3ffee8828f7f1bae7fa3cf5e58f59ba627Bob Moore */ 71053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore for (i = 0; i < count; i++) { 71153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore sub_package = *elements; 71253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore sub_elements = sub_package->package.elements; 713e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 71453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Each sub-object must be of type Package */ 715e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 71653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore status = acpi_ns_check_object_type(data, &sub_package, 71753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore ACPI_RTYPE_PACKAGE, i); 71853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore if (ACPI_FAILURE(status)) { 71953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore return (status); 72053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 721e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 72253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Examine the different types of expected sub-packages */ 723e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 72453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore switch (package->ret_info.type) { 72553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore case ACPI_PTYPE2: 72653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore case ACPI_PTYPE2_PKG_COUNT: 72753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore case ACPI_PTYPE2_REV_FIXED: 72853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 72953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Each subpackage has a fixed number of elements */ 73053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 73153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore expected_count = 73253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore package->ret_info.count1 + package->ret_info.count2; 73353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore if (sub_package->package.count < expected_count) { 73453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore goto package_too_small; 73553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 73653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 73753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore status = 73853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore acpi_ns_check_package_elements(data, sub_elements, 73953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore package->ret_info. 74053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore object_type1, 74153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore package->ret_info. 74253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore count1, 74353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore package->ret_info. 74453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore object_type2, 74553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore package->ret_info. 74653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore count2, 0); 74753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore if (ACPI_FAILURE(status)) { 74853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore return (status); 74953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 75053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore break; 75153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 75253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore case ACPI_PTYPE2_FIXED: 75353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 75453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Each sub-package has a fixed length */ 755e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 75653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore expected_count = package->ret_info2.count; 75753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore if (sub_package->package.count < expected_count) { 75853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore goto package_too_small; 75953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 760e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 76153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Check the type of each sub-package element */ 762e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 76353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore for (j = 0; j < expected_count; j++) { 764e8707b340fb5b6313cde784b944a568dfd770dddBob Moore status = 7650444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore acpi_ns_check_object_type(data, 76653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore &sub_elements[j], 76753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore package-> 76853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore ret_info2. 76953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore object_type[j], 77053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore j); 771e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 772e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 773e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 77453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 77553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore break; 776e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 77753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore case ACPI_PTYPE2_MIN: 778e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 77953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Each sub-package has a variable but minimum length */ 780e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 78153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore expected_count = package->ret_info.count1; 78253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore if (sub_package->package.count < expected_count) { 78353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore goto package_too_small; 78453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 785e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 78653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Check the type of each sub-package element */ 787e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 78853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore status = 78953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore acpi_ns_check_package_elements(data, sub_elements, 79053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore package->ret_info. 79153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore object_type1, 79253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore sub_package->package. 79353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore count, 0, 0, 0); 79453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore if (ACPI_FAILURE(status)) { 79553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore return (status); 796e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 79753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore break; 798e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 79953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore case ACPI_PTYPE2_COUNT: 800e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 80153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* 80253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * First element is the (Integer) count of elements, including 80353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * the count field. 80453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore */ 80553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore status = acpi_ns_check_object_type(data, sub_elements, 80653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore ACPI_RTYPE_INTEGER, 80753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 0); 80853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore if (ACPI_FAILURE(status)) { 80953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore return (status); 81053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 811e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 81253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* 81353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * Make sure package is large enough for the Count and is 81453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore * is as large as the minimum size 81553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore */ 81653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore expected_count = (u32)(*sub_elements)->integer.value; 81753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore if (sub_package->package.count < expected_count) { 81853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore goto package_too_small; 81953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 82053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore if (sub_package->package.count < 82153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore package->ret_info.count1) { 82253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore expected_count = package->ret_info.count1; 82353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore goto package_too_small; 82453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 825e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 82653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* Check the type of each sub-package element */ 827e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 82853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore status = 82953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore acpi_ns_check_package_elements(data, 83053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore (sub_elements + 1), 83153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore package->ret_info. 83253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore object_type1, 83353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore (expected_count - 1), 83453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 0, 0, 1); 83553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore if (ACPI_FAILURE(status)) { 83653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore return (status); 83753e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 83853e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore break; 83953e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 84053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore default: /* Should not get here, type was validated by caller */ 84153e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 84253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore return (AE_AML_INTERNAL); 84353e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore } 84453e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore 84553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore elements++; 846e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 847e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 848e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (AE_OK); 849e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 85053e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moorepackage_too_small: 851e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 85253e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore /* The sub-package count was smaller than required */ 853e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 8540444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, 85553e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore "Return Sub-Package[%u] is too small - found %u elements, expected %u", 85653e9387bdd8bfef6cffff2d2eb6bd28eca812682Bob Moore i, sub_package->package.count, expected_count)); 857e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 858e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (AE_AML_OPERAND_VALUE); 859e8707b340fb5b6313cde784b944a568dfd770dddBob Moore} 860e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 861e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/******************************************************************************* 862e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 863e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * FUNCTION: acpi_ns_check_package_elements 864e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 8650444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * PARAMETERS: Data - Pointer to validation data structure 866e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Elements - Pointer to the package elements array 867e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Type1 - Object type for first group 868e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Count1 - Count for first group 869e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Type2 - Object type for second group 870e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Count2 - Count for second group 87103ef132b7258bbea4858be4b1bd6cb6c3fdd3253Bob Moore * start_index - Start of the first group of elements 872e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 873e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * RETURN: Status 874e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 875e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * DESCRIPTION: Check that all elements of a package are of the correct object 876e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * type. Supports up to two groups of different object types. 877e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 878e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ******************************************************************************/ 879e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 880e8707b340fb5b6313cde784b944a568dfd770dddBob Moorestatic acpi_status 8810444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Mooreacpi_ns_check_package_elements(struct acpi_predefined_data *data, 882e8707b340fb5b6313cde784b944a568dfd770dddBob Moore union acpi_operand_object **elements, 88303ef132b7258bbea4858be4b1bd6cb6c3fdd3253Bob Moore u8 type1, 88403ef132b7258bbea4858be4b1bd6cb6c3fdd3253Bob Moore u32 count1, 88503ef132b7258bbea4858be4b1bd6cb6c3fdd3253Bob Moore u8 type2, u32 count2, u32 start_index) 886e8707b340fb5b6313cde784b944a568dfd770dddBob Moore{ 887e8707b340fb5b6313cde784b944a568dfd770dddBob Moore union acpi_operand_object **this_element = elements; 888e8707b340fb5b6313cde784b944a568dfd770dddBob Moore acpi_status status; 889e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 i; 890e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 891e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 892e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Up to two groups of package elements are supported by the data 893e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * structure. All elements in each group must be of the same type. 894e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * The second group can have a count of zero. 895e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 896e8707b340fb5b6313cde784b944a568dfd770dddBob Moore for (i = 0; i < count1; i++) { 8970444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore status = acpi_ns_check_object_type(data, this_element, 89803ef132b7258bbea4858be4b1bd6cb6c3fdd3253Bob Moore type1, i + start_index); 899e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 900e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 901e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 902e8707b340fb5b6313cde784b944a568dfd770dddBob Moore this_element++; 903e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 904e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 905e8707b340fb5b6313cde784b944a568dfd770dddBob Moore for (i = 0; i < count2; i++) { 9060444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore status = acpi_ns_check_object_type(data, this_element, 90703ef132b7258bbea4858be4b1bd6cb6c3fdd3253Bob Moore type2, 90803ef132b7258bbea4858be4b1bd6cb6c3fdd3253Bob Moore (i + count1 + start_index)); 909e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_FAILURE(status)) { 910e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 911e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 912e8707b340fb5b6313cde784b944a568dfd770dddBob Moore this_element++; 913e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 914e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 915e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (AE_OK); 916e8707b340fb5b6313cde784b944a568dfd770dddBob Moore} 917e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 918e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/******************************************************************************* 919e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 920e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * FUNCTION: acpi_ns_check_object_type 921e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 9220444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * PARAMETERS: Data - Pointer to validation data structure 923a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * return_object_ptr - Pointer to the object returned from the 924a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore * evaluation of a method or object 925e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * expected_btypes - Bitmap of expected return type(s) 926e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * package_index - Index of object within parent package (if 9270444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * applicable - ACPI_NOT_PACKAGE_ELEMENT 9280444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * otherwise) 929e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 930e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * RETURN: Status 931e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 932e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * DESCRIPTION: Check the type of the return object against the expected object 933e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * type(s). Use of Btype allows multiple expected object types. 934e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 935e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ******************************************************************************/ 936e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 937e8707b340fb5b6313cde784b944a568dfd770dddBob Moorestatic acpi_status 9380444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Mooreacpi_ns_check_object_type(struct acpi_predefined_data *data, 939a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore union acpi_operand_object **return_object_ptr, 940e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 expected_btypes, u32 package_index) 941e8707b340fb5b6313cde784b944a568dfd770dddBob Moore{ 942a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore union acpi_operand_object *return_object = *return_object_ptr; 943e8707b340fb5b6313cde784b944a568dfd770dddBob Moore acpi_status status = AE_OK; 944e8707b340fb5b6313cde784b944a568dfd770dddBob Moore u32 return_btype; 945e8707b340fb5b6313cde784b944a568dfd770dddBob Moore char type_buffer[48]; /* Room for 5 types */ 946e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 947e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 948e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * If we get a NULL return_object here, it is a NULL package element, 949e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * and this is always an error. 950e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 951e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (!return_object) { 952e8707b340fb5b6313cde784b944a568dfd770dddBob Moore goto type_error_exit; 953e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 954e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 955e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* A Namespace node should not get here, but make sure */ 956e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 957e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (ACPI_GET_DESCRIPTOR_TYPE(return_object) == ACPI_DESC_TYPE_NAMED) { 9580444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, 9590444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "Invalid return type - Found a Namespace node [%4.4s] type %s", 9600444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore return_object->node.name.ascii, 9610444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore acpi_ut_get_type_name(return_object->node. 9620444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore type))); 963e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (AE_AML_OPERAND_TYPE); 964e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 965e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 966e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 967e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Convert the object type (ACPI_TYPE_xxx) to a bitmapped object type. 968e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * The bitmapped type allows multiple possible return types. 969e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 970e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Note, the cases below must handle all of the possible types returned 971e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * from all of the predefined names (including elements of returned 972e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * packages) 973e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 9743371c19c294a4cb3649aa4e84606be8a1d999e61Bob Moore switch (return_object->common.type) { 975e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_TYPE_INTEGER: 976e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return_btype = ACPI_RTYPE_INTEGER; 977e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 978e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 979e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_TYPE_BUFFER: 980e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return_btype = ACPI_RTYPE_BUFFER; 981e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 982e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 983e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_TYPE_STRING: 984e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return_btype = ACPI_RTYPE_STRING; 985e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 986e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 987e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_TYPE_PACKAGE: 988e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return_btype = ACPI_RTYPE_PACKAGE; 989e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 990e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 991e8707b340fb5b6313cde784b944a568dfd770dddBob Moore case ACPI_TYPE_LOCAL_REFERENCE: 992e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return_btype = ACPI_RTYPE_REFERENCE; 993e8707b340fb5b6313cde784b944a568dfd770dddBob Moore break; 994e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 995e8707b340fb5b6313cde784b944a568dfd770dddBob Moore default: 996e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Not one of the supported objects, must be incorrect */ 997e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 998e8707b340fb5b6313cde784b944a568dfd770dddBob Moore goto type_error_exit; 999e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 1000e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1001e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Is the object one of the expected types? */ 1002e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1003e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (!(return_btype & expected_btypes)) { 1004a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore 1005a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore /* Type mismatch -- attempt repair of the returned object */ 1006a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore 10070444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore status = acpi_ns_repair_object(data, expected_btypes, 10080444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore package_index, 1009a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore return_object_ptr); 1010a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore if (ACPI_SUCCESS(status)) { 10110444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore return (AE_OK); /* Repair was successful */ 1012a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore } 1013e8707b340fb5b6313cde784b944a568dfd770dddBob Moore goto type_error_exit; 1014e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 1015e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1016e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* For reference objects, check that the reference type is correct */ 1017e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 10183371c19c294a4cb3649aa4e84606be8a1d999e61Bob Moore if (return_object->common.type == ACPI_TYPE_LOCAL_REFERENCE) { 10190444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore status = acpi_ns_check_reference(data, return_object); 1020e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 1021e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1022e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (status); 1023e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1024e8707b340fb5b6313cde784b944a568dfd770dddBob Moore type_error_exit: 1025e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1026e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* Create a string with all expected types for this predefined object */ 1027e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 10280444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore acpi_ns_get_expected_types(type_buffer, expected_btypes); 1029e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 10300444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore if (package_index == ACPI_NOT_PACKAGE_ELEMENT) { 10310444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, 10320444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "Return type mismatch - found %s, expected %s", 10330444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore acpi_ut_get_object_type_name 10340444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore (return_object), type_buffer)); 1035e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } else { 10360444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, 10370444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "Return Package type mismatch at index %u - " 10380444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "found %s, expected %s", package_index, 10390444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore acpi_ut_get_object_type_name 10400444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore (return_object), type_buffer)); 1041e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 1042e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1043e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (AE_AML_OPERAND_TYPE); 1044e8707b340fb5b6313cde784b944a568dfd770dddBob Moore} 1045e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1046e8707b340fb5b6313cde784b944a568dfd770dddBob Moore/******************************************************************************* 1047e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 1048e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * FUNCTION: acpi_ns_check_reference 1049e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 10500444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * PARAMETERS: Data - Pointer to validation data structure 1051e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * return_object - Object returned from the evaluation of a 1052e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * method or object 1053e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 1054e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * RETURN: Status 1055e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 1056e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * DESCRIPTION: Check a returned reference object for the correct reference 1057e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * type. The only reference type that can be returned from a 1058e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * predefined method is a named reference. All others are invalid. 1059e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * 1060e8707b340fb5b6313cde784b944a568dfd770dddBob Moore ******************************************************************************/ 1061e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1062e8707b340fb5b6313cde784b944a568dfd770dddBob Moorestatic acpi_status 10630444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Mooreacpi_ns_check_reference(struct acpi_predefined_data *data, 1064e8707b340fb5b6313cde784b944a568dfd770dddBob Moore union acpi_operand_object *return_object) 1065e8707b340fb5b6313cde784b944a568dfd770dddBob Moore{ 1066e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1067e8707b340fb5b6313cde784b944a568dfd770dddBob Moore /* 1068e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * Check the reference object for the correct reference type (opcode). 1069e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * The only type of reference that can be converted to an union acpi_object is 1070e8707b340fb5b6313cde784b944a568dfd770dddBob Moore * a reference to a named object (reference class: NAME) 1071e8707b340fb5b6313cde784b944a568dfd770dddBob Moore */ 1072e8707b340fb5b6313cde784b944a568dfd770dddBob Moore if (return_object->reference.class == ACPI_REFCLASS_NAME) { 1073e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (AE_OK); 1074e8707b340fb5b6313cde784b944a568dfd770dddBob Moore } 1075e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 10760444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags, 10770444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore "Return type mismatch - unexpected reference object type [%s] %2.2X", 10780444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore acpi_ut_get_reference_name(return_object), 10790444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore return_object->reference.class)); 1080e8707b340fb5b6313cde784b944a568dfd770dddBob Moore 1081e8707b340fb5b6313cde784b944a568dfd770dddBob Moore return (AE_AML_OPERAND_TYPE); 1082e8707b340fb5b6313cde784b944a568dfd770dddBob Moore} 1083a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore 1084a647b5c34047560d7efe7e53e756c6692ce67dc7Bob Moore/******************************************************************************* 10850444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * 10860444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * FUNCTION: acpi_ns_get_expected_types 10870444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * 10880444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * PARAMETERS: Buffer - Pointer to where the string is returned 10890444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * expected_btypes - Bitmap of expected return type(s) 10900444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * 10910444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * RETURN: Buffer is populated with type names. 10920444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * 10930444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * DESCRIPTION: Translate the expected types bitmap into a string of ascii 10940444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * names of expected types, for use in warning messages. 10950444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore * 10960444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ******************************************************************************/ 10970444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore 10980444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moorestatic void acpi_ns_get_expected_types(char *buffer, u32 expected_btypes) 10990444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore{ 11000444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore u32 this_rtype; 11010444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore u32 i; 11020444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore u32 j; 11030444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore 11040444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore j = 1; 11050444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore buffer[0] = 0; 11060444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore this_rtype = ACPI_RTYPE_INTEGER; 11070444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore 11080444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore for (i = 0; i < ACPI_NUM_RTYPES; i++) { 11090444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore 11100444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore /* If one of the expected types, concatenate the name of this type */ 11110444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore 11120444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore if (expected_btypes & this_rtype) { 11130444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore ACPI_STRCAT(buffer, &acpi_rtype_names[i][j]); 11140444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore j = 0; /* Use name separator from now on */ 11150444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore } 11160444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore this_rtype <<= 1; /* Next Rtype */ 11170444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore } 11180444e8f6d72d6e38f92d48884bc90bbc6c22fd5aBob Moore} 1119