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: exoparg2 - AML execution - opcodes with 2 arguments
4
 *
5
 *****************************************************************************/
6
 
7
/******************************************************************************
8
 *
9
 * 1. Copyright Notice
10
 *
2216 Serge 11
 * Some or all of this work - Copyright (c) 1999 - 2011, Intel Corp.
1498 serge 12
 * All rights reserved.
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
 * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
87
 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88
 * PARTICULAR PURPOSE.
89
 *
90
 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91
 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92
 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93
 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94
 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95
 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
96
 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97
 * LIMITED REMEDY.
98
 *
99
 * 4.3. Licensee shall not export, either directly or indirectly, any of this
100
 * software or system incorporating such software without first obtaining any
101
 * required license or other approval from the U. S. Department of Commerce or
102
 * any other agency or department of the United States Government.  In the
103
 * event Licensee exports any such software from the United States or
104
 * re-exports any such software from a foreign destination, Licensee shall
105
 * ensure that the distribution and export/re-export of the software is in
106
 * compliance with all laws, regulations, orders, or other restrictions of the
107
 * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108
 * any of its subsidiaries will export/re-export any technical data, process,
109
 * software, or service, directly or indirectly, to any country for which the
110
 * United States government or any agency thereof requires an export license,
111
 * other governmental approval, or letter of assurance, without first obtaining
112
 * such license, approval or letter.
113
 *
114
 *****************************************************************************/
115
 
116
 
117
#define __EXOPARG2_C__
118
 
119
#include "acpi.h"
120
#include "accommon.h"
121
#include "acparser.h"
122
#include "acinterp.h"
123
#include "acevents.h"
124
#include "amlcode.h"
125
 
126
 
127
#define _COMPONENT          ACPI_EXECUTER
128
        ACPI_MODULE_NAME    ("exoparg2")
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:    AcpiExOpcode_2A_0T_0R
157
 *
158
 * PARAMETERS:  WalkState           - Current walk state
159
 *
160
 * RETURN:      Status
161
 *
162
 * DESCRIPTION: Execute opcode with two arguments, no target, and no return
163
 *              value.
164
 *
165
 * ALLOCATION:  Deletes both operands
166
 *
167
 ******************************************************************************/
168
 
169
ACPI_STATUS
170
AcpiExOpcode_2A_0T_0R (
171
    ACPI_WALK_STATE         *WalkState)
172
{
173
    ACPI_OPERAND_OBJECT     **Operand = &WalkState->Operands[0];
174
    ACPI_NAMESPACE_NODE     *Node;
175
    UINT32                  Value;
176
    ACPI_STATUS             Status = AE_OK;
177
 
178
 
179
    ACPI_FUNCTION_TRACE_STR (ExOpcode_2A_0T_0R,
180
            AcpiPsGetOpcodeName (WalkState->Opcode));
181
 
182
 
183
    /* Examine the opcode */
184
 
185
    switch (WalkState->Opcode)
186
    {
187
    case AML_NOTIFY_OP:         /* Notify (NotifyObject, NotifyValue) */
188
 
189
        /* The first operand is a namespace node */
190
 
191
        Node = (ACPI_NAMESPACE_NODE *) Operand[0];
192
 
193
        /* Second value is the notify value */
194
 
195
        Value = (UINT32) Operand[1]->Integer.Value;
196
 
197
        /* Are notifies allowed on this object? */
198
 
199
        if (!AcpiEvIsNotifyObject (Node))
200
        {
201
            ACPI_ERROR ((AE_INFO,
202
                "Unexpected notify object type [%s]",
203
                AcpiUtGetTypeName (Node->Type)));
204
 
205
            Status = AE_AML_OPERAND_TYPE;
206
            break;
207
        }
208
 
209
        /*
210
         * Dispatch the notify to the appropriate handler
211
         * NOTE: the request is queued for execution after this method
212
         * completes.  The notify handlers are NOT invoked synchronously
213
         * from this thread -- because handlers may in turn run other
214
         * control methods.
215
         */
216
        Status = AcpiEvQueueNotifyRequest (Node, Value);
217
        break;
218
 
219
 
220
    default:
221
 
222
        ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X",
223
            WalkState->Opcode));
