OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [acpi/] [dispatcher/] [dswexec.c] - Blame information for rev 67

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/******************************************************************************
2
 *
3
 * Module Name: dswexec - Dispatcher method execution callbacks;
4
 *                        dispatch to interpreter.
5
 *
6
 *****************************************************************************/
7
 
8
/*
9
 * Copyright (C) 2000 - 2007, R. Byron Moore
10
 * All rights reserved.
11
 *
12
 * Redistribution and use in source and binary forms, with or without
13
 * modification, are permitted provided that the following conditions
14
 * are met:
15
 * 1. Redistributions of source code must retain the above copyright
16
 *    notice, this list of conditions, and the following disclaimer,
17
 *    without modification.
18
 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
19
 *    substantially similar to the "NO WARRANTY" disclaimer below
20
 *    ("Disclaimer") and any redistribution must be conditioned upon
21
 *    including a substantially similar Disclaimer requirement for further
22
 *    binary redistribution.
23
 * 3. Neither the names of the above-listed copyright holders nor the names
24
 *    of any contributors may be used to endorse or promote products derived
25
 *    from this software without specific prior written permission.
26
 *
27
 * Alternatively, this software may be distributed under the terms of the
28
 * GNU General Public License ("GPL") version 2 as published by the Free
29
 * Software Foundation.
30
 *
31
 * NO WARRANTY
32
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
35
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
36
 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
37
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
38
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
41
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42
 * POSSIBILITY OF SUCH DAMAGES.
43
 */
44
 
45
#include <acpi/acpi.h>
46
#include <acpi/acparser.h>
47
#include <acpi/amlcode.h>
48
#include <acpi/acdispat.h>
49
#include <acpi/acinterp.h>
50
#include <acpi/acnamesp.h>
51
#include <acpi/acdebug.h>
52
 
53
#define _COMPONENT          ACPI_DISPATCHER
54
ACPI_MODULE_NAME("dswexec")
55
 
56
/*
57
 * Dispatch table for opcode classes
58
 */
59
static ACPI_EXECUTE_OP acpi_gbl_op_type_dispatch[] = {
60
        acpi_ex_opcode_0A_0T_1R,
61
        acpi_ex_opcode_1A_0T_0R,
62
        acpi_ex_opcode_1A_0T_1R,
63
        acpi_ex_opcode_1A_1T_0R,
64
        acpi_ex_opcode_1A_1T_1R,
65
        acpi_ex_opcode_2A_0T_0R,
66
        acpi_ex_opcode_2A_0T_1R,
67
        acpi_ex_opcode_2A_1T_1R,
68
        acpi_ex_opcode_2A_2T_1R,
69
        acpi_ex_opcode_3A_0T_0R,
70
        acpi_ex_opcode_3A_1T_1R,
71
        acpi_ex_opcode_6A_0T_1R
72
};
73
 
74
/*****************************************************************************
75
 *
76
 * FUNCTION:    acpi_ds_get_predicate_value
77
 *
78
 * PARAMETERS:  walk_state      - Current state of the parse tree walk
79
 *              result_obj      - if non-zero, pop result from result stack
80
 *
81
 * RETURN:      Status
82
 *
83
 * DESCRIPTION: Get the result of a predicate evaluation
84
 *
85
 ****************************************************************************/
86
 
87
acpi_status
88
acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state,
89
                            union acpi_operand_object *result_obj)
