ACPICA 20050408 from Bob Moore
[deliverable/linux.git] / drivers / acpi / dispatcher / dsutils.c
1 /*******************************************************************************
2 *
3 * Module Name: dsutils - Dispatcher utilities
4 *
5 ******************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2005, R. Byron Moore
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions, and the following disclaimer,
16 * without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 * substantially similar to the "NO WARRANTY" disclaimer below
19 * ("Disclaimer") and any redistribution must be conditioned upon
20 * including a substantially similar Disclaimer requirement for further
21 * binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 * of any contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
25 *
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
29 *
30 * NO WARRANTY
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
42 */
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 ("dsutils")
55
56
57 /*******************************************************************************
58 *
59 * FUNCTION: acpi_ds_clear_implicit_return
60 *
61 * PARAMETERS: walk_state - Current State
62 *
63 * RETURN: None.
64 *
65 * DESCRIPTION: Clear and remove a reference on an implicit return value. Used
66 * to delete "stale" return values (if enabled, the return value
67 * from every operator is saved at least momentarily, in case the
68 * parent method exits.)
69 *
70 ******************************************************************************/
71
72 void
73 acpi_ds_clear_implicit_return (
74 struct acpi_walk_state *walk_state)
75 {
76 ACPI_FUNCTION_NAME ("ds_clear_implicit_return");
77
78
79 /*
80 * Slack must be enabled for this feature
81 */
82 if (!acpi_gbl_enable_interpreter_slack) {
83 return;
84 }
85
86 if (walk_state->implicit_return_obj) {
87 /*
88 * Delete any "stale" implicit return. However, in
89 * complex statements, the implicit return value can be
90 * bubbled up several levels.
91 */
92 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
93 "Removing reference on stale implicit return obj %p\n",
94 walk_state->implicit_return_obj));
95
96 acpi_ut_remove_reference (walk_state->implicit_return_obj);
97 walk_state->implicit_return_obj = NULL;
98 }
99 }
100
101
102 #ifndef ACPI_NO_METHOD_EXECUTION
103 /*******************************************************************************
104 *
105 * FUNCTION: acpi_ds_do_implicit_return
106 *
107 * PARAMETERS: return_desc - The return value
108 * walk_state - Current State
109 * add_reference - True if a reference should be added to the
110 * return object
111 *
112 * RETURN: TRUE if implicit return enabled, FALSE otherwise
113 *
114 * DESCRIPTION: Implements the optional "implicit return". We save the result
115 * of every ASL operator and control method invocation in case the
116 * parent method exit. Before storing a new return value, we
117 * delete the previous return value.
118 *
119 ******************************************************************************/
120
121 u8
122 acpi_ds_do_implicit_return (
123 union acpi_operand_object *return_desc,
124 struct acpi_walk_state *walk_state,
125 u8 add_reference)
126 {
127 ACPI_FUNCTION_NAME ("ds_do_implicit_return");
128
129
130 /*
131 * Slack must be enabled for this feature, and we must
132 * have a valid return object
133 */
134 if ((!acpi_gbl_enable_interpreter_slack) ||
135 (!return_desc)) {
136 return (FALSE);
137 }
138
139 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
140 "Result %p will be implicitly returned; Prev=%p\n",
141 return_desc,
142 walk_state->implicit_return_obj));
143
144 /*
145 * Delete any "stale" implicit return value first. However, in
146 * complex statements, the implicit return value can be
147 * bubbled up several levels, so we don't clear the value if it
148 * is the same as the return_desc.
149 */
150 if (walk_state->implicit_return_obj) {
151 if (walk_state->implicit_return_obj == return_desc) {
152 return (TRUE);
153 }
154 acpi_ds_clear_implicit_return (walk_state);
155 }
156
157 /* Save the implicit return value, add a reference if requested */
158
159 walk_state->implicit_return_obj = return_desc;
160 if (add_reference) {
161 acpi_ut_add_reference (return_desc);
162 }
163
164 return (TRUE);
165 }
166
167
168 /*******************************************************************************
169 *
170 * FUNCTION: acpi_ds_is_result_used
171 *
172 * PARAMETERS: Op - Current Op
173 * walk_state - Current State
174 *
175 * RETURN: TRUE if result is used, FALSE otherwise
176 *
177 * DESCRIPTION: Check if a result object will be used by the parent
178 *
179 ******************************************************************************/
180
181 u8
182 acpi_ds_is_result_used (
183 union acpi_parse_object *op,
184 struct acpi_walk_state *walk_state)
185 {
186 const struct acpi_opcode_info *parent_info;
187
188 ACPI_FUNCTION_TRACE_PTR ("ds_is_result_used", op);
189
190
191 /* Must have both an Op and a Result Object */
192
193 if (!op) {
194 ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Null Op\n"));
195 return_VALUE (TRUE);
196 }
197
198 /*
199 * We know that this operator is not a
200 * Return() operator (would not come here.) The following code is the
201 * optional support for a so-called "implicit return". Some AML code
202 * assumes that the last value of the method is "implicitly" returned
203 * to the caller. Just save the last result as the return value.
204 * NOTE: this is optional because the ASL language does not actually
205 * support this behavior.
206 */
207 (void) acpi_ds_do_implicit_return (walk_state->result_obj, walk_state, TRUE);
208
209 /*
210 * Now determine if the parent will use the result
211 *
212 * If there is no parent, or the parent is a scope_op, we are executing
213 * at the method level. An executing method typically has no parent,
214 * since each method is parsed separately. A method invoked externally
215 * via execute_control_method has a scope_op as the parent.
216 */
217 if ((!op->common.parent) ||
218 (op->common.parent->common.aml_opcode == AML_SCOPE_OP)) {
219 /* No parent, the return value cannot possibly be used */
220
221 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
222 "At Method level, result of [%s] not used\n",
223 acpi_ps_get_opcode_name (op->common.aml_opcode)));
224 return_VALUE (FALSE);
225 }
226
227 /* Get info on the parent. The root_op is AML_SCOPE */
228
229 parent_info = acpi_ps_get_opcode_info (op->common.parent->common.aml_opcode);
230 if (parent_info->class == AML_CLASS_UNKNOWN) {
231 ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
232 "Unknown parent opcode. Op=%p\n", op));
233 return_VALUE (FALSE);
234 }
235
236 /*
237 * Decide what to do with the result based on the parent. If
238 * the parent opcode will not use the result, delete the object.
239 * Otherwise leave it as is, it will be deleted when it is used
240 * as an operand later.
241 */
242 switch (parent_info->class) {
243 case AML_CLASS_CONTROL:
244
245 switch (op->common.parent->common.aml_opcode) {
246 case AML_RETURN_OP:
247
248 /* Never delete the return value associated with a return opcode */
249
250 goto result_used;
251
252 case AML_IF_OP:
253 case AML_WHILE_OP:
254
255 /*
256 * If we are executing the predicate AND this is the predicate op,
257 * we will use the return value
258 */
259 if ((walk_state->control_state->common.state == ACPI_CONTROL_PREDICATE_EXECUTING) &&
260 (walk_state->control_state->control.predicate_op == op)) {
261 goto result_used;
262 }
263 break;
264
265 default:
266 /* Ignore other control opcodes */
267 break;
268 }
269
270 /* The general control opcode returns no result */
271
272 goto result_not_used;
273
274
275 case AML_CLASS_CREATE:
276
277 /*
278 * These opcodes allow term_arg(s) as operands and therefore
279 * the operands can be method calls. The result is used.
280 */
281 goto result_used;
282
283
284 case AML_CLASS_NAMED_OBJECT:
285
286 if ((op->common.parent->common.aml_opcode == AML_REGION_OP) ||
287 (op->common.parent->common.aml_opcode == AML_DATA_REGION_OP) ||
288 (op->common.parent->common.aml_opcode == AML_PACKAGE_OP) ||
289 (op->common.parent->common.aml_opcode == AML_VAR_PACKAGE_OP) ||
290 (op->common.parent->common.aml_opcode == AML_BUFFER_OP) ||
291 (op->common.parent->common.aml_opcode == AML_INT_EVAL_SUBTREE_OP)) {
292 /*
293 * These opcodes allow term_arg(s) as operands and therefore
294 * the operands can be method calls. The result is used.
295 */
296 goto result_used;
297 }
298
299 goto result_not_used;
300
301
302 default:
303
304 /*
305 * In all other cases. the parent will actually use the return
306 * object, so keep it.
307 */
308 goto result_used;
309 }
310
311
312 result_used:
313 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
314 "Result of [%s] used by Parent [%s] Op=%p\n",
315 acpi_ps_get_opcode_name (op->common.aml_opcode),
316 acpi_ps_get_opcode_name (op->common.parent->common.aml_opcode), op));
317
318 return_VALUE (TRUE);
319
320
321 result_not_used:
322 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
323 "Result of [%s] not used by Parent [%s] Op=%p\n",
324 acpi_ps_get_opcode_name (op->common.aml_opcode),
325 acpi_ps_get_opcode_name (op->common.parent->common.aml_opcode), op));
326
327 return_VALUE (FALSE);
328 }
329
330
331 /*******************************************************************************
332 *
333 * FUNCTION: acpi_ds_delete_result_if_not_used
334 *
335 * PARAMETERS: Op - Current parse Op
336 * result_obj - Result of the operation
337 * walk_state - Current state
338 *
339 * RETURN: Status
340 *
341 * DESCRIPTION: Used after interpretation of an opcode. If there is an internal
342 * result descriptor, check if the parent opcode will actually use
343 * this result. If not, delete the result now so that it will
344 * not become orphaned.
345 *
346 ******************************************************************************/
347
348 void
349 acpi_ds_delete_result_if_not_used (
350 union acpi_parse_object *op,
351 union acpi_operand_object *result_obj,
352 struct acpi_walk_state *walk_state)
353 {
354 union acpi_operand_object *obj_desc;
355 acpi_status status;
356
357
358 ACPI_FUNCTION_TRACE_PTR ("ds_delete_result_if_not_used", result_obj);
359
360
361 if (!op) {
362 ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Null Op\n"));
363 return_VOID;
364 }
365
366 if (!result_obj) {
367 return_VOID;
368 }
369
370 if (!acpi_ds_is_result_used (op, walk_state)) {
371 /* Must pop the result stack (obj_desc should be equal to result_obj) */
372
373 status = acpi_ds_result_pop (&obj_desc, walk_state);
374 if (ACPI_SUCCESS (status)) {
375 acpi_ut_remove_reference (result_obj);
376 }
377 }
378
379 return_VOID;
380 }
381
382
383 /*******************************************************************************
384 *
385 * FUNCTION: acpi_ds_resolve_operands
386 *
387 * PARAMETERS: walk_state - Current walk state with operands on stack
388 *
389 * RETURN: Status
390 *
391 * DESCRIPTION: Resolve all operands to their values. Used to prepare
392 * arguments to a control method invocation (a call from one
393 * method to another.)
394 *
395 ******************************************************************************/
396
397 acpi_status
398 acpi_ds_resolve_operands (
399 struct acpi_walk_state *walk_state)
400 {
401 u32 i;
402 acpi_status status = AE_OK;
403
404
405 ACPI_FUNCTION_TRACE_PTR ("ds_resolve_operands", walk_state);
406
407
408 /*
409 * Attempt to resolve each of the valid operands
410 * Method arguments are passed by reference, not by value. This means
411 * that the actual objects are passed, not copies of the objects.
412 */
413 for (i = 0; i < walk_state->num_operands; i++) {
414 status = acpi_ex_resolve_to_value (&walk_state->operands[i], walk_state);
415 if (ACPI_FAILURE (status)) {
416 break;
417 }
418 }
419
420 return_ACPI_STATUS (status);
421 }
422
423
424 /*******************************************************************************
425 *
426 * FUNCTION: acpi_ds_clear_operands
427 *
428 * PARAMETERS: walk_state - Current walk state with operands on stack
429 *
430 * RETURN: None
431 *
432 * DESCRIPTION: Clear all operands on the current walk state operand stack.
433 *
434 ******************************************************************************/
435
436 void
437 acpi_ds_clear_operands (
438 struct acpi_walk_state *walk_state)
439 {
440 u32 i;
441
442
443 ACPI_FUNCTION_TRACE_PTR ("ds_clear_operands", walk_state);
444
445
446 /* Remove a reference on each operand on the stack */
447
448 for (i = 0; i < walk_state->num_operands; i++) {
449 /*
450 * Remove a reference to all operands, including both
451 * "Arguments" and "Targets".
452 */
453 acpi_ut_remove_reference (walk_state->operands[i]);
454 walk_state->operands[i] = NULL;
455 }
456
457 walk_state->num_operands = 0;
458 return_VOID;
459 }
460 #endif
461
462
463 /*******************************************************************************
464 *
465 * FUNCTION: acpi_ds_create_operand
466 *
467 * PARAMETERS: walk_state - Current walk state
468 * Arg - Parse object for the argument
469 * arg_index - Which argument (zero based)
470 *
471 * RETURN: Status
472 *
473 * DESCRIPTION: Translate a parse tree object that is an argument to an AML
474 * opcode to the equivalent interpreter object. This may include
475 * looking up a name or entering a new name into the internal
476 * namespace.
477 *
478 ******************************************************************************/
479
480 acpi_status
481 acpi_ds_create_operand (
482 struct acpi_walk_state *walk_state,
483 union acpi_parse_object *arg,
484 u32 arg_index)
485 {
486 acpi_status status = AE_OK;
487 char *name_string;
488 u32 name_length;
489 union acpi_operand_object *obj_desc;
490 union acpi_parse_object *parent_op;
491 u16 opcode;
492 acpi_interpreter_mode interpreter_mode;
493 const struct acpi_opcode_info *op_info;
494
495
496 ACPI_FUNCTION_TRACE_PTR ("ds_create_operand", arg);
497
498
499 /* A valid name must be looked up in the namespace */
500
501 if ((arg->common.aml_opcode == AML_INT_NAMEPATH_OP) &&
502 (arg->common.value.string)) {
503 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Getting a name: Arg=%p\n", arg));
504
505 /* Get the entire name string from the AML stream */
506
507 status = acpi_ex_get_name_string (ACPI_TYPE_ANY, arg->common.value.buffer,
508 &name_string, &name_length);
509
510 if (ACPI_FAILURE (status)) {
511 return_ACPI_STATUS (status);
512 }
513
514 /* All prefixes have been handled, and the name is in name_string */
515
516 /*
517 * Special handling for buffer_field declarations. This is a deferred
518 * opcode that unfortunately defines the field name as the last
519 * parameter instead of the first. We get here when we are performing
520 * the deferred execution, so the actual name of the field is already
521 * in the namespace. We don't want to attempt to look it up again
522 * because we may be executing in a different scope than where the
523 * actual opcode exists.
524 */
525 if ((walk_state->deferred_node) &&
526 (walk_state->deferred_node->type == ACPI_TYPE_BUFFER_FIELD) &&
527 (arg_index != 0)) {
528 obj_desc = ACPI_CAST_PTR (
529 union acpi_operand_object, walk_state->deferred_node);
530 status = AE_OK;
531 }
532 else /* All other opcodes */ {
533 /*
534 * Differentiate between a namespace "create" operation
535 * versus a "lookup" operation (IMODE_LOAD_PASS2 vs.
536 * IMODE_EXECUTE) in order to support the creation of
537 * namespace objects during the execution of control methods.
538 */
539 parent_op = arg->common.parent;
540 op_info = acpi_ps_get_opcode_info (parent_op->common.aml_opcode);
541 if ((op_info->flags & AML_NSNODE) &&
542 (parent_op->common.aml_opcode != AML_INT_METHODCALL_OP) &&
543 (parent_op->common.aml_opcode != AML_REGION_OP) &&
544 (parent_op->common.aml_opcode != AML_INT_NAMEPATH_OP)) {
545 /* Enter name into namespace if not found */
546
547 interpreter_mode = ACPI_IMODE_LOAD_PASS2;
548 }
549 else {
550 /* Return a failure if name not found */
551
552 interpreter_mode = ACPI_IMODE_EXECUTE;
553 }
554
555 status = acpi_ns_lookup (walk_state->scope_info, name_string,
556 ACPI_TYPE_ANY, interpreter_mode,
557 ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
558 walk_state,
559 ACPI_CAST_INDIRECT_PTR (struct acpi_namespace_node, &obj_desc));
560 /*
561 * The only case where we pass through (ignore) a NOT_FOUND
562 * error is for the cond_ref_of opcode.
563 */
564 if (status == AE_NOT_FOUND) {
565 if (parent_op->common.aml_opcode == AML_COND_REF_OF_OP) {
566 /*
567 * For the Conditional Reference op, it's OK if
568 * the name is not found; We just need a way to
569 * indicate this to the interpreter, set the
570 * object to the root
571 */
572 obj_desc = ACPI_CAST_PTR (
573 union acpi_operand_object, acpi_gbl_root_node);
574 status = AE_OK;
575 }
576 else {
577 /*
578 * We just plain didn't find it -- which is a
579 * very serious error at this point
580 */
581 status = AE_AML_NAME_NOT_FOUND;
582 }
583 }
584
585 if (ACPI_FAILURE (status)) {
586 ACPI_REPORT_NSERROR (name_string, status);
587 }
588 }
589
590 /* Free the namestring created above */
591
592 ACPI_MEM_FREE (name_string);
593
594 /* Check status from the lookup */
595
596 if (ACPI_FAILURE (status)) {
597 return_ACPI_STATUS (status);
598 }
599
600 /* Put the resulting object onto the current object stack */
601
602 status = acpi_ds_obj_stack_push (obj_desc, walk_state);
603 if (ACPI_FAILURE (status)) {
604 return_ACPI_STATUS (status);
605 }
606 ACPI_DEBUGGER_EXEC (acpi_db_display_argument_object (obj_desc, walk_state));
607 }
608 else {
609 /* Check for null name case */
610
611 if (arg->common.aml_opcode == AML_INT_NAMEPATH_OP) {
612 /*
613 * If the name is null, this means that this is an
614 * optional result parameter that was not specified
615 * in the original ASL. Create a Zero Constant for a
616 * placeholder. (Store to a constant is a Noop.)
617 */
618 opcode = AML_ZERO_OP; /* Has no arguments! */
619
620 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
621 "Null namepath: Arg=%p\n", arg));
622 }
623 else {
624 opcode = arg->common.aml_opcode;
625 }
626
627 /* Get the object type of the argument */
628
629 op_info = acpi_ps_get_opcode_info (opcode);
630 if (op_info->object_type == ACPI_TYPE_INVALID) {
631 return_ACPI_STATUS (AE_NOT_IMPLEMENTED);
632 }
633
634 if (op_info->flags & AML_HAS_RETVAL) {
635 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
636 "Argument previously created, already stacked \n"));
637
638 ACPI_DEBUGGER_EXEC (acpi_db_display_argument_object (
639 walk_state->operands [walk_state->num_operands - 1], walk_state));
640
641 /*
642 * Use value that was already previously returned
643 * by the evaluation of this argument
644 */
645 status = acpi_ds_result_pop_from_bottom (&obj_desc, walk_state);
646 if (ACPI_FAILURE (status)) {
647 /*
648 * Only error is underflow, and this indicates
649 * a missing or null operand!
650 */
651 ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
652 "Missing or null operand, %s\n",
653 acpi_format_exception (status)));
654 return_ACPI_STATUS (status);
655 }
656 }
657 else {
658 /* Create an ACPI_INTERNAL_OBJECT for the argument */
659
660 obj_desc = acpi_ut_create_internal_object (op_info->object_type);
661 if (!obj_desc) {
662 return_ACPI_STATUS (AE_NO_MEMORY);
663 }
664
665 /* Initialize the new object */
666
667 status = acpi_ds_init_object_from_op (
668 walk_state, arg, opcode, &obj_desc);
669 if (ACPI_FAILURE (status)) {
670 acpi_ut_delete_object_desc (obj_desc);
671 return_ACPI_STATUS (status);
672 }
673 }
674
675 /* Put the operand object on the object stack */
676
677 status = acpi_ds_obj_stack_push (obj_desc, walk_state);
678 if (ACPI_FAILURE (status)) {
679 return_ACPI_STATUS (status);
680 }
681
682 ACPI_DEBUGGER_EXEC (acpi_db_display_argument_object (obj_desc, walk_state));
683 }
684
685 return_ACPI_STATUS (AE_OK);
686 }
687
688
689 /*******************************************************************************
690 *
691 * FUNCTION: acpi_ds_create_operands
692 *
693 * PARAMETERS: walk_state - Current state
694 * first_arg - First argument of a parser argument tree
695 *
696 * RETURN: Status
697 *
698 * DESCRIPTION: Convert an operator's arguments from a parse tree format to
699 * namespace objects and place those argument object on the object
700 * stack in preparation for evaluation by the interpreter.
701 *
702 ******************************************************************************/
703
704 acpi_status
705 acpi_ds_create_operands (
706 struct acpi_walk_state *walk_state,
707 union acpi_parse_object *first_arg)
708 {
709 acpi_status status = AE_OK;
710 union acpi_parse_object *arg;
711 u32 arg_count = 0;
712
713
714 ACPI_FUNCTION_TRACE_PTR ("ds_create_operands", first_arg);
715
716
717 /* For all arguments in the list... */
718
719 arg = first_arg;
720 while (arg) {
721 status = acpi_ds_create_operand (walk_state, arg, arg_count);
722 if (ACPI_FAILURE (status)) {
723 goto cleanup;
724 }
725
726 ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Arg #%d (%p) done, Arg1=%p\n",
727 arg_count, arg, first_arg));
728
729 /* Move on to next argument, if any */
730
731 arg = arg->common.next;
732 arg_count++;
733 }
734
735 return_ACPI_STATUS (status);
736
737
738 cleanup:
739 /*
740 * We must undo everything done above; meaning that we must
741 * pop everything off of the operand stack and delete those
742 * objects
743 */
744 (void) acpi_ds_obj_stack_pop_and_delete (arg_count, walk_state);
745
746 ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "While creating Arg %d - %s\n",
747 (arg_count + 1), acpi_format_exception (status)));
748 return_ACPI_STATUS (status);
749 }
750
751
This page took 0.063741 seconds and 5 git commands to generate.