224
        Status = AE_AML_BAD_OPCODE;
225
    }
226
 
227
    return_ACPI_STATUS (Status);
228
}
229
 
230
 
231
/*******************************************************************************
232
 *
233
 * FUNCTION:    AcpiExOpcode_2A_2T_1R
234
 *
235
 * PARAMETERS:  WalkState           - Current walk state
236
 *
237
 * RETURN:      Status
238
 *
239
 * DESCRIPTION: Execute a dyadic operator (2 operands) with 2 output targets
240
 *              and one implicit return value.
241
 *
242
 ******************************************************************************/
243
 
244
ACPI_STATUS
245
AcpiExOpcode_2A_2T_1R (
246
    ACPI_WALK_STATE         *WalkState)
247
{
248
    ACPI_OPERAND_OBJECT     **Operand = &WalkState->Operands[0];
249
    ACPI_OPERAND_OBJECT     *ReturnDesc1 = NULL;
250
    ACPI_OPERAND_OBJECT     *ReturnDesc2 = NULL;
251
    ACPI_STATUS             Status;
252
 
253
 
254
    ACPI_FUNCTION_TRACE_STR (ExOpcode_2A_2T_1R,
255
        AcpiPsGetOpcodeName (WalkState->Opcode));
256
 
257
 
258
    /* Execute the opcode */
259
 
260
    switch (WalkState->Opcode)
261
    {
262
    case AML_DIVIDE_OP:
263
 
264
        /* Divide (Dividend, Divisor, RemainderResult QuotientResult) */
265
 
266
        ReturnDesc1 = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
267
        if (!ReturnDesc1)
268
        {
269
            Status = AE_NO_MEMORY;
270
            goto Cleanup;
271
        }
272
 
273
        ReturnDesc2 = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
274
        if (!ReturnDesc2)
275
        {
276
            Status = AE_NO_MEMORY;
277
            goto Cleanup;
278
        }
279
 
280
        /* Quotient to ReturnDesc1, remainder to ReturnDesc2 */
281
 
282
        Status = AcpiUtDivide (Operand[0]->Integer.Value,
283
                               Operand[1]->Integer.Value,
284
                               &ReturnDesc1->Integer.Value,
285
                               &ReturnDesc2->Integer.Value);
286
        if (ACPI_FAILURE (Status))
287
        {
288
            goto Cleanup;
289
        }
290
        break;
291
 
292
 
293
    default:
294
 
295
        ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X",
296
            WalkState->Opcode));
297
        Status = AE_AML_BAD_OPCODE;
298
        goto Cleanup;
299
    }
300
 
301
    /* Store the results to the target reference operands */
302
 
303
    Status = AcpiExStore (ReturnDesc2, Operand[2], WalkState);
304
    if (ACPI_FAILURE (Status))
305
    {
306
        goto Cleanup;
307
    }
308
 
309
    Status = AcpiExStore (ReturnDesc1, Operand[3], WalkState);
310
    if (ACPI_FAILURE (Status))
311
    {
312
        goto Cleanup;
313
    }
314
 
315
Cleanup:
316
    /*
317
     * Since the remainder is not returned indirectly, remove a reference to
318
     * it. Only the quotient is returned indirectly.
319
     */
320
    AcpiUtRemoveReference (ReturnDesc2);
321
 
322
    if (ACPI_FAILURE (Status))
323
    {
324
        /* Delete the return object */
325
 
326
        AcpiUtRemoveReference (ReturnDesc1);
327
    }
328
 
329
    /* Save return object (the remainder) on success */
330
 
331
    else
332
    {
333
        WalkState->ResultObj = ReturnDesc1;
334
    }
335
 
336
    return_ACPI_STATUS (Status);
337
}
338
 
339
 
340
/*******************************************************************************
341
 *
342
 * FUNCTION:    AcpiExOpcode_2A_1T_1R
343
 *
344
 * PARAMETERS:  WalkState           - Current walk state
345
 *
346
 * RETURN:      Status
347
 *
348
 * DESCRIPTION: Execute opcode with two arguments, one target, and a return
349
 *              value.
350
 *
351
 ******************************************************************************/