90
{
91
        acpi_status status = AE_OK;
92
        union acpi_operand_object *obj_desc;
93
        union acpi_operand_object *local_obj_desc = NULL;
94
 
95
        ACPI_FUNCTION_TRACE_PTR(ds_get_predicate_value, walk_state);
96
 
97
        walk_state->control_state->common.state = 0;
98
 
99
        if (result_obj) {
100
                status = acpi_ds_result_pop(&obj_desc, walk_state);
101
                if (ACPI_FAILURE(status)) {
102
                        ACPI_EXCEPTION((AE_INFO, status,
103
                                        "Could not get result from predicate evaluation"));
104
 
105
                        return_ACPI_STATUS(status);
106
                }
107
        } else {
108
                status = acpi_ds_create_operand(walk_state, walk_state->op, 0);
109
                if (ACPI_FAILURE(status)) {
110
                        return_ACPI_STATUS(status);
111
                }
112
 
113
                status =
114
                    acpi_ex_resolve_to_value(&walk_state->operands[0],
115
                                             walk_state);
116
                if (ACPI_FAILURE(status)) {
117
                        return_ACPI_STATUS(status);
118
                }
119
 
120
                obj_desc = walk_state->operands[0];
121
        }
122
 
123
        if (!obj_desc) {
124
                ACPI_ERROR((AE_INFO,
125
                            "No predicate ObjDesc=%p State=%p",
126
                            obj_desc, walk_state));
127
 
128
                return_ACPI_STATUS(AE_AML_NO_OPERAND);
129
        }
130
 
131
        /*
132
         * Result of predicate evaluation must be an Integer
133
         * object. Implicitly convert the argument if necessary.
134
         */
135
        status = acpi_ex_convert_to_integer(obj_desc, &local_obj_desc, 16);
136
        if (ACPI_FAILURE(status)) {
137
                goto cleanup;
138
        }
139
 
140
        if (ACPI_GET_OBJECT_TYPE(local_obj_desc) != ACPI_TYPE_INTEGER) {
141
                ACPI_ERROR((AE_INFO,
142
                            "Bad predicate (not an integer) ObjDesc=%p State=%p Type=%X",
143
                            obj_desc, walk_state,
144
                            ACPI_GET_OBJECT_TYPE(obj_desc)));
145
 
146
                status = AE_AML_OPERAND_TYPE;
147
                goto cleanup;
148
        }
149
 
150
        /* Truncate the predicate to 32-bits if necessary */
151
 
152
        acpi_ex_truncate_for32bit_table(local_obj_desc);
153
 
154
        /*
155
         * Save the result of the predicate evaluation on
156
         * the control stack
157
         */
158
        if (local_obj_desc->integer.value) {
159
                walk_state->control_state->common.value = TRUE;
160
        } else {
161
                /*
162
                 * Predicate is FALSE, we will just toss the
163
                 * rest of the package
164
                 */
165
                walk_state->control_state->common.value = FALSE;
166
                status = AE_CTRL_FALSE;
167
        }
168
 
169
      cleanup:
170
 
171
        ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Completed a predicate eval=%X Op=%p\n",
172
                          walk_state->control_state->common.value,
173
                          walk_state->op));
174
 
175
        /* Break to debugger to display result */
176
 
177
        ACPI_DEBUGGER_EXEC(acpi_db_display_result_object
178
                           (local_obj_desc, walk_state));
179
 
180
        /*
181
         * Delete the predicate result object (we know that
182
         * we don't need it anymore)
183
         */
184
        if (local_obj_desc != obj_desc) {
185
                acpi_ut_remove_reference(local_obj_desc);
186
        }
187
        acpi_ut_remove_reference(obj_desc);
188
 
189
        walk_state->control_state->common.state = ACPI_CONTROL_NORMAL;
190
        return_ACPI_STATUS(status);
191
}
192
 
193
/*****************************************************************************
194
 *
195
 * FUNCTION:    acpi_ds_exec_begin_op
196
 *
197
 * PARAMETERS:  walk_state      - Current state of the parse tree walk
198
 *              out_op          - Where to return op if a new one is created
199
 *
200
 * RETURN:      Status
201
 *
202
 * DESCRIPTION: Descending callback used during the execution of control
203
 *              methods.  This is where most operators and operands are
204
 *              dispatched to the interpreter.
205
 *
206
 ****************************************************************************/
207
 
208
acpi_status
209
acpi_ds_exec_begin_op(struct acpi_walk_state *walk_state,
210
                      union acpi_parse_object **out_op)
