1*29492bb7SDavid van Moolenbroek /******************************************************************************
2*29492bb7SDavid van Moolenbroek *
3*29492bb7SDavid van Moolenbroek * Module Name: nsprepkg - Validation of package objects for predefined names
4*29492bb7SDavid van Moolenbroek *
5*29492bb7SDavid van Moolenbroek *****************************************************************************/
6*29492bb7SDavid van Moolenbroek
7*29492bb7SDavid van Moolenbroek /*
8*29492bb7SDavid van Moolenbroek * Copyright (C) 2000 - 2014, Intel Corp.
9*29492bb7SDavid van Moolenbroek * All rights reserved.
10*29492bb7SDavid van Moolenbroek *
11*29492bb7SDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without
12*29492bb7SDavid van Moolenbroek * modification, are permitted provided that the following conditions
13*29492bb7SDavid van Moolenbroek * are met:
14*29492bb7SDavid van Moolenbroek * 1. Redistributions of source code must retain the above copyright
15*29492bb7SDavid van Moolenbroek * notice, this list of conditions, and the following disclaimer,
16*29492bb7SDavid van Moolenbroek * without modification.
17*29492bb7SDavid van Moolenbroek * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18*29492bb7SDavid van Moolenbroek * substantially similar to the "NO WARRANTY" disclaimer below
19*29492bb7SDavid van Moolenbroek * ("Disclaimer") and any redistribution must be conditioned upon
20*29492bb7SDavid van Moolenbroek * including a substantially similar Disclaimer requirement for further
21*29492bb7SDavid van Moolenbroek * binary redistribution.
22*29492bb7SDavid van Moolenbroek * 3. Neither the names of the above-listed copyright holders nor the names
23*29492bb7SDavid van Moolenbroek * of any contributors may be used to endorse or promote products derived
24*29492bb7SDavid van Moolenbroek * from this software without specific prior written permission.
25*29492bb7SDavid van Moolenbroek *
26*29492bb7SDavid van Moolenbroek * Alternatively, this software may be distributed under the terms of the
27*29492bb7SDavid van Moolenbroek * GNU General Public License ("GPL") version 2 as published by the Free
28*29492bb7SDavid van Moolenbroek * Software Foundation.
29*29492bb7SDavid van Moolenbroek *
30*29492bb7SDavid van Moolenbroek * NO WARRANTY
31*29492bb7SDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32*29492bb7SDavid van Moolenbroek * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33*29492bb7SDavid van Moolenbroek * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34*29492bb7SDavid van Moolenbroek * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35*29492bb7SDavid van Moolenbroek * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36*29492bb7SDavid van Moolenbroek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37*29492bb7SDavid van Moolenbroek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38*29492bb7SDavid van Moolenbroek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39*29492bb7SDavid van Moolenbroek * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40*29492bb7SDavid van Moolenbroek * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41*29492bb7SDavid van Moolenbroek * POSSIBILITY OF SUCH DAMAGES.
42*29492bb7SDavid van Moolenbroek */
43*29492bb7SDavid van Moolenbroek
44*29492bb7SDavid van Moolenbroek #include "acpi.h"
45*29492bb7SDavid van Moolenbroek #include "accommon.h"
46*29492bb7SDavid van Moolenbroek #include "acnamesp.h"
47*29492bb7SDavid van Moolenbroek #include "acpredef.h"
48*29492bb7SDavid van Moolenbroek
49*29492bb7SDavid van Moolenbroek
50*29492bb7SDavid van Moolenbroek #define _COMPONENT ACPI_NAMESPACE
51*29492bb7SDavid van Moolenbroek ACPI_MODULE_NAME ("nsprepkg")
52*29492bb7SDavid van Moolenbroek
53*29492bb7SDavid van Moolenbroek
54*29492bb7SDavid van Moolenbroek /* Local prototypes */
55*29492bb7SDavid van Moolenbroek
56*29492bb7SDavid van Moolenbroek static ACPI_STATUS
57*29492bb7SDavid van Moolenbroek AcpiNsCheckPackageList (
58*29492bb7SDavid van Moolenbroek ACPI_EVALUATE_INFO *Info,
59*29492bb7SDavid van Moolenbroek const ACPI_PREDEFINED_INFO *Package,
60*29492bb7SDavid van Moolenbroek ACPI_OPERAND_OBJECT **Elements,
61*29492bb7SDavid van Moolenbroek UINT32 Count);
62*29492bb7SDavid van Moolenbroek
63*29492bb7SDavid van Moolenbroek static ACPI_STATUS
64*29492bb7SDavid van Moolenbroek AcpiNsCheckPackageElements (
65*29492bb7SDavid van Moolenbroek ACPI_EVALUATE_INFO *Info,
66*29492bb7SDavid van Moolenbroek ACPI_OPERAND_OBJECT **Elements,
67*29492bb7SDavid van Moolenbroek UINT8 Type1,
68*29492bb7SDavid van Moolenbroek UINT32 Count1,
69*29492bb7SDavid van Moolenbroek UINT8 Type2,
70*29492bb7SDavid van Moolenbroek UINT32 Count2,
71*29492bb7SDavid van Moolenbroek UINT32 StartIndex);
72*29492bb7SDavid van Moolenbroek
73*29492bb7SDavid van Moolenbroek
74*29492bb7SDavid van Moolenbroek /*******************************************************************************
75*29492bb7SDavid van Moolenbroek *
76*29492bb7SDavid van Moolenbroek * FUNCTION: AcpiNsCheckPackage
77*29492bb7SDavid van Moolenbroek *
78*29492bb7SDavid van Moolenbroek * PARAMETERS: Info - Method execution information block
79*29492bb7SDavid van Moolenbroek * ReturnObjectPtr - Pointer to the object returned from the
80*29492bb7SDavid van Moolenbroek * evaluation of a method or object
81*29492bb7SDavid van Moolenbroek *
82*29492bb7SDavid van Moolenbroek * RETURN: Status
83*29492bb7SDavid van Moolenbroek *
84*29492bb7SDavid van Moolenbroek * DESCRIPTION: Check a returned package object for the correct count and
85*29492bb7SDavid van Moolenbroek * correct type of all sub-objects.
86*29492bb7SDavid van Moolenbroek *
87*29492bb7SDavid van Moolenbroek ******************************************************************************/
88*29492bb7SDavid van Moolenbroek
89*29492bb7SDavid van Moolenbroek ACPI_STATUS
AcpiNsCheckPackage(ACPI_EVALUATE_INFO * Info,ACPI_OPERAND_OBJECT ** ReturnObjectPtr)90*29492bb7SDavid van Moolenbroek AcpiNsCheckPackage (
91*29492bb7SDavid van Moolenbroek ACPI_EVALUATE_INFO *Info,
92*29492bb7SDavid van Moolenbroek ACPI_OPERAND_OBJECT **ReturnObjectPtr)
93*29492bb7SDavid van Moolenbroek {
94*29492bb7SDavid van Moolenbroek ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr;
95*29492bb7SDavid van Moolenbroek const ACPI_PREDEFINED_INFO *Package;
96*29492bb7SDavid van Moolenbroek ACPI_OPERAND_OBJECT **Elements;
97*29492bb7SDavid van Moolenbroek ACPI_STATUS Status = AE_OK;
98*29492bb7SDavid van Moolenbroek UINT32 ExpectedCount;
99*29492bb7SDavid van Moolenbroek UINT32 Count;
100*29492bb7SDavid van Moolenbroek UINT32 i;
101*29492bb7SDavid van Moolenbroek
102*29492bb7SDavid van Moolenbroek
103*29492bb7SDavid van Moolenbroek ACPI_FUNCTION_NAME (NsCheckPackage);
104*29492bb7SDavid van Moolenbroek
105*29492bb7SDavid van Moolenbroek
106*29492bb7SDavid van Moolenbroek /* The package info for this name is in the next table entry */
107*29492bb7SDavid van Moolenbroek
108*29492bb7SDavid van Moolenbroek Package = Info->Predefined + 1;
109*29492bb7SDavid van Moolenbroek
110*29492bb7SDavid van Moolenbroek ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
111*29492bb7SDavid van Moolenbroek "%s Validating return Package of Type %X, Count %X\n",
112*29492bb7SDavid van Moolenbroek Info->FullPathname, Package->RetInfo.Type,
113*29492bb7SDavid van Moolenbroek ReturnObject->Package.Count));
114*29492bb7SDavid van Moolenbroek
115*29492bb7SDavid van Moolenbroek /*
116*29492bb7SDavid van Moolenbroek * For variable-length Packages, we can safely remove all embedded
117*29492bb7SDavid van Moolenbroek * and trailing NULL package elements
118*29492bb7SDavid van Moolenbroek */
119*29492bb7SDavid van Moolenbroek AcpiNsRemoveNullElements (Info, Package->RetInfo.Type, ReturnObject);
120*29492bb7SDavid van Moolenbroek
121*29492bb7SDavid van Moolenbroek /* Extract package count and elements array */
122*29492bb7SDavid van Moolenbroek
123*29492bb7SDavid van Moolenbroek Elements = ReturnObject->Package.Elements;
124*29492bb7SDavid van Moolenbroek Count = ReturnObject->Package.Count;
125*29492bb7SDavid van Moolenbroek
126*29492bb7SDavid van Moolenbroek /*
127*29492bb7SDavid van Moolenbroek * Most packages must have at least one element. The only exception
128*29492bb7SDavid van Moolenbroek * is the variable-length package (ACPI_PTYPE1_VAR).
129*29492bb7SDavid van Moolenbroek */
130*29492bb7SDavid van Moolenbroek if (!Count)
131*29492bb7SDavid van Moolenbroek {
132*29492bb7SDavid van Moolenbroek if (Package->RetInfo.Type == ACPI_PTYPE1_VAR)
133*29492bb7SDavid van Moolenbroek {
134*29492bb7SDavid van Moolenbroek return (AE_OK);
135*29492bb7SDavid van Moolenbroek }
136*29492bb7SDavid van Moolenbroek
137*29492bb7SDavid van Moolenbroek ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
138*29492bb7SDavid van Moolenbroek "Return Package has no elements (empty)"));
139*29492bb7SDavid van Moolenbroek
140*29492bb7SDavid van Moolenbroek return (AE_AML_OPERAND_VALUE);
141*29492bb7SDavid van Moolenbroek }
142*29492bb7SDavid van Moolenbroek
143*29492bb7SDavid van Moolenbroek /*
144*29492bb7SDavid van Moolenbroek * Decode the type of the expected package contents
145*29492bb7SDavid van Moolenbroek *
146*29492bb7SDavid van Moolenbroek * PTYPE1 packages contain no subpackages
147*29492bb7SDavid van Moolenbroek * PTYPE2 packages contain subpackages
148*29492bb7SDavid van Moolenbroek */
149*29492bb7SDavid van Moolenbroek switch (Package->RetInfo.Type)
150*29492bb7SDavid van Moolenbroek {
151*29492bb7SDavid van Moolenbroek case ACPI_PTYPE1_FIXED:
152*29492bb7SDavid van Moolenbroek /*
153*29492bb7SDavid van Moolenbroek * The package count is fixed and there are no subpackages
154*29492bb7SDavid van Moolenbroek *
155*29492bb7SDavid van Moolenbroek * If package is too small, exit.
156*29492bb7SDavid van Moolenbroek * If package is larger than expected, issue warning but continue
157*29492bb7SDavid van Moolenbroek */
158*29492bb7SDavid van Moolenbroek ExpectedCount = Package->RetInfo.Count1 + Package->RetInfo.Count2;
159*29492bb7SDavid van Moolenbroek if (Count < ExpectedCount)
160*29492bb7SDavid van Moolenbroek {
161*29492bb7SDavid van Moolenbroek goto PackageTooSmall;
162*29492bb7SDavid van Moolenbroek }
163*29492bb7SDavid van Moolenbroek else if (Count > ExpectedCount)
164*29492bb7SDavid van Moolenbroek {
165*29492bb7SDavid van Moolenbroek ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR,
166*29492bb7SDavid van Moolenbroek "%s: Return Package is larger than needed - "
167*29492bb7SDavid van Moolenbroek "found %u, expected %u\n",
168*29492bb7SDavid van Moolenbroek Info->FullPathname, Count, ExpectedCount));
169*29492bb7SDavid van Moolenbroek }
170*29492bb7SDavid van Moolenbroek
171*29492bb7SDavid van Moolenbroek /* Validate all elements of the returned package */
172*29492bb7SDavid van Moolenbroek
173*29492bb7SDavid van Moolenbroek Status = AcpiNsCheckPackageElements (Info, Elements,
174*29492bb7SDavid van Moolenbroek Package->RetInfo.ObjectType1, Package->RetInfo.Count1,
175*29492bb7SDavid van Moolenbroek Package->RetInfo.ObjectType2, Package->RetInfo.Count2, 0);
176*29492bb7SDavid van Moolenbroek break;
177*29492bb7SDavid van Moolenbroek
178*29492bb7SDavid van Moolenbroek case ACPI_PTYPE1_VAR:
179*29492bb7SDavid van Moolenbroek /*
180*29492bb7SDavid van Moolenbroek * The package count is variable, there are no subpackages, and all
181*29492bb7SDavid van Moolenbroek * elements must be of the same type
182*29492bb7SDavid van Moolenbroek */
183*29492bb7SDavid van Moolenbroek for (i = 0; i < Count; i++)
184*29492bb7SDavid van Moolenbroek {
185*29492bb7SDavid van Moolenbroek Status = AcpiNsCheckObjectType (Info, Elements,
186*29492bb7SDavid van Moolenbroek Package->RetInfo.ObjectType1, i);
187*29492bb7SDavid van Moolenbroek if (ACPI_FAILURE (Status))
188*29492bb7SDavid van Moolenbroek {
189*29492bb7SDavid van Moolenbroek return (Status);
190*29492bb7SDavid van Moolenbroek }
191*29492bb7SDavid van Moolenbroek Elements++;
192*29492bb7SDavid van Moolenbroek }
193*29492bb7SDavid van Moolenbroek break;
194*29492bb7SDavid van Moolenbroek
195*29492bb7SDavid van Moolenbroek case ACPI_PTYPE1_OPTION:
196*29492bb7SDavid van Moolenbroek /*
197*29492bb7SDavid van Moolenbroek * The package count is variable, there are no subpackages. There are
198*29492bb7SDavid van Moolenbroek * a fixed number of required elements, and a variable number of
199*29492bb7SDavid van Moolenbroek * optional elements.
200*29492bb7SDavid van Moolenbroek *
201*29492bb7SDavid van Moolenbroek * Check if package is at least as large as the minimum required
202*29492bb7SDavid van Moolenbroek */
203*29492bb7SDavid van Moolenbroek ExpectedCount = Package->RetInfo3.Count;
204*29492bb7SDavid van Moolenbroek if (Count < ExpectedCount)
205*29492bb7SDavid van Moolenbroek {
206*29492bb7SDavid van Moolenbroek goto PackageTooSmall;
207*29492bb7SDavid van Moolenbroek }
208*29492bb7SDavid van Moolenbroek
209*29492bb7SDavid van Moolenbroek /* Variable number of sub-objects */
210*29492bb7SDavid van Moolenbroek
211*29492bb7SDavid van Moolenbroek for (i = 0; i < Count; i++)
212*29492bb7SDavid van Moolenbroek {
213*29492bb7SDavid van Moolenbroek if (i < Package->RetInfo3.Count)
214*29492bb7SDavid van Moolenbroek {
215*29492bb7SDavid van Moolenbroek /* These are the required package elements (0, 1, or 2) */
216*29492bb7SDavid van Moolenbroek
217*29492bb7SDavid van Moolenbroek Status = AcpiNsCheckObjectType (Info, Elements,
218*29492bb7SDavid van Moolenbroek Package->RetInfo3.ObjectType[i], i);
219*29492bb7SDavid van Moolenbroek if (ACPI_FAILURE (Status))
220*29492bb7SDavid van Moolenbroek {
221*29492bb7SDavid van Moolenbroek return (Status);
222*29492bb7SDavid van Moolenbroek }
223*29492bb7SDavid van Moolenbroek }
224*29492bb7SDavid van Moolenbroek else
225*29492bb7SDavid van Moolenbroek {
226*29492bb7SDavid van Moolenbroek /* These are the optional package elements */
227*29492bb7SDavid van Moolenbroek
228*29492bb7SDavid van Moolenbroek Status = AcpiNsCheckObjectType (Info, Elements,
229*29492bb7SDavid van Moolenbroek Package->RetInfo3.TailObjectType, i);
230*29492bb7SDavid van Moolenbroek if (ACPI_FAILURE (Status))
231*29492bb7SDavid van Moolenbroek {
232*29492bb7SDavid van Moolenbroek return (Status);
233*29492bb7SDavid van Moolenbroek }
234*29492bb7SDavid van Moolenbroek }
235*29492bb7SDavid van Moolenbroek Elements++;
236*29492bb7SDavid van Moolenbroek }
237*29492bb7SDavid van Moolenbroek break;
238*29492bb7SDavid van Moolenbroek
239*29492bb7SDavid van Moolenbroek case ACPI_PTYPE2_REV_FIXED:
240*29492bb7SDavid van Moolenbroek
241*29492bb7SDavid van Moolenbroek /* First element is the (Integer) revision */
242*29492bb7SDavid van Moolenbroek
243*29492bb7SDavid van Moolenbroek Status = AcpiNsCheckObjectType (Info, Elements,
244*29492bb7SDavid van Moolenbroek ACPI_RTYPE_INTEGER, 0);
245*29492bb7SDavid van Moolenbroek if (ACPI_FAILURE (Status))
246*29492bb7SDavid van Moolenbroek {
247*29492bb7SDavid van Moolenbroek return (Status);
248*29492bb7SDavid van Moolenbroek }
249*29492bb7SDavid van Moolenbroek
250*29492bb7SDavid van Moolenbroek Elements++;
251*29492bb7SDavid van Moolenbroek Count--;
252*29492bb7SDavid van Moolenbroek
253*29492bb7SDavid van Moolenbroek /* Examine the subpackages */
254*29492bb7SDavid van Moolenbroek
255*29492bb7SDavid van Moolenbroek Status = AcpiNsCheckPackageList (Info, Package, Elements, Count);
256*29492bb7SDavid van Moolenbroek break;
257*29492bb7SDavid van Moolenbroek
258*29492bb7SDavid van Moolenbroek case ACPI_PTYPE2_PKG_COUNT:
259*29492bb7SDavid van Moolenbroek
260*29492bb7SDavid van Moolenbroek /* First element is the (Integer) count of subpackages to follow */
261*29492bb7SDavid van Moolenbroek
262*29492bb7SDavid van Moolenbroek Status = AcpiNsCheckObjectType (Info, Elements,
263*29492bb7SDavid van Moolenbroek ACPI_RTYPE_INTEGER, 0);
264*29492bb7SDavid van Moolenbroek if (ACPI_FAILURE (Status))
265*29492bb7SDavid van Moolenbroek {
266*29492bb7SDavid van Moolenbroek return (Status);
267*29492bb7SDavid van Moolenbroek }
268*29492bb7SDavid van Moolenbroek
269*29492bb7SDavid van Moolenbroek /*
270*29492bb7SDavid van Moolenbroek * Count cannot be larger than the parent package length, but allow it
271*29492bb7SDavid van Moolenbroek * to be smaller. The >= accounts for the Integer above.
272*29492bb7SDavid van Moolenbroek */
273*29492bb7SDavid van Moolenbroek ExpectedCount = (UINT32) (*Elements)->Integer.Value;
274*29492bb7SDavid van Moolenbroek if (ExpectedCount >= Count)
275*29492bb7SDavid van Moolenbroek {
276*29492bb7SDavid van Moolenbroek goto PackageTooSmall;
277*29492bb7SDavid van Moolenbroek }
278*29492bb7SDavid van Moolenbroek
279*29492bb7SDavid van Moolenbroek Count = ExpectedCount;
280*29492bb7SDavid van Moolenbroek Elements++;
281*29492bb7SDavid van Moolenbroek
282*29492bb7SDavid van Moolenbroek /* Examine the subpackages */
283*29492bb7SDavid van Moolenbroek
284*29492bb7SDavid van Moolenbroek Status = AcpiNsCheckPackageList (Info, Package, Elements, Count);
285*29492bb7SDavid van Moolenbroek break;
286*29492bb7SDavid van Moolenbroek
287*29492bb7SDavid van Moolenbroek case ACPI_PTYPE2:
288*29492bb7SDavid van Moolenbroek case ACPI_PTYPE2_FIXED:
289*29492bb7SDavid van Moolenbroek case ACPI_PTYPE2_MIN:
290*29492bb7SDavid van Moolenbroek case ACPI_PTYPE2_COUNT:
291*29492bb7SDavid van Moolenbroek case ACPI_PTYPE2_FIX_VAR:
292*29492bb7SDavid van Moolenbroek /*
293*29492bb7SDavid van Moolenbroek * These types all return a single Package that consists of a
294*29492bb7SDavid van Moolenbroek * variable number of subpackages.
295*29492bb7SDavid van Moolenbroek *
296*29492bb7SDavid van Moolenbroek * First, ensure that the first element is a subpackage. If not,
297*29492bb7SDavid van Moolenbroek * the BIOS may have incorrectly returned the object as a single
298*29492bb7SDavid van Moolenbroek * package instead of a Package of Packages (a common error if
299*29492bb7SDavid van Moolenbroek * there is only one entry). We may be able to repair this by
300*29492bb7SDavid van Moolenbroek * wrapping the returned Package with a new outer Package.
301*29492bb7SDavid van Moolenbroek */
302*29492bb7SDavid van Moolenbroek if (*Elements && ((*Elements)->Common.Type != ACPI_TYPE_PACKAGE))
303*29492bb7SDavid van Moolenbroek {
304*29492bb7SDavid van Moolenbroek /* Create the new outer package and populate it */
305*29492bb7SDavid van Moolenbroek
306*29492bb7SDavid van Moolenbroek Status = AcpiNsWrapWithPackage (Info, ReturnObject, ReturnObjectPtr);
307*29492bb7SDavid van Moolenbroek if (ACPI_FAILURE (Status))
308*29492bb7SDavid van Moolenbroek {
309*29492bb7SDavid van Moolenbroek return (Status);
310*29492bb7SDavid van Moolenbroek }
311*29492bb7SDavid van Moolenbroek
312*29492bb7SDavid van Moolenbroek /* Update locals to point to the new package (of 1 element) */
313*29492bb7SDavid van Moolenbroek
314*29492bb7SDavid van Moolenbroek ReturnObject = *ReturnObjectPtr;
315*29492bb7SDavid van Moolenbroek Elements = ReturnObject->Package.Elements;
316*29492bb7SDavid van Moolenbroek Count = 1;
317*29492bb7SDavid van Moolenbroek }
318*29492bb7SDavid van Moolenbroek
319*29492bb7SDavid van Moolenbroek /* Examine the subpackages */
320*29492bb7SDavid van Moolenbroek
321*29492bb7SDavid van Moolenbroek Status = AcpiNsCheckPackageList (Info, Package, Elements, Count);
322*29492bb7SDavid van Moolenbroek break;
323*29492bb7SDavid van Moolenbroek
324*29492bb7SDavid van Moolenbroek case ACPI_PTYPE2_UUID_PAIR:
325*29492bb7SDavid van Moolenbroek
326*29492bb7SDavid van Moolenbroek /* The package must contain pairs of (UUID + type) */
327*29492bb7SDavid van Moolenbroek
328*29492bb7SDavid van Moolenbroek if (Count & 1)
329*29492bb7SDavid van Moolenbroek {
330*29492bb7SDavid van Moolenbroek ExpectedCount = Count + 1;
331*29492bb7SDavid van Moolenbroek goto PackageTooSmall;
332*29492bb7SDavid van Moolenbroek }
333*29492bb7SDavid van Moolenbroek
334*29492bb7SDavid van Moolenbroek while (Count > 0)
335*29492bb7SDavid van Moolenbroek {
336*29492bb7SDavid van Moolenbroek Status = AcpiNsCheckObjectType(Info, Elements,
337*29492bb7SDavid van Moolenbroek Package->RetInfo.ObjectType1, 0);
338*29492bb7SDavid van Moolenbroek if (ACPI_FAILURE(Status))
339*29492bb7SDavid van Moolenbroek {
340*29492bb7SDavid van Moolenbroek return (Status);
341*29492bb7SDavid van Moolenbroek }
342*29492bb7SDavid van Moolenbroek
343*29492bb7SDavid van Moolenbroek /* Validate length of the UUID buffer */
344*29492bb7SDavid van Moolenbroek
345*29492bb7SDavid van Moolenbroek if ((*Elements)->Buffer.Length != 16)
346*29492bb7SDavid van Moolenbroek {
347*29492bb7SDavid van Moolenbroek ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname,
348*29492bb7SDavid van Moolenbroek Info->NodeFlags, "Invalid length for UUID Buffer"));
349*29492bb7SDavid van Moolenbroek return (AE_AML_OPERAND_VALUE);
350*29492bb7SDavid van Moolenbroek }
351*29492bb7SDavid van Moolenbroek
352*29492bb7SDavid van Moolenbroek Status = AcpiNsCheckObjectType(Info, Elements + 1,
353*29492bb7SDavid van Moolenbroek Package->RetInfo.ObjectType2, 0);
354*29492bb7SDavid van Moolenbroek if (ACPI_FAILURE(Status))
355*29492bb7SDavid van Moolenbroek {
356*29492bb7SDavid van Moolenbroek return (Status);
357*29492bb7SDavid van Moolenbroek }
358*29492bb7SDavid van Moolenbroek
359*29492bb7SDavid van Moolenbroek Elements += 2;
360*29492bb7SDavid van Moolenbroek Count -= 2;
361*29492bb7SDavid van Moolenbroek }
362*29492bb7SDavid van Moolenbroek break;
363*29492bb7SDavid van Moolenbroek
364*29492bb7SDavid van Moolenbroek default:
365*29492bb7SDavid van Moolenbroek
366*29492bb7SDavid van Moolenbroek /* Should not get here if predefined info table is correct */
367*29492bb7SDavid van Moolenbroek
368*29492bb7SDavid van Moolenbroek ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
369*29492bb7SDavid van Moolenbroek "Invalid internal return type in table entry: %X",
370*29492bb7SDavid van Moolenbroek Package->RetInfo.Type));
371*29492bb7SDavid van Moolenbroek
372*29492bb7SDavid van Moolenbroek return (AE_AML_INTERNAL);
373*29492bb7SDavid van Moolenbroek }
374*29492bb7SDavid van Moolenbroek
375*29492bb7SDavid van Moolenbroek return (Status);
376*29492bb7SDavid van Moolenbroek
377*29492bb7SDavid van Moolenbroek
378*29492bb7SDavid van Moolenbroek PackageTooSmall:
379*29492bb7SDavid van Moolenbroek
380*29492bb7SDavid van Moolenbroek /* Error exit for the case with an incorrect package count */
381*29492bb7SDavid van Moolenbroek
382*29492bb7SDavid van Moolenbroek ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
383*29492bb7SDavid van Moolenbroek "Return Package is too small - found %u elements, expected %u",
384*29492bb7SDavid van Moolenbroek Count, ExpectedCount));
385*29492bb7SDavid van Moolenbroek
386*29492bb7SDavid van Moolenbroek return (AE_AML_OPERAND_VALUE);
387*29492bb7SDavid van Moolenbroek }
388*29492bb7SDavid van Moolenbroek
389*29492bb7SDavid van Moolenbroek
390*29492bb7SDavid van Moolenbroek /*******************************************************************************
391*29492bb7SDavid van Moolenbroek *
392*29492bb7SDavid van Moolenbroek * FUNCTION: AcpiNsCheckPackageList
393*29492bb7SDavid van Moolenbroek *
394*29492bb7SDavid van Moolenbroek * PARAMETERS: Info - Method execution information block
395*29492bb7SDavid van Moolenbroek * Package - Pointer to package-specific info for method
396*29492bb7SDavid van Moolenbroek * Elements - Element list of parent package. All elements
397*29492bb7SDavid van Moolenbroek * of this list should be of type Package.
398*29492bb7SDavid van Moolenbroek * Count - Count of subpackages
399*29492bb7SDavid van Moolenbroek *
400*29492bb7SDavid van Moolenbroek * RETURN: Status
401*29492bb7SDavid van Moolenbroek *
402*29492bb7SDavid van Moolenbroek * DESCRIPTION: Examine a list of subpackages
403*29492bb7SDavid van Moolenbroek *
404*29492bb7SDavid van Moolenbroek ******************************************************************************/
405*29492bb7SDavid van Moolenbroek
406*29492bb7SDavid van Moolenbroek static ACPI_STATUS
AcpiNsCheckPackageList(ACPI_EVALUATE_INFO * Info,const ACPI_PREDEFINED_INFO * Package,ACPI_OPERAND_OBJECT ** Elements,UINT32 Count)407*29492bb7SDavid van Moolenbroek AcpiNsCheckPackageList (
408*29492bb7SDavid van Moolenbroek ACPI_EVALUATE_INFO *Info,
409*29492bb7SDavid van Moolenbroek const ACPI_PREDEFINED_INFO *Package,
410*29492bb7SDavid van Moolenbroek ACPI_OPERAND_OBJECT **Elements,
411*29492bb7SDavid van Moolenbroek UINT32 Count)
412*29492bb7SDavid van Moolenbroek {
413*29492bb7SDavid van Moolenbroek ACPI_OPERAND_OBJECT *SubPackage;
414*29492bb7SDavid van Moolenbroek ACPI_OPERAND_OBJECT **SubElements;
415*29492bb7SDavid van Moolenbroek ACPI_STATUS Status;
416*29492bb7SDavid van Moolenbroek UINT32 ExpectedCount;
417*29492bb7SDavid van Moolenbroek UINT32 i;
418*29492bb7SDavid van Moolenbroek UINT32 j;
419*29492bb7SDavid van Moolenbroek
420*29492bb7SDavid van Moolenbroek
421*29492bb7SDavid van Moolenbroek /*
422*29492bb7SDavid van Moolenbroek * Validate each subpackage in the parent Package
423*29492bb7SDavid van Moolenbroek *
424*29492bb7SDavid van Moolenbroek * NOTE: assumes list of subpackages contains no NULL elements.
425*29492bb7SDavid van Moolenbroek * Any NULL elements should have been removed by earlier call
426*29492bb7SDavid van Moolenbroek * to AcpiNsRemoveNullElements.
427*29492bb7SDavid van Moolenbroek */
428*29492bb7SDavid van Moolenbroek for (i = 0; i < Count; i++)
429*29492bb7SDavid van Moolenbroek {
430*29492bb7SDavid van Moolenbroek SubPackage = *Elements;
431*29492bb7SDavid van Moolenbroek SubElements = SubPackage->Package.Elements;
432*29492bb7SDavid van Moolenbroek Info->ParentPackage = SubPackage;
433*29492bb7SDavid van Moolenbroek
434*29492bb7SDavid van Moolenbroek /* Each sub-object must be of type Package */
435*29492bb7SDavid van Moolenbroek
436*29492bb7SDavid van Moolenbroek Status = AcpiNsCheckObjectType (Info, &SubPackage,
437*29492bb7SDavid van Moolenbroek ACPI_RTYPE_PACKAGE, i);
438*29492bb7SDavid van Moolenbroek if (ACPI_FAILURE (Status))
439*29492bb7SDavid van Moolenbroek {
440*29492bb7SDavid van Moolenbroek return (Status);
441*29492bb7SDavid van Moolenbroek }
442*29492bb7SDavid van Moolenbroek
443*29492bb7SDavid van Moolenbroek /* Examine the different types of expected subpackages */
444*29492bb7SDavid van Moolenbroek
445*29492bb7SDavid van Moolenbroek Info->ParentPackage = SubPackage;
446*29492bb7SDavid van Moolenbroek switch (Package->RetInfo.Type)
447*29492bb7SDavid van Moolenbroek {
448*29492bb7SDavid van Moolenbroek case ACPI_PTYPE2:
449*29492bb7SDavid van Moolenbroek case ACPI_PTYPE2_PKG_COUNT:
450*29492bb7SDavid van Moolenbroek case ACPI_PTYPE2_REV_FIXED:
451*29492bb7SDavid van Moolenbroek
452*29492bb7SDavid van Moolenbroek /* Each subpackage has a fixed number of elements */
453*29492bb7SDavid van Moolenbroek
454*29492bb7SDavid van Moolenbroek ExpectedCount = Package->RetInfo.Count1 + Package->RetInfo.Count2;
455*29492bb7SDavid van Moolenbroek if (SubPackage->Package.Count < ExpectedCount)
456*29492bb7SDavid van Moolenbroek {
457*29492bb7SDavid van Moolenbroek goto PackageTooSmall;
458*29492bb7SDavid van Moolenbroek }
459*29492bb7SDavid van Moolenbroek
460*29492bb7SDavid van Moolenbroek Status = AcpiNsCheckPackageElements (Info, SubElements,
461*29492bb7SDavid van Moolenbroek Package->RetInfo.ObjectType1,
462*29492bb7SDavid van Moolenbroek Package->RetInfo.Count1,
463*29492bb7SDavid van Moolenbroek Package->RetInfo.ObjectType2,
464*29492bb7SDavid van Moolenbroek Package->RetInfo.Count2, 0);
465*29492bb7SDavid van Moolenbroek if (ACPI_FAILURE (Status))
466*29492bb7SDavid van Moolenbroek {
467*29492bb7SDavid van Moolenbroek return (Status);
468*29492bb7SDavid van Moolenbroek }
469*29492bb7SDavid van Moolenbroek break;
470*29492bb7SDavid van Moolenbroek
471*29492bb7SDavid van Moolenbroek case ACPI_PTYPE2_FIX_VAR:
472*29492bb7SDavid van Moolenbroek /*
473*29492bb7SDavid van Moolenbroek * Each subpackage has a fixed number of elements and an
474*29492bb7SDavid van Moolenbroek * optional element
475*29492bb7SDavid van Moolenbroek */
476*29492bb7SDavid van Moolenbroek ExpectedCount = Package->RetInfo.Count1 + Package->RetInfo.Count2;
477*29492bb7SDavid van Moolenbroek if (SubPackage->Package.Count < ExpectedCount)
478*29492bb7SDavid van Moolenbroek {
479*29492bb7SDavid van Moolenbroek goto PackageTooSmall;
480*29492bb7SDavid van Moolenbroek }
481*29492bb7SDavid van Moolenbroek
482*29492bb7SDavid van Moolenbroek Status = AcpiNsCheckPackageElements (Info, SubElements,
483*29492bb7SDavid van Moolenbroek Package->RetInfo.ObjectType1,
484*29492bb7SDavid van Moolenbroek Package->RetInfo.Count1,
485*29492bb7SDavid van Moolenbroek Package->RetInfo.ObjectType2,
486*29492bb7SDavid van Moolenbroek SubPackage->Package.Count - Package->RetInfo.Count1, 0);
487*29492bb7SDavid van Moolenbroek if (ACPI_FAILURE (Status))
488*29492bb7SDavid van Moolenbroek {
489*29492bb7SDavid van Moolenbroek return (Status);
490*29492bb7SDavid van Moolenbroek }
491*29492bb7SDavid van Moolenbroek break;
492*29492bb7SDavid van Moolenbroek
493*29492bb7SDavid van Moolenbroek case ACPI_PTYPE2_FIXED:
494*29492bb7SDavid van Moolenbroek
495*29492bb7SDavid van Moolenbroek /* Each subpackage has a fixed length */
496*29492bb7SDavid van Moolenbroek
497*29492bb7SDavid van Moolenbroek ExpectedCount = Package->RetInfo2.Count;
498*29492bb7SDavid van Moolenbroek if (SubPackage->Package.Count < ExpectedCount)
499*29492bb7SDavid van Moolenbroek {
500*29492bb7SDavid van Moolenbroek goto PackageTooSmall;
501*29492bb7SDavid van Moolenbroek }
502*29492bb7SDavid van Moolenbroek
503*29492bb7SDavid van Moolenbroek /* Check the type of each subpackage element */
504*29492bb7SDavid van Moolenbroek
505*29492bb7SDavid van Moolenbroek for (j = 0; j < ExpectedCount; j++)
506*29492bb7SDavid van Moolenbroek {
507*29492bb7SDavid van Moolenbroek Status = AcpiNsCheckObjectType (Info, &SubElements[j],
508*29492bb7SDavid van Moolenbroek Package->RetInfo2.ObjectType[j], j);
509*29492bb7SDavid van Moolenbroek if (ACPI_FAILURE (Status))
510*29492bb7SDavid van Moolenbroek {
511*29492bb7SDavid van Moolenbroek return (Status);
512*29492bb7SDavid van Moolenbroek }
513*29492bb7SDavid van Moolenbroek }
514*29492bb7SDavid van Moolenbroek break;
515*29492bb7SDavid van Moolenbroek
516*29492bb7SDavid van Moolenbroek case ACPI_PTYPE2_MIN:
517*29492bb7SDavid van Moolenbroek
518*29492bb7SDavid van Moolenbroek /* Each subpackage has a variable but minimum length */
519*29492bb7SDavid van Moolenbroek
520*29492bb7SDavid van Moolenbroek ExpectedCount = Package->RetInfo.Count1;
521*29492bb7SDavid van Moolenbroek if (SubPackage->Package.Count < ExpectedCount)
522*29492bb7SDavid van Moolenbroek {
523*29492bb7SDavid van Moolenbroek goto PackageTooSmall;
524*29492bb7SDavid van Moolenbroek }
525*29492bb7SDavid van Moolenbroek
526*29492bb7SDavid van Moolenbroek /* Check the type of each subpackage element */
527*29492bb7SDavid van Moolenbroek
528*29492bb7SDavid van Moolenbroek Status = AcpiNsCheckPackageElements (Info, SubElements,
529*29492bb7SDavid van Moolenbroek Package->RetInfo.ObjectType1,
530*29492bb7SDavid van Moolenbroek SubPackage->Package.Count, 0, 0, 0);
531*29492bb7SDavid van Moolenbroek if (ACPI_FAILURE (Status))
532*29492bb7SDavid van Moolenbroek {
533*29492bb7SDavid van Moolenbroek return (Status);
534*29492bb7SDavid van Moolenbroek }
535*29492bb7SDavid van Moolenbroek break;
536*29492bb7SDavid van Moolenbroek
537*29492bb7SDavid van Moolenbroek case ACPI_PTYPE2_COUNT:
538*29492bb7SDavid van Moolenbroek /*
539*29492bb7SDavid van Moolenbroek * First element is the (Integer) count of elements, including
540*29492bb7SDavid van Moolenbroek * the count field (the ACPI name is NumElements)
541*29492bb7SDavid van Moolenbroek */
542*29492bb7SDavid van Moolenbroek Status = AcpiNsCheckObjectType (Info, SubElements,
543*29492bb7SDavid van Moolenbroek ACPI_RTYPE_INTEGER, 0);
544*29492bb7SDavid van Moolenbroek if (ACPI_FAILURE (Status))
545*29492bb7SDavid van Moolenbroek {
546*29492bb7SDavid van Moolenbroek return (Status);
547*29492bb7SDavid van Moolenbroek }
548*29492bb7SDavid van Moolenbroek
549*29492bb7SDavid van Moolenbroek /*
550*29492bb7SDavid van Moolenbroek * Make sure package is large enough for the Count and is
551*29492bb7SDavid van Moolenbroek * is as large as the minimum size
552*29492bb7SDavid van Moolenbroek */
553*29492bb7SDavid van Moolenbroek ExpectedCount = (UINT32) (*SubElements)->Integer.Value;
554*29492bb7SDavid van Moolenbroek if (SubPackage->Package.Count < ExpectedCount)
555*29492bb7SDavid van Moolenbroek {
556*29492bb7SDavid van Moolenbroek goto PackageTooSmall;
557*29492bb7SDavid van Moolenbroek }
558*29492bb7SDavid van Moolenbroek if (SubPackage->Package.Count < Package->RetInfo.Count1)
559*29492bb7SDavid van Moolenbroek {
560*29492bb7SDavid van Moolenbroek ExpectedCount = Package->RetInfo.Count1;
561*29492bb7SDavid van Moolenbroek goto PackageTooSmall;
562*29492bb7SDavid van Moolenbroek }
563*29492bb7SDavid van Moolenbroek if (ExpectedCount == 0)
564*29492bb7SDavid van Moolenbroek {
565*29492bb7SDavid van Moolenbroek /*
566*29492bb7SDavid van Moolenbroek * Either the NumEntries element was originally zero or it was
567*29492bb7SDavid van Moolenbroek * a NULL element and repaired to an Integer of value zero.
568*29492bb7SDavid van Moolenbroek * In either case, repair it by setting NumEntries to be the
569*29492bb7SDavid van Moolenbroek * actual size of the subpackage.
570*29492bb7SDavid van Moolenbroek */
571*29492bb7SDavid van Moolenbroek ExpectedCount = SubPackage->Package.Count;
572*29492bb7SDavid van Moolenbroek (*SubElements)->Integer.Value = ExpectedCount;
573*29492bb7SDavid van Moolenbroek }
574*29492bb7SDavid van Moolenbroek
575*29492bb7SDavid van Moolenbroek /* Check the type of each subpackage element */
576*29492bb7SDavid van Moolenbroek
577*29492bb7SDavid van Moolenbroek Status = AcpiNsCheckPackageElements (Info, (SubElements + 1),
578*29492bb7SDavid van Moolenbroek Package->RetInfo.ObjectType1,
579*29492bb7SDavid van Moolenbroek (ExpectedCount - 1), 0, 0, 1);
580*29492bb7SDavid van Moolenbroek if (ACPI_FAILURE (Status))
581*29492bb7SDavid van Moolenbroek {
582*29492bb7SDavid van Moolenbroek return (Status);
583*29492bb7SDavid van Moolenbroek }
584*29492bb7SDavid van Moolenbroek break;
585*29492bb7SDavid van Moolenbroek
586*29492bb7SDavid van Moolenbroek default: /* Should not get here, type was validated by caller */
587*29492bb7SDavid van Moolenbroek
588*29492bb7SDavid van Moolenbroek return (AE_AML_INTERNAL);
589*29492bb7SDavid van Moolenbroek }
590*29492bb7SDavid van Moolenbroek
591*29492bb7SDavid van Moolenbroek Elements++;
592*29492bb7SDavid van Moolenbroek }
593*29492bb7SDavid van Moolenbroek
594*29492bb7SDavid van Moolenbroek return (AE_OK);
595*29492bb7SDavid van Moolenbroek
596*29492bb7SDavid van Moolenbroek
597*29492bb7SDavid van Moolenbroek PackageTooSmall:
598*29492bb7SDavid van Moolenbroek
599*29492bb7SDavid van Moolenbroek /* The subpackage count was smaller than required */
600*29492bb7SDavid van Moolenbroek
601*29492bb7SDavid van Moolenbroek ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags,
602*29492bb7SDavid van Moolenbroek "Return SubPackage[%u] is too small - found %u elements, expected %u",
603*29492bb7SDavid van Moolenbroek i, SubPackage->Package.Count, ExpectedCount));
604*29492bb7SDavid van Moolenbroek
605*29492bb7SDavid van Moolenbroek return (AE_AML_OPERAND_VALUE);
606*29492bb7SDavid van Moolenbroek }
607*29492bb7SDavid van Moolenbroek
608*29492bb7SDavid van Moolenbroek
609*29492bb7SDavid van Moolenbroek /*******************************************************************************
610*29492bb7SDavid van Moolenbroek *
611*29492bb7SDavid van Moolenbroek * FUNCTION: AcpiNsCheckPackageElements
612*29492bb7SDavid van Moolenbroek *
613*29492bb7SDavid van Moolenbroek * PARAMETERS: Info - Method execution information block
614*29492bb7SDavid van Moolenbroek * Elements - Pointer to the package elements array
615*29492bb7SDavid van Moolenbroek * Type1 - Object type for first group
616*29492bb7SDavid van Moolenbroek * Count1 - Count for first group
617*29492bb7SDavid van Moolenbroek * Type2 - Object type for second group
618*29492bb7SDavid van Moolenbroek * Count2 - Count for second group
619*29492bb7SDavid van Moolenbroek * StartIndex - Start of the first group of elements
620*29492bb7SDavid van Moolenbroek *
621*29492bb7SDavid van Moolenbroek * RETURN: Status
622*29492bb7SDavid van Moolenbroek *
623*29492bb7SDavid van Moolenbroek * DESCRIPTION: Check that all elements of a package are of the correct object
624*29492bb7SDavid van Moolenbroek * type. Supports up to two groups of different object types.
625*29492bb7SDavid van Moolenbroek *
626*29492bb7SDavid van Moolenbroek ******************************************************************************/
627*29492bb7SDavid van Moolenbroek
628*29492bb7SDavid van Moolenbroek static ACPI_STATUS
AcpiNsCheckPackageElements(ACPI_EVALUATE_INFO * Info,ACPI_OPERAND_OBJECT ** Elements,UINT8 Type1,UINT32 Count1,UINT8 Type2,UINT32 Count2,UINT32 StartIndex)629*29492bb7SDavid van Moolenbroek AcpiNsCheckPackageElements (
630*29492bb7SDavid van Moolenbroek ACPI_EVALUATE_INFO *Info,
631*29492bb7SDavid van Moolenbroek ACPI_OPERAND_OBJECT **Elements,
632*29492bb7SDavid van Moolenbroek UINT8 Type1,
633*29492bb7SDavid van Moolenbroek UINT32 Count1,
634*29492bb7SDavid van Moolenbroek UINT8 Type2,
635*29492bb7SDavid van Moolenbroek UINT32 Count2,
636*29492bb7SDavid van Moolenbroek UINT32 StartIndex)
637*29492bb7SDavid van Moolenbroek {
638*29492bb7SDavid van Moolenbroek ACPI_OPERAND_OBJECT **ThisElement = Elements;
639*29492bb7SDavid van Moolenbroek ACPI_STATUS Status;
640*29492bb7SDavid van Moolenbroek UINT32 i;
641*29492bb7SDavid van Moolenbroek
642*29492bb7SDavid van Moolenbroek
643*29492bb7SDavid van Moolenbroek /*
644*29492bb7SDavid van Moolenbroek * Up to two groups of package elements are supported by the data
645*29492bb7SDavid van Moolenbroek * structure. All elements in each group must be of the same type.
646*29492bb7SDavid van Moolenbroek * The second group can have a count of zero.
647*29492bb7SDavid van Moolenbroek */
648*29492bb7SDavid van Moolenbroek for (i = 0; i < Count1; i++)
649*29492bb7SDavid van Moolenbroek {
650*29492bb7SDavid van Moolenbroek Status = AcpiNsCheckObjectType (Info, ThisElement,
651*29492bb7SDavid van Moolenbroek Type1, i + StartIndex);
652*29492bb7SDavid van Moolenbroek if (ACPI_FAILURE (Status))
653*29492bb7SDavid van Moolenbroek {
654*29492bb7SDavid van Moolenbroek return (Status);
655*29492bb7SDavid van Moolenbroek }
656*29492bb7SDavid van Moolenbroek ThisElement++;
657*29492bb7SDavid van Moolenbroek }
658*29492bb7SDavid van Moolenbroek
659*29492bb7SDavid van Moolenbroek for (i = 0; i < Count2; i++)
660*29492bb7SDavid van Moolenbroek {
661*29492bb7SDavid van Moolenbroek Status = AcpiNsCheckObjectType (Info, ThisElement,
662*29492bb7SDavid van Moolenbroek Type2, (i + Count1 + StartIndex));
663*29492bb7SDavid van Moolenbroek if (ACPI_FAILURE (Status))
664*29492bb7SDavid van Moolenbroek {
665*29492bb7SDavid van Moolenbroek return (Status);
666*29492bb7SDavid van Moolenbroek }
667*29492bb7SDavid van Moolenbroek ThisElement++;
668*29492bb7SDavid van Moolenbroek }
669*29492bb7SDavid van Moolenbroek
670*29492bb7SDavid van Moolenbroek return (AE_OK);
671*29492bb7SDavid van Moolenbroek }
672