352
 
353
ACPI_STATUS
354
AcpiExOpcode_2A_1T_1R (
355
    ACPI_WALK_STATE         *WalkState)
356
{
357
    ACPI_OPERAND_OBJECT     **Operand = &WalkState->Operands[0];
358
    ACPI_OPERAND_OBJECT     *ReturnDesc = NULL;
359
    UINT64                  Index;
360
    ACPI_STATUS             Status = AE_OK;
361
    ACPI_SIZE               Length;
362
 
363
 
364
    ACPI_FUNCTION_TRACE_STR (ExOpcode_2A_1T_1R,
365
        AcpiPsGetOpcodeName (WalkState->Opcode));
366
 
367
 
368
    /* Execute the opcode */
369
 
370
    if (WalkState->OpInfo->Flags & AML_MATH)
371
    {
372
        /* All simple math opcodes (add, etc.) */
373
 
374
        ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
375
        if (!ReturnDesc)
376
        {
377
            Status = AE_NO_MEMORY;
378
            goto Cleanup;
379
        }
380
 
381
        ReturnDesc->Integer.Value = AcpiExDoMathOp (WalkState->Opcode,
382
                                                Operand[0]->Integer.Value,
383
                                                Operand[1]->Integer.Value);
384
        goto StoreResultToTarget;
385
    }
386
 
387
    switch (WalkState->Opcode)
388
    {
389
    case AML_MOD_OP: /* Mod (Dividend, Divisor, RemainderResult (ACPI 2.0) */
390
 
391
        ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
392
        if (!ReturnDesc)
393
        {
394
            Status = AE_NO_MEMORY;
395
            goto Cleanup;
396
        }
397
 
398
        /* ReturnDesc will contain the remainder */
399
 
400
        Status = AcpiUtDivide (Operand[0]->Integer.Value,
401
                               Operand[1]->Integer.Value,
402
                               NULL,
403
                               &ReturnDesc->Integer.Value);
404
        break;
405
 
406
 
407
    case AML_CONCAT_OP: /* Concatenate (Data1, Data2, Result) */
408
 
409
        Status = AcpiExDoConcatenate (Operand[0], Operand[1],
410
                    &ReturnDesc, WalkState);
411
        break;
412
 
413
 
414
    case AML_TO_STRING_OP: /* ToString (Buffer, Length, Result) (ACPI 2.0) */
415
 
416
        /*
417
         * Input object is guaranteed to be a buffer at this point (it may have
418
         * been converted.)  Copy the raw buffer data to a new object of
419
         * type String.
420
         */
421
 
422
        /*
423
         * Get the length of the new string. It is the smallest of:
424
         * 1) Length of the input buffer
425
         * 2) Max length as specified in the ToString operator
426
         * 3) Length of input buffer up to a zero byte (null terminator)
427
         *
428
         * NOTE: A length of zero is ok, and will create a zero-length, null
429
         *       terminated string.
430
         */
431
        Length = 0;
432
        while ((Length < Operand[0]->Buffer.Length) &&
433
               (Length < Operand[1]->Integer.Value) &&
434
               (Operand[0]->Buffer.Pointer[Length]))
435
        {
436
            Length++;
437
        }
438
 
439
        /* Allocate a new string object */
440
 
441
        ReturnDesc = AcpiUtCreateStringObject (Length);
442
        if (!ReturnDesc)
443
        {
444
            Status = AE_NO_MEMORY;
445
            goto Cleanup;
446
        }
447
 
448
        /*
449
         * Copy the raw buffer data with no transform.
450
         * (NULL terminated already)
451
         */
452
        ACPI_MEMCPY (ReturnDesc->String.Pointer,
453
            Operand[0]->Buffer.Pointer, Length);
454
        break;
455
 
456
 
457
    case AML_CONCAT_RES_OP:
458
 
459
        /* ConcatenateResTemplate (Buffer, Buffer, Result) (ACPI 2.0) */
460
 
461
        Status = AcpiExConcatTemplate (Operand[0], Operand[1],
462
                    &ReturnDesc, WalkState);
463
        break;
464
 
465
 
466
    case AML_INDEX_OP:              /* Index (Source Index Result) */
467
 
468
        /* Create the internal return object */
469
 
470
        ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_LOCAL_REFERENCE);
471
        if (!ReturnDesc)
472
        {
473
            Status = AE_NO_MEMORY;
474
            goto Cleanup;
475
        }
476
 
477
        /* Initialize the Index reference object */
478
 
479
        Index = Operand[1]->Integer.Value;
480
        ReturnDesc->Reference.Value = (UINT32) Index;
481
        ReturnDesc->Reference.Class = ACPI_REFCLASS_INDEX;
482
 
483
        /*
484
         * At this point, the Source operand is a String, Buffer, or Package.
485
         * Verify that the index is within range.
486
         */
487
        switch ((Operand[0])->Common.Type)
488
        {
489
        case ACPI_TYPE_STRING:
490
 
491
            if (Index >= Operand[0]->String.Length)
492
            {
493
                Status = AE_AML_STRING_LIMIT;
494
            }
495
 
496
            ReturnDesc->Reference.TargetType = ACPI_TYPE_BUFFER_FIELD;
497
            break;
498
 
499
        case ACPI_TYPE_BUFFER:
500
 
501
            if (Index >= Operand[0]->Buffer.Length)
502
            {
503
                Status = AE_AML_BUFFER_LIMIT;
504
            }
505
 
506
            ReturnDesc->Reference.TargetType = ACPI_TYPE_BUFFER_FIELD;
507
            break;
508
 
509
        case ACPI_TYPE_PACKAGE:
510
 
511
            if (Index >= Operand[0]->Package.Count)
512
            {
513
                Status = AE_AML_PACKAGE_LIMIT;
514
            }
515
 
516
            ReturnDesc->Reference.TargetType = ACPI_TYPE_PACKAGE;
517
            ReturnDesc->Reference.Where = &Operand[0]->Package.Elements [Index];
518
            break;
519
 
520
        default:
521
 
522
            Status = AE_AML_INTERNAL;
523
            goto Cleanup;
524
        }
525
 
526
        /* Failure means that the Index was beyond the end of the object */
527
 
528
        if (ACPI_FAILURE (Status))
529
        {
530
            ACPI_EXCEPTION ((AE_INFO, Status,
531
                "Index (0x%8.8X%8.8X) is beyond end of object",
532
                ACPI_FORMAT_UINT64 (Index)));
533
            goto Cleanup;
534
        }
535
 
536
        /*
537
         * Save the target object and add a reference to it for the life
538
         * of the index
539
         */
540
        ReturnDesc->Reference.Object = Operand[0];
541
        AcpiUtAddReference (Operand[0]);
542
 
543
        /* Store the reference to the Target */
544
 
545
        Status = AcpiExStore (ReturnDesc, Operand[2], WalkState);
546
 
547
        /* Return the reference */
548
 
549
        WalkState->ResultObj = ReturnDesc;
550
        goto Cleanup;
551
 
552
 
553
    default:
554
 
555
        ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X",
556
            WalkState->Opcode));
