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