211
{
212
        union acpi_parse_object *op;
213
        acpi_status status = AE_OK;
214
        u32 opcode_class;
215
 
216
        ACPI_FUNCTION_TRACE_PTR(ds_exec_begin_op, walk_state);
217
 
218
        op = walk_state->op;
219
        if (!op) {
220
                status = acpi_ds_load2_begin_op(walk_state, out_op);
221
                if (ACPI_FAILURE(status)) {
222
                        goto error_exit;
223
                }
224
 
225
                op = *out_op;
226
                walk_state->op = op;
227
                walk_state->opcode = op->common.aml_opcode;
228
                walk_state->op_info =
229
                    acpi_ps_get_opcode_info(op->common.aml_opcode);
230
 
231
                if (acpi_ns_opens_scope(walk_state->op_info->object_type)) {
232
                        ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
233
                                          "(%s) Popping scope for Op %p\n",
234
                                          acpi_ut_get_type_name(walk_state->
235
                                                                op_info->
236
                                                                object_type),
237
                                          op));
238
 
239
                        status = acpi_ds_scope_stack_pop(walk_state);
240
                        if (ACPI_FAILURE(status)) {
241
                                goto error_exit;
242
                        }
243
                }
244
        }
245
 
246
        if (op == walk_state->origin) {
247
                if (out_op) {
248
                        *out_op = op;
249
                }
250
 
251
                return_ACPI_STATUS(AE_OK);
252
        }
253
 
254
        /*
255
         * If the previous opcode was a conditional, this opcode
256
         * must be the beginning of the associated predicate.
257
         * Save this knowledge in the current scope descriptor
258
         */
259
        if ((walk_state->control_state) &&
260
            (walk_state->control_state->common.state ==
261
             ACPI_CONTROL_CONDITIONAL_EXECUTING)) {
262
                ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
263
                                  "Exec predicate Op=%p State=%p\n", op,
264
                                  walk_state));
265
 
266
                walk_state->control_state->common.state =
267
                    ACPI_CONTROL_PREDICATE_EXECUTING;
268
 
269
                /* Save start of predicate */
270
 
271
                walk_state->control_state->control.predicate_op = op;
272
        }
273
 
274
        opcode_class = walk_state->op_info->class;
275
 
276
        /* We want to send namepaths to the load code */
277
 
278
        if (op->common.aml_opcode == AML_INT_NAMEPATH_OP) {
279
                opcode_class = AML_CLASS_NAMED_OBJECT;
280
        }
281
 
282
        /*
283
         * Handle the opcode based upon the opcode type
284
         */
285
        switch (opcode_class) {
286
        case AML_CLASS_CONTROL:
287
 
288
                status = acpi_ds_result_stack_push(walk_state);
289
                if (ACPI_FAILURE(status)) {
290
                        goto error_exit;
291
                }
292
 
293
                status = acpi_ds_exec_begin_control_op(walk_state, op);
294
                break;
295
 
296
        case AML_CLASS_NAMED_OBJECT:
297
 
298
                if (walk_state->walk_type & ACPI_WALK_METHOD) {
299
                        /*
300
                         * Found a named object declaration during method execution;
301
                         * we must enter this object into the namespace.  The created
302
                         * object is temporary and will be deleted upon completion of
303
                         * the execution of this method.
304
                         */
305
                        status = acpi_ds_load2_begin_op(walk_state, NULL);
306
                }
307
 
308
                if (op->common.aml_opcode == AML_REGION_OP) {
309
                        status = acpi_ds_result_stack_push(walk_state);
310
                }
311
                break;
312
 
313
        case AML_CLASS_EXECUTE:
314
        case AML_CLASS_CREATE:
315
                /*
316
                 * Most operators with arguments (except create_xxx_field operators)
317
                 * Start a new result/operand state
318
                 */
319
                if (walk_state->op_info->object_type != ACPI_TYPE_BUFFER_FIELD) {
320
                        status = acpi_ds_result_stack_push(walk_state);
321
                }
322
                break;
323
 
324
        default:
325
                break;
326
        }
