3 Display the ACPI tables
5 Copyright (c) 2011-2012, Intel Corporation. All rights reserved.
6 SPDX-License-Identifier: BSD-2-Clause-Patent
10 #include <WebServer.h>
11 #include <Guid/Acpi.h>
12 #include <IndustryStandard/Acpi10.h>
13 #include <IndustryStandard/Acpi30.h>
15 #if defined(_MSC_VER) // Handle Microsoft VC++ compiler specifics.
16 #pragma warning ( disable : 4305 )
17 #endif // defined(_MSC_VER)
20 // Ensure proper structure formats
26 UINT8 RegisterBitWidth
;
27 UINT8 RegisterBitOffset
;
34 UINT32 Signature
; // 0
39 UINT8 OemTableId
[8]; // 16
40 UINT32 OemRevision
; // 24
41 UINT32 CreatorId
; // 28
42 UINT32 CreatorRevision
; // 32
43 UINT8 DefinitionBlock
[1]; // 36
48 UINT32 Signature
; // 0
53 UINT8 OemTableId
[8]; // 16
54 UINT32 OemRevision
; // 24
55 UINT32 CreatorId
; // 28
56 UINT32 CreatorRevision
; // 32
57 UINT32 FirmwareCtrl
; // 36
60 UINT8 PreferredPmProfile
; // 45
63 UINT8 AcpiEnable
; // 52
64 UINT8 AcpiDisable
; // 53
65 UINT8 S4BiosReq
; // 54
66 UINT8 PStateCnt
; // 55
67 UINT32 Pm1aEvtBlk
; // 56
68 UINT32 Pm1bEvtBlk
; // 60
69 UINT32 Pm1aCntBlk
; // 64
70 UINT32 Pm1bCntBlk
; // 68
71 UINT32 Pm2CntBlk
; // 72
72 UINT32 PmTmrBlk
; // 76
75 UINT8 Pm1EvtLen
; // 88
76 UINT8 Pm1CntLen
; // 89
77 UINT8 PM2CntLen
; // 90
79 UINT8 Gpe0BlkLen
; // 92
80 UINT8 Gpe1BlkLen
; // 93
83 UINT16 PLvl2Lat
; // 96
84 UINT16 PLvl3Lat
; // 98
85 UINT16 FlushSize
; // 100
86 UINT16 FlushStride
; // 102
87 UINT8 DutyOffset
; // 104
88 UINT8 DutyWidth
; // 105
92 UINT16 IapcBootArch
; // 109
93 UINT8 Reserved2
; // 111
95 UINT32 ResetReg
[3]; // 116
96 UINT8 ResetValue
; // 128
97 UINT8 Reserved3
[3]; // 129
98 UINT64 XFirmwareCtrl
; // 132
100 UINT32 XPm1aEvtBlk
[3]; // 148
101 UINT32 XPm1bEvtBlk
[3]; // 160
102 UINT32 XPm1aCntBlk
[3]; // 172
103 UINT32 XPm1bCntBlk
[3]; // 184
104 UINT32 XPm2CntBlk
[3]; // 196
105 UINT32 XPmTmrBlk
[3]; // 208
106 UINT32 XGpe0Blk
[3]; // 220
107 UINT32 XGpe1Blk
[3]; // 232
120 UINT32 CreatorRevision
;
126 UINT32 Signature
; // 0
135 CONST CHAR8
* pTableName
;
136 CONST CHAR16
* pWebPage
;
140 CONST TABLE_SIGNATURE mTableId
[] = {
141 { APIC_SIGNATURE
, "APIC", PAGE_ACPI_APIC
},
142 { BGRT_SIGNATURE
, "BGRT", PAGE_ACPI_BGRT
},
143 { DSDT_SIGNATURE
, "DSDT", PAGE_ACPI_DSDT
},
144 { FADT_SIGNATURE
, "FADT", PAGE_ACPI_FADT
},
145 { HPET_SIGNATURE
, "HPET", PAGE_ACPI_HPET
},
146 { MCFG_SIGNATURE
, "MCFG", PAGE_ACPI_MCFG
},
147 { SSDT_SIGNATURE
, "SSDT", PAGE_ACPI_SSDT
},
148 { TCPA_SIGNATURE
, "TCPA", PAGE_ACPI_TCPA
},
149 { UEFI_SIGNATURE
, "UEFI", PAGE_ACPI_UEFI
}
154 Locate the RSDT table
156 @return Table address or NULL if not found
164 CONST EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER
* pRsdp10b
;
165 CONST EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER
* pRsdp30
;
166 CONST ACPI_RSDT
* pRsdt
;
170 // Use for/break instead of goto
177 Status
= EfiGetSystemConfigurationTable ( &gEfiAcpiTableGuid
, (VOID
**)&pRsdp30
);
178 if ( !EFI_ERROR ( Status
)) {
179 pRsdt
= (ACPI_RSDT
*)(UINTN
)pRsdp30
->RsdtAddress
;
182 Status
= EfiGetSystemConfigurationTable (&gEfiAcpi10TableGuid
, (VOID
**)&pRsdp10b
);
183 if ( EFI_ERROR ( Status
)) {
186 pRsdt
= (ACPI_RSDT
*)(UINTN
)pRsdp10b
->RsdtAddress
;
192 // The entry was not found
199 Locate the specified table
201 @param [in] Signature Table signature
203 @return Table address or NULL if not found
212 CONST UINT32
* pEntry
;
213 CONST EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER
* pRsdp10b
;
214 CONST EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER
* pRsdp30
;
215 CONST ACPI_RSDT
* pRsdt
;
216 CONST UINT32
* pSignature
;
220 // Use for/break instead of goto
226 Status
= EfiGetSystemConfigurationTable ( &gEfiAcpiTableGuid
, (VOID
**)&pRsdp30
);
227 if ( !EFI_ERROR ( Status
)) {
228 pRsdt
= (ACPI_RSDT
*)(UINTN
)pRsdp30
->RsdtAddress
;
231 Status
= EfiGetSystemConfigurationTable (&gEfiAcpi10TableGuid
, (VOID
**)&pRsdp10b
);
232 if ( EFI_ERROR ( Status
)) {
235 pRsdt
= (ACPI_RSDT
*)(UINTN
)pRsdp10b
->RsdtAddress
;
239 // Walk the list of entries
241 pEntry
= &pRsdt
->Entry
[ 0 ];
242 pEnd
= &pEntry
[(( pRsdt
->Length
- sizeof ( *pRsdt
)) >> 2 ) + 1 ];
243 while ( pEnd
> pEntry
) {
245 // The entry is actually a 32-bit physical table address
246 // The first entry in the table is the 32-bit table signature
248 pSignature
= (UINT32
*)(UINTN
)*pEntry
;
249 if ( *pSignature
== Signature
) {
250 return (CONST VOID
*)(UINTN
)*pEntry
;
254 // Set the next entry
262 // The entry was not found
269 Display a row containing a hex value
271 @param [in] SocketFD The socket's file descriptor to add to the list.
272 @param [in] pPort The WSDT_PORT structure address
273 @param [in] pName Address of a zero terminated name string
274 @param [in] Length Length in bytes
275 @param [in] pChar Address of the first character
277 @retval EFI_SUCCESS The request was successfully processed
283 IN WSDT_PORT
* pPort
,
284 IN CONST CHAR8
* pName
,
286 IN CONST CHAR8
* pChar
296 // Use for/break instead of goto
302 Status
= HttpSendAnsiString ( SocketFD
,
305 if ( EFI_ERROR ( Status
)) {
308 Status
= HttpSendAnsiString ( SocketFD
,
311 if ( EFI_ERROR ( Status
)) {
314 Status
= HttpSendAnsiString ( SocketFD
,
317 if ( EFI_ERROR ( Status
)) {
322 // Display the characters
325 pEnd
= &pChar
[ Length
];
326 while ( pEnd
> pData
) {
327 Status
= HttpSendCharacter ( SocketFD
,
331 if ( EFI_ERROR ( Status
)) {
335 if ( EFI_ERROR ( Status
)) {
340 // Display the byte values
342 Status
= HttpSendAnsiString ( SocketFD
,
345 if ( EFI_ERROR ( Status
)) {
349 while ( pEnd
> pData
) {
350 Status
= HttpSendHexBits ( SocketFD
,
354 if ( EFI_ERROR ( Status
)) {
357 if ( pEnd
> pData
) {
358 Status
= HttpSendAnsiString ( SocketFD
,
361 if ( EFI_ERROR ( Status
)) {
370 Status
= HttpSendAnsiString ( SocketFD
,
372 "</code></td></tr>\r\n" );
377 // Return the operation status
379 DBG_EXIT_STATUS ( Status
);
385 Format a row with a list of bytes
387 @param [in] SocketFD The socket's file descriptor to add to the list.
388 @param [in] pPort The WSDT_PORT structure address
389 @param [in] pName Zero terminated name string
390 @param [in] ByteCount The number of bytes to display
391 @param [in] pData Address of the byte array
393 @retval EFI_SUCCESS The request was successfully processed
399 IN WSDT_PORT
* pPort
,
402 IN CONST UINT8
* pData
409 // Use for/break instead of goto
415 Status
= HttpSendAnsiString ( SocketFD
,
418 if ( EFI_ERROR ( Status
)) {
423 // Display the field name
425 Status
= HttpSendAnsiString ( SocketFD
,
428 if ( EFI_ERROR ( Status
)) {
433 // Display the field value
435 Status
= HttpSendAnsiString ( SocketFD
,
437 "</td><td><code>0x" );
438 if ( EFI_ERROR ( Status
)) {
441 pEnd
= &pData
[ ByteCount
];
442 while ( pEnd
> pData
) {
443 Status
= HttpSendHexBits ( SocketFD
,
447 if ( EFI_ERROR ( Status
)) {
450 if ( pEnd
> pData
) {
451 Status
= HttpSendAnsiString ( SocketFD
,
454 if ( EFI_ERROR ( Status
)) {
459 if ( EFI_ERROR ( Status
)) {
466 Status
= HttpSendAnsiString ( SocketFD
,
468 "</code></td></tr>\r\n" );
473 // Return the operation status
480 Format a row with a list of bytes
482 @param [in] SocketFD The socket's file descriptor to add to the list.
483 @param [in] pPort The WSDT_PORT structure address
484 @param [in] pName Zero terminated name string
485 @param [in] ByteCount The number of bytes to display
486 @param [in] pData Address of the byte array
488 @retval EFI_SUCCESS The request was successfully processed
494 IN WSDT_PORT
* pPort
,
497 IN CONST UINT8
* pData
503 // Use for/break instead of goto
509 Status
= HttpSendAnsiString ( SocketFD
,
512 if ( EFI_ERROR ( Status
)) {
517 // Display the field name
519 Status
= HttpSendAnsiString ( SocketFD
,
522 if ( EFI_ERROR ( Status
)) {
527 // Start the field value
529 Status
= HttpSendAnsiString ( SocketFD
,
532 if ( EFI_ERROR ( Status
)) {
539 Status
= HttpSendDump ( SocketFD
,
545 // Terminate the field value and row
547 Status
= HttpSendAnsiString ( SocketFD
,
554 // Return the operation status
561 Format a row with a general address
563 @param [in] SocketFD The socket's file descriptor to add to the list.
564 @param [in] pPort The WSDT_PORT structure address
565 @param [in] pName Zero terminated name string
566 @param [in] pAddr Address of the general address buffer
567 @param [in] pWebPage Zero terminated web page address
569 @retval EFI_SUCCESS The request was successfully processed
575 IN WSDT_PORT
* pPort
,
577 IN CONST UINT32
* pAddr
,
578 IN CONST CHAR16
* pWebPage
581 CONST GENERIC_ADDRESS
* pGenericAddress
;
585 // Use for/break instead of goto
591 Status
= HttpSendAnsiString ( SocketFD
,
594 if ( EFI_ERROR ( Status
)) {
599 // Display the field name
601 Status
= HttpSendAnsiString ( SocketFD
,
604 if ( EFI_ERROR ( Status
)) {
609 // Display the field value
611 Status
= HttpSendAnsiString ( SocketFD
,
614 if ( EFI_ERROR ( Status
)) {
619 // Determine the type of address
621 pGenericAddress
= (CONST GENERIC_ADDRESS
*)pAddr
;
622 if ( 0 == pGenericAddress
->AddressSpaceId
) {
623 Status
= HttpSendAnsiString ( SocketFD
, pPort
, "System Memory" );
625 else if ( 1 == pGenericAddress
->AddressSpaceId
) {
626 Status
= HttpSendAnsiString ( SocketFD
, pPort
, "I/O Space" );
628 else if ( 2 == pGenericAddress
->AddressSpaceId
) {
629 Status
= HttpSendAnsiString ( SocketFD
, pPort
, "PCI Configuration Space" );
631 else if ( 3 == pGenericAddress
->AddressSpaceId
) {
632 Status
= HttpSendAnsiString ( SocketFD
, pPort
, "Embedded Controller" );
634 else if ( 4 == pGenericAddress
->AddressSpaceId
) {
635 Status
= HttpSendAnsiString ( SocketFD
, pPort
, "SMBus" );
637 else if ( 0x7f == pGenericAddress
->AddressSpaceId
) {
638 Status
= HttpSendAnsiString ( SocketFD
, pPort
, "Functional Fixed Hardware" );
640 else if (( 0xc0 <= pGenericAddress
->AddressSpaceId
)
641 && ( 0xff >= pGenericAddress
->AddressSpaceId
)) {
642 Status
= HttpSendAnsiString ( SocketFD
, pPort
, "OEM Defined" );
645 Status
= HttpSendAnsiString ( SocketFD
, pPort
, "Reserved" );
647 if ( EFI_ERROR ( Status
)) {
650 Status
= HttpSendAnsiString ( SocketFD
,
652 "<br/>Register Bit Width: " );
653 if ( EFI_ERROR ( Status
)) {
656 Status
= HttpSendValue ( SocketFD
,
658 pGenericAddress
->RegisterBitWidth
);
659 if ( EFI_ERROR ( Status
)) {
662 Status
= HttpSendAnsiString ( SocketFD
,
664 "<br/>Register Bit Offset: " );
665 if ( EFI_ERROR ( Status
)) {
668 Status
= HttpSendHexValue ( SocketFD
,
670 pGenericAddress
->RegisterBitOffset
);
671 if ( EFI_ERROR ( Status
)) {
674 Status
= HttpSendAnsiString ( SocketFD
,
676 "<br/>Access Size: " );
677 if ( EFI_ERROR ( Status
)) {
680 Status
= HttpSendValue ( SocketFD
,
682 pGenericAddress
->AccessSize
);
683 if ( EFI_ERROR ( Status
)) {
686 Status
= HttpSendAnsiString ( SocketFD
,
689 if ( EFI_ERROR ( Status
)) {
694 // Add the web-page link if necessary
696 if ( NULL
!= pWebPage
) {
697 Status
= HttpSendAnsiString ( SocketFD
,
699 "<a target=\"_blank\" href=\"" );
700 if ( EFI_ERROR ( Status
)) {
703 Status
= HttpSendUnicodeString ( SocketFD
,
706 if ( EFI_ERROR ( Status
)) {
709 Status
= HttpSendAnsiString ( SocketFD
,
712 if ( EFI_ERROR ( Status
)) {
718 // Display the address
720 Status
= HttpSendAnsiString ( SocketFD
,
723 if ( EFI_ERROR ( Status
)) {
726 Status
= HttpSendHexBits ( SocketFD
,
729 pGenericAddress
->Address
);
730 if ( EFI_ERROR ( Status
)) {
735 // Finish the web-page link if necessary
737 if ( NULL
!= pWebPage
) {
738 Status
= HttpSendAnsiString ( SocketFD
,
741 if ( EFI_ERROR ( Status
)) {
749 Status
= HttpSendAnsiString ( SocketFD
,
751 "</code></td></tr>\r\n" );
756 // Return the operation status
763 Translate a table address into a web page
765 @param [in] pSignature Address of the table signature
766 @param [out] ppTableName Address to receive the table name address
768 @return Zero terminated web page address or NULL if not found
773 IN UINT32
* pSignature
,
774 OUT CONST CHAR8
** ppTableName
777 CONST TABLE_SIGNATURE
* pTableId
;
778 CONST TABLE_SIGNATURE
* pEnd
;
782 // Walk the list of tables
784 Signature
= *pSignature
;
785 pTableId
= &mTableId
[ 0 ];
786 pEnd
= &pTableId
[ sizeof ( mTableId
) / sizeof ( mTableId
[ 0 ])];
787 while ( pEnd
> pTableId
) {
789 // Attempt to locate the table signature
791 if ( pTableId
->Signature
== Signature
) {
793 // The signature was found
794 // Return the web page
796 *ppTableName
= pTableId
->pTableName
;
797 return pTableId
->pWebPage
;
801 // Set the next table
807 // The table was not found
809 *ppTableName
= (CONST CHAR8
*)pSignature
;
815 Respond with the APIC table
817 @param [in] SocketFD The socket's file descriptor to add to the list.
818 @param [in] pPort The WSDT_PORT structure address
819 @param [out] pbDone Address to receive the request completion status
821 @retval EFI_SUCCESS The request was successfully processed
827 IN WSDT_PORT
* pPort
,
831 CONST ACPI_UNKNOWN
* pApic
;
837 // Send the APIC page
843 pApic
= (ACPI_UNKNOWN
*)LocateTable ( APIC_SIGNATURE
);
844 if ( NULL
== pApic
) {
845 Status
= EFI_NOT_FOUND
;
850 // Send the page and table header
852 Status
= TableHeader ( SocketFD
, pPort
, L
"APIC Table", pApic
);
853 if ( EFI_ERROR ( Status
)) {
858 // Display the header
860 Status
= RowAnsiArray ( SocketFD
,
863 sizeof ( pApic
->Signature
),
864 (CHAR8
*)&pApic
->Signature
);
865 if ( EFI_ERROR ( Status
)) {
868 Status
= RowDecimalValue ( SocketFD
,
872 if ( EFI_ERROR ( Status
)) {
877 // Display the data from the table
879 Status
= RowDump ( SocketFD
,
882 pApic
->Length
- sizeof ( *pApic
) + 1,
883 (UINT8
*)( pApic
+ 1 ));
884 if ( EFI_ERROR ( Status
)) {
889 // Build the table trailer
891 Status
= TableTrailer ( SocketFD
,
898 // Return the operation status
900 DBG_EXIT_STATUS ( Status
);
906 Respond with the BGRT table
908 @param [in] SocketFD The socket's file descriptor to add to the list.
909 @param [in] pPort The WSDT_PORT structure address
910 @param [out] pbDone Address to receive the request completion status
912 @retval EFI_SUCCESS The request was successfully processed
918 IN WSDT_PORT
* pPort
,
922 CONST ACPI_UNKNOWN
* pBgrt
;
928 // Send the BGRT page
934 pBgrt
= (ACPI_UNKNOWN
*)LocateTable ( BGRT_SIGNATURE
);
935 if ( NULL
== pBgrt
) {
936 Status
= EFI_NOT_FOUND
;
941 // Send the page and table header
943 Status
= TableHeader ( SocketFD
, pPort
, L
"BGRT Table", pBgrt
);
944 if ( EFI_ERROR ( Status
)) {
949 // Display the header
951 Status
= RowAnsiArray ( SocketFD
,
954 sizeof ( pBgrt
->Signature
),
955 (CHAR8
*)&pBgrt
->Signature
);
956 if ( EFI_ERROR ( Status
)) {
959 Status
= RowDecimalValue ( SocketFD
,
963 if ( EFI_ERROR ( Status
)) {
968 // Display the data from the table
970 Status
= RowDump ( SocketFD
,
973 pBgrt
->Length
- sizeof ( *pBgrt
) + 1,
974 (UINT8
*)( pBgrt
+ 1 ));
975 if ( EFI_ERROR ( Status
)) {
980 // Build the table trailer
982 Status
= TableTrailer ( SocketFD
,
989 // Return the operation status
991 DBG_EXIT_STATUS ( Status
);
997 Respond with the ACPI DSDT table
999 @param [in] SocketFD The socket's file descriptor to add to the list.
1000 @param [in] pPort The WSDT_PORT structure address
1001 @param [out] pbDone Address to receive the request completion status
1003 @retval EFI_SUCCESS The request was successfully processed
1009 IN WSDT_PORT
* pPort
,
1010 OUT BOOLEAN
* pbDone
1013 CONST ACPI_DSDT
* pDsdt
;
1014 CONST ACPI_FADT
* pFadt
;
1020 // Send the DADT page
1026 pFadt
= (ACPI_FADT
*)LocateTable ( FADT_SIGNATURE
);
1027 if ( NULL
== pFadt
) {
1028 Status
= EFI_NOT_FOUND
;
1031 pDsdt
= (VOID
*)(UINTN
)pFadt
->XDsdt
;
1034 // Send the page and table header
1036 Status
= TableHeader ( SocketFD
, pPort
, L
"DSDT - Differentiated System Description Table", pDsdt
);
1037 if ( EFI_ERROR ( Status
)) {
1042 // Display the DSDT header
1044 Status
= RowAnsiArray ( SocketFD
,
1047 sizeof ( pDsdt
->Signature
),
1048 (CHAR8
*)&pDsdt
->Signature
);
1049 if ( EFI_ERROR ( Status
)) {
1052 Status
= RowDecimalValue ( SocketFD
,
1056 if ( EFI_ERROR ( Status
)) {
1059 Status
= RowDecimalValue ( SocketFD
,
1063 if ( EFI_ERROR ( Status
)) {
1066 Status
= RowHexValue ( SocketFD
,
1071 if ( EFI_ERROR ( Status
)) {
1074 Status
= RowAnsiArray ( SocketFD
,
1077 sizeof ( pDsdt
->OemId
),
1078 (CONST CHAR8
*)&pDsdt
->OemId
[ 0 ]);
1079 if ( EFI_ERROR ( Status
)) {
1082 Status
= RowAnsiArray ( SocketFD
,
1085 sizeof ( pDsdt
->OemTableId
),
1086 (CONST CHAR8
*)&pDsdt
->OemTableId
[ 0 ]);
1087 if ( EFI_ERROR ( Status
)) {
1090 Status
= RowRevision ( SocketFD
,
1093 pDsdt
->OemRevision
);
1094 if ( EFI_ERROR ( Status
)) {
1097 Status
= RowAnsiArray ( SocketFD
,
1100 sizeof ( pDsdt
->CreatorId
),
1101 (CHAR8
*)&pDsdt
->CreatorId
);
1102 if ( EFI_ERROR ( Status
)) {
1105 Status
= RowRevision ( SocketFD
,
1108 pDsdt
->CreatorRevision
);
1109 if ( EFI_ERROR ( Status
)) {
1114 // Display the data from the DSDT
1116 Status
= RowDump ( SocketFD
,
1119 pDsdt
->Length
- sizeof ( *pDsdt
) + 1,
1120 &pDsdt
->DefinitionBlock
[0]);
1121 if ( EFI_ERROR ( Status
)) {
1126 // Build the table trailer
1128 Status
= TableTrailer ( SocketFD
,
1135 // Return the operation status
1137 DBG_EXIT_STATUS ( Status
);
1143 Respond with the ACPI FADT table
1145 @param [in] SocketFD The socket's file descriptor to add to the list.
1146 @param [in] pPort The WSDT_PORT structure address
1147 @param [out] pbDone Address to receive the request completion status
1149 @retval EFI_SUCCESS The request was successfully processed
1155 IN WSDT_PORT
* pPort
,
1156 OUT BOOLEAN
* pbDone
1159 CONST ACPI_FADT
* pFadt
;
1165 // Send the FADT page
1171 pFadt
= (ACPI_FADT
*)LocateTable ( FADT_SIGNATURE
);
1172 if ( NULL
== pFadt
) {
1173 Status
= EFI_NOT_FOUND
;
1178 // Send the page and table header
1180 Status
= TableHeader ( SocketFD
, pPort
, L
"FADT - Fixed ACPI Description Table", pFadt
);
1181 if ( EFI_ERROR ( Status
)) {
1186 // Display the FSDT header
1188 Status
= RowAnsiArray ( SocketFD
,
1191 sizeof ( pFadt
->Signature
),
1192 (CHAR8
*)&pFadt
->Signature
);
1193 if ( EFI_ERROR ( Status
)) {
1196 Status
= RowDecimalValue ( SocketFD
,
1200 if ( EFI_ERROR ( Status
)) {
1203 Status
= RowDecimalValue ( SocketFD
,
1207 if ( EFI_ERROR ( Status
)) {
1210 Status
= RowHexValue ( SocketFD
,
1215 if ( EFI_ERROR ( Status
)) {
1218 Status
= RowAnsiArray ( SocketFD
,
1221 sizeof ( pFadt
->OemId
),
1222 (CONST CHAR8
*)&pFadt
->OemId
[ 0 ]);
1223 if ( EFI_ERROR ( Status
)) {
1226 Status
= RowAnsiArray ( SocketFD
,
1229 sizeof ( pFadt
->OemTableId
),
1230 (CONST CHAR8
*)&pFadt
->OemTableId
[ 0 ]);
1231 if ( EFI_ERROR ( Status
)) {
1234 Status
= RowRevision ( SocketFD
,
1237 pFadt
->OemRevision
);
1238 if ( EFI_ERROR ( Status
)) {
1241 Status
= RowAnsiArray ( SocketFD
,
1244 sizeof ( pFadt
->CreatorId
),
1245 (CHAR8
*)&pFadt
->CreatorId
);
1246 if ( EFI_ERROR ( Status
)) {
1249 Status
= RowRevision ( SocketFD
,
1252 pFadt
->CreatorRevision
);
1253 if ( EFI_ERROR ( Status
)) {
1258 // Display the data from the FADT
1260 Status
= RowPointer ( SocketFD
,
1263 (CONST VOID
*)(UINTN
)pFadt
->FirmwareCtrl
,
1265 if ( EFI_ERROR ( Status
)) {
1268 Status
= RowPointer ( SocketFD
,
1271 (CONST VOID
*)(UINTN
)pFadt
->DSDT
,
1272 ( pFadt
->DSDT
== pFadt
->XDsdt
) ? PAGE_ACPI_DSDT
: NULL
);
1273 if ( EFI_ERROR ( Status
)) {
1276 Status
= RowHexValue ( SocketFD
,
1281 if ( EFI_ERROR ( Status
)) {
1284 Status
= RowHexValue ( SocketFD
,
1286 "Preferred_PM_Profile",
1287 pFadt
->PreferredPmProfile
,
1289 if ( EFI_ERROR ( Status
)) {
1292 Status
= RowHexValue ( SocketFD
,
1297 if ( EFI_ERROR ( Status
)) {
1300 Status
= RowHexValue ( SocketFD
,
1305 if ( EFI_ERROR ( Status
)) {
1308 Status
= RowHexValue ( SocketFD
,
1313 if ( EFI_ERROR ( Status
)) {
1316 Status
= RowHexValue ( SocketFD
,
1321 if ( EFI_ERROR ( Status
)) {
1324 Status
= RowHexValue ( SocketFD
,
1329 if ( EFI_ERROR ( Status
)) {
1332 Status
= RowHexValue ( SocketFD
,
1337 if ( EFI_ERROR ( Status
)) {
1340 Status
= RowHexValue ( SocketFD
,
1345 if ( EFI_ERROR ( Status
)) {
1348 Status
= RowHexValue ( SocketFD
,
1353 if ( EFI_ERROR ( Status
)) {
1356 Status
= RowHexValue ( SocketFD
,
1361 if ( EFI_ERROR ( Status
)) {
1364 Status
= RowHexValue ( SocketFD
,
1369 if ( EFI_ERROR ( Status
)) {
1372 Status
= RowHexValue ( SocketFD
,
1377 if ( EFI_ERROR ( Status
)) {
1380 Status
= RowHexValue ( SocketFD
,
1385 if ( EFI_ERROR ( Status
)) {
1389 Status
= RowHexValue ( SocketFD
,
1394 if ( EFI_ERROR ( Status
)) {
1397 Status
= RowHexValue ( SocketFD
,
1402 if ( EFI_ERROR ( Status
)) {
1405 Status
= RowDecimalValue ( SocketFD
,
1409 if ( EFI_ERROR ( Status
)) {
1412 Status
= RowDecimalValue ( SocketFD
,
1416 if ( EFI_ERROR ( Status
)) {
1419 Status
= RowDecimalValue ( SocketFD
,
1423 if ( EFI_ERROR ( Status
)) {
1426 Status
= RowDecimalValue ( SocketFD
,
1430 if ( EFI_ERROR ( Status
)) {
1433 Status
= RowDecimalValue ( SocketFD
,
1436 pFadt
->Gpe0BlkLen
);
1437 if ( EFI_ERROR ( Status
)) {
1440 Status
= RowDecimalValue ( SocketFD
,
1443 pFadt
->Gpe1BlkLen
);
1444 if ( EFI_ERROR ( Status
)) {
1447 Status
= RowHexValue ( SocketFD
,
1452 if ( EFI_ERROR ( Status
)) {
1455 Status
= RowDecimalValue ( SocketFD
,
1459 if ( EFI_ERROR ( Status
)) {
1462 Status
= RowHexValue ( SocketFD
,
1467 if ( EFI_ERROR ( Status
)) {
1470 Status
= RowHexValue ( SocketFD
,
1475 if ( EFI_ERROR ( Status
)) {
1478 Status
= RowDecimalValue ( SocketFD
,
1482 if ( EFI_ERROR ( Status
)) {
1485 Status
= RowDecimalValue ( SocketFD
,
1488 pFadt
->FlushStride
);
1489 if ( EFI_ERROR ( Status
)) {
1492 Status
= RowHexValue ( SocketFD
,
1497 if ( EFI_ERROR ( Status
)) {
1500 Status
= RowHexValue ( SocketFD
,
1505 if ( EFI_ERROR ( Status
)) {
1508 Status
= RowHexValue ( SocketFD
,
1513 if ( EFI_ERROR ( Status
)) {
1516 Status
= RowHexValue ( SocketFD
,
1521 if ( EFI_ERROR ( Status
)) {
1524 Status
= RowHexValue ( SocketFD
,
1529 if ( EFI_ERROR ( Status
)) {
1532 Status
= RowHexValue ( SocketFD
,
1535 pFadt
->IapcBootArch
,
1537 if ( EFI_ERROR ( Status
)) {
1540 Status
= RowHexValue ( SocketFD
,
1545 if ( EFI_ERROR ( Status
)) {
1548 Status
= RowHexValue ( SocketFD
,
1553 if ( EFI_ERROR ( Status
)) {
1556 Status
= RowGenericAddress ( SocketFD
,
1559 &pFadt
->ResetReg
[0],
1561 if ( EFI_ERROR ( Status
)) {
1564 Status
= RowHexValue ( SocketFD
,
1569 if ( EFI_ERROR ( Status
)) {
1572 Status
= RowHexValue ( SocketFD
,
1575 pFadt
->Reserved3
[0],
1577 if ( EFI_ERROR ( Status
)) {
1580 Status
= RowHexValue ( SocketFD
,
1583 pFadt
->Reserved3
[1],
1585 if ( EFI_ERROR ( Status
)) {
1588 Status
= RowHexValue ( SocketFD
,
1591 pFadt
->Reserved3
[2],
1593 if ( EFI_ERROR ( Status
)) {
1596 Status
= RowHexValue ( SocketFD
,
1599 pFadt
->XFirmwareCtrl
,
1601 if ( EFI_ERROR ( Status
)) {
1604 Status
= RowHexValue ( SocketFD
,
1609 if ( EFI_ERROR ( Status
)) {
1612 Status
= RowGenericAddress ( SocketFD
,
1615 &pFadt
->XPm1aEvtBlk
[0],
1617 if ( EFI_ERROR ( Status
)) {
1620 Status
= RowGenericAddress ( SocketFD
,
1623 &pFadt
->XPm1bEvtBlk
[0],
1625 if ( EFI_ERROR ( Status
)) {
1628 Status
= RowGenericAddress ( SocketFD
,
1631 &pFadt
->XPm1aCntBlk
[0],
1633 if ( EFI_ERROR ( Status
)) {
1636 Status
= RowGenericAddress ( SocketFD
,
1639 &pFadt
->XPm1bCntBlk
[0],
1641 if ( EFI_ERROR ( Status
)) {
1644 Status
= RowGenericAddress ( SocketFD
,
1647 &pFadt
->XPm2CntBlk
[0],
1649 if ( EFI_ERROR ( Status
)) {
1652 Status
= RowGenericAddress ( SocketFD
,
1655 &pFadt
->XPmTmrBlk
[0],
1657 if ( EFI_ERROR ( Status
)) {
1660 Status
= RowGenericAddress ( SocketFD
,
1663 &pFadt
->XGpe0Blk
[0],
1665 if ( EFI_ERROR ( Status
)) {
1668 Status
= RowGenericAddress ( SocketFD
,
1671 &pFadt
->XGpe1Blk
[0],
1673 if ( EFI_ERROR ( Status
)) {
1678 // Build the table trailer
1680 Status
= TableTrailer ( SocketFD
,
1687 // Return the operation status
1689 DBG_EXIT_STATUS ( Status
);
1695 Respond with the HPET table
1697 @param [in] SocketFD The socket's file descriptor to add to the list.
1698 @param [in] pPort The WSDT_PORT structure address
1699 @param [out] pbDone Address to receive the request completion status
1701 @retval EFI_SUCCESS The request was successfully processed
1707 IN WSDT_PORT
* pPort
,
1708 OUT BOOLEAN
* pbDone
1711 CONST ACPI_UNKNOWN
* pHpet
;
1717 // Send the HPET page
1723 pHpet
= (ACPI_UNKNOWN
*)LocateTable ( HPET_SIGNATURE
);
1724 if ( NULL
== pHpet
) {
1725 Status
= EFI_NOT_FOUND
;
1730 // Send the page and table header
1732 Status
= TableHeader ( SocketFD
, pPort
, L
"HPET Table", pHpet
);
1733 if ( EFI_ERROR ( Status
)) {
1738 // Display the header
1740 Status
= RowAnsiArray ( SocketFD
,
1743 sizeof ( pHpet
->Signature
),
1744 (CHAR8
*)&pHpet
->Signature
);
1745 if ( EFI_ERROR ( Status
)) {
1748 Status
= RowDecimalValue ( SocketFD
,
1752 if ( EFI_ERROR ( Status
)) {
1757 // Display the data from the table
1759 Status
= RowDump ( SocketFD
,
1762 pHpet
->Length
- sizeof ( *pHpet
) + 1,
1763 (UINT8
*)( pHpet
+ 1 ));
1764 if ( EFI_ERROR ( Status
)) {
1769 // Build the table trailer
1771 Status
= TableTrailer ( SocketFD
,
1778 // Return the operation status
1780 DBG_EXIT_STATUS ( Status
);
1786 Respond with the MCFG table
1788 @param [in] SocketFD The socket's file descriptor to add to the list.
1789 @param [in] pPort The WSDT_PORT structure address
1790 @param [out] pbDone Address to receive the request completion status
1792 @retval EFI_SUCCESS The request was successfully processed
1798 IN WSDT_PORT
* pPort
,
1799 OUT BOOLEAN
* pbDone
1802 CONST ACPI_UNKNOWN
* pMcfg
;
1808 // Send the MCFG page
1814 pMcfg
= (ACPI_UNKNOWN
*)LocateTable ( MCFG_SIGNATURE
);
1815 if ( NULL
== pMcfg
) {
1816 Status
= EFI_NOT_FOUND
;
1821 // Send the page and table header
1823 Status
= TableHeader ( SocketFD
, pPort
, L
"MCFG Table", pMcfg
);
1824 if ( EFI_ERROR ( Status
)) {
1829 // Display the header
1831 Status
= RowAnsiArray ( SocketFD
,
1834 sizeof ( pMcfg
->Signature
),
1835 (CHAR8
*)&pMcfg
->Signature
);
1836 if ( EFI_ERROR ( Status
)) {
1839 Status
= RowDecimalValue ( SocketFD
,
1843 if ( EFI_ERROR ( Status
)) {
1848 // Display the data from the table
1850 Status
= RowDump ( SocketFD
,
1853 pMcfg
->Length
- sizeof ( *pMcfg
) + 1,
1854 (UINT8
*)( pMcfg
+ 1 ));
1855 if ( EFI_ERROR ( Status
)) {
1860 // Build the table trailer
1862 Status
= TableTrailer ( SocketFD
,
1869 // Return the operation status
1871 DBG_EXIT_STATUS ( Status
);
1877 Respond with the ACPI RSDP 1.0b table
1879 @param [in] SocketFD The socket's file descriptor to add to the list.
1880 @param [in] pPort The WSDT_PORT structure address
1881 @param [out] pbDone Address to receive the request completion status
1883 @retval EFI_SUCCESS The request was successfully processed
1889 IN WSDT_PORT
* pPort
,
1890 OUT BOOLEAN
* pbDone
1893 CONST EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER
* pRsdp10b
;
1899 // Send the RSDP page
1905 Status
= EfiGetSystemConfigurationTable ( &gEfiAcpi10TableGuid
, (VOID
**) &pRsdp10b
);
1906 if ( EFI_ERROR ( Status
)) {
1911 // Send the page and table header
1913 Status
= TableHeader ( SocketFD
, pPort
, L
"RSDP - ACPI 1.0b Root System Description Pointer", pRsdp10b
);
1914 if ( EFI_ERROR ( Status
)) {
1921 Status
= RowAnsiArray ( SocketFD
,
1924 sizeof ( pRsdp10b
->Signature
),
1925 (CHAR8
*)&pRsdp10b
->Signature
);
1926 if ( EFI_ERROR ( Status
)) {
1929 Status
= RowHexValue ( SocketFD
,
1934 if ( EFI_ERROR ( Status
)) {
1937 Status
= RowAnsiArray ( SocketFD
,
1940 sizeof ( pRsdp10b
->OemId
),
1941 (CONST CHAR8
*)&pRsdp10b
->OemId
[ 0 ]);
1942 if ( EFI_ERROR ( Status
)) {
1945 Status
= RowHexValue ( SocketFD
,
1950 if ( EFI_ERROR ( Status
)) {
1953 Status
= RowPointer ( SocketFD
,
1956 (VOID
*)(UINTN
)pRsdp10b
->RsdtAddress
,
1958 if ( EFI_ERROR ( Status
)) {
1963 // Build the table trailer
1965 Status
= TableTrailer ( SocketFD
,
1972 // Return the operation status
1974 DBG_EXIT_STATUS ( Status
);
1980 Respond with the ACPI RSDP 3.0 table
1982 @param [in] SocketFD The socket's file descriptor to add to the list.
1983 @param [in] pPort The WSDT_PORT structure address
1984 @param [out] pbDone Address to receive the request completion status
1986 @retval EFI_SUCCESS The request was successfully processed
1992 IN WSDT_PORT
* pPort
,
1993 OUT BOOLEAN
* pbDone
1996 CONST EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER
* pRsdp30
;
2002 // Send the RSDP page
2008 Status
= EfiGetSystemConfigurationTable ( &gEfiAcpiTableGuid
, (VOID
**) &pRsdp30
);
2009 if ( EFI_ERROR ( Status
)) {
2014 // Send the page and table header
2016 Status
= TableHeader ( SocketFD
, pPort
, L
"RSDP - ACPI 3.0 Root System Description Pointer", pRsdp30
);
2017 if ( EFI_ERROR ( Status
)) {
2024 Status
= RowAnsiArray ( SocketFD
,
2027 sizeof ( pRsdp30
->Signature
),
2028 (CHAR8
*)&pRsdp30
->Signature
);
2029 if ( EFI_ERROR ( Status
)) {
2032 Status
= RowHexValue ( SocketFD
,
2037 if ( EFI_ERROR ( Status
)) {
2040 Status
= RowAnsiArray ( SocketFD
,
2043 sizeof ( pRsdp30
->OemId
),
2044 (CONST CHAR8
*)&pRsdp30
->OemId
[ 0 ]);
2045 if ( EFI_ERROR ( Status
)) {
2048 Status
= RowHexValue ( SocketFD
,
2053 if ( EFI_ERROR ( Status
)) {
2056 Status
= RowPointer ( SocketFD
,
2059 (VOID
*)(UINTN
)pRsdp30
->RsdtAddress
,
2061 if ( EFI_ERROR ( Status
)) {
2064 Status
= RowDecimalValue ( SocketFD
,
2068 if ( EFI_ERROR ( Status
)) {
2071 Status
= RowPointer ( SocketFD
,
2074 (VOID
*)(UINTN
)pRsdp30
->XsdtAddress
,
2076 if ( EFI_ERROR ( Status
)) {
2079 Status
= RowHexValue ( SocketFD
,
2082 pRsdp30
->ExtendedChecksum
,
2084 if ( EFI_ERROR ( Status
)) {
2087 Status
= RowBytes ( SocketFD
,
2090 sizeof ( pRsdp30
->Reserved
),
2091 &pRsdp30
->Reserved
[ 0 ]);
2092 if ( EFI_ERROR ( Status
)) {
2097 // Build the table trailer
2099 Status
= TableTrailer ( SocketFD
,
2106 // Return the operation status
2108 DBG_EXIT_STATUS ( Status
);
2114 Respond with the ACPI RSDT table
2116 @param [in] SocketFD The socket's file descriptor to add to the list.
2117 @param [in] pPort The WSDT_PORT structure address
2118 @param [out] pbDone Address to receive the request completion status
2120 @retval EFI_SUCCESS The request was successfully processed
2126 IN WSDT_PORT
* pPort
,
2127 OUT BOOLEAN
* pbDone
2130 CONST UINT32
* pEnd
;
2131 CONST UINT32
* pEntry
;
2132 CONST ACPI_RSDT
* pRsdt
;
2133 CONST CHAR8
* pTableName
;
2134 CONST CHAR16
* pWebPage
;
2136 UINT32 TableName
[ 2 ];
2141 // Send the RSDT page
2147 pRsdt
= LocateRsdt ( );
2148 if ( NULL
== pRsdt
) {
2149 Status
= EFI_NOT_FOUND
;
2154 // Send the page and table header
2156 Status
= TableHeader ( SocketFD
, pPort
, L
"RSDT - ACPI Root System Description Table", pRsdt
);
2157 if ( EFI_ERROR ( Status
)) {
2164 Status
= RowAnsiArray ( SocketFD
,
2167 sizeof ( pRsdt
->Signature
),
2168 (CHAR8
*)&pRsdt
->Signature
);
2169 if ( EFI_ERROR ( Status
)) {
2172 Status
= RowDecimalValue ( SocketFD
,
2176 if ( EFI_ERROR ( Status
)) {
2179 Status
= RowDecimalValue ( SocketFD
,
2183 if ( EFI_ERROR ( Status
)) {
2186 Status
= RowHexValue ( SocketFD
,
2191 if ( EFI_ERROR ( Status
)) {
2194 Status
= RowAnsiArray ( SocketFD
,
2197 sizeof ( pRsdt
->OemId
),
2198 (CONST CHAR8
*)&pRsdt
->OemId
[ 0 ]);
2199 if ( EFI_ERROR ( Status
)) {
2202 Status
= RowAnsiArray ( SocketFD
,
2205 sizeof ( pRsdt
->OemTableId
),
2206 (CONST CHAR8
*)&pRsdt
->OemTableId
[ 0 ]);
2207 if ( EFI_ERROR ( Status
)) {
2210 Status
= RowRevision ( SocketFD
,
2213 pRsdt
->OemRevision
);
2214 if ( EFI_ERROR ( Status
)) {
2217 Status
= RowAnsiArray ( SocketFD
,
2220 sizeof ( pRsdt
->CreatorId
),
2221 (CHAR8
*)&pRsdt
->CreatorId
);
2222 if ( EFI_ERROR ( Status
)) {
2225 Status
= RowRevision ( SocketFD
,
2228 pRsdt
->CreatorRevision
);
2229 if ( EFI_ERROR ( Status
)) {
2234 // Walk the list of entries
2236 pEntry
= &pRsdt
->Entry
[ 0 ];
2237 pEnd
= &pEntry
[(( pRsdt
->Length
- sizeof ( *pRsdt
)) >> 2 ) + 1 ];
2239 while ( pEnd
> pEntry
) {
2241 // The entry is actually a 32-bit physical table address
2242 // The first entry in the table is the 32-bit table signature
2244 TableName
[ 0 ] = *(UINT32
*)(UINTN
)*pEntry
;
2245 pWebPage
= SignatureLookup ( &TableName
[ 0 ], &pTableName
);
2248 // Display the table address
2250 Status
= RowPointer ( SocketFD
,
2253 (VOID
*)(UINTN
)*pEntry
,
2255 if ( EFI_ERROR ( Status
)) {
2260 if ( EFI_ERROR ( Status
)) {
2265 // Build the table trailer
2267 Status
= TableTrailer ( SocketFD
,
2274 // Return the operation status
2276 DBG_EXIT_STATUS ( Status
);
2282 Respond with the SSDT table
2284 @param [in] SocketFD The socket's file descriptor to add to the list.
2285 @param [in] pPort The WSDT_PORT structure address
2286 @param [out] pbDone Address to receive the request completion status
2288 @retval EFI_SUCCESS The request was successfully processed
2294 IN WSDT_PORT
* pPort
,
2295 OUT BOOLEAN
* pbDone
2298 CONST ACPI_UNKNOWN
* pSsdt
;
2304 // Send the SSDT page
2310 pSsdt
= (ACPI_UNKNOWN
*)LocateTable ( SSDT_SIGNATURE
);
2311 if ( NULL
== pSsdt
) {
2312 Status
= EFI_NOT_FOUND
;
2317 // Send the page and table header
2319 Status
= TableHeader ( SocketFD
, pPort
, L
"SSDT Table", pSsdt
);
2320 if ( EFI_ERROR ( Status
)) {
2325 // Display the header
2327 Status
= RowAnsiArray ( SocketFD
,
2330 sizeof ( pSsdt
->Signature
),
2331 (CHAR8
*)&pSsdt
->Signature
);
2332 if ( EFI_ERROR ( Status
)) {
2335 Status
= RowDecimalValue ( SocketFD
,
2339 if ( EFI_ERROR ( Status
)) {
2344 // Display the data from the table
2346 Status
= RowDump ( SocketFD
,
2349 pSsdt
->Length
- sizeof ( *pSsdt
) + 1,
2350 (UINT8
*)( pSsdt
+ 1 ));
2351 if ( EFI_ERROR ( Status
)) {
2356 // Build the table trailer
2358 Status
= TableTrailer ( SocketFD
,
2365 // Return the operation status
2367 DBG_EXIT_STATUS ( Status
);
2373 Respond with the TCPA table
2375 @param [in] SocketFD The socket's file descriptor to add to the list.
2376 @param [in] pPort The WSDT_PORT structure address
2377 @param [out] pbDone Address to receive the request completion status
2379 @retval EFI_SUCCESS The request was successfully processed
2385 IN WSDT_PORT
* pPort
,
2386 OUT BOOLEAN
* pbDone
2389 CONST ACPI_UNKNOWN
* pTcpa
;
2395 // Send the TCPA page
2401 pTcpa
= (ACPI_UNKNOWN
*)LocateTable ( TCPA_SIGNATURE
);
2402 if ( NULL
== pTcpa
) {
2403 Status
= EFI_NOT_FOUND
;
2408 // Send the page and table header
2410 Status
= TableHeader ( SocketFD
, pPort
, L
"TCPA Table", pTcpa
);
2411 if ( EFI_ERROR ( Status
)) {
2416 // Display the header
2418 Status
= RowAnsiArray ( SocketFD
,
2421 sizeof ( pTcpa
->Signature
),
2422 (CHAR8
*)&pTcpa
->Signature
);
2423 if ( EFI_ERROR ( Status
)) {
2426 Status
= RowDecimalValue ( SocketFD
,
2430 if ( EFI_ERROR ( Status
)) {
2435 // Display the data from the table
2437 Status
= RowDump ( SocketFD
,
2440 pTcpa
->Length
- sizeof ( *pTcpa
) + 1,
2441 (UINT8
*)( pTcpa
+ 1 ));
2442 if ( EFI_ERROR ( Status
)) {
2447 // Build the table trailer
2449 Status
= TableTrailer ( SocketFD
,
2456 // Return the operation status
2458 DBG_EXIT_STATUS ( Status
);
2464 Respond with the UEFI table
2466 @param [in] SocketFD The socket's file descriptor to add to the list.
2467 @param [in] pPort The WSDT_PORT structure address
2468 @param [out] pbDone Address to receive the request completion status
2470 @retval EFI_SUCCESS The request was successfully processed
2476 IN WSDT_PORT
* pPort
,
2477 OUT BOOLEAN
* pbDone
2480 CONST ACPI_UNKNOWN
* pUefi
;
2486 // Send the UEFI page
2492 pUefi
= (ACPI_UNKNOWN
*)LocateTable ( UEFI_SIGNATURE
);
2493 if ( NULL
== pUefi
) {
2494 Status
= EFI_NOT_FOUND
;
2499 // Send the page and table header
2501 Status
= TableHeader ( SocketFD
, pPort
, L
"UEFI Table", pUefi
);
2502 if ( EFI_ERROR ( Status
)) {
2507 // Display the header
2509 Status
= RowAnsiArray ( SocketFD
,
2512 sizeof ( pUefi
->Signature
),
2513 (CHAR8
*)&pUefi
->Signature
);
2514 if ( EFI_ERROR ( Status
)) {
2517 Status
= RowDecimalValue ( SocketFD
,
2521 if ( EFI_ERROR ( Status
)) {
2526 // Display the data from the table
2528 Status
= RowDump ( SocketFD
,
2531 pUefi
->Length
- sizeof ( *pUefi
) + 1,
2532 (UINT8
*)( pUefi
+ 1 ));
2533 if ( EFI_ERROR ( Status
)) {
2538 // Build the table trailer
2540 Status
= TableTrailer ( SocketFD
,
2547 // Return the operation status
2549 DBG_EXIT_STATUS ( Status
);