557
        Status = AE_AML_BAD_OPCODE;
558
        break;
559
    }
560
 
561
 
562
StoreResultToTarget:
563
 
564
    if (ACPI_SUCCESS (Status))
565
    {
566
        /*
567
         * Store the result of the operation (which is now in ReturnDesc) into
568
         * the Target descriptor.
569
         */
570
        Status = AcpiExStore (ReturnDesc, Operand[2], WalkState);
571
        if (ACPI_FAILURE (Status))
572
        {
573
            goto Cleanup;
574
        }
575
 
576
        if (!WalkState->ResultObj)
577
        {
578
            WalkState->ResultObj = ReturnDesc;
579
        }
580
    }
581
 
582
 
583
Cleanup:
584
 
585
    /* Delete return object on error */
586
 
587
    if (ACPI_FAILURE (Status))
588
    {
589
        AcpiUtRemoveReference (ReturnDesc);
590
        WalkState->ResultObj = NULL;
591
    }
592
 
593
    return_ACPI_STATUS (Status);
594
}
595
 
596
 
597
/*******************************************************************************
598
 *
599
 * FUNCTION:    AcpiExOpcode_2A_0T_1R
600
 *
601
 * PARAMETERS:  WalkState           - Current walk state
602
 *
603
 * RETURN:      Status
604
 *
605
 * DESCRIPTION: Execute opcode with 2 arguments, no target, and a return value
606
 *
607
 ******************************************************************************/