327
 
328
        /* Nothing to do here during method execution */
329
 
330
        return_ACPI_STATUS(status);
331
 
332
      error_exit:
333
        status = acpi_ds_method_error(status, walk_state);
334
        return_ACPI_STATUS(status);
335
}
336
 
337
/*****************************************************************************
338
 *
339
 * FUNCTION:    acpi_ds_exec_end_op
340
 *
341
 * PARAMETERS:  walk_state      - Current state of the parse tree walk
342
 *
343
 * RETURN:      Status
344
 *
345
 * DESCRIPTION: Ascending callback used during the execution of control
346
 *              methods.  The only thing we really need to do here is to
347
 *              notice the beginning of IF, ELSE, and WHILE blocks.
348
 *
349
 ****************************************************************************/
350
 
351
acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
352
{
353
        union acpi_parse_object *op;
354
        acpi_status status = AE_OK;
355
        u32 op_type;
356
        u32 op_class;
357
        union acpi_parse_object *next_op;
358
        union acpi_parse_object *first_arg;
359
 
360
        ACPI_FUNCTION_TRACE_PTR(ds_exec_end_op, walk_state);
361
 
362
        op = walk_state->op;
363
        op_type = walk_state->op_info->type;
364
        op_class = walk_state->op_info->class;
365
 
366
        if (op_class == AML_CLASS_UNKNOWN) {
367
                ACPI_ERROR((AE_INFO, "Unknown opcode %X",
368
                            op->common.aml_opcode));
369
                return_ACPI_STATUS(AE_NOT_IMPLEMENTED);
370
        }
371
 
372
        first_arg = op->common.value.arg;
373
 
374
        /* Init the walk state */
375
 
376
        walk_state->num_operands = 0;
377
        walk_state->return_desc = NULL;
378
        walk_state->result_obj = NULL;
379
 
380
        /* Call debugger for single step support (DEBUG build only) */
381
 
382
        ACPI_DEBUGGER_EXEC(status =
383
                           acpi_db_single_step(walk_state, op, op_class));
384
        ACPI_DEBUGGER_EXEC(if (ACPI_FAILURE(status)) {
385
                           return_ACPI_STATUS(status);}
386
        ) ;
387
 
388
        /* Decode the Opcode Class */
389
 
390
        switch (op_class) {
391
        case AML_CLASS_ARGUMENT:        /* constants, literals, etc. - do nothing */
392
                break;
393
 
394
        case AML_CLASS_EXECUTE: /* most operators with arguments */
395
 
396
                /* Build resolved operand stack */
397
 
398
                status = acpi_ds_create_operands(walk_state, first_arg);
399
                if (ACPI_FAILURE(status)) {
400
                        goto cleanup;
401
                }
402
 
403
                /* Done with this result state (Now that operand stack is built) */
404
 
405
                status = acpi_ds_result_stack_pop(walk_state);
406
                if (ACPI_FAILURE(status)) {
407
                        goto cleanup;
408
                }
409
 
410
                /*
411
                 * All opcodes require operand resolution, with the only exceptions
412
                 * being the object_type and size_of operators.
413
                 */
414
                if (!(walk_state->op_info->flags & AML_NO_OPERAND_RESOLVE)) {
415
 
416
                        /* Resolve all operands */
417
 
418
                        status = acpi_ex_resolve_operands(walk_state->opcode,
419
                                                          &(walk_state->
420
                                                            operands
421
                                                            [walk_state->
422
                                                             num_operands - 1]),
423
                                                          walk_state);
424
                        if (ACPI_SUCCESS(status)) {
425
                                ACPI_DUMP_OPERANDS(ACPI_WALK_OPERANDS,
426
                                                   ACPI_IMODE_EXECUTE,
427
                                                   acpi_ps_get_opcode_name
428
                                                   (walk_state->opcode),
429
                                                   walk_state->num_operands,
430
                                                   "after ExResolveOperands");
431
                        }
432
                }
433
 
434
                if (ACPI_SUCCESS(status)) {
435
                        /*
436
                         * Dispatch the request to the appropriate interpreter handler
437
                         * routine.  There is one routine per opcode "type" based upon the
438
                         * number of opcode arguments and return type.
439
                         */
440
                        status =
441
                            acpi_gbl_op_type_dispatch[op_type] (walk_state);
442
                } else {
443
                        /*
444
                         * Treat constructs of the form "Store(LocalX,LocalX)" as noops when the
445
                         * Local is uninitialized.
446
                         */
447
                        if ((status == AE_AML_UNINITIALIZED_LOCAL) &&
448
                            (walk_state->opcode == AML_STORE_OP) &&
449
                            (walk_state->operands[0]->common.type ==
450
                             ACPI_TYPE_LOCAL_REFERENCE)
451
                            && (walk_state->operands[1]->common.type ==
452
                                ACPI_TYPE_LOCAL_REFERENCE)
453
                            && (walk_state->operands[0]->reference.opcode ==
454
                                walk_state->operands[1]->reference.opcode)
455
                            && (walk_state->operands[0]->reference.offset ==
456
                                walk_state->operands[1]->reference.offset)) {
457
                                status = AE_OK;
458
                        } else {
459
                                ACPI_EXCEPTION((AE_INFO, status,
460
                                                "While resolving operands for [%s]",
461
                                                acpi_ps_get_opcode_name
462
                                                (walk_state->opcode)));
463
                        }
464
                }
465
 
466
                /* Always delete the argument objects and clear the operand stack */
467
 
468
                acpi_ds_clear_operands(walk_state);
469
 
470
                /*
471
                 * If a result object was returned from above, push it on the
472
                 * current result stack
473
                 */
474
                if (ACPI_SUCCESS(status) && walk_state->result_obj) {
475
                        status =
476
                            acpi_ds_result_push(walk_state->result_obj,
477
                                                walk_state);
478
                }
479
                break;
480
 
481
        default:
482
 
483
                switch (op_type) {
484
                case AML_TYPE_CONTROL:  /* Type 1 opcode, IF/ELSE/WHILE/NOOP */
485
 
486
                        /* 1 Operand, 0 external_result, 0 internal_result */
487
 
488
                        status = acpi_ds_exec_end_control_op(walk_state, op);
489
 
490
                        /* Make sure to properly pop the result stack */
491
 
492
                        if (ACPI_SUCCESS(status)) {
493
                                status = acpi_ds_result_stack_pop(walk_state);
494
                        } else if (status == AE_CTRL_PENDING) {
495
                                status = acpi_ds_result_stack_pop(walk_state);
496
                                if (ACPI_SUCCESS(status)) {
497
                                        status = AE_CTRL_PENDING;
498
                                }
499
                        }
500
                        break;
501
 
502
                case AML_TYPE_METHOD_CALL:
503
 
504
                        /*
505
                         * If the method is referenced from within a package
506
                         * declaration, it is not a invocation of the method, just
507
                         * a reference to it.
508
                         */
509
                        if ((op->asl.parent) &&
510
                            ((op->asl.parent->asl.aml_opcode == AML_PACKAGE_OP)
511
                             || (op->asl.parent->asl.aml_opcode ==
512
                                 AML_VAR_PACKAGE_OP))) {
513
                                ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
514
                                                  "Method Reference in a Package, Op=%p\n",
515
                                                  op));
516
 
517
                                op->common.node =
518
                                    (struct acpi_namespace_node *)op->asl.value.
519
                                    arg->asl.node->object;
520
                                acpi_ut_add_reference(op->asl.value.arg->asl.
521
                                                      node->object);
522
                                return_ACPI_STATUS(AE_OK);
523
                        }
524
 
525
                        ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
526
                                          "Method invocation, Op=%p\n", op));
