Subversion Repositories Kolibri OS

Rev

Rev 1498 | Details | Compare with Previous | Last modification | View Log | RSS feed

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