608
 
609
ACPI_STATUS
610
AcpiExOpcode_2A_0T_1R (
611
    ACPI_WALK_STATE         *WalkState)
612
{
613
    ACPI_OPERAND_OBJECT     **Operand = &WalkState->Operands[0];
614
    ACPI_OPERAND_OBJECT     *ReturnDesc = NULL;
615
    ACPI_STATUS             Status = AE_OK;
616
    BOOLEAN                 LogicalResult = FALSE;
617
 
618
 
619
    ACPI_FUNCTION_TRACE_STR (ExOpcode_2A_0T_1R,
620
        AcpiPsGetOpcodeName (WalkState->Opcode));
621
 
622
 
623
    /* Create the internal return object */
624
 
625
    ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
626
    if (!ReturnDesc)
627
    {
628
        Status = AE_NO_MEMORY;
629
        goto Cleanup;
630
    }
631
 
632
    /* Execute the Opcode */
633
 
634
    if (WalkState->OpInfo->Flags & AML_LOGICAL_NUMERIC)
635
    {
636
        /* LogicalOp  (Operand0, Operand1) */
637
 
638
        Status = AcpiExDoLogicalNumericOp (WalkState->Opcode,
639
                        Operand[0]->Integer.Value, Operand[1]->Integer.Value,
640
                        &LogicalResult);
641
        goto StoreLogicalResult;
642
    }
643
    else if (WalkState->OpInfo->Flags & AML_LOGICAL)
644
    {
645
        /* LogicalOp  (Operand0, Operand1) */
646
 
647
        Status = AcpiExDoLogicalOp (WalkState->Opcode, Operand[0],
648
                    Operand[1], &LogicalResult);
649
        goto StoreLogicalResult;
650
    }
651
 
652
    switch (WalkState->Opcode)
653
    {
654
    case AML_ACQUIRE_OP:            /* Acquire (MutexObject, Timeout) */
655
 
656
        Status = AcpiExAcquireMutex (Operand[1], Operand[0], WalkState);
657
        if (Status == AE_TIME)
658
        {
659
            LogicalResult = TRUE;       /* TRUE = Acquire timed out */
660
            Status = AE_OK;
661
        }
662
        break;
663
 
664
 
665
    case AML_WAIT_OP:               /* Wait (EventObject, Timeout) */
666
 
667
        Status = AcpiExSystemWaitEvent (Operand[1], Operand[0]);
668
        if (Status == AE_TIME)
669
        {
670
            LogicalResult = TRUE;       /* TRUE, Wait timed out */
671
            Status = AE_OK;
672
        }
673
        break;
674
 
675
 
676
    default:
677
 
678
        ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X",
679
            WalkState->Opcode));
680
        Status = AE_AML_BAD_OPCODE;
681
        goto Cleanup;
682
    }
683
 
684
 
685
StoreLogicalResult:
686
    /*
687
     * Set return value to according to LogicalResult. logical TRUE (all ones)
688
     * Default is FALSE (zero)
689
     */
690
    if (LogicalResult)
691
    {
692
        ReturnDesc->Integer.Value = ACPI_UINT64_MAX;
693
    }
694
 
695
Cleanup:
696
 
697
    /* Delete return object on error */
698
 
699
    if (ACPI_FAILURE (Status))
700
    {
701
        AcpiUtRemoveReference (ReturnDesc);
702
    }
703
 
704
    /* Save return object on success */
705
 
706
    else
707
    {
708
        WalkState->ResultObj = ReturnDesc;
709
    }
710
 
711
    return_ACPI_STATUS (Status);
712
}
713