527
 
528
                        /*
529
                         * (AML_METHODCALL) Op->Asl.Value.Arg->Asl.Node contains
530
                         * the method Node pointer
531
                         */
532
                        /* next_op points to the op that holds the method name */
533
 
534
                        next_op = first_arg;
535
 
536
                        /* next_op points to first argument op */
537
 
538
                        next_op = next_op->common.next;
539
 
540
                        /*
541
                         * Get the method's arguments and put them on the operand stack
542
                         */
543
                        status = acpi_ds_create_operands(walk_state, next_op);
544
                        if (ACPI_FAILURE(status)) {
545
                                break;
546
                        }
547
 
548
                        /*
549
                         * Since the operands will be passed to another control method,
550
                         * we must resolve all local references here (Local variables,
551
                         * arguments to *this* method, etc.)
552
                         */
553
                        status = acpi_ds_resolve_operands(walk_state);
554
                        if (ACPI_FAILURE(status)) {
555
 
556
                                /* On error, clear all resolved operands */
557
 
558
                                acpi_ds_clear_operands(walk_state);
559
                                break;
560
                        }
561
 
562
                        /*
563
                         * Tell the walk loop to preempt this running method and
564
                         * execute the new method
565
                         */
566
                        status = AE_CTRL_TRANSFER;
