ACPI.c revision 4684b66f261ffb74fa7575ed10df43cc0645a42f
1/*++
2  This file contains an 'Intel UEFI Application' and is
3  licensed for Intel CPUs and chipsets under the terms of your
4  license agreement with Intel or your vendor.  This file may
5  be modified by the user, subject to additional terms of the
6  license agreement
7--*/
8/*++
9
10Copyright (c)  2011 Intel Corporation. All rights reserved
11This software and associated documentation (if any) is furnished
12under a license and may only be used or copied in accordance
13with the terms of the license. Except as permitted by such
14license, no part of this software or documentation may be
15reproduced, stored in a retrieval system, or transmitted in any
16form or by any means without the express written consent of
17Intel Corporation.
18
19--*/
20
21/** @file
22  Display the runtime services table
23
24**/
25
26#include <WebServer.h>
27#include <Guid/Acpi.h>
28#include <IndustryStandard/Acpi10.h>
29#include <IndustryStandard/Acpi30.h>
30
31#pragma warning ( disable : 4305 )
32
33//
34// Ensure proper structure formats
35//
36#pragma pack(1)
37
38typedef struct {
39  UINT8 AddressSpaceId;
40  UINT8 RegisterBitWidth;
41  UINT8 RegisterBitOffset;
42  UINT8 AccessSize;
43  UINT64 Address;
44} GENERIC_ADDRESS;
45
46
47typedef struct {
48  UINT32 Signature;           //    0
49  UINT32 Length;              //    4
50  UINT8 Revision;             //    8
51  UINT8 Checksum;             //    9
52  UINT8 OemId[6];             //   10
53  UINT8 OemTableId[8];        //   16
54  UINT32 OemRevision;         //   24
55  UINT32 CreatorId;           //   28
56  UINT32 CreatorRevision;     //   32
57  UINT8 DefinitionBlock[1];   //   36
58} ACPI_DSDT;
59
60
61typedef struct {
62  UINT32 Signature;           //    0
63  UINT32 Length;              //    4
64  UINT8 Revision;             //    8
65  UINT8 Checksum;             //    9
66  UINT8 OemId[6];             //   10
67  UINT8 OemTableId[8];        //   16
68  UINT32 OemRevision;         //   24
69  UINT32 CreatorId;           //   28
70  UINT32 CreatorRevision;     //   32
71  UINT32 FirmwareCtrl;        //   36
72  UINT32 DSDT;                //   40
73  UINT8 Reserved;             //   44
74  UINT8 PreferredPmProfile;   //   45
75  UINT16 SciInt;              //   46
76  UINT32 SmiCmd;              //   48
77  UINT8 AcpiEnable;           //   52
78  UINT8 AcpiDisable;          //   53
79  UINT8 S4BiosReq;            //   54
80  UINT8 PStateCnt;            //   55
81  UINT32 Pm1aEvtBlk;          //   56
82  UINT32 Pm1bEvtBlk;          //   60
83  UINT32 Pm1aCntBlk;          //   64
84  UINT32 Pm1bCntBlk;          //   68
85  UINT32 Pm2CntBlk;           //   72
86  UINT32 PmTmrBlk;            //   76
87  UINT32 Gpe0Blk;             //   80
88  UINT32 Gpe1Blk;             //   84
89  UINT8 Pm1EvtLen;            //   88
90  UINT8 Pm1CntLen;            //   89
91  UINT8 PM2CntLen;            //   90
92  UINT8 PmTmrLen;             //   91
93  UINT8 Gpe0BlkLen;           //   92
94  UINT8 Gpe1BlkLen;           //   93
95  UINT8 Gpe1Base;             //   94
96  UINT8 CstCnt;               //   95
97  UINT16 PLvl2Lat;            //   96
98  UINT16 PLvl3Lat;            //   98
99  UINT16 FlushSize;           //  100
100  UINT16 FlushStride;         //  102
101  UINT8 DutyOffset;           //  104
102  UINT8 DutyWidth;            //  105
103  UINT8 DayAlrm;              //  106
104  UINT8 MonAlrm;              //  107
105  UINT8 Century;              //  108
106  UINT16 IapcBootArch;        //  109
107  UINT8 Reserved2;            //  111
108  UINT32 Flags;               //  112
109  UINT32 ResetReg [3];        //  116
110  UINT8 ResetValue;           //  128
111  UINT8 Reserved3 [3];        //  129
112  UINT64 XFirmwareCtrl;       //  132
113  UINT64 XDsdt;               //  140
114  UINT32 XPm1aEvtBlk [3];     //  148
115  UINT32 XPm1bEvtBlk [3];     //  160
116  UINT32 XPm1aCntBlk [3];     //  172
117  UINT32 XPm1bCntBlk [3];     //  184
118  UINT32 XPm2CntBlk [3];      //  196
119  UINT32 XPmTmrBlk [3];       //  208
120  UINT32 XGpe0Blk [3];        //  220
121  UINT32 XGpe1Blk [3];        //  232
122} ACPI_FADT;
123
124
125typedef struct {
126  UINT32 Signature;
127  UINT32 Length;
128  UINT8 Revision;
129  UINT8 Checksum;
130  UINT8 OemId[6];
131  UINT8 OemTableId[8];
132  UINT32 OemRevision;
133  UINT32 CreatorId;
134  UINT32 CreatorRevision;
135  UINT32 Entry[1];
136} ACPI_RSDT;
137
138
139#pragma pack()
140
141
142typedef struct {
143  UINT32 Signature;
144  CONST CHAR8 * pTableName;
145  CONST CHAR16 * pWebPage;
146} TABLE_SIGNATURE;
147
148
149CONST TABLE_SIGNATURE mTableId [] = {
150  { DSDT_SIGNATURE, "DSDT", PAGE_ACPI_DSDT },
151  { FADT_SIGNATURE, "FADT", PAGE_ACPI_FADT }
152};
153
154
155/**
156  Locate the RSDT table
157
158  @returns Table address or NULL if not found
159
160**/
161CONST ACPI_RSDT *
162LocateRsdt (
163  VOID
164  )
165{
166  CONST EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER * pRsdp10b;
167  CONST EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER * pRsdp30;
168  CONST ACPI_RSDT * pRsdt;
169  EFI_STATUS Status;
170
171  //
172  //  Use for/break instead of goto
173  //
174  pRsdt = NULL;
175  for ( ; ; ) {
176    //
177    //  Locate the RSDT
178    //
179    Status = EfiGetSystemConfigurationTable ( &gEfiAcpiTableGuid, (VOID **)&pRsdp30 );
180    if ( !EFI_ERROR ( Status )) {
181      pRsdt = (ACPI_RSDT *)pRsdp30->RsdtAddress;
182    }
183    else {
184      Status = EfiGetSystemConfigurationTable (&gEfiAcpi10TableGuid, (VOID **)&pRsdp10b );
185      if ( EFI_ERROR ( Status )) {
186        break;
187      }
188      pRsdt = (ACPI_RSDT *)pRsdp10b->RsdtAddress;
189    }
190    break;
191  }
192
193  //
194  //  The entry was not found
195  //
196  return pRsdt;
197}
198
199
200/**
201  Locate the specified table
202
203  @param [in] Signature     Table signature
204
205  @returns Table address or NULL if not found
206
207**/
208CONST VOID *
209LocateTable (
210  IN UINT32 Signature
211  )
212{
213  CONST UINT32 * pEnd;
214  CONST UINT32 * pEntry;
215  CONST EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER * pRsdp10b;
216  CONST EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER * pRsdp30;
217  CONST ACPI_RSDT * pRsdt;
218  CONST UINT32 * pSignature;
219  EFI_STATUS Status;
220
221  //
222  //  Use for/break instead of goto
223  //
224  for ( ; ; ) {
225    //
226    //  Locate the RSDT
227    //
228    Status = EfiGetSystemConfigurationTable ( &gEfiAcpiTableGuid, (VOID **)&pRsdp30 );
229    if ( !EFI_ERROR ( Status )) {
230      pRsdt = (ACPI_RSDT *)pRsdp30->RsdtAddress;
231    }
232    else {
233      Status = EfiGetSystemConfigurationTable (&gEfiAcpi10TableGuid, (VOID **)&pRsdp10b );
234      if ( EFI_ERROR ( Status )) {
235        break;
236      }
237      pRsdt = (ACPI_RSDT *)pRsdp10b->RsdtAddress;
238    }
239
240    //
241    //  Walk the list of entries
242    //
243    pEntry = &pRsdt->Entry [ 0 ];
244    pEnd = &pEntry [(( pRsdt->Length - sizeof ( *pRsdt )) >> 2 ) + 1 ];
245    while ( pEnd > pEntry ) {
246      //
247      //  The entry is actually a 32-bit physical table address
248      //  The first entry in the table is the 32-bit table signature
249      //
250      pSignature = (UINT32 *)*pEntry;
251      if ( *pSignature == Signature ) {
252        return (CONST VOID *) *pEntry;
253      }
254
255      //
256      //  Set the next entry
257      //
258      pEntry++;
259    }
260    break;
261  }
262
263  //
264  //  The entry was not found
265  //
266  return NULL;
267}
268
269
270/**
271  Display a row containing a hex value
272
273  @param [in] SocketFD      The socket's file descriptor to add to the list.
274  @param [in] pPort         The WSDT_PORT structure address
275  @param [in] pName         Address of a zero terminated name string
276  @param [in] Length        Length in bytes
277  @param [in] pChar         Address of the first character
278
279  @retval EFI_SUCCESS       The request was successfully processed
280
281**/
282EFI_STATUS
283RowAnsiArray (
284  IN int SocketFD,
285  IN WSDT_PORT * pPort,
286  IN CONST CHAR8 * pName,
287  IN UINTN Length,
288  IN CONST CHAR8 * pChar
289  )
290{
291  CONST CHAR8 * pData;
292  CONST CHAR8 * pEnd;
293  EFI_STATUS Status;
294
295  DBG_ENTER ( );
296
297  //
298  //  Use for/break instead of goto
299  //
300  for ( ; ; ) {
301    //
302    //  Start the row
303    //
304    Status = HttpSendAnsiString ( SocketFD,
305                                  pPort,
306                                  "<tr><td>" );
307    if ( EFI_ERROR ( Status )) {
308      break;
309    }
310    Status = HttpSendAnsiString ( SocketFD,
311                                  pPort,
312                                  pName );
313    if ( EFI_ERROR ( Status )) {
314      break;
315    }
316    Status = HttpSendAnsiString ( SocketFD,
317                                  pPort,
318                                  "</td><td><code>" );
319    if ( EFI_ERROR ( Status )) {
320      break;
321    }
322
323    //
324    //  Display the characters
325    //
326    pData = pChar;
327    pEnd = &pChar [ Length ];
328    while ( pEnd > pData ) {
329      Status = HttpSendCharacter ( SocketFD,
330                                   pPort,
331                                   *pData++,
332                                   " " );
333      if ( EFI_ERROR ( Status )) {
334        break;
335      }
336    }
337    if ( EFI_ERROR ( Status )) {
338      break;
339    }
340
341    //
342    //  Display the byte values
343    //
344    Status = HttpSendAnsiString ( SocketFD,
345                                  pPort,
346                                  "<br/>0x" );
347    if ( EFI_ERROR ( Status )) {
348      break;
349    }
350    pData = pChar;
351    while ( pEnd > pData ) {
352      Status = HttpSendHexBits ( SocketFD,
353                                 pPort,
354                                 8,
355                                 *pData++ );
356      if ( EFI_ERROR ( Status )) {
357        break;
358      }
359      if ( pEnd > pData ) {
360        Status = HttpSendAnsiString ( SocketFD,
361                                      pPort,
362                                      " 0x" );
363        if ( EFI_ERROR ( Status )) {
364          break;
365        }
366      }
367    }
368
369    //
370    //  Terminate the row
371    //
372    Status = HttpSendAnsiString ( SocketFD,
373                                  pPort,
374                                  "</code></td></tr>\r\n" );
375    break;
376  }
377
378  //
379  //  Return the operation status
380  //
381  DBG_EXIT_STATUS ( Status );
382  return Status;
383}
384
385
386/**
387  Format a row with a list of bytes
388
389  @param [in] SocketFD      The socket's file descriptor to add to the list.
390  @param [in] pPort         The WSDT_PORT structure address
391  @param [in] pName         Zero terminated name string
392  @param [in] ByteCount     The number of bytes to display
393  @param [in] pData         Address of the byte array
394
395  @retval EFI_SUCCESS       The request was successfully processed
396
397**/
398EFI_STATUS
399RowBytes (
400  IN int SocketFD,
401  IN WSDT_PORT * pPort,
402  IN CHAR8 * pName,
403  IN UINTN ByteCount,
404  IN CONST UINT8 * pData
405  )
406{
407  CONST UINT8 * pEnd;
408  EFI_STATUS Status;
409
410  //
411  //  Use for/break instead of goto
412  //
413  for ( ; ; ) {
414    //
415    //  Start the row
416    //
417    Status = HttpSendAnsiString ( SocketFD,
418                                  pPort,
419                                  "<tr><td>" );
420    if ( EFI_ERROR ( Status )) {
421      break;
422    }
423
424    //
425    //  Display the field name
426    //
427    Status = HttpSendAnsiString ( SocketFD,
428                                  pPort,
429                                  pName );
430    if ( EFI_ERROR ( Status )) {
431      break;
432    }
433
434    //
435    //  Display the field value
436    //
437    Status = HttpSendAnsiString ( SocketFD,
438                                  pPort,
439                                  "</td><td><code>0x" );
440    if ( EFI_ERROR ( Status )) {
441      break;
442    }
443    pEnd = &pData [ ByteCount ];
444    while ( pEnd > pData ) {
445      Status = HttpSendHexBits ( SocketFD,
446                                 pPort,
447                                 8,
448                                 *pData++ );
449      if ( EFI_ERROR ( Status )) {
450        break;
451      }
452      if ( pEnd > pData ) {
453        Status = HttpSendAnsiString ( SocketFD,
454                                      pPort,
455                                      " 0x" );
456        if ( EFI_ERROR ( Status )) {
457          break;
458        }
459      }
460    }
461    if ( EFI_ERROR ( Status )) {
462      break;
463    }
464
465    //
466    //  Terminate the row
467    //
468    Status = HttpSendAnsiString ( SocketFD,
469                                  pPort,
470                                  "</code></td></tr>\r\n" );
471    break;
472  }
473
474  //
475  //  Return the operation status
476  //
477  return Status;
478}
479
480
481/**
482  Format a row with a list of bytes
483
484  @param [in] SocketFD      The socket's file descriptor to add to the list.
485  @param [in] pPort         The WSDT_PORT structure address
486  @param [in] pName         Zero terminated name string
487  @param [in] ByteCount     The number of bytes to display
488  @param [in] pData         Address of the byte array
489
490  @retval EFI_SUCCESS       The request was successfully processed
491
492**/
493EFI_STATUS
494RowDump (
495  IN int SocketFD,
496  IN WSDT_PORT * pPort,
497  IN CHAR8 * pName,
498  IN UINTN ByteCount,
499  IN CONST UINT8 * pData
500  )
501{
502  EFI_STATUS Status;
503
504  //
505  //  Use for/break instead of goto
506  //
507  for ( ; ; ) {
508    //
509    //  Start the row
510    //
511    Status = HttpSendAnsiString ( SocketFD,
512                                  pPort,
513                                  "<tr><td>" );
514    if ( EFI_ERROR ( Status )) {
515      break;
516    }
517
518    //
519    //  Display the field name
520    //
521    Status = HttpSendAnsiString ( SocketFD,
522                                  pPort,
523                                  pName );
524    if ( EFI_ERROR ( Status )) {
525      break;
526    }
527
528    //
529    //  Start the field value
530    //
531    Status = HttpSendAnsiString ( SocketFD,
532                                  pPort,
533                                  "</td><td>" );
534    if ( EFI_ERROR ( Status )) {
535      break;
536    }
537
538    //
539    //  Dump the buffer
540    //
541    Status = HttpSendDump ( SocketFD,
542                            pPort,
543                            ByteCount,
544                            pData );
545
546    //
547    //  Terminate the field value and row
548    //
549    Status = HttpSendAnsiString ( SocketFD,
550                                  pPort,
551                                  "</td></tr>\r\n" );
552    break;
553  }
554
555  //
556  //  Return the operation status
557  //
558  return Status;
559}
560
561
562/**
563  Format a row with a general address
564
565  @param [in] SocketFD      The socket's file descriptor to add to the list.
566  @param [in] pPort         The WSDT_PORT structure address
567  @param [in] pName         Zero terminated name string
568  @param [in] pAddr         Address of the general address buffer
569  @param [in] pWebPage      Zero terminated web page address
570
571  @retval EFI_SUCCESS       The request was successfully processed
572
573**/
574EFI_STATUS
575RowGenericAddress (
576  IN int SocketFD,
577  IN WSDT_PORT * pPort,
578  IN CHAR8 * pName,
579  IN CONST UINT32 * pAddr,
580  IN CONST CHAR16 * pWebPage
581  )
582{
583  CONST GENERIC_ADDRESS * pGenericAddress;
584  EFI_STATUS Status;
585
586  //
587  //  Use for/break instead of goto
588  //
589  for ( ; ; ) {
590    //
591    //  Start the row
592    //
593    Status = HttpSendAnsiString ( SocketFD,
594                                  pPort,
595                                  "<tr><td>" );
596    if ( EFI_ERROR ( Status )) {
597      break;
598    }
599
600    //
601    //  Display the field name
602    //
603    Status = HttpSendAnsiString ( SocketFD,
604                                  pPort,
605                                  pName );
606    if ( EFI_ERROR ( Status )) {
607      break;
608    }
609
610    //
611    //  Display the field value
612    //
613    Status = HttpSendAnsiString ( SocketFD,
614                                  pPort,
615                                  "</td><td><code>" );
616    if ( EFI_ERROR ( Status )) {
617      break;
618    }
619
620    //
621    //  Determine the type of address
622    //
623    pGenericAddress = (CONST GENERIC_ADDRESS *)pAddr;
624    if ( 0 == pGenericAddress->AddressSpaceId ) {
625      Status = HttpSendAnsiString ( SocketFD, pPort, "System Memory" );
626    }
627    else if ( 1 == pGenericAddress->AddressSpaceId ) {
628      Status = HttpSendAnsiString ( SocketFD, pPort, "I/O Space" );
629    }
630    else if ( 2 == pGenericAddress->AddressSpaceId ) {
631      Status = HttpSendAnsiString ( SocketFD, pPort, "PCI Configuration Space" );
632    }
633    else if ( 3 == pGenericAddress->AddressSpaceId ) {
634      Status = HttpSendAnsiString ( SocketFD, pPort, "Embedded Controller" );
635    }
636    else if ( 4 == pGenericAddress->AddressSpaceId ) {
637      Status = HttpSendAnsiString ( SocketFD, pPort, "SMBus" );
638    }
639    else if ( 0x7f == pGenericAddress->AddressSpaceId ) {
640      Status = HttpSendAnsiString ( SocketFD, pPort, "Functional Fixed Hardware" );
641    }
642    else if (( 0xc0 <= pGenericAddress->AddressSpaceId )
643      && ( 0xff >= pGenericAddress->AddressSpaceId )) {
644      Status = HttpSendAnsiString ( SocketFD, pPort, "OEM Defined" );
645    }
646    else {
647      Status = HttpSendAnsiString ( SocketFD, pPort, "Reserved" );
648    }
649    if ( EFI_ERROR ( Status )) {
650      break;
651    }
652    Status = HttpSendAnsiString ( SocketFD,
653                                  pPort,
654                                  "<br/>Register Bit Width: " );
655    if ( EFI_ERROR ( Status )) {
656      break;
657    }
658    Status = HttpSendValue ( SocketFD,
659                             pPort,
660                             pGenericAddress->RegisterBitWidth );
661    if ( EFI_ERROR ( Status )) {
662      break;
663    }
664    Status = HttpSendAnsiString ( SocketFD,
665                                  pPort,
666                                  "<br/>Register Bit Offset: " );
667    if ( EFI_ERROR ( Status )) {
668      break;
669    }
670    Status = HttpSendHexValue ( SocketFD,
671                                pPort,
672                                pGenericAddress->RegisterBitOffset );
673    if ( EFI_ERROR ( Status )) {
674      break;
675    }
676    Status = HttpSendAnsiString ( SocketFD,
677                                  pPort,
678                                  "<br/>Access Size: " );
679    if ( EFI_ERROR ( Status )) {
680      break;
681    }
682    Status = HttpSendValue ( SocketFD,
683                             pPort,
684                             pGenericAddress->AccessSize );
685    if ( EFI_ERROR ( Status )) {
686      break;
687    }
688    Status = HttpSendAnsiString ( SocketFD,
689                                  pPort,
690                                  "<br/>Address: " );
691    if ( EFI_ERROR ( Status )) {
692      break;
693    }
694
695    //
696    //  Add the web-page link if necessary
697    //
698    if ( NULL != pWebPage ) {
699      Status = HttpSendAnsiString ( SocketFD,
700                                    pPort,
701                                    "<a target=\"_blank\" href=\"" );
702      if ( EFI_ERROR ( Status )) {
703        break;
704      }
705      Status = HttpSendUnicodeString ( SocketFD,
706                                       pPort,
707                                       pWebPage );
708      if ( EFI_ERROR ( Status )) {
709        break;
710      }
711      Status = HttpSendAnsiString ( SocketFD,
712                                    pPort,
713                                    "\">" );
714      if ( EFI_ERROR ( Status )) {
715        break;
716      }
717    }
718
719    //
720    //  Display the address
721    //
722    Status = HttpSendAnsiString ( SocketFD,
723                                  pPort,
724                                  "0x" );
725    if ( EFI_ERROR ( Status )) {
726      break;
727    }
728    Status = HttpSendHexBits ( SocketFD,
729                               pPort,
730                               64,
731                               pGenericAddress->Address );
732    if ( EFI_ERROR ( Status )) {
733      break;
734    }
735
736    //
737    //  Finish the web-page link if necessary
738    //
739    if ( NULL != pWebPage ) {
740      Status = HttpSendAnsiString ( SocketFD,
741                                    pPort,
742                                    "</a>" );
743      if ( EFI_ERROR ( Status )) {
744        break;
745      }
746    }
747
748    //
749    //  Terminate the row
750    //
751    Status = HttpSendAnsiString ( SocketFD,
752                                  pPort,
753                                  "</code></td></tr>\r\n" );
754    break;
755  }
756
757  //
758  //  Return the operation status
759  //
760  return Status;
761}
762
763
764/**
765  Translate a table address into a web page
766
767  @param [in] pSignature      Address of the table signature
768  @param [out] ppTableName    Address to receive the table name address
769
770  @returns Zero terminated web page address or NULL if not found
771
772**/
773CONST CHAR16 *
774SignatureLookup (
775  IN UINT32 * pSignature,
776  OUT CONST CHAR8 ** ppTableName
777  )
778{
779  CONST TABLE_SIGNATURE * pTableId;
780  CONST TABLE_SIGNATURE * pEnd;
781  UINT32 Signature;
782
783  //
784  //  Walk the list of tables
785  //
786  Signature = *pSignature;
787  pTableId = &mTableId [ 0 ];
788  pEnd = &pTableId [ sizeof ( mTableId ) / sizeof ( mTableId [ 0 ])];
789  while ( pEnd > pTableId ) {
790    //
791    //  Attempt to locate the table signature
792    //
793    if ( pTableId->Signature == Signature ) {
794      //
795      //  The signature was found
796      //  Return the web page
797      //
798      *ppTableName = pTableId->pTableName;
799      return pTableId->pWebPage;
800    }
801
802    //
803    //  Set the next table
804    //
805    pTableId += 1;
806  }
807
808  //
809  //  The table was not found
810  //
811  *ppTableName = (CONST CHAR8 *)pSignature;
812  return NULL;
813}
814
815
816/**
817  Respond with the ACPI DSDT table
818
819  @param [in] SocketFD      The socket's file descriptor to add to the list.
820  @param [in] pPort         The WSDT_PORT structure address
821  @param [out] pbDone       Address to receive the request completion status
822
823  @retval EFI_SUCCESS       The request was successfully processed
824
825**/
826EFI_STATUS
827AcpiDsdtPage (
828  IN int SocketFD,
829  IN WSDT_PORT * pPort,
830  OUT BOOLEAN * pbDone
831  )
832{
833  CONST ACPI_DSDT * pDsdt;
834  CONST ACPI_FADT * pFadt;
835  EFI_STATUS Status;
836
837  DBG_ENTER ( );
838
839  //
840  //  Send the DADT page
841  //
842  for ( ; ; ) {
843    //
844    //  Locate the DADT
845    //
846    pFadt = (ACPI_FADT *)LocateTable ( FADT_SIGNATURE );
847    if ( NULL == pFadt ) {
848      Status = EFI_NOT_FOUND;
849      break;
850    }
851    pDsdt = (VOID *)pFadt->XDsdt;
852
853    //
854    //  Send the page and table header
855    //
856    Status = TableHeader ( SocketFD, pPort, L"DSDT - Differentiated System Description Table", pDsdt );
857    if ( EFI_ERROR ( Status )) {
858      break;
859    }
860
861    //
862    //  Display the DSDT header
863    //
864    Status = RowAnsiArray ( SocketFD,
865                            pPort,
866                            "Signature",
867                            sizeof ( pDsdt->Signature ),
868                            (CHAR8 *)&pDsdt->Signature );
869    if ( EFI_ERROR ( Status )) {
870      break;
871    }
872    Status = RowDecimalValue ( SocketFD,
873                               pPort,
874                               "Length",
875                               pDsdt->Length );
876    if ( EFI_ERROR ( Status )) {
877      break;
878    }
879    Status = RowDecimalValue ( SocketFD,
880                               pPort,
881                               "Revision",
882                               pDsdt->Revision );
883    if ( EFI_ERROR ( Status )) {
884      break;
885    }
886    Status = RowHexValue ( SocketFD,
887                           pPort,
888                           "Checksum",
889                           pDsdt->Checksum,
890                           NULL );
891    if ( EFI_ERROR ( Status )) {
892      break;
893    }
894    Status = RowAnsiArray ( SocketFD,
895                            pPort,
896                            "OEMID",
897                            sizeof ( pDsdt->OemId ),
898                            &pDsdt->OemId [ 0 ]);
899    if ( EFI_ERROR ( Status )) {
900      break;
901    }
902    Status = RowAnsiArray ( SocketFD,
903                            pPort,
904                            "OEM Table ID",
905                            sizeof ( pDsdt->OemTableId ),
906                            &pDsdt->OemTableId [ 0 ]);
907    if ( EFI_ERROR ( Status )) {
908      break;
909    }
910    Status = RowRevision ( SocketFD,
911                           pPort,
912                           "OEM Revision",
913                           pDsdt->OemRevision );
914    if ( EFI_ERROR ( Status )) {
915      break;
916    }
917    Status = RowAnsiArray ( SocketFD,
918                            pPort,
919                            "Creator ID",
920                            sizeof ( pDsdt->CreatorId ),
921                            (CHAR8 *)&pDsdt->CreatorId );
922    if ( EFI_ERROR ( Status )) {
923      break;
924    }
925    Status = RowRevision ( SocketFD,
926                           pPort,
927                           "Creator Revision",
928                           pDsdt->CreatorRevision );
929    if ( EFI_ERROR ( Status )) {
930      break;
931    }
932
933    //
934    //  Display the data from the DSDT
935    //
936    Status = RowDump ( SocketFD,
937                       pPort,
938                       "Definition Block",
939                       pDsdt->Length - sizeof ( *pDsdt ) + 1,
940                       &pDsdt->DefinitionBlock[0]);
941    if ( EFI_ERROR ( Status )) {
942      break;
943    }
944
945    //
946    //  Build the table trailer
947    //
948    Status = TableTrailer ( SocketFD,
949                            pPort,
950                            pbDone );
951    break;
952  }
953
954  //
955  //  Return the operation status
956  //
957  DBG_EXIT_STATUS ( Status );
958  return Status;
959}
960
961
962/**
963  Respond with the ACPI FADT table
964
965  @param [in] SocketFD      The socket's file descriptor to add to the list.
966  @param [in] pPort         The WSDT_PORT structure address
967  @param [out] pbDone       Address to receive the request completion status
968
969  @retval EFI_SUCCESS       The request was successfully processed
970
971**/
972EFI_STATUS
973AcpiFadtPage (
974  IN int SocketFD,
975  IN WSDT_PORT * pPort,
976  OUT BOOLEAN * pbDone
977  )
978{
979  CONST ACPI_FADT * pFadt;
980  EFI_STATUS Status;
981
982  DBG_ENTER ( );
983
984  //
985  //  Send the FADT page
986  //
987  for ( ; ; ) {
988    //
989    //  Locate the FADT
990    //
991    pFadt = (ACPI_FADT *)LocateTable ( FADT_SIGNATURE );
992    if ( NULL == pFadt ) {
993      Status = EFI_NOT_FOUND;
994      break;
995    }
996
997    //
998    //  Send the page and table header
999    //
1000    Status = TableHeader ( SocketFD, pPort, L"FADT - Fixed ACPI Description Table", pFadt );
1001    if ( EFI_ERROR ( Status )) {
1002      break;
1003    }
1004
1005    //
1006    //  Display the FSDT header
1007    //
1008    Status = RowAnsiArray ( SocketFD,
1009                            pPort,
1010                            "Signature",
1011                            sizeof ( pFadt->Signature ),
1012                            (CHAR8 *)&pFadt->Signature );
1013    if ( EFI_ERROR ( Status )) {
1014      break;
1015    }
1016    Status = RowDecimalValue ( SocketFD,
1017                               pPort,
1018                               "Length",
1019                               pFadt->Length );
1020    if ( EFI_ERROR ( Status )) {
1021      break;
1022    }
1023    Status = RowDecimalValue ( SocketFD,
1024                               pPort,
1025                               "Revision",
1026                               pFadt->Revision );
1027    if ( EFI_ERROR ( Status )) {
1028      break;
1029    }
1030    Status = RowHexValue ( SocketFD,
1031                           pPort,
1032                           "Checksum",
1033                           pFadt->Checksum,
1034                           NULL );
1035    if ( EFI_ERROR ( Status )) {
1036      break;
1037    }
1038    Status = RowAnsiArray ( SocketFD,
1039                            pPort,
1040                            "OEMID",
1041                            sizeof ( pFadt->OemId ),
1042                            &pFadt->OemId [ 0 ]);
1043    if ( EFI_ERROR ( Status )) {
1044      break;
1045    }
1046    Status = RowAnsiArray ( SocketFD,
1047                            pPort,
1048                            "OEM Table ID",
1049                            sizeof ( pFadt->OemTableId ),
1050                            &pFadt->OemTableId [ 0 ]);
1051    if ( EFI_ERROR ( Status )) {
1052      break;
1053    }
1054    Status = RowRevision ( SocketFD,
1055                           pPort,
1056                           "OEM Revision",
1057                           pFadt->OemRevision );
1058    if ( EFI_ERROR ( Status )) {
1059      break;
1060    }
1061    Status = RowAnsiArray ( SocketFD,
1062                            pPort,
1063                            "Creator ID",
1064                            sizeof ( pFadt->CreatorId ),
1065                            (CHAR8 *)&pFadt->CreatorId );
1066    if ( EFI_ERROR ( Status )) {
1067      break;
1068    }
1069    Status = RowRevision ( SocketFD,
1070                           pPort,
1071                           "Creator Revision",
1072                           pFadt->CreatorRevision );
1073    if ( EFI_ERROR ( Status )) {
1074      break;
1075    }
1076
1077    //
1078    //  Display the data from the FADT
1079    //
1080    Status = RowPointer ( SocketFD,
1081                          pPort,
1082                          "FIRMWARE_CTRL",
1083                          (CONST VOID *)pFadt->FirmwareCtrl,
1084                          NULL );
1085    if ( EFI_ERROR ( Status )) {
1086      break;
1087    }
1088    Status = RowPointer ( SocketFD,
1089                          pPort,
1090                          "DSDT",
1091                          (CONST VOID *)pFadt->DSDT,
1092                          ( pFadt->DSDT == pFadt->XDsdt ) ? PAGE_ACPI_DSDT : NULL );
1093    if ( EFI_ERROR ( Status )) {
1094      break;
1095    }
1096    Status = RowHexValue ( SocketFD,
1097                           pPort,
1098                           "Reserved",
1099                           pFadt->Reserved,
1100                           NULL );
1101    if ( EFI_ERROR ( Status )) {
1102      break;
1103    }
1104    Status = RowHexValue ( SocketFD,
1105                           pPort,
1106                           "Preferred_PM_Profile",
1107                           pFadt->PreferredPmProfile,
1108                           NULL );
1109    if ( EFI_ERROR ( Status )) {
1110      break;
1111    }
1112    Status = RowHexValue ( SocketFD,
1113                           pPort,
1114                           "SCI_INT",
1115                           pFadt->SciInt,
1116                           NULL );
1117    if ( EFI_ERROR ( Status )) {
1118      break;
1119    }
1120    Status = RowHexValue ( SocketFD,
1121                           pPort,
1122                           "SMI_CMD",
1123                           pFadt->SmiCmd,
1124                           NULL );
1125    if ( EFI_ERROR ( Status )) {
1126      break;
1127    }
1128    Status = RowHexValue ( SocketFD,
1129                           pPort,
1130                           "ACPI_ENABLE",
1131                           pFadt->AcpiEnable,
1132                           NULL );
1133    if ( EFI_ERROR ( Status )) {
1134      break;
1135    }
1136    Status = RowHexValue ( SocketFD,
1137                           pPort,
1138                           "ACPI_DISABLE",
1139                           pFadt->AcpiDisable,
1140                           NULL );
1141    if ( EFI_ERROR ( Status )) {
1142      break;
1143    }
1144    Status = RowHexValue ( SocketFD,
1145                           pPort,
1146                           "S4BIOS_REQ",
1147                           pFadt->S4BiosReq,
1148                           NULL );
1149    if ( EFI_ERROR ( Status )) {
1150      break;
1151    }
1152    Status = RowHexValue ( SocketFD,
1153                           pPort,
1154                           "PSTATE_CNT",
1155                           pFadt->PStateCnt,
1156                           NULL );
1157    if ( EFI_ERROR ( Status )) {
1158      break;
1159    }
1160    Status = RowHexValue ( SocketFD,
1161                           pPort,
1162                           "PM1a_EVT_BLK",
1163                           pFadt->Pm1aEvtBlk,
1164                           NULL );
1165    if ( EFI_ERROR ( Status )) {
1166      break;
1167    }
1168    Status = RowHexValue ( SocketFD,
1169                           pPort,
1170                           "PM1b_EVT_BLK",
1171                           pFadt->Pm1bEvtBlk,
1172                           NULL );
1173    if ( EFI_ERROR ( Status )) {
1174      break;
1175    }
1176    Status = RowHexValue ( SocketFD,
1177                           pPort,
1178                           "PM1a_CNT_BLK",
1179                           pFadt->Pm1aCntBlk,
1180                           NULL );
1181    if ( EFI_ERROR ( Status )) {
1182      break;
1183    }
1184    Status = RowHexValue ( SocketFD,
1185                           pPort,
1186                           "PM1b_CNT_BLK",
1187                           pFadt->Pm1bCntBlk,
1188                           NULL );
1189    if ( EFI_ERROR ( Status )) {
1190      break;
1191    }
1192    Status = RowHexValue ( SocketFD,
1193                           pPort,
1194                           "PM2_CNT_BLK",
1195                           pFadt->Pm2CntBlk,
1196                           NULL );
1197    if ( EFI_ERROR ( Status )) {
1198      break;
1199    }
1200    Status = RowHexValue ( SocketFD,
1201                           pPort,
1202                           "PM_TMR_BLK",
1203                           pFadt->PmTmrBlk,
1204                           NULL );
1205    if ( EFI_ERROR ( Status )) {
1206      break;
1207    }
1208
1209    Status = RowHexValue ( SocketFD,
1210                           pPort,
1211                           "GPE0_BLK",
1212                           pFadt->Gpe0Blk,
1213                           NULL );
1214    if ( EFI_ERROR ( Status )) {
1215      break;
1216    }
1217    Status = RowHexValue ( SocketFD,
1218                           pPort,
1219                           "GPE1_BLK",
1220                           pFadt->Gpe1Blk,
1221                           NULL );
1222    if ( EFI_ERROR ( Status )) {
1223      break;
1224    }
1225    Status = RowDecimalValue ( SocketFD,
1226                               pPort,
1227                               "PM1_EVT_LEN",
1228                               pFadt->Pm1EvtLen );
1229    if ( EFI_ERROR ( Status )) {
1230      break;
1231    }
1232    Status = RowDecimalValue ( SocketFD,
1233                               pPort,
1234                               "PM1_CNT_LEN",
1235                               pFadt->Pm1CntLen );
1236    if ( EFI_ERROR ( Status )) {
1237      break;
1238    }
1239    Status = RowDecimalValue ( SocketFD,
1240                               pPort,
1241                               "PM2_CNT_LEN",
1242                               pFadt->PM2CntLen );
1243    if ( EFI_ERROR ( Status )) {
1244      break;
1245    }
1246    Status = RowDecimalValue ( SocketFD,
1247                               pPort,
1248                               "PM_TMR_LEN",
1249                               pFadt->PmTmrLen );
1250    if ( EFI_ERROR ( Status )) {
1251      break;
1252    }
1253    Status = RowDecimalValue ( SocketFD,
1254                               pPort,
1255                               "GPE0_BLK_LEN",
1256                               pFadt->Gpe0BlkLen );
1257    if ( EFI_ERROR ( Status )) {
1258      break;
1259    }
1260    Status = RowDecimalValue ( SocketFD,
1261                               pPort,
1262                               "GPE1_BLK_LEN",
1263                               pFadt->Gpe1BlkLen );
1264    if ( EFI_ERROR ( Status )) {
1265      break;
1266    }
1267    Status = RowHexValue ( SocketFD,
1268                           pPort,
1269                           "GPE1_BASE",
1270                           pFadt->Gpe1Base,
1271                           NULL );
1272    if ( EFI_ERROR ( Status )) {
1273      break;
1274    }
1275    Status = RowDecimalValue ( SocketFD,
1276                               pPort,
1277                               "CST_CNT",
1278                               pFadt->CstCnt );
1279    if ( EFI_ERROR ( Status )) {
1280      break;
1281    }
1282    Status = RowHexValue ( SocketFD,
1283                           pPort,
1284                           "P_LVL2_LAT",
1285                           pFadt->PLvl2Lat,
1286                           NULL );
1287    if ( EFI_ERROR ( Status )) {
1288      break;
1289    }
1290    Status = RowHexValue ( SocketFD,
1291                           pPort,
1292                           "P_LVL3_LAT",
1293                           pFadt->PLvl3Lat,
1294                           NULL );
1295    if ( EFI_ERROR ( Status )) {
1296      break;
1297    }
1298    Status = RowDecimalValue ( SocketFD,
1299                               pPort,
1300                               "FLUSH_SIZE",
1301                               pFadt->FlushSize );
1302    if ( EFI_ERROR ( Status )) {
1303      break;
1304    }
1305    Status = RowDecimalValue ( SocketFD,
1306                               pPort,
1307                               "FLUSH_Stride",
1308                               pFadt->FlushStride );
1309    if ( EFI_ERROR ( Status )) {
1310      break;
1311    }
1312    Status = RowHexValue ( SocketFD,
1313                           pPort,
1314                           "DUTY_OFFSET",
1315                           pFadt->DutyOffset,
1316                           NULL );
1317    if ( EFI_ERROR ( Status )) {
1318      break;
1319    }
1320    Status = RowHexValue ( SocketFD,
1321                           pPort,
1322                           "DUTY_WIDTH",
1323                           pFadt->DutyWidth,
1324                           NULL );
1325    if ( EFI_ERROR ( Status )) {
1326      break;
1327    }
1328    Status = RowHexValue ( SocketFD,
1329                           pPort,
1330                           "DAY_ALRM",
1331                           pFadt->DayAlrm,
1332                           NULL );
1333    if ( EFI_ERROR ( Status )) {
1334      break;
1335    }
1336    Status = RowHexValue ( SocketFD,
1337                           pPort,
1338                           "MON_ALRM",
1339                           pFadt->MonAlrm,
1340                           NULL );
1341    if ( EFI_ERROR ( Status )) {
1342      break;
1343    }
1344    Status = RowHexValue ( SocketFD,
1345                           pPort,
1346                           "CENTURY",
1347                           pFadt->Century,
1348                           NULL );
1349    if ( EFI_ERROR ( Status )) {
1350      break;
1351    }
1352    Status = RowHexValue ( SocketFD,
1353                           pPort,
1354                           "IAPC_BOOT_ARCH",
1355                           pFadt->IapcBootArch,
1356                           NULL );
1357    if ( EFI_ERROR ( Status )) {
1358      break;
1359    }
1360    Status = RowHexValue ( SocketFD,
1361                           pPort,
1362                           "Reserved",
1363                           pFadt->Reserved2,
1364                           NULL );
1365    if ( EFI_ERROR ( Status )) {
1366      break;
1367    }
1368    Status = RowHexValue ( SocketFD,
1369                           pPort,
1370                           "Flags",
1371                           pFadt->Flags,
1372                           NULL );
1373    if ( EFI_ERROR ( Status )) {
1374      break;
1375    }
1376    Status = RowGenericAddress ( SocketFD,
1377                                 pPort,
1378                                 "RESET_REG",
1379                                 &pFadt->ResetReg[0],
1380                                 NULL );
1381    if ( EFI_ERROR ( Status )) {
1382      break;
1383    }
1384    Status = RowHexValue ( SocketFD,
1385                           pPort,
1386                           "RESET_VALUE",
1387                           pFadt->ResetValue,
1388                           NULL );
1389    if ( EFI_ERROR ( Status )) {
1390      break;
1391    }
1392    Status = RowHexValue ( SocketFD,
1393                           pPort,
1394                           "Reserved",
1395                           pFadt->Reserved3[0],
1396                           NULL );
1397    if ( EFI_ERROR ( Status )) {
1398      break;
1399    }
1400    Status = RowHexValue ( SocketFD,
1401                           pPort,
1402                           "Reserved",
1403                           pFadt->Reserved3[1],
1404                           NULL );
1405    if ( EFI_ERROR ( Status )) {
1406      break;
1407    }
1408    Status = RowHexValue ( SocketFD,
1409                           pPort,
1410                           "Reserved",
1411                           pFadt->Reserved3[2],
1412                           NULL );
1413    if ( EFI_ERROR ( Status )) {
1414      break;
1415    }
1416    Status = RowHexValue ( SocketFD,
1417                           pPort,
1418                           "X_FIRMWARE_CTRL",
1419                           pFadt->XFirmwareCtrl,
1420                           NULL );
1421    if ( EFI_ERROR ( Status )) {
1422      break;
1423    }
1424    Status = RowHexValue ( SocketFD,
1425                           pPort,
1426                           "X_DSDT",
1427                           pFadt->XDsdt,
1428                           PAGE_ACPI_DSDT );
1429    if ( EFI_ERROR ( Status )) {
1430      break;
1431    }
1432    Status = RowGenericAddress ( SocketFD,
1433                                 pPort,
1434                                 "X_PM1a_EVT_BLK",
1435                                 &pFadt->XPm1aEvtBlk[0],
1436                                 NULL );
1437    if ( EFI_ERROR ( Status )) {
1438      break;
1439    }
1440    Status = RowGenericAddress ( SocketFD,
1441                                 pPort,
1442                                 "X_PM1b_EVT_BLK",
1443                                 &pFadt->XPm1bEvtBlk[0],
1444                                 NULL );
1445    if ( EFI_ERROR ( Status )) {
1446      break;
1447    }
1448    Status = RowGenericAddress ( SocketFD,
1449                                 pPort,
1450                                 "X_PM1a_CNT_BLK",
1451                                 &pFadt->XPm1aCntBlk[0],
1452                                 NULL );
1453    if ( EFI_ERROR ( Status )) {
1454      break;
1455    }
1456    Status = RowGenericAddress ( SocketFD,
1457                                 pPort,
1458                                 "X_PM1b_CNT_BLK",
1459                                 &pFadt->XPm1bCntBlk[0],
1460                                 NULL );
1461    if ( EFI_ERROR ( Status )) {
1462      break;
1463    }
1464    Status = RowGenericAddress ( SocketFD,
1465                                 pPort,
1466                                 "X_PM2_CNT_BLK",
1467                                 &pFadt->XPm2CntBlk[0],
1468                                 NULL );
1469    if ( EFI_ERROR ( Status )) {
1470      break;
1471    }
1472    Status = RowGenericAddress ( SocketFD,
1473                                 pPort,
1474                                 "X_PM_TMR_BLK",
1475                                 &pFadt->XPmTmrBlk[0],
1476                                 NULL );
1477    if ( EFI_ERROR ( Status )) {
1478      break;
1479    }
1480    Status = RowGenericAddress ( SocketFD,
1481                                 pPort,
1482                                 "X_GPE0_BLK",
1483                                 &pFadt->XGpe0Blk[0],
1484                                 NULL );
1485    if ( EFI_ERROR ( Status )) {
1486      break;
1487    }
1488    Status = RowGenericAddress ( SocketFD,
1489                                 pPort,
1490                                 "X_GPE1_BLK",
1491                                 &pFadt->XGpe1Blk[0],
1492                                 NULL );
1493    if ( EFI_ERROR ( Status )) {
1494      break;
1495    }
1496
1497    //
1498    //  Build the table trailer
1499    //
1500    Status = TableTrailer ( SocketFD,
1501                            pPort,
1502                            pbDone );
1503    break;
1504  }
1505
1506  //
1507  //  Return the operation status
1508  //
1509  DBG_EXIT_STATUS ( Status );
1510  return Status;
1511}
1512
1513
1514/**
1515  Respond with the ACPI RSDP 1.0b table
1516
1517  @param [in] SocketFD      The socket's file descriptor to add to the list.
1518  @param [in] pPort         The WSDT_PORT structure address
1519  @param [out] pbDone       Address to receive the request completion status
1520
1521  @retval EFI_SUCCESS       The request was successfully processed
1522
1523**/
1524EFI_STATUS
1525AcpiRsdp10Page (
1526  IN int SocketFD,
1527  IN WSDT_PORT * pPort,
1528  OUT BOOLEAN * pbDone
1529  )
1530{
1531  CONST EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER * pRsdp10b;
1532  EFI_STATUS Status;
1533
1534  DBG_ENTER ( );
1535
1536  //
1537  //  Send the RSDP page
1538  //
1539  for ( ; ; ) {
1540    //
1541    //  Locate the RSDP
1542    //
1543    Status = EfiGetSystemConfigurationTable ( &gEfiAcpi10TableGuid, (VOID **) &pRsdp10b );
1544    if ( EFI_ERROR ( Status )) {
1545      break;
1546    }
1547
1548    //
1549    //  Send the page and table header
1550    //
1551    Status = TableHeader ( SocketFD, pPort, L"RSDP - ACPI 1.0b Root System Description Pointer", pRsdp10b );
1552    if ( EFI_ERROR ( Status )) {
1553      break;
1554    }
1555
1556    //
1557    //  Display the RSDP
1558    //
1559    Status = RowAnsiArray ( SocketFD,
1560                            pPort,
1561                            "Signature",
1562                            sizeof ( pRsdp10b->Signature ),
1563                            (CHAR8 *)&pRsdp10b->Signature );
1564    if ( EFI_ERROR ( Status )) {
1565      break;
1566    }
1567    Status = RowHexValue ( SocketFD,
1568                           pPort,
1569                           "Checksum",
1570                           pRsdp10b->Checksum,
1571                           NULL );
1572    if ( EFI_ERROR ( Status )) {
1573      break;
1574    }
1575    Status = RowAnsiArray ( SocketFD,
1576                            pPort,
1577                            "OemId",
1578                            sizeof ( pRsdp10b->OemId ),
1579                            &pRsdp10b->OemId [ 0 ]);
1580    if ( EFI_ERROR ( Status )) {
1581      break;
1582    }
1583    Status = RowHexValue ( SocketFD,
1584                           pPort,
1585                           "Reserved",
1586                           pRsdp10b->Reserved,
1587                           NULL );
1588    if ( EFI_ERROR ( Status )) {
1589      break;
1590    }
1591    Status = RowPointer ( SocketFD,
1592                          pPort,
1593                          "RsdtAddress",
1594                          (VOID *)pRsdp10b->RsdtAddress,
1595                          PAGE_ACPI_RSDT );
1596    if ( EFI_ERROR ( Status )) {
1597      break;
1598    }
1599
1600    //
1601    //  Build the table trailer
1602    //
1603    Status = TableTrailer ( SocketFD,
1604                            pPort,
1605                            pbDone );
1606    break;
1607  }
1608
1609  //
1610  //  Return the operation status
1611  //
1612  DBG_EXIT_STATUS ( Status );
1613  return Status;
1614}
1615
1616
1617/**
1618  Respond with the ACPI RSDP 3.0 table
1619
1620  @param [in] SocketFD      The socket's file descriptor to add to the list.
1621  @param [in] pPort         The WSDT_PORT structure address
1622  @param [out] pbDone       Address to receive the request completion status
1623
1624  @retval EFI_SUCCESS       The request was successfully processed
1625
1626**/
1627EFI_STATUS
1628AcpiRsdp30Page (
1629  IN int SocketFD,
1630  IN WSDT_PORT * pPort,
1631  OUT BOOLEAN * pbDone
1632  )
1633{
1634  CONST EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER * pRsdp30;
1635  EFI_STATUS Status;
1636
1637  DBG_ENTER ( );
1638
1639  //
1640  //  Send the RSDP page
1641  //
1642  for ( ; ; ) {
1643    //
1644    //  Locate the RSDP
1645    //
1646    Status = EfiGetSystemConfigurationTable ( &gEfiAcpiTableGuid, (VOID **) &pRsdp30 );
1647    if ( EFI_ERROR ( Status )) {
1648      break;
1649    }
1650
1651    //
1652    //  Send the page and table header
1653    //
1654    Status = TableHeader ( SocketFD, pPort, L"RSDP - ACPI 3.0 Root System Description Pointer", pRsdp30 );
1655    if ( EFI_ERROR ( Status )) {
1656      break;
1657    }
1658
1659    //
1660    //  Display the RSDP
1661    //
1662    Status = RowAnsiArray ( SocketFD,
1663                            pPort,
1664                            "Signature",
1665                            sizeof ( pRsdp30->Signature ),
1666                            (CHAR8 *)&pRsdp30->Signature );
1667    if ( EFI_ERROR ( Status )) {
1668      break;
1669    }
1670    Status = RowHexValue ( SocketFD,
1671                           pPort,
1672                           "Checksum",
1673                           pRsdp30->Checksum,
1674                           NULL );
1675    if ( EFI_ERROR ( Status )) {
1676      break;
1677    }
1678    Status = RowAnsiArray ( SocketFD,
1679                            pPort,
1680                            "OemId",
1681                            sizeof ( pRsdp30->OemId ),
1682                            &pRsdp30->OemId [ 0 ]);
1683    if ( EFI_ERROR ( Status )) {
1684      break;
1685    }
1686    Status = RowHexValue ( SocketFD,
1687                           pPort,
1688                           "Revision",
1689                           pRsdp30->Revision,
1690                           NULL );
1691    if ( EFI_ERROR ( Status )) {
1692      break;
1693    }
1694    Status = RowPointer ( SocketFD,
1695                          pPort,
1696                          "RsdtAddress",
1697                          (VOID *)pRsdp30->RsdtAddress,
1698                          PAGE_ACPI_RSDT );
1699    if ( EFI_ERROR ( Status )) {
1700      break;
1701    }
1702    Status = RowDecimalValue ( SocketFD,
1703                               pPort,
1704                               "Length",
1705                               pRsdp30->Length );
1706    if ( EFI_ERROR ( Status )) {
1707      break;
1708    }
1709    Status = RowPointer ( SocketFD,
1710                          pPort,
1711                          "XsdtAddress",
1712                          (VOID *)pRsdp30->XsdtAddress,
1713                          NULL );
1714    if ( EFI_ERROR ( Status )) {
1715      break;
1716    }
1717    Status = RowHexValue ( SocketFD,
1718                           pPort,
1719                           "ExtendedChecksum",
1720                           pRsdp30->ExtendedChecksum,
1721                           NULL );
1722    if ( EFI_ERROR ( Status )) {
1723      break;
1724    }
1725    Status = RowBytes ( SocketFD,
1726                        pPort,
1727                        "Reserved",
1728                        sizeof ( pRsdp30->Reserved ),
1729                        &pRsdp30->Reserved [ 0 ]);
1730    if ( EFI_ERROR ( Status )) {
1731      break;
1732    }
1733
1734    //
1735    //  Build the table trailer
1736    //
1737    Status = TableTrailer ( SocketFD,
1738                            pPort,
1739                            pbDone );
1740    break;
1741  }
1742
1743  //
1744  //  Return the operation status
1745  //
1746  DBG_EXIT_STATUS ( Status );
1747  return Status;
1748}
1749
1750
1751/**
1752  Respond with the ACPI RSDT table
1753
1754  @param [in] SocketFD      The socket's file descriptor to add to the list.
1755  @param [in] pPort         The WSDT_PORT structure address
1756  @param [out] pbDone       Address to receive the request completion status
1757
1758  @retval EFI_SUCCESS       The request was successfully processed
1759
1760**/
1761EFI_STATUS
1762AcpiRsdtPage (
1763  IN int SocketFD,
1764  IN WSDT_PORT * pPort,
1765  OUT BOOLEAN * pbDone
1766  )
1767{
1768  CONST UINT32 * pEnd;
1769  CONST UINT32 * pEntry;
1770  CONST ACPI_RSDT * pRsdt;
1771  CONST CHAR8 * pTableName;
1772  CONST CHAR16 * pWebPage;
1773  EFI_STATUS Status;
1774  UINT32 TableName [ 2 ];
1775
1776  DBG_ENTER ( );
1777
1778  //
1779  //  Send the RSDT page
1780  //
1781  for ( ; ; ) {
1782    //
1783    //  Locate the RSDT
1784    //
1785    pRsdt = LocateRsdt ( );
1786    if ( NULL == pRsdt ) {
1787      Status = EFI_NOT_FOUND;
1788      break;
1789    }
1790
1791    //
1792    //  Send the page and table header
1793    //
1794    Status = TableHeader ( SocketFD, pPort, L"RSDT - ACPI Root System Description Table", pRsdt );
1795    if ( EFI_ERROR ( Status )) {
1796      break;
1797    }
1798
1799    //
1800    //  Display the RSDT
1801    //
1802    Status = RowAnsiArray ( SocketFD,
1803                            pPort,
1804                            "Signature",
1805                            sizeof ( pRsdt->Signature ),
1806                            (CHAR8 *)&pRsdt->Signature );
1807    if ( EFI_ERROR ( Status )) {
1808      break;
1809    }
1810    Status = RowDecimalValue ( SocketFD,
1811                               pPort,
1812                               "Length",
1813                               pRsdt->Length );
1814    if ( EFI_ERROR ( Status )) {
1815      break;
1816    }
1817    Status = RowDecimalValue ( SocketFD,
1818                               pPort,
1819                               "Revision",
1820                               pRsdt->Revision );
1821    if ( EFI_ERROR ( Status )) {
1822      break;
1823    }
1824    Status = RowHexValue ( SocketFD,
1825                           pPort,
1826                           "Checksum",
1827                           pRsdt->Checksum,
1828                           NULL );
1829    if ( EFI_ERROR ( Status )) {
1830      break;
1831    }
1832    Status = RowAnsiArray ( SocketFD,
1833                            pPort,
1834                            "OEMID",
1835                            sizeof ( pRsdt->OemId ),
1836                            &pRsdt->OemId [ 0 ]);
1837    if ( EFI_ERROR ( Status )) {
1838      break;
1839    }
1840    Status = RowAnsiArray ( SocketFD,
1841                            pPort,
1842                            "OEM Table ID",
1843                            sizeof ( pRsdt->OemTableId ),
1844                            &pRsdt->OemTableId [ 0 ]);
1845    if ( EFI_ERROR ( Status )) {
1846      break;
1847    }
1848    Status = RowRevision ( SocketFD,
1849                           pPort,
1850                           "OEM Revision",
1851                           pRsdt->OemRevision );
1852    if ( EFI_ERROR ( Status )) {
1853      break;
1854    }
1855    Status = RowAnsiArray ( SocketFD,
1856                            pPort,
1857                            "Creator ID",
1858                            sizeof ( pRsdt->CreatorId ),
1859                            (CHAR8 *)&pRsdt->CreatorId );
1860    if ( EFI_ERROR ( Status )) {
1861      break;
1862    }
1863    Status = RowRevision ( SocketFD,
1864                           pPort,
1865                           "Creator Revision",
1866                           pRsdt->CreatorRevision );
1867    if ( EFI_ERROR ( Status )) {
1868      break;
1869    }
1870
1871    //
1872    //  Walk the list of entries
1873    //
1874    pEntry = &pRsdt->Entry [ 0 ];
1875    pEnd = &pEntry [(( pRsdt->Length - sizeof ( *pRsdt )) >> 2 ) + 1 ];
1876    TableName [ 1 ] = 0;
1877    while ( pEnd > pEntry ) {
1878      //
1879      //  The entry is actually a 32-bit physical table address
1880      //  The first entry in the table is the 32-bit table signature
1881      //
1882      TableName [ 0 ] = *(UINT32 *)*pEntry;
1883      pWebPage = SignatureLookup ( &TableName [ 0 ], &pTableName );
1884
1885      //
1886      //  Display the table address
1887      //
1888      Status = RowPointer ( SocketFD,
1889                            pPort,
1890                            pTableName,
1891                            (VOID *)*pEntry,
1892                            pWebPage );
1893      if ( EFI_ERROR ( Status )) {
1894        break;
1895      }
1896      pEntry++;
1897    }
1898    if ( EFI_ERROR ( Status )) {
1899      break;
1900    }
1901
1902    //
1903    //  Build the table trailer
1904    //
1905    Status = TableTrailer ( SocketFD,
1906                            pPort,
1907                            pbDone );
1908    break;
1909  }
1910
1911  //
1912  //  Return the operation status
1913  //
1914  DBG_EXIT_STATUS ( Status );
1915  return Status;
1916}
1917
1918
1919