Also document BGE_FAKE_AUTONEG in LINT.
[dragonfly.git] / sys / contrib / dev / acpica / 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 /* $DragonFly: src/sys/contrib/dev/acpica/Attic/exoparg6.c,v 1.1 2003/09/24 03:32:16 drhodus Exp $                                                               */
119
120 #define __EXOPARG6_C__
121
122 #include "acpi.h"
123 #include "acinterp.h"
124 #include "acparser.h"
125 #include "amlcode.h"
126
127
128 #define _COMPONENT          ACPI_EXECUTER
129         ACPI_MODULE_NAME    ("exoparg6")
130
131
132 /*!
133  * Naming convention for AML interpreter execution routines.
134  *
135  * The routines that begin execution of AML opcodes are named with a common
136  * convention based upon the number of arguments, the number of target operands,
137  * and whether or not a value is returned:
138  *
139  *      AcpiExOpcode_xA_yT_zR
140  *
141  * Where:
142  *
143  * xA - ARGUMENTS:    The number of arguments (input operands) that are
144  *                    required for this opcode type (1 through 6 args).
145  * yT - TARGETS:      The number of targets (output operands) that are required
146  *                    for this opcode type (0, 1, or 2 targets).
147  * zR - RETURN VALUE: Indicates whether this opcode type returns a value
148  *                    as the function return (0 or 1).
149  *
150  * The AcpiExOpcode* functions are called via the Dispatcher component with
151  * fully resolved operands.
152 !*/
153
154
155 /*******************************************************************************
156  *
157  * FUNCTION:    AcpiExDoMatch
158  *
159  * PARAMETERS:  MatchOp         - The AML match operand
160  *              PackageValue    - Value from the target package
161  *              MatchValue      - Value to be matched
162  *
163  * RETURN:      TRUE if the match is successful, FALSE otherwise
164  *
165  * DESCRIPTION: Implements the low-level match for the ASL Match operator
166  *
167  ******************************************************************************/
168
169 BOOLEAN
170 AcpiExDoMatch (
171     UINT32                  MatchOp,
172     ACPI_INTEGER            PackageValue,
173     ACPI_INTEGER            MatchValue)
174 {
175
176     switch (MatchOp)
177     {
178     case MATCH_MTR:   /* always true */
179
180         break;
181
182
183     case MATCH_MEQ:   /* true if equal   */
184
185         if (PackageValue != MatchValue)
186         {
187             return (FALSE);
188         }
189         break;
190
191
192     case MATCH_MLE:   /* true if less than or equal  */
193
194         if (PackageValue > MatchValue)
195         {
196             return (FALSE);
197         }
198         break;
199
200
201     case MATCH_MLT:   /* true if less than   */
202
203         if (PackageValue >= MatchValue)
204         {
205             return (FALSE);
206         }
207         break;
208
209
210     case MATCH_MGE:   /* true if greater than or equal   */
211
212         if (PackageValue < MatchValue)
213         {
214             return (FALSE);
215         }
216         break;
217
218
219     case MATCH_MGT:   /* true if greater than    */
220
221         if (PackageValue <= MatchValue)
222         {
223             return (FALSE);
224         }
225         break;
226
227
228     default:    /* undefined   */
229
230         return (FALSE);
231     }
232
233
234     return TRUE;
235 }
236
237
238 /*******************************************************************************
239  *
240  * FUNCTION:    AcpiExOpcode_6A_0T_1R
241  *
242  * PARAMETERS:  WalkState           - Current walk state
243  *
244  * RETURN:      Status
245  *
246  * DESCRIPTION: Execute opcode with 6 arguments, no target, and a return value
247  *
248  ******************************************************************************/
249
250 ACPI_STATUS
251 AcpiExOpcode_6A_0T_1R (
252     ACPI_WALK_STATE         *WalkState)
253 {
254     ACPI_OPERAND_OBJECT     **Operand = &WalkState->Operands[0];
255     ACPI_OPERAND_OBJECT     *ReturnDesc = NULL;
256     ACPI_STATUS             Status = AE_OK;
257     UINT32                  Index;
258     ACPI_OPERAND_OBJECT     *ThisElement;
259
260
261     ACPI_FUNCTION_TRACE_STR ("ExOpcode_6A_0T_1R", AcpiPsGetOpcodeName (WalkState->Opcode));
262
263
264     switch (WalkState->Opcode)
265     {
266     case AML_MATCH_OP:
267         /*
268          * Match (SearchPackage[0], MatchOp1[1], MatchObject1[2],
269          *                          MatchOp2[3], MatchObject2[4], StartIndex[5])
270          */
271
272         /* Validate match comparison sub-opcodes */
273
274         if ((Operand[1]->Integer.Value > MAX_MATCH_OPERATOR) ||
275             (Operand[3]->Integer.Value > MAX_MATCH_OPERATOR))
276         {
277             ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "operation encoding out of range\n"));
278             Status = AE_AML_OPERAND_VALUE;
279             goto Cleanup;
280         }
281
282         Index = (UINT32) Operand[5]->Integer.Value;
283         if (Index >= (UINT32) Operand[0]->Package.Count)
284         {
285             ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Index beyond package end\n"));
286             Status = AE_AML_PACKAGE_LIMIT;
287             goto Cleanup;
288         }
289
290         ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
291         if (!ReturnDesc)
292         {
293             Status = AE_NO_MEMORY;
294             goto Cleanup;
295
296         }
297
298         /* Default return value if no match found */
299
300         ReturnDesc->Integer.Value = ACPI_INTEGER_MAX;
301
302         /*
303          * Examine each element until a match is found.  Within the loop,
304          * "continue" signifies that the current element does not match
305          * and the next should be examined.
306          *
307          * Upon finding a match, the loop will terminate via "break" at
308          * the bottom.  If it terminates "normally", MatchValue will be -1
309          * (its initial value) indicating that no match was found.  When
310          * returned as a Number, this will produce the Ones value as specified.
311          */
312         for ( ; Index < Operand[0]->Package.Count; Index++)
313         {
314             ThisElement = Operand[0]->Package.Elements[Index];
315
316             /*
317              * Treat any NULL or non-numeric elements as non-matching.
318              */
319             if (!ThisElement ||
320                 ACPI_GET_OBJECT_TYPE (ThisElement) != ACPI_TYPE_INTEGER)
321             {
322                 continue;
323             }
324
325             /*
326              * "continue" (proceed to next iteration of enclosing
327              * "for" loop) signifies a non-match.
328              */
329             if (!AcpiExDoMatch ((UINT32) Operand[1]->Integer.Value,
330                                 ThisElement->Integer.Value, Operand[2]->Integer.Value))
331             {
332                 continue;
333             }
334
335             if (!AcpiExDoMatch ((UINT32) Operand[3]->Integer.Value,
336                                 ThisElement->Integer.Value, Operand[4]->Integer.Value))
337             {
338                 continue;
339             }
340
341             /* Match found: Index is the return value */
342
343             ReturnDesc->Integer.Value = Index;
344             break;
345         }
346
347         break;
348
349
350     case AML_LOAD_TABLE_OP:
351
352         Status = AcpiExLoadTableOp (WalkState, &ReturnDesc);
353         break;
354
355
356     default:
357
358         ACPI_REPORT_ERROR (("AcpiExOpcode_3A_0T_0R: Unknown opcode %X\n",
359                 WalkState->Opcode));
360         Status = AE_AML_BAD_OPCODE;
361         goto Cleanup;
362     }
363
364
365     WalkState->ResultObj = ReturnDesc;
366
367
368 Cleanup:
369
370     /* Delete return object on error */
371
372     if (ACPI_FAILURE (Status))
373     {
374         AcpiUtRemoveReference (ReturnDesc);
375     }
376
377     return_ACPI_STATUS (Status);
378 }