567
 
568
                        /*
569
                         * Return now; we don't want to disturb anything,
570
                         * especially the operand count!
571
                         */
572
                        return_ACPI_STATUS(status);
573
 
574
                case AML_TYPE_CREATE_FIELD:
575
 
576
                        ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
577
                                          "Executing CreateField Buffer/Index Op=%p\n",
578
                                          op));
579
 
580
                        status = acpi_ds_load2_end_op(walk_state);
581
                        if (ACPI_FAILURE(status)) {
582
                                break;
583
                        }
584
 
585
                        status =
586
                            acpi_ds_eval_buffer_field_operands(walk_state, op);
587
                        break;
588
 
589
                case AML_TYPE_CREATE_OBJECT:
590
 
591
                        ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
592
                                          "Executing CreateObject (Buffer/Package) Op=%p\n",
593
                                          op));
594
 
595
                        switch (op->common.parent->common.aml_opcode) {
596
                        case AML_NAME_OP:
597
 
598
                                /*
599
                                 * Put the Node on the object stack (Contains the ACPI Name
600
                                 * of this object)
601
                                 */
602
                                walk_state->operands[0] =
603
                                    (void *)op->common.parent->common.node;
604
                                walk_state->num_operands = 1;
605
 
606
                                status = acpi_ds_create_node(walk_state,
607
                                                             op->common.parent->
608
                                                             common.node,
609
                                                             op->common.parent);
610
                                if (ACPI_FAILURE(status)) {
611
                                        break;
612
                                }
613
 
614
                                /* Fall through */
615
                                /*lint -fallthrough */
616
 
617
                        case AML_INT_EVAL_SUBTREE_OP:
618
 
619
                                status =
620
                                    acpi_ds_eval_data_object_operands
621
                                    (walk_state, op,
622
                                     acpi_ns_get_attached_object(op->common.
623
                                                                 parent->common.
624
                                                                 node));
625
                                break;
626
 
627
                        default:
628
 
629
                                status =
630
                                    acpi_ds_eval_data_object_operands
631
                                    (walk_state, op, NULL);
632
                                break;
633
                        }
634
 
635
                        /* Done with result state (Now that operand stack is built) */
636
 
637
                        status = acpi_ds_result_stack_pop(walk_state);
638
                        if (ACPI_FAILURE(status)) {
639
                                goto cleanup;
640
                        }
641
 
642
                        /*
643
                         * If a result object was returned from above, push it on the
644
                         * current result stack
645
                         */
646
                        if (walk_state->result_obj) {
647
                                status =
648
                                    acpi_ds_result_push(walk_state->result_obj,
649
                                                        walk_state);
650
                        }
