Bring in acpica 20110211, still not ok anyway
[dragonfly.git] / sys / contrib / dev / acpica-unix / debugger / dbcmds.c
1 /*******************************************************************************
2  *
3  * Module Name: dbcmds - Miscellaneous debug commands and output routines
4  *
5  ******************************************************************************/
6
7 /******************************************************************************
8  *
9  * 1. Copyright Notice
10  *
11  * Some or all of this work - Copyright (c) 1999 - 2011, Intel Corp.
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 #include "acpi.h"
118 #include "accommon.h"
119 #include "acevents.h"
120 #include "acdebug.h"
121 #include "acresrc.h"
122 #include "actables.h"
123
124 #ifdef ACPI_DEBUGGER
125
126 #define _COMPONENT          ACPI_CA_DEBUGGER
127         ACPI_MODULE_NAME    ("dbcmds")
128
129
130 /* Local prototypes */
131
132 static void
133 AcpiDmCompareAmlResources (
134     UINT8                   *Aml1Buffer,
135     ACPI_RSDESC_SIZE        Aml1BufferLength,
136     UINT8                   *Aml2Buffer,
137     ACPI_RSDESC_SIZE        Aml2BufferLength);
138
139 static ACPI_STATUS
140 AcpiDmTestResourceConversion (
141     ACPI_NAMESPACE_NODE     *Node,
142     char                    *Name);
143
144
145 /*******************************************************************************
146  *
147  * FUNCTION:    AcpiDbConvertToNode
148  *
149  * PARAMETERS:  InString        - String to convert
150  *
151  * RETURN:      Pointer to a NS node
152  *
153  * DESCRIPTION: Convert a string to a valid NS pointer.  Handles numeric or
154  *              alpha strings.
155  *
156  ******************************************************************************/
157
158 ACPI_NAMESPACE_NODE *
159 AcpiDbConvertToNode (
160     char                    *InString)
161 {
162     ACPI_NAMESPACE_NODE     *Node;
163
164
165     if ((*InString >= 0x30) && (*InString <= 0x39))
166     {
167         /* Numeric argument, convert */
168
169         Node = ACPI_TO_POINTER (ACPI_STRTOUL (InString, NULL, 16));
170         if (!AcpiOsReadable (Node, sizeof (ACPI_NAMESPACE_NODE)))
171         {
172             AcpiOsPrintf ("Address %p is invalid in this address space\n",
173                 Node);
174             return (NULL);
175         }
176
177         /* Make sure pointer is valid NS node */
178
179         if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
180         {
181             AcpiOsPrintf ("Address %p is not a valid NS node [%s]\n",
182                     Node, AcpiUtGetDescriptorName (Node));
183             return (NULL);
184         }
185     }
186     else
187     {
188         /* Alpha argument */
189         /* The parameter is a name string that must be resolved to a
190          * Named obj
191          */
192         Node = AcpiDbLocalNsLookup (InString);
193         if (!Node)
194         {
195             Node = AcpiGbl_RootNode;
196         }
197     }
198
199     return (Node);
200 }
201
202
203 /*******************************************************************************
204  *
205  * FUNCTION:    AcpiDbSleep
206  *
207  * PARAMETERS:  ObjectArg       - Desired sleep state (0-5)
208  *
209  * RETURN:      Status
210  *
211  * DESCRIPTION: Simulate a sleep/wake sequence
212  *
213  ******************************************************************************/
214
215 ACPI_STATUS
216 AcpiDbSleep (
217     char                    *ObjectArg)
218 {
219     ACPI_STATUS             Status;
220     UINT8                   SleepState;
221
222
223     SleepState = (UINT8) ACPI_STRTOUL (ObjectArg, NULL, 0);
224
225     AcpiOsPrintf ("**** Prepare to sleep ****\n");
226     Status = AcpiEnterSleepStatePrep (SleepState);
227     if (ACPI_FAILURE (Status))
228     {
229         return (Status);
230     }
231
232     AcpiOsPrintf ("**** Going to sleep ****\n");
233     Status = AcpiEnterSleepState (SleepState);
234     if (ACPI_FAILURE (Status))
235     {
236         return (Status);
237     }
238
239     AcpiOsPrintf ("**** returning from sleep ****\n");
240     Status = AcpiLeaveSleepState (SleepState);
241
242     return (Status);
243 }
244
245 /*******************************************************************************
246  *
247  * FUNCTION:    AcpiDbDisplayLocks
248  *
249  * PARAMETERS:  None
250  *
251  * RETURN:      None
252  *
253  * DESCRIPTION: Display information about internal mutexes.
254  *
255  ******************************************************************************/
256
257 void
258 AcpiDbDisplayLocks (
259     void)
260 {
261     UINT32                  i;
262
263
264     for (i = 0; i < ACPI_MAX_MUTEX; i++)
265     {
266         AcpiOsPrintf ("%26s : %s\n", AcpiUtGetMutexName (i),
267             AcpiGbl_MutexInfo[i].ThreadId == ACPI_MUTEX_NOT_ACQUIRED
268                 ? "Locked" : "Unlocked");
269     }
270 }
271
272
273 /*******************************************************************************
274  *
275  * FUNCTION:    AcpiDbDisplayTableInfo
276  *
277  * PARAMETERS:  TableArg        - String with name of table to be displayed
278  *
279  * RETURN:      None
280  *
281  * DESCRIPTION: Display information about loaded tables.  Current
282  *              implementation displays all loaded tables.
283  *
284  ******************************************************************************/
285
286 void
287 AcpiDbDisplayTableInfo (
288     char                    *TableArg)
289 {
290     UINT32                  i;
291     ACPI_TABLE_DESC         *TableDesc;
292     ACPI_STATUS             Status;
293
294
295     /* Walk the entire root table list */
296
297     for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++)
298     {
299         TableDesc = &AcpiGbl_RootTableList.Tables[i];
300         AcpiOsPrintf ("%u ", i);
301
302         /* Make sure that the table is mapped */
303
304         Status = AcpiTbVerifyTable (TableDesc);
305         if (ACPI_FAILURE (Status))
306         {
307             return;
308         }
309
310         /* Dump the table header */
311
312         if (TableDesc->Pointer)
313         {
314             AcpiTbPrintTableHeader (TableDesc->Address, TableDesc->Pointer);
315         }
316         else
317         {
318             /* If the pointer is null, the table has been unloaded */
319
320             ACPI_INFO ((AE_INFO, "%4.4s - Table has been unloaded",
321                 TableDesc->Signature.Ascii));
322         }
323     }
324 }
325
326
327 /*******************************************************************************
328  *
329  * FUNCTION:    AcpiDbUnloadAcpiTable
330  *
331  * PARAMETERS:  TableArg        - Name of the table to be unloaded
332  *              InstanceArg     - Which instance of the table to unload (if
333  *                                there are multiple tables of the same type)
334  *
335  * RETURN:      Nonde
336  *
337  * DESCRIPTION: Unload an ACPI table.
338  *              Instance is not implemented
339  *
340  ******************************************************************************/
341
342 void
343 AcpiDbUnloadAcpiTable (
344     char                    *TableArg,
345     char                    *InstanceArg)
346 {
347 /* TBD: Need to reimplement for new data structures */
348
349 #if 0
350     UINT32                  i;
351     ACPI_STATUS             Status;
352
353
354     /* Search all tables for the target type */
355
356     for (i = 0; i < (ACPI_TABLE_ID_MAX+1); i++)
357     {
358         if (!ACPI_STRNCMP (TableArg, AcpiGbl_TableData[i].Signature,
359                 AcpiGbl_TableData[i].SigLength))
360         {
361             /* Found the table, unload it */
362
363             Status = AcpiUnloadTable (i);
364             if (ACPI_SUCCESS (Status))
365             {
366                 AcpiOsPrintf ("[%s] unloaded and uninstalled\n", TableArg);
367             }
368             else
369             {
370                 AcpiOsPrintf ("%s, while unloading [%s]\n",
371                     AcpiFormatException (Status), TableArg);
372             }
373
374             return;
375         }
376     }
377
378     AcpiOsPrintf ("Unknown table type [%s]\n", TableArg);
379 #endif
380 }
381
382
383 /*******************************************************************************
384  *
385  * FUNCTION:    AcpiDbSendNotify
386  *
387  * PARAMETERS:  Name            - Name of ACPI object to send the notify to
388  *              Value           - Value of the notify to send.
389  *
390  * RETURN:      None
391  *
392  * DESCRIPTION: Send an ACPI notification.  The value specified is sent to the
393  *              named object as an ACPI notify.
394  *
395  ******************************************************************************/
396
397 void
398 AcpiDbSendNotify (
399     char                    *Name,
400     UINT32                  Value)
401 {
402     ACPI_NAMESPACE_NODE     *Node;
403     ACPI_STATUS             Status;
404
405
406     /* Translate name to an Named object */
407
408     Node = AcpiDbConvertToNode (Name);
409     if (!Node)
410     {
411         return;
412     }
413
414     /* Decode Named object type */
415
416     switch (Node->Type)
417     {
418     case ACPI_TYPE_DEVICE:
419     case ACPI_TYPE_THERMAL:
420
421          /* Send the notify */
422
423         Status = AcpiEvQueueNotifyRequest (Node, Value);
424         if (ACPI_FAILURE (Status))
425         {
426             AcpiOsPrintf ("Could not queue notify\n");
427         }
428         break;
429
430     default:
431         AcpiOsPrintf ("Named object is not a device or a thermal object\n");
432         break;
433     }
434 }
435
436
437 /*******************************************************************************
438  *
439  * FUNCTION:    AcpiDbDisplayInterfaces
440  *
441  * PARAMETERS:  ActionArg           - Null, "install", or "remove"
442  *              InterfaceNameArg    - Name for install/remove options
443  *
444  * RETURN:      None
445  *
446  * DESCRIPTION: Display or modify the global _OSI interface list
447  *
448  ******************************************************************************/
449
450 void
451 AcpiDbDisplayInterfaces (
452     char                    *ActionArg,
453     char                    *InterfaceNameArg)
454 {
455     ACPI_INTERFACE_INFO     *NextInterface;
456     char                    *SubString;
457     ACPI_STATUS             Status;
458
459
460     /* If no arguments, just display current interface list */
461
462     if (!ActionArg)
463     {
464         (void) AcpiOsAcquireMutex (AcpiGbl_OsiMutex,
465                     ACPI_WAIT_FOREVER);
466
467         NextInterface = AcpiGbl_SupportedInterfaces;
468
469         while (NextInterface)
470         {
471             if (!(NextInterface->Flags & ACPI_OSI_INVALID))
472             {
473                 AcpiOsPrintf ("%s\n", NextInterface->Name);
474             }
475             NextInterface = NextInterface->Next;
476         }
477
478         AcpiOsReleaseMutex (AcpiGbl_OsiMutex);
479         return;
480     }
481
482     /* If ActionArg exists, so must InterfaceNameArg */
483
484     if (!InterfaceNameArg)
485     {
486         AcpiOsPrintf ("Missing Interface Name argument\n");
487         return;
488     }
489
490     /* Uppercase the action for match below */
491
492     AcpiUtStrupr (ActionArg);
493
494     /* Install - install an interface */
495
496     SubString = ACPI_STRSTR ("INSTALL", ActionArg);
497     if (SubString)
498     {
499         Status = AcpiInstallInterface (InterfaceNameArg);
500         if (ACPI_FAILURE (Status))
501         {
502             AcpiOsPrintf ("%s, while installing \"%s\"\n",
503                 AcpiFormatException (Status), InterfaceNameArg);
504         }
505         return;
506     }
507
508     /* Remove - remove an interface */
509
510     SubString = ACPI_STRSTR ("REMOVE", ActionArg);
511     if (SubString)
512     {
513         Status = AcpiRemoveInterface (InterfaceNameArg);
514         if (ACPI_FAILURE (Status))
515         {
516             AcpiOsPrintf ("%s, while removing \"%s\"\n",
517                 AcpiFormatException (Status), InterfaceNameArg);
518         }
519         return;
520     }
521
522     /* Invalid ActionArg */
523
524     AcpiOsPrintf ("Invalid action argument: %s\n", ActionArg);
525     return;
526 }
527
528
529 /*******************************************************************************
530  *
531  * FUNCTION:    AcpiDmCompareAmlResources
532  *
533  * PARAMETERS:  Aml1Buffer          - Contains first resource list
534  *              Aml1BufferLength    - Length of first resource list
535  *              Aml2Buffer          - Contains second resource list
536  *              Aml2BufferLength    - Length of second resource list
537  *
538  * RETURN:      None
539  *
540  * DESCRIPTION: Compare two AML resource lists, descriptor by descriptor (in
541  *              order to isolate a miscompare to an individual resource)
542  *
543  ******************************************************************************/
544
545 static void
546 AcpiDmCompareAmlResources (
547     UINT8                   *Aml1Buffer,
548     ACPI_RSDESC_SIZE        Aml1BufferLength,
549     UINT8                   *Aml2Buffer,
550     ACPI_RSDESC_SIZE        Aml2BufferLength)
551 {
552     UINT8                   *Aml1;
553     UINT8                   *Aml2;
554     ACPI_RSDESC_SIZE        Aml1Length;
555     ACPI_RSDESC_SIZE        Aml2Length;
556     ACPI_RSDESC_SIZE        Offset = 0;
557     UINT8                   ResourceType;
558     UINT32                  Count = 0;
559
560
561     /* Compare overall buffer sizes (may be different due to size rounding) */
562
563     if (Aml1BufferLength != Aml2BufferLength)
564     {
565         AcpiOsPrintf (
566             "**** Buffer length mismatch in converted AML: original %X new %X ****\n",
567             Aml1BufferLength, Aml2BufferLength);
568     }
569
570     Aml1 = Aml1Buffer;
571     Aml2 = Aml2Buffer;
572
573     /* Walk the descriptor lists, comparing each descriptor */
574
575     while (Aml1 < (Aml1Buffer + Aml1BufferLength))
576     {
577         /* Get the lengths of each descriptor */
578
579         Aml1Length = AcpiUtGetDescriptorLength (Aml1);
580         Aml2Length = AcpiUtGetDescriptorLength (Aml2);
581         ResourceType = AcpiUtGetResourceType (Aml1);
582
583         /* Check for descriptor length match */
584
585         if (Aml1Length != Aml2Length)
586         {
587             AcpiOsPrintf (
588                 "**** Length mismatch in descriptor [%.2X] type %2.2X, Offset %8.8X L1 %X L2 %X ****\n",
589                 Count, ResourceType, Offset, Aml1Length, Aml2Length);
590         }
591
592         /* Check for descriptor byte match */
593
594         else if (ACPI_MEMCMP (Aml1, Aml2, Aml1Length))
595         {
596             AcpiOsPrintf (
597                 "**** Data mismatch in descriptor [%.2X] type %2.2X, Offset %8.8X ****\n",
598                 Count, ResourceType, Offset);
599         }
600
601         /* Exit on EndTag descriptor */
602
603         if (ResourceType == ACPI_RESOURCE_NAME_END_TAG)
604         {
605             return;
606         }
607
608         /* Point to next descriptor in each buffer */
609
610         Count++;
611         Offset += Aml1Length;
612         Aml1 += Aml1Length;
613         Aml2 += Aml2Length;
614     }
615 }
616
617
618 /*******************************************************************************
619  *
620  * FUNCTION:    AcpiDmTestResourceConversion
621  *
622  * PARAMETERS:  Node            - Parent device node
623  *              Name            - resource method name (_CRS)
624  *
625  * RETURN:      Status
626  *
627  * DESCRIPTION: Compare the original AML with a conversion of the AML to
628  *              internal resource list, then back to AML.
629  *
630  ******************************************************************************/
631
632 static ACPI_STATUS
633 AcpiDmTestResourceConversion (
634     ACPI_NAMESPACE_NODE     *Node,
635     char                    *Name)
636 {
637     ACPI_STATUS             Status;
638     ACPI_BUFFER             ReturnObj;
639     ACPI_BUFFER             ResourceObj;
640     ACPI_BUFFER             NewAml;
641     ACPI_OBJECT             *OriginalAml;
642
643
644     AcpiOsPrintf ("Resource Conversion Comparison:\n");
645
646     NewAml.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
647     ReturnObj.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
648     ResourceObj.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
649
650     /* Get the original _CRS AML resource template */
651
652     Status = AcpiEvaluateObject (Node, Name, NULL, &ReturnObj);
653     if (ACPI_FAILURE (Status))
654     {
655         AcpiOsPrintf ("Could not obtain %s: %s\n",
656             Name, AcpiFormatException (Status));
657         return (Status);
658     }
659
660     /* Get the AML resource template, converted to internal resource structs */
661
662     Status = AcpiGetCurrentResources (Node, &ResourceObj);
663     if (ACPI_FAILURE (Status))
664     {
665         AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n",
666             AcpiFormatException (Status));
667         goto Exit1;
668     }
669
670     /* Convert internal resource list to external AML resource template */
671
672     Status = AcpiRsCreateAmlResources (ResourceObj.Pointer, &NewAml);
673     if (ACPI_FAILURE (Status))
674     {
675         AcpiOsPrintf ("AcpiRsCreateAmlResources failed: %s\n",
676             AcpiFormatException (Status));
677         goto Exit2;
678     }
679
680     /* Compare original AML to the newly created AML resource list */
681
682     OriginalAml = ReturnObj.Pointer;
683
684     AcpiDmCompareAmlResources (
685         OriginalAml->Buffer.Pointer, (ACPI_RSDESC_SIZE) OriginalAml->Buffer.Length,
686         NewAml.Pointer, (ACPI_RSDESC_SIZE) NewAml.Length);
687
688     /* Cleanup and exit */
689
690     ACPI_FREE (NewAml.Pointer);
691 Exit2:
692     ACPI_FREE (ResourceObj.Pointer);
693 Exit1:
694     ACPI_FREE (ReturnObj.Pointer);
695     return (Status);
696 }
697
698
699 /*******************************************************************************
700  *
701  * FUNCTION:    AcpiDbDisplayResources
702  *
703  * PARAMETERS:  ObjectArg       - String with hex value of the object
704  *
705  * RETURN:      None
706  *
707  * DESCRIPTION: Display the resource objects associated with a device.
708  *
709  ******************************************************************************/
710
711 void
712 AcpiDbDisplayResources (
713     char                    *ObjectArg)
714 {
715     ACPI_NAMESPACE_NODE     *Node;
716     ACPI_STATUS             Status;
717     ACPI_BUFFER             ReturnObj;
718
719
720     AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
721     AcpiDbgLevel |= ACPI_LV_RESOURCES;
722
723     /* Convert string to object pointer */
724
725     Node = AcpiDbConvertToNode (ObjectArg);
726     if (!Node)
727     {
728         return;
729     }
730
731     /* Prepare for a return object of arbitrary size */
732
733     ReturnObj.Pointer = AcpiGbl_DbBuffer;
734     ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
735
736     /* _PRT */
737
738     AcpiOsPrintf ("Evaluating _PRT\n");
739
740     /* Check if _PRT exists */
741
742     Status = AcpiEvaluateObject (Node, METHOD_NAME__PRT, NULL, &ReturnObj);
743     if (ACPI_FAILURE (Status))
744     {
745         AcpiOsPrintf ("Could not obtain _PRT: %s\n",
746             AcpiFormatException (Status));
747         goto GetCrs;
748     }
749
750     ReturnObj.Pointer = AcpiGbl_DbBuffer;
751     ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
752
753     Status = AcpiGetIrqRoutingTable (Node, &ReturnObj);
754     if (ACPI_FAILURE (Status))
755     {
756         AcpiOsPrintf ("GetIrqRoutingTable failed: %s\n",
757             AcpiFormatException (Status));
758         goto GetCrs;
759     }
760
761     AcpiRsDumpIrqList (ACPI_CAST_PTR (UINT8, AcpiGbl_DbBuffer));
762
763
764     /* _CRS */
765
766 GetCrs:
767     AcpiOsPrintf ("Evaluating _CRS\n");
768
769     ReturnObj.Pointer = AcpiGbl_DbBuffer;
770     ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
771
772     /* Check if _CRS exists */
773
774     Status = AcpiEvaluateObject (Node, METHOD_NAME__CRS, NULL, &ReturnObj);
775     if (ACPI_FAILURE (Status))
776     {
777         AcpiOsPrintf ("Could not obtain _CRS: %s\n",
778             AcpiFormatException (Status));
779         goto GetPrs;
780     }
781
782     /* Get the _CRS resource list */
783
784     ReturnObj.Pointer = AcpiGbl_DbBuffer;
785     ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
786
787     Status = AcpiGetCurrentResources (Node, &ReturnObj);
788     if (ACPI_FAILURE (Status))
789     {
790         AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n",
791             AcpiFormatException (Status));
792         goto GetPrs;
793     }
794
795     /* Dump the _CRS resource list */
796
797     AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE,
798         ReturnObj.Pointer));
799
800     /*
801      * Perform comparison of original AML to newly created AML. This tests both
802      * the AML->Resource conversion and the Resource->Aml conversion.
803      */
804     Status = AcpiDmTestResourceConversion (Node, METHOD_NAME__CRS);
805
806     /* Execute _SRS with the resource list */
807
808     Status = AcpiSetCurrentResources (Node, &ReturnObj);
809     if (ACPI_FAILURE (Status))
810     {
811         AcpiOsPrintf ("AcpiSetCurrentResources failed: %s\n",
812             AcpiFormatException (Status));
813         goto GetPrs;
814     }
815
816
817     /* _PRS */
818
819 GetPrs:
820     AcpiOsPrintf ("Evaluating _PRS\n");
821
822     ReturnObj.Pointer = AcpiGbl_DbBuffer;
823     ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
824
825     /* Check if _PRS exists */
826
827     Status = AcpiEvaluateObject (Node, METHOD_NAME__PRS, NULL, &ReturnObj);
828     if (ACPI_FAILURE (Status))
829     {
830         AcpiOsPrintf ("Could not obtain _PRS: %s\n",
831             AcpiFormatException (Status));
832         goto Cleanup;
833     }
834
835     ReturnObj.Pointer = AcpiGbl_DbBuffer;
836     ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
837
838     Status = AcpiGetPossibleResources (Node, &ReturnObj);
839     if (ACPI_FAILURE (Status))
840     {
841         AcpiOsPrintf ("AcpiGetPossibleResources failed: %s\n",
842             AcpiFormatException (Status));
843         goto Cleanup;
844     }
845
846     AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE, AcpiGbl_DbBuffer));
847
848 Cleanup:
849
850     AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
851     return;
852 }
853
854
855 /*******************************************************************************
856  *
857  * FUNCTION:    AcpiDbGenerateGpe
858  *
859  * PARAMETERS:  GpeArg          - Raw GPE number, ascii string
860  *              BlockArg        - GPE block number, ascii string
861  *                                0 or 1 for FADT GPE blocks
862  *
863  * RETURN:      None
864  *
865  * DESCRIPTION: Generate a GPE
866  *
867  ******************************************************************************/
868
869 void
870 AcpiDbGenerateGpe (
871     char                    *GpeArg,
872     char                    *BlockArg)
873 {
874     UINT32                  BlockNumber;
875     UINT32                  GpeNumber;
876     ACPI_GPE_EVENT_INFO     *GpeEventInfo;
877
878
879     GpeNumber   = ACPI_STRTOUL (GpeArg, NULL, 0);
880     BlockNumber = ACPI_STRTOUL (BlockArg, NULL, 0);
881
882
883     GpeEventInfo = AcpiEvGetGpeEventInfo (ACPI_TO_POINTER (BlockNumber),
884         GpeNumber);
885     if (!GpeEventInfo)
886     {
887         AcpiOsPrintf ("Invalid GPE\n");
888         return;
889     }
890
891     (void) AcpiEvGpeDispatch (NULL, GpeEventInfo, GpeNumber);
892 }
893
894 #endif /* ACPI_DEBUGGER */