Merge from vendor branch AWK:
[dragonfly.git] / sys / contrib / dev / acpica-unix-20031203 / interpreter / executer / exoparg6.c
1
2 /******************************************************************************
3  *
4  * Module Name: exoparg6 - AML execution - opcodes with 6 arguments
5  *              $Revision: 12 $
6  *
7  *****************************************************************************/
8
9 /******************************************************************************
10  *
11  * 1. Copyright Notice
12  *
13  * Some or all of this work - Copyright (c) 1999 - 2003, Intel Corp.
14  * All rights reserved.
15  *
16  * 2. License
17  *
18  * 2.1. This is your license from Intel Corp. under its intellectual property
19  * rights.  You may have additional license terms from the party that provided
20  * you this software, covering your right to use that party's intellectual
21  * property rights.
22  *
23  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
24  * copy of the source code appearing in this file ("Covered Code") an
25  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
26  * base code distributed originally by Intel ("Original Intel Code") to copy,
27  * make derivatives, distribute, use and display any portion of the Covered
28  * Code in any form, with the right to sublicense such rights; and
29  *
30  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
31  * license (with the right to sublicense), under only those claims of Intel
32  * patents that are infringed by the Original Intel Code, to make, use, sell,
33  * offer to sell, and import the Covered Code and derivative works thereof
34  * solely to the minimum extent necessary to exercise the above copyright
35  * license, and in no event shall the patent license extend to any additions
36  * to or modifications of the Original Intel Code.  No other license or right
37  * is granted directly or by implication, estoppel or otherwise;
38  *
39  * The above copyright and patent license is granted only if the following
40  * conditions are met:
41  *
42  * 3. Conditions
43  *
44  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
45  * Redistribution of source code of any substantial portion of the Covered
46  * Code or modification with rights to further distribute source must include
47  * the above Copyright Notice, the above License, this list of Conditions,
48  * and the following Disclaimer and Export Compliance provision.  In addition,
49  * Licensee must cause all Covered Code to which Licensee contributes to
50  * contain a file documenting the changes Licensee made to create that Covered
51  * Code and the date of any change.  Licensee must include in that file the
52  * documentation of any changes made by any predecessor Licensee.  Licensee
53  * must include a prominent statement that the modification is derived,
54  * directly or indirectly, from Original Intel Code.
55  *
56  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
57  * Redistribution of source code of any substantial portion of the Covered
58  * Code or modification without rights to further distribute source must
59  * include the following Disclaimer and Export Compliance provision in the
60  * documentation and/or other materials provided with distribution.  In
61  * addition, Licensee may not authorize further sublicense of source of any
62  * portion of the Covered Code, and must include terms to the effect that the
63  * license from Licensee to its licensee is limited to the intellectual
64  * property embodied in the software Licensee provides to its licensee, and
65  * not to intellectual property embodied in modifications its licensee may
66  * make.
67  *
68  * 3.3. Redistribution of Executable. Redistribution in executable form of any
69  * substantial portion of the Covered Code or modification must reproduce the
70  * above Copyright Notice, and the following Disclaimer and Export Compliance
71  * provision in the documentation and/or other materials provided with the
72  * distribution.
73  *
74  * 3.4. Intel retains all right, title, and interest in and to the Original
75  * Intel Code.
76  *
77  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
78  * Intel shall be used in advertising or otherwise to promote the sale, use or
79  * other dealings in products derived from or relating to the Covered Code
80  * without prior written authorization from Intel.
81  *
82  * 4. Disclaimer and Export Compliance
83  *
84  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
85  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
86  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
87  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
88
89  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
90  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
91  * PARTICULAR PURPOSE.
92  *
93  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
94  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
95  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
96  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
97  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
98  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
99  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
100  * LIMITED REMEDY.
101  *
102  * 4.3. Licensee shall not export, either directly or indirectly, any of this
103  * software or system incorporating such software without first obtaining any
104  * required license or other approval from the U. S. Department of Commerce or
105  * any other agency or department of the United States Government.  In the
106  * event Licensee exports any such software from the United States or
107  * re-exports any such software from a foreign destination, Licensee shall
108  * ensure that the distribution and export/re-export of the software is in
109  * compliance with all laws, regulations, orders, or other restrictions of the
110  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
111  * any of its subsidiaries will export/re-export any technical data, process,
112  * software, or service, directly or indirectly, to any country for which the
113  * United States government or any agency thereof requires an export license,
114  * other governmental approval, or letter of assurance, without first obtaining
115  * such license, approval or letter.
116  *
117  *****************************************************************************/
118
119 #define __EXOPARG6_C__
120
121 #include "acpi.h"
122 #include "acinterp.h"
123 #include "acparser.h"
124 #include "amlcode.h"
125
126
127 #define _COMPONENT          ACPI_EXECUTER
128         ACPI_MODULE_NAME    ("exoparg6")
129
130
131 /*!
132  * Naming convention for AML interpreter execution routines.
133  *
134  * The routines that begin execution of AML opcodes are named with a common
135  * convention based upon the number of arguments, the number of target operands,
136  * and whether or not a value is returned:
137  *
138  *      AcpiExOpcode_xA_yT_zR
139  *
140  * Where:
141  *
142  * xA - ARGUMENTS:    The number of arguments (input operands) that are
143  *                    required for this opcode type (1 through 6 args).
144  * yT - TARGETS:      The number of targets (output operands) that are required
145  *                    for this opcode type (0, 1, or 2 targets).
146  * zR - RETURN VALUE: Indicates whether this opcode type returns a value
147  *                    as the function return (0 or 1).
148  *
149  * The AcpiExOpcode* functions are called via the Dispatcher component with
150  * fully resolved operands.
151 !*/
152
153
154 /*******************************************************************************
155  *
156  * FUNCTION:    AcpiExDoMatch
157  *
158  * PARAMETERS:  MatchOp         - The AML match operand
159  *              PackageValue    - Value from the target package
160  *              MatchValue      - Value to be matched
161  *
162  * RETURN:      TRUE if the match is successful, FALSE otherwise
163  *
164  * DESCRIPTION: Implements the low-level match for the ASL Match operator
165  *
166  ******************************************************************************/
167
168 BOOLEAN
169 AcpiExDoMatch (
170     UINT32                  MatchOp,
171     ACPI_INTEGER            PackageValue,
172     ACPI_INTEGER            MatchValue)
173 {
174
175     switch (MatchOp)
176     {
177     case MATCH_MTR:   /* always true */
178
179         break;
180
181
182     case MATCH_MEQ:   /* true if equal   */
183
184         if (PackageValue != MatchValue)
185         {
186             return (FALSE);
187         }
188         break;
189
190
191     case MATCH_MLE:   /* true if less than or equal  */
192
193         if (PackageValue > MatchValue)
194         {
195             return (FALSE);
196         }
197         break;
198
199
200     case MATCH_MLT:   /* true if less than   */
201
202         if (PackageValue >= MatchValue)
203         {
204             return (FALSE);
205         }
206         break;
207
208
209     case MATCH_MGE:   /* true if greater than or equal   */
210
211         if (PackageValue < MatchValue)
212         {
213             return (FALSE);
214         }
215         break;
216
217
218     case MATCH_MGT:   /* true if greater than    */
219
220         if (PackageValue <= MatchValue)
221         {
222             return (FALSE);
223         }
224         break;
225
226
227     default:    /* undefined   */
228
229         return (FALSE);
230     }
231
232
233     return TRUE;
234 }
235
236
237 /*******************************************************************************
238  *
239  * FUNCTION:    AcpiExOpcode_6A_0T_1R
240  *
241  * PARAMETERS:  WalkState           - Current walk state
242  *
243  * RETURN:      Status
244  *
245  * DESCRIPTION: Execute opcode with 6 arguments, no target, and a return value
246  *
247  ******************************************************************************/
248
249 ACPI_STATUS
250 AcpiExOpcode_6A_0T_1R (
251     ACPI_WALK_STATE         *WalkState)
252 {
253     ACPI_OPERAND_OBJECT     **Operand = &WalkState->Operands[0];
254     ACPI_OPERAND_OBJECT     *ReturnDesc = NULL;
255     ACPI_STATUS             Status = AE_OK;
256     UINT32                  Index;
257     ACPI_OPERAND_OBJECT     *ThisElement;
258
259
260     ACPI_FUNCTION_TRACE_STR ("ExOpcode_6A_0T_1R", AcpiPsGetOpcodeName (WalkState->Opcode));
261
262
263     switch (WalkState->Opcode)
264     {
265     case AML_MATCH_OP:
266         /*
267          * Match (SearchPackage[0], MatchOp1[1], MatchObject1[2],
268          *                          MatchOp2[3], MatchObject2[4], StartIndex[5])
269          */
270
271         /* Validate match comparison sub-opcodes */
272
273         if ((Operand[1]->Integer.Value > MAX_MATCH_OPERATOR) ||
274             (Operand[3]->Integer.Value > MAX_MATCH_OPERATOR))
275         {
276             ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "operation encoding out of range\n"));
277             Status = AE_AML_OPERAND_VALUE;
278             goto Cleanup;
279         }
280
281         Index = (UINT32) Operand[5]->Integer.Value;
282         if (Index >= (UINT32) Operand[0]->Package.Count)
283         {
284             ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Index beyond package end\n"));
285             Status = AE_AML_PACKAGE_LIMIT;
286             goto Cleanup;
287         }
288
289         ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
290         if (!ReturnDesc)
291         {
292             Status = AE_NO_MEMORY;
293             goto Cleanup;
294
295         }
296
297         /* Default return value if no match found */
298
299         ReturnDesc->Integer.Value = ACPI_INTEGER_MAX;
300
301         /*
302          * Examine each element until a match is found.  Within the loop,
303          * "continue" signifies that the current element does not match
304          * and the next should be examined.
305          *
306          * Upon finding a match, the loop will terminate via "break" at
307          * the bottom.  If it terminates "normally", MatchValue will be -1
308          * (its initial value) indicating that no match was found.  When
309          * returned as a Number, this will produce the Ones value as specified.
310          */
311         for ( ; Index < Operand[0]->Package.Count; Index++)
312         {
313             ThisElement = Operand[0]->Package.Elements[Index];
314
315             /*
316              * Treat any NULL or non-numeric elements as non-matching.
317              */
318             if (!ThisElement ||
319                 ACPI_GET_OBJECT_TYPE (ThisElement) != ACPI_TYPE_INTEGER)
320             {
321                 continue;
322             }
323
324             /*
325              * "continue" (proceed to next iteration of enclosing
326              * "for" loop) signifies a non-match.
327              */
328             if (!AcpiExDoMatch ((UINT32) Operand[1]->Integer.Value,
329                                 ThisElement->Integer.Value, Operand[2]->Integer.Value))
330             {
331                 continue;
332             }
333
334             if (!AcpiExDoMatch ((UINT32) Operand[3]->Integer.Value,
335                                 ThisElement->Integer.Value, Operand[4]->Integer.Value))
336             {
337                 continue;
338             }
339
340             /* Match found: Index is the return value */
341
342             ReturnDesc->Integer.Value = Index;
343             break;
344         }
345
346         break;
347
348
349     case AML_LOAD_TABLE_OP:
350
351         Status = AcpiExLoadTableOp (WalkState, &ReturnDesc);
352         break;
353
354
355     default:
356
357         ACPI_REPORT_ERROR (("AcpiExOpcode_3A_0T_0R: Unknown opcode %X\n",
358                 WalkState->Opcode));
359         Status = AE_AML_BAD_OPCODE;
360         goto Cleanup;
361     }
362
363
364     WalkState->ResultObj = ReturnDesc;
365
366
367 Cleanup:
368
369     /* Delete return object on error */
370
371     if (ACPI_FAILURE (Status))
372     {
373         AcpiUtRemoveReference (ReturnDesc);
374     }
375
376     return_ACPI_STATUS (Status);
377 }