651
                        break;
652
 
653
                case AML_TYPE_NAMED_FIELD:
654
                case AML_TYPE_NAMED_COMPLEX:
655
                case AML_TYPE_NAMED_SIMPLE:
656
                case AML_TYPE_NAMED_NO_OBJ:
657
 
658
                        status = acpi_ds_load2_end_op(walk_state);
659
                        if (ACPI_FAILURE(status)) {
660
                                break;
661
                        }
662
 
663
                        if (op->common.aml_opcode == AML_REGION_OP) {
664
                                ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
665
                                                  "Executing OpRegion Address/Length Op=%p\n",
666
                                                  op));
667
 
668
                                status =
669
                                    acpi_ds_eval_region_operands(walk_state,
670
                                                                 op);
671
                                if (ACPI_FAILURE(status)) {
672
                                        break;
673
                                }
674
 
675
                                status = acpi_ds_result_stack_pop(walk_state);
676
                        }
677
                        break;
678
 
679
                case AML_TYPE_UNDEFINED:
680
 
681
                        ACPI_ERROR((AE_INFO,
682
                                    "Undefined opcode type Op=%p", op));
683
                        return_ACPI_STATUS(AE_NOT_IMPLEMENTED);
684
 
685
                case AML_TYPE_BOGUS:
686
 
687
                        ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
688
                                          "Internal opcode=%X type Op=%p\n",
689
                                          walk_state->opcode, op));
690
                        break;
691
 
692
                default:
693
 
694
                        ACPI_ERROR((AE_INFO,
695
                                    "Unimplemented opcode, class=%X type=%X Opcode=%X Op=%p",
696
                                    op_class, op_type, op->common.aml_opcode,
697
                                    op));
698
 
699
                        status = AE_NOT_IMPLEMENTED;
700
                        break;
701
                }
702
        }
703
 
704
        /*
705
         * ACPI 2.0 support for 64-bit integers: Truncate numeric
706
         * result value if we are executing from a 32-bit ACPI table
707
         */
708
        acpi_ex_truncate_for32bit_table(walk_state->result_obj);
709
 
710
        /*
711
         * Check if we just completed the evaluation of a
712
         * conditional predicate
713
         */
714
        if ((ACPI_SUCCESS(status)) &&
715
            (walk_state->control_state) &&
716
            (walk_state->control_state->common.state ==
717
             ACPI_CONTROL_PREDICATE_EXECUTING) &&
718
            (walk_state->control_state->control.predicate_op == op)) {
719
                status =
720
                    acpi_ds_get_predicate_value(walk_state,
721
                                                walk_state->result_obj);
722
                walk_state->result_obj = NULL;
723
        }
724
 
725
      cleanup:
726
 
727
        if (walk_state->result_obj) {
728
 
729
                /* Break to debugger to display result */
730
 
731
                ACPI_DEBUGGER_EXEC(acpi_db_display_result_object
732
                                   (walk_state->result_obj, walk_state));
733
 
734
                /*
735
                 * Delete the result op if and only if:
736
                 * Parent will not use the result -- such as any
737
                 * non-nested type2 op in a method (parent will be method)
738
                 */
739
                acpi_ds_delete_result_if_not_used(op, walk_state->result_obj,
740
                                                  walk_state);
741
        }
742
#ifdef _UNDER_DEVELOPMENT
743
 
744
        if (walk_state->parser_state.aml == walk_state->parser_state.aml_end) {
745
                acpi_db_method_end(walk_state);
746
        }
747
#endif
748
 
749
        /* Invoke exception handler on error */
750
 
751
        if (ACPI_FAILURE(status)) {
752
                status = acpi_ds_method_error(status, walk_state);
753
        }
754
 
755
        /* Always clear the object stack */
756
 
757
        walk_state->num_operands = 0;
758
        return_ACPI_STATUS(status);
759
}

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.