dmopcode.c revision 1.1.1.2.10.1 1 /*******************************************************************************
2 *
3 * Module Name: dmopcode - AML disassembler, specific AML opcodes
4 *
5 ******************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2013, Intel Corp.
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 #include "acpi.h"
45 #include "accommon.h"
46 #include "acparser.h"
47 #include "amlcode.h"
48 #include "acdisasm.h"
49
50 #ifdef ACPI_DISASSEMBLER
51
52 #define _COMPONENT ACPI_CA_DEBUGGER
53 ACPI_MODULE_NAME ("dmopcode")
54
55 /* Local prototypes */
56
57 static void
58 AcpiDmMatchKeyword (
59 ACPI_PARSE_OBJECT *Op);
60
61
62 /*******************************************************************************
63 *
64 * FUNCTION: AcpiDmPredefinedDescription
65 *
66 * PARAMETERS: Op - Name() parse object
67 *
68 * RETURN: None
69 *
70 * DESCRIPTION: Emit a description comment for a predefined ACPI name.
71 * Used for iASL compiler only.
72 *
73 ******************************************************************************/
74
75 void
76 AcpiDmPredefinedDescription (
77 ACPI_PARSE_OBJECT *Op)
78 {
79 #ifdef ACPI_ASL_COMPILER
80 const AH_PREDEFINED_NAME *Info;
81 char *NameString;
82 int LastCharIsDigit;
83 int LastCharsAreHex;
84
85
86 if (!Op)
87 {
88 return;
89 }
90
91 /* Ensure that the comment field is emitted only once */
92
93 if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEF_CHECKED)
94 {
95 return;
96 }
97 Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEF_CHECKED;
98
99 /* Predefined name must start with an underscore */
100
101 NameString = ACPI_CAST_PTR (char, &Op->Named.Name);
102 if (NameString[0] != '_')
103 {
104 return;
105 }
106
107 /*
108 * Check for the special ACPI names:
109 * _ACd, _ALd, _EJd, _Exx, _Lxx, _Qxx, _Wxx, _T_a
110 * (where d=decimal_digit, x=hex_digit, a=anything)
111 *
112 * Convert these to the generic name for table lookup.
113 * Note: NameString is guaranteed to be upper case here.
114 */
115 LastCharIsDigit =
116 (ACPI_IS_DIGIT (NameString[3])); /* d */
117 LastCharsAreHex =
118 (ACPI_IS_XDIGIT (NameString[2]) && /* xx */
119 ACPI_IS_XDIGIT (NameString[3]));
120
121 switch (NameString[1])
122 {
123 case 'A':
124
125 if ((NameString[2] == 'C') && (LastCharIsDigit))
126 {
127 NameString = "_ACx";
128 }
129 else if ((NameString[2] == 'L') && (LastCharIsDigit))
130 {
131 NameString = "_ALx";
132 }
133 break;
134
135 case 'E':
136
137 if ((NameString[2] == 'J') && (LastCharIsDigit))
138 {
139 NameString = "_EJx";
140 }
141 else if (LastCharsAreHex)
142 {
143 NameString = "_Exx";
144 }
145 break;
146
147 case 'L':
148
149 if (LastCharsAreHex)
150 {
151 NameString = "_Lxx";
152 }
153 break;
154
155 case 'Q':
156
157 if (LastCharsAreHex)
158 {
159 NameString = "_Qxx";
160 }
161 break;
162
163 case 'T':
164
165 if (NameString[2] == '_')
166 {
167 NameString = "_T_x";
168 }
169 break;
170
171 case 'W':
172
173 if (LastCharsAreHex)
174 {
175 NameString = "_Wxx";
176 }
177 break;
178
179 default:
180
181 break;
182 }
183
184 /* Match the name in the info table */
185
186 for (Info = AslPredefinedInfo; Info->Name; Info++)
187 {
188 if (ACPI_COMPARE_NAME (NameString, Info->Name))
189 {
190 AcpiOsPrintf (" // %4.4s: %s",
191 NameString, ACPI_CAST_PTR (char, Info->Description));
192 return;
193 }
194 }
195
196 #endif
197 return;
198 }
199
200
201 /*******************************************************************************
202 *
203 * FUNCTION: AcpiDmFieldPredefinedDescription
204 *
205 * PARAMETERS: Op - Parse object
206 *
207 * RETURN: None
208 *
209 * DESCRIPTION: Emit a description comment for a resource descriptor tag
210 * (which is a predefined ACPI name.) Used for iASL compiler only.
211 *
212 ******************************************************************************/
213
214 void
215 AcpiDmFieldPredefinedDescription (
216 ACPI_PARSE_OBJECT *Op)
217 {
218 #ifdef ACPI_ASL_COMPILER
219 ACPI_PARSE_OBJECT *IndexOp;
220 char *Tag;
221 const ACPI_OPCODE_INFO *OpInfo;
222 const AH_PREDEFINED_NAME *Info;
223
224
225 if (!Op)
226 {
227 return;
228 }
229
230 /* Ensure that the comment field is emitted only once */
231
232 if (Op->Common.DisasmFlags & ACPI_PARSEOP_PREDEF_CHECKED)
233 {
234 return;
235 }
236 Op->Common.DisasmFlags |= ACPI_PARSEOP_PREDEF_CHECKED;
237
238 /*
239 * Op must be one of the Create* operators: CreateField, CreateBitField,
240 * CreateByteField, CreateWordField, CreateDwordField, CreateQwordField
241 */
242 OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
243 if (!(OpInfo->Flags & AML_CREATE))
244 {
245 return;
246 }
247
248 /* Second argument is the Index argument */
249
250 IndexOp = Op->Common.Value.Arg;
251 IndexOp = IndexOp->Common.Next;
252
253 /* Index argument must be a namepath */
254
255 if (IndexOp->Common.AmlOpcode != AML_INT_NAMEPATH_OP)
256 {
257 return;
258 }
259
260 /* Major cheat: We previously put the Tag ptr in the Node field */
261
262 Tag = ACPI_CAST_PTR (char, IndexOp->Common.Node);
263 if (!Tag)
264 {
265 return;
266 }
267
268 /* Match the name in the info table */
269
270 for (Info = AslPredefinedInfo; Info->Name; Info++)
271 {
272 if (ACPI_COMPARE_NAME (Tag, Info->Name))
273 {
274 AcpiOsPrintf (" // %4.4s: %s", Tag,
275 ACPI_CAST_PTR (char, Info->Description));
276 return;
277 }
278 }
279
280 #endif
281 return;
282 }
283
284
285 /*******************************************************************************
286 *
287 * FUNCTION: AcpiDmMethodFlags
288 *
289 * PARAMETERS: Op - Method Object to be examined
290 *
291 * RETURN: None
292 *
293 * DESCRIPTION: Decode control method flags
294 *
295 ******************************************************************************/
296
297 void
298 AcpiDmMethodFlags (
299 ACPI_PARSE_OBJECT *Op)
300 {
301 UINT32 Flags;
302 UINT32 Args;
303
304
305 /* The next Op contains the flags */
306
307 Op = AcpiPsGetDepthNext (NULL, Op);
308 Flags = (UINT8) Op->Common.Value.Integer;
309 Args = Flags & 0x07;
310
311 /* Mark the Op as completed */
312
313 Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
314
315 /* 1) Method argument count */
316
317 AcpiOsPrintf (", %u, ", Args);
318
319 /* 2) Serialize rule */
320
321 if (!(Flags & 0x08))
322 {
323 AcpiOsPrintf ("Not");
324 }
325
326 AcpiOsPrintf ("Serialized");
327
328 /* 3) SyncLevel */
329
330 if (Flags & 0xF0)
331 {
332 AcpiOsPrintf (", %u", Flags >> 4);
333 }
334 }
335
336
337 /*******************************************************************************
338 *
339 * FUNCTION: AcpiDmFieldFlags
340 *
341 * PARAMETERS: Op - Field Object to be examined
342 *
343 * RETURN: None
344 *
345 * DESCRIPTION: Decode Field definition flags
346 *
347 ******************************************************************************/
348
349 void
350 AcpiDmFieldFlags (
351 ACPI_PARSE_OBJECT *Op)
352 {
353 UINT32 Flags;
354
355
356 Op = Op->Common.Next;
357 Flags = (UINT8) Op->Common.Value.Integer;
358
359 /* Mark the Op as completed */
360
361 Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
362
363 AcpiOsPrintf ("%s, ", AcpiGbl_AccessTypes [Flags & 0x07]);
364 AcpiOsPrintf ("%s, ", AcpiGbl_LockRule [(Flags & 0x10) >> 4]);
365 AcpiOsPrintf ("%s)", AcpiGbl_UpdateRules [(Flags & 0x60) >> 5]);
366 }
367
368
369 /*******************************************************************************
370 *
371 * FUNCTION: AcpiDmAddressSpace
372 *
373 * PARAMETERS: SpaceId - ID to be translated
374 *
375 * RETURN: None
376 *
377 * DESCRIPTION: Decode a SpaceId to an AddressSpaceKeyword
378 *
379 ******************************************************************************/
380
381 void
382 AcpiDmAddressSpace (
383 UINT8 SpaceId)
384 {
385
386 if (SpaceId >= ACPI_NUM_PREDEFINED_REGIONS)
387 {
388 if (SpaceId == 0x7F)
389 {
390 AcpiOsPrintf ("FFixedHW, ");
391 }
392 else
393 {
394 AcpiOsPrintf ("0x%.2X, ", SpaceId);
395 }
396 }
397 else
398 {
399 AcpiOsPrintf ("%s, ", AcpiGbl_RegionTypes [SpaceId]);
400 }
401 }
402
403
404 /*******************************************************************************
405 *
406 * FUNCTION: AcpiDmRegionFlags
407 *
408 * PARAMETERS: Op - Object to be examined
409 *
410 * RETURN: None
411 *
412 * DESCRIPTION: Decode OperationRegion flags
413 *
414 ******************************************************************************/
415
416 void
417 AcpiDmRegionFlags (
418 ACPI_PARSE_OBJECT *Op)
419 {
420
421
422 /* The next Op contains the SpaceId */
423
424 Op = AcpiPsGetDepthNext (NULL, Op);
425
426 /* Mark the Op as completed */
427
428 Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
429
430 AcpiOsPrintf (", ");
431 AcpiDmAddressSpace ((UINT8) Op->Common.Value.Integer);
432 }
433
434
435 /*******************************************************************************
436 *
437 * FUNCTION: AcpiDmMatchOp
438 *
439 * PARAMETERS: Op - Match Object to be examined
440 *
441 * RETURN: None
442 *
443 * DESCRIPTION: Decode Match opcode operands
444 *
445 ******************************************************************************/
446
447 void
448 AcpiDmMatchOp (
449 ACPI_PARSE_OBJECT *Op)
450 {
451 ACPI_PARSE_OBJECT *NextOp;
452
453
454 NextOp = AcpiPsGetDepthNext (NULL, Op);
455 NextOp = NextOp->Common.Next;
456
457 if (!NextOp)
458 {
459 /* Handle partial tree during single-step */
460
461 return;
462 }
463
464 /* Mark the two nodes that contain the encoding for the match keywords */
465
466 NextOp->Common.DisasmOpcode = ACPI_DASM_MATCHOP;
467
468 NextOp = NextOp->Common.Next;
469 NextOp = NextOp->Common.Next;
470 NextOp->Common.DisasmOpcode = ACPI_DASM_MATCHOP;
471 }
472
473
474 /*******************************************************************************
475 *
476 * FUNCTION: AcpiDmMatchKeyword
477 *
478 * PARAMETERS: Op - Match Object to be examined
479 *
480 * RETURN: None
481 *
482 * DESCRIPTION: Decode Match opcode operands
483 *
484 ******************************************************************************/
485
486 static void
487 AcpiDmMatchKeyword (
488 ACPI_PARSE_OBJECT *Op)
489 {
490
491
492 if (((UINT32) Op->Common.Value.Integer) > ACPI_MAX_MATCH_OPCODE)
493 {
494 AcpiOsPrintf ("/* Unknown Match Keyword encoding */");
495 }
496 else
497 {
498 AcpiOsPrintf ("%s", ACPI_CAST_PTR (char,
499 AcpiGbl_MatchOps[(ACPI_SIZE) Op->Common.Value.Integer]));
500 }
501 }
502
503
504 /*******************************************************************************
505 *
506 * FUNCTION: AcpiDmDisassembleOneOp
507 *
508 * PARAMETERS: WalkState - Current walk info
509 * Info - Parse tree walk info
510 * Op - Op that is to be printed
511 *
512 * RETURN: None
513 *
514 * DESCRIPTION: Disassemble a single AML opcode
515 *
516 ******************************************************************************/
517
518 void
519 AcpiDmDisassembleOneOp (
520 ACPI_WALK_STATE *WalkState,
521 ACPI_OP_WALK_INFO *Info,
522 ACPI_PARSE_OBJECT *Op)
523 {
524 const ACPI_OPCODE_INFO *OpInfo = NULL;
525 UINT32 Offset;
526 UINT32 Length;
527 ACPI_PARSE_OBJECT *Child;
528 ACPI_STATUS Status;
529 UINT8 *Aml;
530
531
532 if (!Op)
533 {
534 AcpiOsPrintf ("<NULL OP PTR>");
535 return;
536 }
537
538 switch (Op->Common.DisasmOpcode)
539 {
540 case ACPI_DASM_MATCHOP:
541
542 AcpiDmMatchKeyword (Op);
543 return;
544
545 case ACPI_DASM_LNOT_SUFFIX:
546
547 switch (Op->Common.AmlOpcode)
548 {
549 case AML_LEQUAL_OP:
550
551 AcpiOsPrintf ("LNotEqual");
552 break;
553
554 case AML_LGREATER_OP:
555
556 AcpiOsPrintf ("LLessEqual");
557 break;
558
559 case AML_LLESS_OP:
560
561 AcpiOsPrintf ("LGreaterEqual");
562 break;
563
564 default:
565
566 break;
567 }
568 Op->Common.DisasmOpcode = 0;
569 Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
570 return;
571
572 default:
573 break;
574 }
575
576
577 OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
578
579 /* The op and arguments */
580
581 switch (Op->Common.AmlOpcode)
582 {
583 case AML_LNOT_OP:
584
585 Child = Op->Common.Value.Arg;
586 if ((Child->Common.AmlOpcode == AML_LEQUAL_OP) ||
587 (Child->Common.AmlOpcode == AML_LGREATER_OP) ||
588 (Child->Common.AmlOpcode == AML_LLESS_OP))
589 {
590 Child->Common.DisasmOpcode = ACPI_DASM_LNOT_SUFFIX;
591 Op->Common.DisasmOpcode = ACPI_DASM_LNOT_PREFIX;
592 }
593 else
594 {
595 AcpiOsPrintf ("%s", OpInfo->Name);
596 }
597 break;
598
599 case AML_BYTE_OP:
600
601 AcpiOsPrintf ("0x%2.2X", (UINT32) Op->Common.Value.Integer);
602 break;
603
604 case AML_WORD_OP:
605
606 if (Op->Common.DisasmOpcode == ACPI_DASM_EISAID)
607 {
608 AcpiDmEisaId ((UINT32) Op->Common.Value.Integer);
609 }
610 else
611 {
612 AcpiOsPrintf ("0x%4.4X", (UINT32) Op->Common.Value.Integer);
613 }
614 break;
615
616 case AML_DWORD_OP:
617
618 if (Op->Common.DisasmOpcode == ACPI_DASM_EISAID)
619 {
620 AcpiDmEisaId ((UINT32) Op->Common.Value.Integer);
621 }
622 else
623 {
624 AcpiOsPrintf ("0x%8.8X", (UINT32) Op->Common.Value.Integer);
625 }
626 break;
627
628 case AML_QWORD_OP:
629
630 AcpiOsPrintf ("0x%8.8X%8.8X",
631 ACPI_FORMAT_UINT64 (Op->Common.Value.Integer));
632 break;
633
634 case AML_STRING_OP:
635
636 AcpiUtPrintString (Op->Common.Value.String, ACPI_UINT16_MAX);
637 break;
638
639 case AML_BUFFER_OP:
640 /*
641 * Determine the type of buffer. We can have one of the following:
642 *
643 * 1) ResourceTemplate containing Resource Descriptors.
644 * 2) Unicode String buffer
645 * 3) ASCII String buffer
646 * 4) Raw data buffer (if none of the above)
647 *
648 * Since there are no special AML opcodes to differentiate these
649 * types of buffers, we have to closely look at the data in the
650 * buffer to determine the type.
651 */
652 if (!AcpiGbl_NoResourceDisassembly)
653 {
654 Status = AcpiDmIsResourceTemplate (WalkState, Op);
655 if (ACPI_SUCCESS (Status))
656 {
657 Op->Common.DisasmOpcode = ACPI_DASM_RESOURCE;
658 AcpiOsPrintf ("ResourceTemplate");
659 break;
660 }
661 else if (Status == AE_AML_NO_RESOURCE_END_TAG)
662 {
663 AcpiOsPrintf ("/**** Is ResourceTemplate, but EndTag not at buffer end ****/ ");
664 }
665 }
666
667 if (AcpiDmIsUnicodeBuffer (Op))
668 {
669 Op->Common.DisasmOpcode = ACPI_DASM_UNICODE;
670 AcpiOsPrintf ("Unicode (");
671 }
672 else if (AcpiDmIsStringBuffer (Op))
673 {
674 Op->Common.DisasmOpcode = ACPI_DASM_STRING;
675 AcpiOsPrintf ("Buffer");
676 }
677 else if (AcpiDmIsPldBuffer (Op))
678 {
679 Op->Common.DisasmOpcode = ACPI_DASM_PLD_METHOD;
680 AcpiOsPrintf ("Buffer");
681 }
682 else
683 {
684 Op->Common.DisasmOpcode = ACPI_DASM_BUFFER;
685 AcpiOsPrintf ("Buffer");
686 }
687 break;
688
689 case AML_INT_STATICSTRING_OP:
690
691 if (Op->Common.Value.String)
692 {
693 AcpiOsPrintf ("%s", Op->Common.Value.String);
694 }
695 else
696 {
697 AcpiOsPrintf ("\"<NULL STATIC STRING PTR>\"");
698 }
699 break;
700
701 case AML_INT_NAMEPATH_OP:
702
703 AcpiDmNamestring (Op->Common.Value.Name);
704 break;
705
706 case AML_INT_NAMEDFIELD_OP:
707
708 Length = AcpiDmDumpName (Op->Named.Name);
709 AcpiOsPrintf (",%*.s %u", (unsigned) (5 - Length), " ",
710 (UINT32) Op->Common.Value.Integer);
711 AcpiDmCommaIfFieldMember (Op);
712
713 Info->BitOffset += (UINT32) Op->Common.Value.Integer;
714 break;
715
716 case AML_INT_RESERVEDFIELD_OP:
717
718 /* Offset() -- Must account for previous offsets */
719
720 Offset = (UINT32) Op->Common.Value.Integer;
721 Info->BitOffset += Offset;
722
723 if (Info->BitOffset % 8 == 0)
724 {
725 AcpiOsPrintf ("Offset (0x%.2X)", ACPI_DIV_8 (Info->BitOffset));
726 }
727 else
728 {
729 AcpiOsPrintf (" , %u", Offset);
730 }
731
732 AcpiDmCommaIfFieldMember (Op);
733 break;
734
735 case AML_INT_ACCESSFIELD_OP:
736 case AML_INT_EXTACCESSFIELD_OP:
737
738 AcpiOsPrintf ("AccessAs (%s, ",
739 AcpiGbl_AccessTypes [(UINT32) (Op->Common.Value.Integer & 0x7)]);
740
741 AcpiDmDecodeAttribute ((UINT8) (Op->Common.Value.Integer >> 8));
742
743 if (Op->Common.AmlOpcode == AML_INT_EXTACCESSFIELD_OP)
744 {
745 AcpiOsPrintf (" (0x%2.2X)", (unsigned) ((Op->Common.Value.Integer >> 16) & 0xFF));
746 }
747
748 AcpiOsPrintf (")");
749 AcpiDmCommaIfFieldMember (Op);
750 break;
751
752 case AML_INT_CONNECTION_OP:
753 /*
754 * Two types of Connection() - one with a buffer object, the
755 * other with a namestring that points to a buffer object.
756 */
757 AcpiOsPrintf ("Connection (");
758 Child = Op->Common.Value.Arg;
759
760 if (Child->Common.AmlOpcode == AML_INT_BYTELIST_OP)
761 {
762 AcpiOsPrintf ("\n");
763
764 Aml = Child->Named.Data;
765 Length = (UINT32) Child->Common.Value.Integer;
766
767 Info->Level += 1;
768 Op->Common.DisasmOpcode = ACPI_DASM_RESOURCE;
769 AcpiDmResourceTemplate (Info, Op->Common.Parent, Aml, Length);
770
771 Info->Level -= 1;
772 AcpiDmIndent (Info->Level);
773 }
774 else
775 {
776 AcpiDmNamestring (Child->Common.Value.Name);
777 }
778
779 AcpiOsPrintf (")");
780 AcpiDmCommaIfFieldMember (Op);
781 AcpiOsPrintf ("\n");
782
783 Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; /* for now, ignore in AcpiDmAscendingOp */
784 Child->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
785 break;
786
787 case AML_INT_BYTELIST_OP:
788
789 AcpiDmByteList (Info, Op);
790 break;
791
792 case AML_INT_METHODCALL_OP:
793
794 Op = AcpiPsGetDepthNext (NULL, Op);
795 Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
796
797 AcpiDmNamestring (Op->Common.Value.Name);
798 break;
799
800 default:
801
802 /* Just get the opcode name and print it */
803
804 AcpiOsPrintf ("%s", OpInfo->Name);
805
806
807 #ifdef ACPI_DEBUGGER
808
809 if ((Op->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP) &&
810 (WalkState) &&
811 (WalkState->Results) &&
812 (WalkState->ResultCount))
813 {
814 AcpiDmDecodeInternalObject (
815 WalkState->Results->Results.ObjDesc [
816 (WalkState->ResultCount - 1) %
817 ACPI_RESULTS_FRAME_OBJ_NUM]);
818 }
819 #endif
820
821 break;
822 }
823 }
824
825 #endif /* ACPI_DISASSEMBLER */
826