3 Display the ACPI tables
5 Copyright (c) 2011-2012, Intel Corporation
6 All rights reserved. This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 #include <WebServer.h>
17 #include <Guid/Acpi.h>
18 #include <IndustryStandard/Acpi10.h>
19 #include <IndustryStandard/Acpi30.h>
21 #if defined(_MSC_VER) // Handle Microsoft VC++ compiler specifics.
22 #pragma warning ( disable : 4305 )
23 #endif // defined(_MSC_VER)
26 // Ensure proper structure formats
32 UINT8 RegisterBitWidth
;
33 UINT8 RegisterBitOffset
;
40 UINT32 Signature
; // 0
45 UINT8 OemTableId
[8]; // 16
46 UINT32 OemRevision
; // 24
47 UINT32 CreatorId
; // 28
48 UINT32 CreatorRevision
; // 32
49 UINT8 DefinitionBlock
[1]; // 36
54 UINT32 Signature
; // 0
59 UINT8 OemTableId
[8]; // 16
60 UINT32 OemRevision
; // 24
61 UINT32 CreatorId
; // 28
62 UINT32 CreatorRevision
; // 32
63 UINT32 FirmwareCtrl
; // 36
66 UINT8 PreferredPmProfile
; // 45
69 UINT8 AcpiEnable
; // 52
70 UINT8 AcpiDisable
; // 53
71 UINT8 S4BiosReq
; // 54
72 UINT8 PStateCnt
; // 55
73 UINT32 Pm1aEvtBlk
; // 56
74 UINT32 Pm1bEvtBlk
; // 60
75 UINT32 Pm1aCntBlk
; // 64
76 UINT32 Pm1bCntBlk
; // 68
77 UINT32 Pm2CntBlk
; // 72
78 UINT32 PmTmrBlk
; // 76
81 UINT8 Pm1EvtLen
; // 88
82 UINT8 Pm1CntLen
; // 89
83 UINT8 PM2CntLen
; // 90
85 UINT8 Gpe0BlkLen
; // 92
86 UINT8 Gpe1BlkLen
; // 93
89 UINT16 PLvl2Lat
; // 96
90 UINT16 PLvl3Lat
; // 98
91 UINT16 FlushSize
; // 100
92 UINT16 FlushStride
; // 102
93 UINT8 DutyOffset
; // 104
94 UINT8 DutyWidth
; // 105
98 UINT16 IapcBootArch
; // 109
99 UINT8 Reserved2
; // 111
101 UINT32 ResetReg
[3]; // 116
102 UINT8 ResetValue
; // 128
103 UINT8 Reserved3
[3]; // 129
104 UINT64 XFirmwareCtrl
; // 132
106 UINT32 XPm1aEvtBlk
[3]; // 148
107 UINT32 XPm1bEvtBlk
[3]; // 160
108 UINT32 XPm1aCntBlk
[3]; // 172
109 UINT32 XPm1bCntBlk
[3]; // 184
110 UINT32 XPm2CntBlk
[3]; // 196
111 UINT32 XPmTmrBlk
[3]; // 208
112 UINT32 XGpe0Blk
[3]; // 220
113 UINT32 XGpe1Blk
[3]; // 232
126 UINT32 CreatorRevision
;
132 UINT32 Signature
; // 0
141 CONST CHAR8
* pTableName
;
142 CONST CHAR16
* pWebPage
;
146 CONST TABLE_SIGNATURE mTableId
[] = {
147 { APIC_SIGNATURE
, "APIC", PAGE_ACPI_APIC
},
148 { BGRT_SIGNATURE
, "BGRT", PAGE_ACPI_BGRT
},
149 { DSDT_SIGNATURE
, "DSDT", PAGE_ACPI_DSDT
},
150 { FADT_SIGNATURE
, "FADT", PAGE_ACPI_FADT
},
151 { HPET_SIGNATURE
, "HPET", PAGE_ACPI_HPET
},
152 { MCFG_SIGNATURE
, "MCFG", PAGE_ACPI_MCFG
},
153 { SSDT_SIGNATURE
, "SSDT", PAGE_ACPI_SSDT
},
154 { TCPA_SIGNATURE
, "TCPA", PAGE_ACPI_TCPA
},
155 { UEFI_SIGNATURE
, "UEFI", PAGE_ACPI_UEFI
}
160 Locate the RSDT table
162 @return Table address or NULL if not found
170 CONST EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER
* pRsdp10b
;
171 CONST EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER
* pRsdp30
;
172 CONST ACPI_RSDT
* pRsdt
;
176 // Use for/break instead of goto
183 Status
= EfiGetSystemConfigurationTable ( &gEfiAcpiTableGuid
, (VOID
**)&pRsdp30
);
184 if ( !EFI_ERROR ( Status
)) {
185 pRsdt
= (ACPI_RSDT
*)(UINTN
)pRsdp30
->RsdtAddress
;
188 Status
= EfiGetSystemConfigurationTable (&gEfiAcpi10TableGuid
, (VOID
**)&pRsdp10b
);
189 if ( EFI_ERROR ( Status
)) {
192 pRsdt
= (ACPI_RSDT
*)(UINTN
)pRsdp10b
->RsdtAddress
;
198 // The entry was not found
205 Locate the specified table
207 @param [in] Signature Table signature
209 @return Table address or NULL if not found
218 CONST UINT32
* pEntry
;
219 CONST EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER
* pRsdp10b
;
220 CONST EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER
* pRsdp30
;
221 CONST ACPI_RSDT
* pRsdt
;
222 CONST UINT32
* pSignature
;
226 // Use for/break instead of goto
232 Status
= EfiGetSystemConfigurationTable ( &gEfiAcpiTableGuid
, (VOID
**)&pRsdp30
);
233 if ( !EFI_ERROR ( Status
)) {
234 pRsdt
= (ACPI_RSDT
*)(UINTN
)pRsdp30
->RsdtAddress
;
237 Status
= EfiGetSystemConfigurationTable (&gEfiAcpi10TableGuid
, (VOID
**)&pRsdp10b
);
238 if ( EFI_ERROR ( Status
)) {
241 pRsdt
= (ACPI_RSDT
*)(UINTN
)pRsdp10b
->RsdtAddress
;
245 // Walk the list of entries
247 pEntry
= &pRsdt
->Entry
[ 0 ];
248 pEnd
= &pEntry
[(( pRsdt
->Length
- sizeof ( *pRsdt
)) >> 2 ) + 1 ];
249 while ( pEnd
> pEntry
) {
251 // The entry is actually a 32-bit physical table address
252 // The first entry in the table is the 32-bit table signature
254 pSignature
= (UINT32
*)(UINTN
)*pEntry
;
255 if ( *pSignature
== Signature
) {
256 return (CONST VOID
*)(UINTN
)*pEntry
;
260 // Set the next entry
268 // The entry was not found
275 Display a row containing a hex value
277 @param [in] SocketFD The socket's file descriptor to add to the list.
278 @param [in] pPort The WSDT_PORT structure address
279 @param [in] pName Address of a zero terminated name string
280 @param [in] Length Length in bytes
281 @param [in] pChar Address of the first character
283 @retval EFI_SUCCESS The request was successfully processed
289 IN WSDT_PORT
* pPort
,
290 IN CONST CHAR8
* pName
,
292 IN CONST CHAR8
* pChar
302 // Use for/break instead of goto
308 Status
= HttpSendAnsiString ( SocketFD
,
311 if ( EFI_ERROR ( Status
)) {
314 Status
= HttpSendAnsiString ( SocketFD
,
317 if ( EFI_ERROR ( Status
)) {
320 Status
= HttpSendAnsiString ( SocketFD
,
323 if ( EFI_ERROR ( Status
)) {
328 // Display the characters
331 pEnd
= &pChar
[ Length
];
332 while ( pEnd
> pData
) {
333 Status
= HttpSendCharacter ( SocketFD
,
337 if ( EFI_ERROR ( Status
)) {
341 if ( EFI_ERROR ( Status
)) {
346 // Display the byte values
348 Status
= HttpSendAnsiString ( SocketFD
,
351 if ( EFI_ERROR ( Status
)) {
355 while ( pEnd
> pData
) {
356 Status
= HttpSendHexBits ( SocketFD
,
360 if ( EFI_ERROR ( Status
)) {
363 if ( pEnd
> pData
) {
364 Status
= HttpSendAnsiString ( SocketFD
,
367 if ( EFI_ERROR ( Status
)) {
376 Status
= HttpSendAnsiString ( SocketFD
,
378 "</code></td></tr>\r\n" );
383 // Return the operation status
385 DBG_EXIT_STATUS ( Status
);
391 Format a row with a list of bytes
393 @param [in] SocketFD The socket's file descriptor to add to the list.
394 @param [in] pPort The WSDT_PORT structure address
395 @param [in] pName Zero terminated name string
396 @param [in] ByteCount The number of bytes to display
397 @param [in] pData Address of the byte array
399 @retval EFI_SUCCESS The request was successfully processed
405 IN WSDT_PORT
* pPort
,
408 IN CONST UINT8
* pData
415 // Use for/break instead of goto
421 Status
= HttpSendAnsiString ( SocketFD
,
424 if ( EFI_ERROR ( Status
)) {
429 // Display the field name
431 Status
= HttpSendAnsiString ( SocketFD
,
434 if ( EFI_ERROR ( Status
)) {
439 // Display the field value
441 Status
= HttpSendAnsiString ( SocketFD
,
443 "</td><td><code>0x" );
444 if ( EFI_ERROR ( Status
)) {
447 pEnd
= &pData
[ ByteCount
];
448 while ( pEnd
> pData
) {
449 Status
= HttpSendHexBits ( SocketFD
,
453 if ( EFI_ERROR ( Status
)) {
456 if ( pEnd
> pData
) {
457 Status
= HttpSendAnsiString ( SocketFD
,
460 if ( EFI_ERROR ( Status
)) {
465 if ( EFI_ERROR ( Status
)) {
472 Status
= HttpSendAnsiString ( SocketFD
,
474 "</code></td></tr>\r\n" );
479 // Return the operation status
486 Format a row with a list of bytes
488 @param [in] SocketFD The socket's file descriptor to add to the list.
489 @param [in] pPort The WSDT_PORT structure address
490 @param [in] pName Zero terminated name string
491 @param [in] ByteCount The number of bytes to display
492 @param [in] pData Address of the byte array
494 @retval EFI_SUCCESS The request was successfully processed
500 IN WSDT_PORT
* pPort
,
503 IN CONST UINT8
* pData
509 // Use for/break instead of goto
515 Status
= HttpSendAnsiString ( SocketFD
,
518 if ( EFI_ERROR ( Status
)) {
523 // Display the field name
525 Status
= HttpSendAnsiString ( SocketFD
,
528 if ( EFI_ERROR ( Status
)) {
533 // Start the field value
535 Status
= HttpSendAnsiString ( SocketFD
,
538 if ( EFI_ERROR ( Status
)) {
545 Status
= HttpSendDump ( SocketFD
,
551 // Terminate the field value and row
553 Status
= HttpSendAnsiString ( SocketFD
,
560 // Return the operation status
567 Format a row with a general address
569 @param [in] SocketFD The socket's file descriptor to add to the list.
570 @param [in] pPort The WSDT_PORT structure address
571 @param [in] pName Zero terminated name string
572 @param [in] pAddr Address of the general address buffer
573 @param [in] pWebPage Zero terminated web page address
575 @retval EFI_SUCCESS The request was successfully processed
581 IN WSDT_PORT
* pPort
,
583 IN CONST UINT32
* pAddr
,
584 IN CONST CHAR16
* pWebPage
587 CONST GENERIC_ADDRESS
* pGenericAddress
;
591 // Use for/break instead of goto
597 Status
= HttpSendAnsiString ( SocketFD
,
600 if ( EFI_ERROR ( Status
)) {
605 // Display the field name
607 Status
= HttpSendAnsiString ( SocketFD
,
610 if ( EFI_ERROR ( Status
)) {
615 // Display the field value
617 Status
= HttpSendAnsiString ( SocketFD
,
620 if ( EFI_ERROR ( Status
)) {
625 // Determine the type of address
627 pGenericAddress
= (CONST GENERIC_ADDRESS
*)pAddr
;
628 if ( 0 == pGenericAddress
->AddressSpaceId
) {
629 Status
= HttpSendAnsiString ( SocketFD
, pPort
, "System Memory" );
631 else if ( 1 == pGenericAddress
->AddressSpaceId
) {
632 Status
= HttpSendAnsiString ( SocketFD
, pPort
, "I/O Space" );
634 else if ( 2 == pGenericAddress
->AddressSpaceId
) {
635 Status
= HttpSendAnsiString ( SocketFD
, pPort
, "PCI Configuration Space" );
637 else if ( 3 == pGenericAddress
->AddressSpaceId
) {
638 Status
= HttpSendAnsiString ( SocketFD
, pPort
, "Embedded Controller" );
640 else if ( 4 == pGenericAddress
->AddressSpaceId
) {
641 Status
= HttpSendAnsiString ( SocketFD
, pPort
, "SMBus" );
643 else if ( 0x7f == pGenericAddress
->AddressSpaceId
) {
644 Status
= HttpSendAnsiString ( SocketFD
, pPort
, "Functional Fixed Hardware" );
646 else if (( 0xc0 <= pGenericAddress
->AddressSpaceId
)
647 && ( 0xff >= pGenericAddress
->AddressSpaceId
)) {
648 Status
= HttpSendAnsiString ( SocketFD
, pPort
, "OEM Defined" );
651 Status
= HttpSendAnsiString ( SocketFD
, pPort
, "Reserved" );
653 if ( EFI_ERROR ( Status
)) {
656 Status
= HttpSendAnsiString ( SocketFD
,
658 "<br/>Register Bit Width: " );
659 if ( EFI_ERROR ( Status
)) {
662 Status
= HttpSendValue ( SocketFD
,
664 pGenericAddress
->RegisterBitWidth
);
665 if ( EFI_ERROR ( Status
)) {
668 Status
= HttpSendAnsiString ( SocketFD
,
670 "<br/>Register Bit Offset: " );
671 if ( EFI_ERROR ( Status
)) {
674 Status
= HttpSendHexValue ( SocketFD
,
676 pGenericAddress
->RegisterBitOffset
);
677 if ( EFI_ERROR ( Status
)) {
680 Status
= HttpSendAnsiString ( SocketFD
,
682 "<br/>Access Size: " );
683 if ( EFI_ERROR ( Status
)) {
686 Status
= HttpSendValue ( SocketFD
,
688 pGenericAddress
->AccessSize
);
689 if ( EFI_ERROR ( Status
)) {
692 Status
= HttpSendAnsiString ( SocketFD
,
695 if ( EFI_ERROR ( Status
)) {
700 // Add the web-page link if necessary
702 if ( NULL
!= pWebPage
) {
703 Status
= HttpSendAnsiString ( SocketFD
,
705 "<a target=\"_blank\" href=\"" );
706 if ( EFI_ERROR ( Status
)) {
709 Status
= HttpSendUnicodeString ( SocketFD
,
712 if ( EFI_ERROR ( Status
)) {
715 Status
= HttpSendAnsiString ( SocketFD
,
718 if ( EFI_ERROR ( Status
)) {
724 // Display the address
726 Status
= HttpSendAnsiString ( SocketFD
,
729 if ( EFI_ERROR ( Status
)) {
732 Status
= HttpSendHexBits ( SocketFD
,
735 pGenericAddress
->Address
);
736 if ( EFI_ERROR ( Status
)) {
741 // Finish the web-page link if necessary
743 if ( NULL
!= pWebPage
) {
744 Status
= HttpSendAnsiString ( SocketFD
,
747 if ( EFI_ERROR ( Status
)) {
755 Status
= HttpSendAnsiString ( SocketFD
,
757 "</code></td></tr>\r\n" );
762 // Return the operation status
769 Translate a table address into a web page
771 @param [in] pSignature Address of the table signature
772 @param [out] ppTableName Address to receive the table name address
774 @return Zero terminated web page address or NULL if not found
779 IN UINT32
* pSignature
,
780 OUT CONST CHAR8
** ppTableName
783 CONST TABLE_SIGNATURE
* pTableId
;
784 CONST TABLE_SIGNATURE
* pEnd
;
788 // Walk the list of tables
790 Signature
= *pSignature
;
791 pTableId
= &mTableId
[ 0 ];
792 pEnd
= &pTableId
[ sizeof ( mTableId
) / sizeof ( mTableId
[ 0 ])];
793 while ( pEnd
> pTableId
) {
795 // Attempt to locate the table signature
797 if ( pTableId
->Signature
== Signature
) {
799 // The signature was found
800 // Return the web page
802 *ppTableName
= pTableId
->pTableName
;
803 return pTableId
->pWebPage
;
807 // Set the next table
813 // The table was not found
815 *ppTableName
= (CONST CHAR8
*)pSignature
;
821 Respond with the APIC table
823 @param [in] SocketFD The socket's file descriptor to add to the list.
824 @param [in] pPort The WSDT_PORT structure address
825 @param [out] pbDone Address to receive the request completion status
827 @retval EFI_SUCCESS The request was successfully processed
833 IN WSDT_PORT
* pPort
,
837 CONST ACPI_UNKNOWN
* pApic
;
843 // Send the APIC page
849 pApic
= (ACPI_UNKNOWN
*)LocateTable ( APIC_SIGNATURE
);
850 if ( NULL
== pApic
) {
851 Status
= EFI_NOT_FOUND
;
856 // Send the page and table header
858 Status
= TableHeader ( SocketFD
, pPort
, L
"APIC Table", pApic
);
859 if ( EFI_ERROR ( Status
)) {
864 // Display the header
866 Status
= RowAnsiArray ( SocketFD
,
869 sizeof ( pApic
->Signature
),
870 (CHAR8
*)&pApic
->Signature
);
871 if ( EFI_ERROR ( Status
)) {
874 Status
= RowDecimalValue ( SocketFD
,
878 if ( EFI_ERROR ( Status
)) {
883 // Display the data from the table
885 Status
= RowDump ( SocketFD
,
888 pApic
->Length
- sizeof ( *pApic
) + 1,
889 (UINT8
*)( pApic
+ 1 ));
890 if ( EFI_ERROR ( Status
)) {
895 // Build the table trailer
897 Status
= TableTrailer ( SocketFD
,
904 // Return the operation status
906 DBG_EXIT_STATUS ( Status
);
912 Respond with the BGRT table
914 @param [in] SocketFD The socket's file descriptor to add to the list.
915 @param [in] pPort The WSDT_PORT structure address
916 @param [out] pbDone Address to receive the request completion status
918 @retval EFI_SUCCESS The request was successfully processed
924 IN WSDT_PORT
* pPort
,
928 CONST ACPI_UNKNOWN
* pBgrt
;
934 // Send the BGRT page
940 pBgrt
= (ACPI_UNKNOWN
*)LocateTable ( BGRT_SIGNATURE
);
941 if ( NULL
== pBgrt
) {
942 Status
= EFI_NOT_FOUND
;
947 // Send the page and table header
949 Status
= TableHeader ( SocketFD
, pPort
, L
"BGRT Table", pBgrt
);
950 if ( EFI_ERROR ( Status
)) {
955 // Display the header
957 Status
= RowAnsiArray ( SocketFD
,
960 sizeof ( pBgrt
->Signature
),
961 (CHAR8
*)&pBgrt
->Signature
);
962 if ( EFI_ERROR ( Status
)) {
965 Status
= RowDecimalValue ( SocketFD
,
969 if ( EFI_ERROR ( Status
)) {
974 // Display the data from the table
976 Status
= RowDump ( SocketFD
,
979 pBgrt
->Length
- sizeof ( *pBgrt
) + 1,
980 (UINT8
*)( pBgrt
+ 1 ));
981 if ( EFI_ERROR ( Status
)) {
986 // Build the table trailer
988 Status
= TableTrailer ( SocketFD
,
995 // Return the operation status
997 DBG_EXIT_STATUS ( Status
);
1003 Respond with the ACPI DSDT table
1005 @param [in] SocketFD The socket's file descriptor to add to the list.
1006 @param [in] pPort The WSDT_PORT structure address
1007 @param [out] pbDone Address to receive the request completion status
1009 @retval EFI_SUCCESS The request was successfully processed
1015 IN WSDT_PORT
* pPort
,
1016 OUT BOOLEAN
* pbDone
1019 CONST ACPI_DSDT
* pDsdt
;
1020 CONST ACPI_FADT
* pFadt
;
1026 // Send the DADT page
1032 pFadt
= (ACPI_FADT
*)LocateTable ( FADT_SIGNATURE
);
1033 if ( NULL
== pFadt
) {
1034 Status
= EFI_NOT_FOUND
;
1037 pDsdt
= (VOID
*)(UINTN
)pFadt
->XDsdt
;
1040 // Send the page and table header
1042 Status
= TableHeader ( SocketFD
, pPort
, L
"DSDT - Differentiated System Description Table", pDsdt
);
1043 if ( EFI_ERROR ( Status
)) {
1048 // Display the DSDT header
1050 Status
= RowAnsiArray ( SocketFD
,
1053 sizeof ( pDsdt
->Signature
),
1054 (CHAR8
*)&pDsdt
->Signature
);
1055 if ( EFI_ERROR ( Status
)) {
1058 Status
= RowDecimalValue ( SocketFD
,
1062 if ( EFI_ERROR ( Status
)) {
1065 Status
= RowDecimalValue ( SocketFD
,
1069 if ( EFI_ERROR ( Status
)) {
1072 Status
= RowHexValue ( SocketFD
,
1077 if ( EFI_ERROR ( Status
)) {
1080 Status
= RowAnsiArray ( SocketFD
,
1083 sizeof ( pDsdt
->OemId
),
1084 (CONST CHAR8
*)&pDsdt
->OemId
[ 0 ]);
1085 if ( EFI_ERROR ( Status
)) {
1088 Status
= RowAnsiArray ( SocketFD
,
1091 sizeof ( pDsdt
->OemTableId
),
1092 (CONST CHAR8
*)&pDsdt
->OemTableId
[ 0 ]);
1093 if ( EFI_ERROR ( Status
)) {
1096 Status
= RowRevision ( SocketFD
,
1099 pDsdt
->OemRevision
);
1100 if ( EFI_ERROR ( Status
)) {
1103 Status
= RowAnsiArray ( SocketFD
,
1106 sizeof ( pDsdt
->CreatorId
),
1107 (CHAR8
*)&pDsdt
->CreatorId
);
1108 if ( EFI_ERROR ( Status
)) {
1111 Status
= RowRevision ( SocketFD
,
1114 pDsdt
->CreatorRevision
);
1115 if ( EFI_ERROR ( Status
)) {
1120 // Display the data from the DSDT
1122 Status
= RowDump ( SocketFD
,
1125 pDsdt
->Length
- sizeof ( *pDsdt
) + 1,
1126 &pDsdt
->DefinitionBlock
[0]);
1127 if ( EFI_ERROR ( Status
)) {
1132 // Build the table trailer
1134 Status
= TableTrailer ( SocketFD
,
1141 // Return the operation status
1143 DBG_EXIT_STATUS ( Status
);
1149 Respond with the ACPI FADT table
1151 @param [in] SocketFD The socket's file descriptor to add to the list.
1152 @param [in] pPort The WSDT_PORT structure address
1153 @param [out] pbDone Address to receive the request completion status
1155 @retval EFI_SUCCESS The request was successfully processed
1161 IN WSDT_PORT
* pPort
,
1162 OUT BOOLEAN
* pbDone
1165 CONST ACPI_FADT
* pFadt
;
1171 // Send the FADT page
1177 pFadt
= (ACPI_FADT
*)LocateTable ( FADT_SIGNATURE
);
1178 if ( NULL
== pFadt
) {
1179 Status
= EFI_NOT_FOUND
;
1184 // Send the page and table header
1186 Status
= TableHeader ( SocketFD
, pPort
, L
"FADT - Fixed ACPI Description Table", pFadt
);
1187 if ( EFI_ERROR ( Status
)) {
1192 // Display the FSDT header
1194 Status
= RowAnsiArray ( SocketFD
,
1197 sizeof ( pFadt
->Signature
),
1198 (CHAR8
*)&pFadt
->Signature
);
1199 if ( EFI_ERROR ( Status
)) {
1202 Status
= RowDecimalValue ( SocketFD
,
1206 if ( EFI_ERROR ( Status
)) {
1209 Status
= RowDecimalValue ( SocketFD
,
1213 if ( EFI_ERROR ( Status
)) {
1216 Status
= RowHexValue ( SocketFD
,
1221 if ( EFI_ERROR ( Status
)) {
1224 Status
= RowAnsiArray ( SocketFD
,
1227 sizeof ( pFadt
->OemId
),
1228 (CONST CHAR8
*)&pFadt
->OemId
[ 0 ]);
1229 if ( EFI_ERROR ( Status
)) {
1232 Status
= RowAnsiArray ( SocketFD
,
1235 sizeof ( pFadt
->OemTableId
),
1236 (CONST CHAR8
*)&pFadt
->OemTableId
[ 0 ]);
1237 if ( EFI_ERROR ( Status
)) {
1240 Status
= RowRevision ( SocketFD
,
1243 pFadt
->OemRevision
);
1244 if ( EFI_ERROR ( Status
)) {
1247 Status
= RowAnsiArray ( SocketFD
,
1250 sizeof ( pFadt
->CreatorId
),
1251 (CHAR8
*)&pFadt
->CreatorId
);
1252 if ( EFI_ERROR ( Status
)) {
1255 Status
= RowRevision ( SocketFD
,
1258 pFadt
->CreatorRevision
);
1259 if ( EFI_ERROR ( Status
)) {
1264 // Display the data from the FADT
1266 Status
= RowPointer ( SocketFD
,
1269 (CONST VOID
*)(UINTN
)pFadt
->FirmwareCtrl
,
1271 if ( EFI_ERROR ( Status
)) {
1274 Status
= RowPointer ( SocketFD
,
1277 (CONST VOID
*)(UINTN
)pFadt
->DSDT
,
1278 ( pFadt
->DSDT
== pFadt
->XDsdt
) ? PAGE_ACPI_DSDT
: NULL
);
1279 if ( EFI_ERROR ( Status
)) {
1282 Status
= RowHexValue ( SocketFD
,
1287 if ( EFI_ERROR ( Status
)) {
1290 Status
= RowHexValue ( SocketFD
,
1292 "Preferred_PM_Profile",
1293 pFadt
->PreferredPmProfile
,
1295 if ( EFI_ERROR ( Status
)) {
1298 Status
= RowHexValue ( SocketFD
,
1303 if ( EFI_ERROR ( Status
)) {
1306 Status
= RowHexValue ( SocketFD
,
1311 if ( EFI_ERROR ( Status
)) {
1314 Status
= RowHexValue ( SocketFD
,
1319 if ( EFI_ERROR ( Status
)) {
1322 Status
= RowHexValue ( SocketFD
,
1327 if ( EFI_ERROR ( Status
)) {
1330 Status
= RowHexValue ( SocketFD
,
1335 if ( EFI_ERROR ( Status
)) {
1338 Status
= RowHexValue ( SocketFD
,
1343 if ( EFI_ERROR ( Status
)) {
1346 Status
= RowHexValue ( SocketFD
,
1351 if ( EFI_ERROR ( Status
)) {
1354 Status
= RowHexValue ( SocketFD
,
1359 if ( EFI_ERROR ( Status
)) {
1362 Status
= RowHexValue ( SocketFD
,
1367 if ( EFI_ERROR ( Status
)) {
1370 Status
= RowHexValue ( SocketFD
,
1375 if ( EFI_ERROR ( Status
)) {
1378 Status
= RowHexValue ( SocketFD
,
1383 if ( EFI_ERROR ( Status
)) {
1386 Status
= RowHexValue ( SocketFD
,
1391 if ( EFI_ERROR ( Status
)) {
1395 Status
= RowHexValue ( SocketFD
,
1400 if ( EFI_ERROR ( Status
)) {
1403 Status
= RowHexValue ( SocketFD
,
1408 if ( EFI_ERROR ( Status
)) {
1411 Status
= RowDecimalValue ( SocketFD
,
1415 if ( EFI_ERROR ( Status
)) {
1418 Status
= RowDecimalValue ( SocketFD
,
1422 if ( EFI_ERROR ( Status
)) {
1425 Status
= RowDecimalValue ( SocketFD
,
1429 if ( EFI_ERROR ( Status
)) {
1432 Status
= RowDecimalValue ( SocketFD
,
1436 if ( EFI_ERROR ( Status
)) {
1439 Status
= RowDecimalValue ( SocketFD
,
1442 pFadt
->Gpe0BlkLen
);
1443 if ( EFI_ERROR ( Status
)) {
1446 Status
= RowDecimalValue ( SocketFD
,
1449 pFadt
->Gpe1BlkLen
);
1450 if ( EFI_ERROR ( Status
)) {
1453 Status
= RowHexValue ( SocketFD
,
1458 if ( EFI_ERROR ( Status
)) {
1461 Status
= RowDecimalValue ( SocketFD
,
1465 if ( EFI_ERROR ( Status
)) {
1468 Status
= RowHexValue ( SocketFD
,
1473 if ( EFI_ERROR ( Status
)) {
1476 Status
= RowHexValue ( SocketFD
,
1481 if ( EFI_ERROR ( Status
)) {
1484 Status
= RowDecimalValue ( SocketFD
,
1488 if ( EFI_ERROR ( Status
)) {
1491 Status
= RowDecimalValue ( SocketFD
,
1494 pFadt
->FlushStride
);
1495 if ( EFI_ERROR ( Status
)) {
1498 Status
= RowHexValue ( SocketFD
,
1503 if ( EFI_ERROR ( Status
)) {
1506 Status
= RowHexValue ( SocketFD
,
1511 if ( EFI_ERROR ( Status
)) {
1514 Status
= RowHexValue ( SocketFD
,
1519 if ( EFI_ERROR ( Status
)) {
1522 Status
= RowHexValue ( SocketFD
,
1527 if ( EFI_ERROR ( Status
)) {
1530 Status
= RowHexValue ( SocketFD
,
1535 if ( EFI_ERROR ( Status
)) {
1538 Status
= RowHexValue ( SocketFD
,
1541 pFadt
->IapcBootArch
,
1543 if ( EFI_ERROR ( Status
)) {
1546 Status
= RowHexValue ( SocketFD
,
1551 if ( EFI_ERROR ( Status
)) {
1554 Status
= RowHexValue ( SocketFD
,
1559 if ( EFI_ERROR ( Status
)) {
1562 Status
= RowGenericAddress ( SocketFD
,
1565 &pFadt
->ResetReg
[0],
1567 if ( EFI_ERROR ( Status
)) {
1570 Status
= RowHexValue ( SocketFD
,
1575 if ( EFI_ERROR ( Status
)) {
1578 Status
= RowHexValue ( SocketFD
,
1581 pFadt
->Reserved3
[0],
1583 if ( EFI_ERROR ( Status
)) {
1586 Status
= RowHexValue ( SocketFD
,
1589 pFadt
->Reserved3
[1],
1591 if ( EFI_ERROR ( Status
)) {
1594 Status
= RowHexValue ( SocketFD
,
1597 pFadt
->Reserved3
[2],
1599 if ( EFI_ERROR ( Status
)) {
1602 Status
= RowHexValue ( SocketFD
,
1605 pFadt
->XFirmwareCtrl
,
1607 if ( EFI_ERROR ( Status
)) {
1610 Status
= RowHexValue ( SocketFD
,
1615 if ( EFI_ERROR ( Status
)) {
1618 Status
= RowGenericAddress ( SocketFD
,
1621 &pFadt
->XPm1aEvtBlk
[0],
1623 if ( EFI_ERROR ( Status
)) {
1626 Status
= RowGenericAddress ( SocketFD
,
1629 &pFadt
->XPm1bEvtBlk
[0],
1631 if ( EFI_ERROR ( Status
)) {
1634 Status
= RowGenericAddress ( SocketFD
,
1637 &pFadt
->XPm1aCntBlk
[0],
1639 if ( EFI_ERROR ( Status
)) {
1642 Status
= RowGenericAddress ( SocketFD
,
1645 &pFadt
->XPm1bCntBlk
[0],
1647 if ( EFI_ERROR ( Status
)) {
1650 Status
= RowGenericAddress ( SocketFD
,
1653 &pFadt
->XPm2CntBlk
[0],
1655 if ( EFI_ERROR ( Status
)) {
1658 Status
= RowGenericAddress ( SocketFD
,
1661 &pFadt
->XPmTmrBlk
[0],
1663 if ( EFI_ERROR ( Status
)) {
1666 Status
= RowGenericAddress ( SocketFD
,
1669 &pFadt
->XGpe0Blk
[0],
1671 if ( EFI_ERROR ( Status
)) {
1674 Status
= RowGenericAddress ( SocketFD
,
1677 &pFadt
->XGpe1Blk
[0],
1679 if ( EFI_ERROR ( Status
)) {
1684 // Build the table trailer
1686 Status
= TableTrailer ( SocketFD
,
1693 // Return the operation status
1695 DBG_EXIT_STATUS ( Status
);
1701 Respond with the HPET table
1703 @param [in] SocketFD The socket's file descriptor to add to the list.
1704 @param [in] pPort The WSDT_PORT structure address
1705 @param [out] pbDone Address to receive the request completion status
1707 @retval EFI_SUCCESS The request was successfully processed
1713 IN WSDT_PORT
* pPort
,
1714 OUT BOOLEAN
* pbDone
1717 CONST ACPI_UNKNOWN
* pHpet
;
1723 // Send the HPET page
1729 pHpet
= (ACPI_UNKNOWN
*)LocateTable ( HPET_SIGNATURE
);
1730 if ( NULL
== pHpet
) {
1731 Status
= EFI_NOT_FOUND
;
1736 // Send the page and table header
1738 Status
= TableHeader ( SocketFD
, pPort
, L
"HPET Table", pHpet
);
1739 if ( EFI_ERROR ( Status
)) {
1744 // Display the header
1746 Status
= RowAnsiArray ( SocketFD
,
1749 sizeof ( pHpet
->Signature
),
1750 (CHAR8
*)&pHpet
->Signature
);
1751 if ( EFI_ERROR ( Status
)) {
1754 Status
= RowDecimalValue ( SocketFD
,
1758 if ( EFI_ERROR ( Status
)) {
1763 // Display the data from the table
1765 Status
= RowDump ( SocketFD
,
1768 pHpet
->Length
- sizeof ( *pHpet
) + 1,
1769 (UINT8
*)( pHpet
+ 1 ));
1770 if ( EFI_ERROR ( Status
)) {
1775 // Build the table trailer
1777 Status
= TableTrailer ( SocketFD
,
1784 // Return the operation status
1786 DBG_EXIT_STATUS ( Status
);
1792 Respond with the MCFG table
1794 @param [in] SocketFD The socket's file descriptor to add to the list.
1795 @param [in] pPort The WSDT_PORT structure address
1796 @param [out] pbDone Address to receive the request completion status
1798 @retval EFI_SUCCESS The request was successfully processed
1804 IN WSDT_PORT
* pPort
,
1805 OUT BOOLEAN
* pbDone
1808 CONST ACPI_UNKNOWN
* pMcfg
;
1814 // Send the MCFG page
1820 pMcfg
= (ACPI_UNKNOWN
*)LocateTable ( MCFG_SIGNATURE
);
1821 if ( NULL
== pMcfg
) {
1822 Status
= EFI_NOT_FOUND
;
1827 // Send the page and table header
1829 Status
= TableHeader ( SocketFD
, pPort
, L
"MCFG Table", pMcfg
);
1830 if ( EFI_ERROR ( Status
)) {
1835 // Display the header
1837 Status
= RowAnsiArray ( SocketFD
,
1840 sizeof ( pMcfg
->Signature
),
1841 (CHAR8
*)&pMcfg
->Signature
);
1842 if ( EFI_ERROR ( Status
)) {
1845 Status
= RowDecimalValue ( SocketFD
,
1849 if ( EFI_ERROR ( Status
)) {
1854 // Display the data from the table
1856 Status
= RowDump ( SocketFD
,
1859 pMcfg
->Length
- sizeof ( *pMcfg
) + 1,
1860 (UINT8
*)( pMcfg
+ 1 ));
1861 if ( EFI_ERROR ( Status
)) {
1866 // Build the table trailer
1868 Status
= TableTrailer ( SocketFD
,
1875 // Return the operation status
1877 DBG_EXIT_STATUS ( Status
);
1883 Respond with the ACPI RSDP 1.0b table
1885 @param [in] SocketFD The socket's file descriptor to add to the list.
1886 @param [in] pPort The WSDT_PORT structure address
1887 @param [out] pbDone Address to receive the request completion status
1889 @retval EFI_SUCCESS The request was successfully processed
1895 IN WSDT_PORT
* pPort
,
1896 OUT BOOLEAN
* pbDone
1899 CONST EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER
* pRsdp10b
;
1905 // Send the RSDP page
1911 Status
= EfiGetSystemConfigurationTable ( &gEfiAcpi10TableGuid
, (VOID
**) &pRsdp10b
);
1912 if ( EFI_ERROR ( Status
)) {
1917 // Send the page and table header
1919 Status
= TableHeader ( SocketFD
, pPort
, L
"RSDP - ACPI 1.0b Root System Description Pointer", pRsdp10b
);
1920 if ( EFI_ERROR ( Status
)) {
1927 Status
= RowAnsiArray ( SocketFD
,
1930 sizeof ( pRsdp10b
->Signature
),
1931 (CHAR8
*)&pRsdp10b
->Signature
);
1932 if ( EFI_ERROR ( Status
)) {
1935 Status
= RowHexValue ( SocketFD
,
1940 if ( EFI_ERROR ( Status
)) {
1943 Status
= RowAnsiArray ( SocketFD
,
1946 sizeof ( pRsdp10b
->OemId
),
1947 (CONST CHAR8
*)&pRsdp10b
->OemId
[ 0 ]);
1948 if ( EFI_ERROR ( Status
)) {
1951 Status
= RowHexValue ( SocketFD
,
1956 if ( EFI_ERROR ( Status
)) {
1959 Status
= RowPointer ( SocketFD
,
1962 (VOID
*)(UINTN
)pRsdp10b
->RsdtAddress
,
1964 if ( EFI_ERROR ( Status
)) {
1969 // Build the table trailer
1971 Status
= TableTrailer ( SocketFD
,
1978 // Return the operation status
1980 DBG_EXIT_STATUS ( Status
);
1986 Respond with the ACPI RSDP 3.0 table
1988 @param [in] SocketFD The socket's file descriptor to add to the list.
1989 @param [in] pPort The WSDT_PORT structure address
1990 @param [out] pbDone Address to receive the request completion status
1992 @retval EFI_SUCCESS The request was successfully processed
1998 IN WSDT_PORT
* pPort
,
1999 OUT BOOLEAN
* pbDone
2002 CONST EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER
* pRsdp30
;
2008 // Send the RSDP page
2014 Status
= EfiGetSystemConfigurationTable ( &gEfiAcpiTableGuid
, (VOID
**) &pRsdp30
);
2015 if ( EFI_ERROR ( Status
)) {
2020 // Send the page and table header
2022 Status
= TableHeader ( SocketFD
, pPort
, L
"RSDP - ACPI 3.0 Root System Description Pointer", pRsdp30
);
2023 if ( EFI_ERROR ( Status
)) {
2030 Status
= RowAnsiArray ( SocketFD
,
2033 sizeof ( pRsdp30
->Signature
),
2034 (CHAR8
*)&pRsdp30
->Signature
);
2035 if ( EFI_ERROR ( Status
)) {
2038 Status
= RowHexValue ( SocketFD
,
2043 if ( EFI_ERROR ( Status
)) {
2046 Status
= RowAnsiArray ( SocketFD
,
2049 sizeof ( pRsdp30
->OemId
),
2050 (CONST CHAR8
*)&pRsdp30
->OemId
[ 0 ]);
2051 if ( EFI_ERROR ( Status
)) {
2054 Status
= RowHexValue ( SocketFD
,
2059 if ( EFI_ERROR ( Status
)) {
2062 Status
= RowPointer ( SocketFD
,
2065 (VOID
*)(UINTN
)pRsdp30
->RsdtAddress
,
2067 if ( EFI_ERROR ( Status
)) {
2070 Status
= RowDecimalValue ( SocketFD
,
2074 if ( EFI_ERROR ( Status
)) {
2077 Status
= RowPointer ( SocketFD
,
2080 (VOID
*)(UINTN
)pRsdp30
->XsdtAddress
,
2082 if ( EFI_ERROR ( Status
)) {
2085 Status
= RowHexValue ( SocketFD
,
2088 pRsdp30
->ExtendedChecksum
,
2090 if ( EFI_ERROR ( Status
)) {
2093 Status
= RowBytes ( SocketFD
,
2096 sizeof ( pRsdp30
->Reserved
),
2097 &pRsdp30
->Reserved
[ 0 ]);
2098 if ( EFI_ERROR ( Status
)) {
2103 // Build the table trailer
2105 Status
= TableTrailer ( SocketFD
,
2112 // Return the operation status
2114 DBG_EXIT_STATUS ( Status
);
2120 Respond with the ACPI RSDT table
2122 @param [in] SocketFD The socket's file descriptor to add to the list.
2123 @param [in] pPort The WSDT_PORT structure address
2124 @param [out] pbDone Address to receive the request completion status
2126 @retval EFI_SUCCESS The request was successfully processed
2132 IN WSDT_PORT
* pPort
,
2133 OUT BOOLEAN
* pbDone
2136 CONST UINT32
* pEnd
;
2137 CONST UINT32
* pEntry
;
2138 CONST ACPI_RSDT
* pRsdt
;
2139 CONST CHAR8
* pTableName
;
2140 CONST CHAR16
* pWebPage
;
2142 UINT32 TableName
[ 2 ];
2147 // Send the RSDT page
2153 pRsdt
= LocateRsdt ( );
2154 if ( NULL
== pRsdt
) {
2155 Status
= EFI_NOT_FOUND
;
2160 // Send the page and table header
2162 Status
= TableHeader ( SocketFD
, pPort
, L
"RSDT - ACPI Root System Description Table", pRsdt
);
2163 if ( EFI_ERROR ( Status
)) {
2170 Status
= RowAnsiArray ( SocketFD
,
2173 sizeof ( pRsdt
->Signature
),
2174 (CHAR8
*)&pRsdt
->Signature
);
2175 if ( EFI_ERROR ( Status
)) {
2178 Status
= RowDecimalValue ( SocketFD
,
2182 if ( EFI_ERROR ( Status
)) {
2185 Status
= RowDecimalValue ( SocketFD
,
2189 if ( EFI_ERROR ( Status
)) {
2192 Status
= RowHexValue ( SocketFD
,
2197 if ( EFI_ERROR ( Status
)) {
2200 Status
= RowAnsiArray ( SocketFD
,
2203 sizeof ( pRsdt
->OemId
),
2204 (CONST CHAR8
*)&pRsdt
->OemId
[ 0 ]);
2205 if ( EFI_ERROR ( Status
)) {
2208 Status
= RowAnsiArray ( SocketFD
,
2211 sizeof ( pRsdt
->OemTableId
),
2212 (CONST CHAR8
*)&pRsdt
->OemTableId
[ 0 ]);
2213 if ( EFI_ERROR ( Status
)) {
2216 Status
= RowRevision ( SocketFD
,
2219 pRsdt
->OemRevision
);
2220 if ( EFI_ERROR ( Status
)) {
2223 Status
= RowAnsiArray ( SocketFD
,
2226 sizeof ( pRsdt
->CreatorId
),
2227 (CHAR8
*)&pRsdt
->CreatorId
);
2228 if ( EFI_ERROR ( Status
)) {
2231 Status
= RowRevision ( SocketFD
,
2234 pRsdt
->CreatorRevision
);
2235 if ( EFI_ERROR ( Status
)) {
2240 // Walk the list of entries
2242 pEntry
= &pRsdt
->Entry
[ 0 ];
2243 pEnd
= &pEntry
[(( pRsdt
->Length
- sizeof ( *pRsdt
)) >> 2 ) + 1 ];
2245 while ( pEnd
> pEntry
) {
2247 // The entry is actually a 32-bit physical table address
2248 // The first entry in the table is the 32-bit table signature
2250 TableName
[ 0 ] = *(UINT32
*)(UINTN
)*pEntry
;
2251 pWebPage
= SignatureLookup ( &TableName
[ 0 ], &pTableName
);
2254 // Display the table address
2256 Status
= RowPointer ( SocketFD
,
2259 (VOID
*)(UINTN
)*pEntry
,
2261 if ( EFI_ERROR ( Status
)) {
2266 if ( EFI_ERROR ( Status
)) {
2271 // Build the table trailer
2273 Status
= TableTrailer ( SocketFD
,
2280 // Return the operation status
2282 DBG_EXIT_STATUS ( Status
);
2288 Respond with the SSDT table
2290 @param [in] SocketFD The socket's file descriptor to add to the list.
2291 @param [in] pPort The WSDT_PORT structure address
2292 @param [out] pbDone Address to receive the request completion status
2294 @retval EFI_SUCCESS The request was successfully processed
2300 IN WSDT_PORT
* pPort
,
2301 OUT BOOLEAN
* pbDone
2304 CONST ACPI_UNKNOWN
* pSsdt
;
2310 // Send the SSDT page
2316 pSsdt
= (ACPI_UNKNOWN
*)LocateTable ( SSDT_SIGNATURE
);
2317 if ( NULL
== pSsdt
) {
2318 Status
= EFI_NOT_FOUND
;
2323 // Send the page and table header
2325 Status
= TableHeader ( SocketFD
, pPort
, L
"SSDT Table", pSsdt
);
2326 if ( EFI_ERROR ( Status
)) {
2331 // Display the header
2333 Status
= RowAnsiArray ( SocketFD
,
2336 sizeof ( pSsdt
->Signature
),
2337 (CHAR8
*)&pSsdt
->Signature
);
2338 if ( EFI_ERROR ( Status
)) {
2341 Status
= RowDecimalValue ( SocketFD
,
2345 if ( EFI_ERROR ( Status
)) {
2350 // Display the data from the table
2352 Status
= RowDump ( SocketFD
,
2355 pSsdt
->Length
- sizeof ( *pSsdt
) + 1,
2356 (UINT8
*)( pSsdt
+ 1 ));
2357 if ( EFI_ERROR ( Status
)) {
2362 // Build the table trailer
2364 Status
= TableTrailer ( SocketFD
,
2371 // Return the operation status
2373 DBG_EXIT_STATUS ( Status
);
2379 Respond with the TCPA table
2381 @param [in] SocketFD The socket's file descriptor to add to the list.
2382 @param [in] pPort The WSDT_PORT structure address
2383 @param [out] pbDone Address to receive the request completion status
2385 @retval EFI_SUCCESS The request was successfully processed
2391 IN WSDT_PORT
* pPort
,
2392 OUT BOOLEAN
* pbDone
2395 CONST ACPI_UNKNOWN
* pTcpa
;
2401 // Send the TCPA page
2407 pTcpa
= (ACPI_UNKNOWN
*)LocateTable ( TCPA_SIGNATURE
);
2408 if ( NULL
== pTcpa
) {
2409 Status
= EFI_NOT_FOUND
;
2414 // Send the page and table header
2416 Status
= TableHeader ( SocketFD
, pPort
, L
"TCPA Table", pTcpa
);
2417 if ( EFI_ERROR ( Status
)) {
2422 // Display the header
2424 Status
= RowAnsiArray ( SocketFD
,
2427 sizeof ( pTcpa
->Signature
),
2428 (CHAR8
*)&pTcpa
->Signature
);
2429 if ( EFI_ERROR ( Status
)) {
2432 Status
= RowDecimalValue ( SocketFD
,
2436 if ( EFI_ERROR ( Status
)) {
2441 // Display the data from the table
2443 Status
= RowDump ( SocketFD
,
2446 pTcpa
->Length
- sizeof ( *pTcpa
) + 1,
2447 (UINT8
*)( pTcpa
+ 1 ));
2448 if ( EFI_ERROR ( Status
)) {
2453 // Build the table trailer
2455 Status
= TableTrailer ( SocketFD
,
2462 // Return the operation status
2464 DBG_EXIT_STATUS ( Status
);
2470 Respond with the UEFI table
2472 @param [in] SocketFD The socket's file descriptor to add to the list.
2473 @param [in] pPort The WSDT_PORT structure address
2474 @param [out] pbDone Address to receive the request completion status
2476 @retval EFI_SUCCESS The request was successfully processed
2482 IN WSDT_PORT
* pPort
,
2483 OUT BOOLEAN
* pbDone
2486 CONST ACPI_UNKNOWN
* pUefi
;
2492 // Send the UEFI page
2498 pUefi
= (ACPI_UNKNOWN
*)LocateTable ( UEFI_SIGNATURE
);
2499 if ( NULL
== pUefi
) {
2500 Status
= EFI_NOT_FOUND
;
2505 // Send the page and table header
2507 Status
= TableHeader ( SocketFD
, pPort
, L
"UEFI Table", pUefi
);
2508 if ( EFI_ERROR ( Status
)) {
2513 // Display the header
2515 Status
= RowAnsiArray ( SocketFD
,
2518 sizeof ( pUefi
->Signature
),
2519 (CHAR8
*)&pUefi
->Signature
);
2520 if ( EFI_ERROR ( Status
)) {
2523 Status
= RowDecimalValue ( SocketFD
,
2527 if ( EFI_ERROR ( Status
)) {
2532 // Display the data from the table
2534 Status
= RowDump ( SocketFD
,
2537 pUefi
->Length
- sizeof ( *pUefi
) + 1,
2538 (UINT8
*)( pUefi
+ 1 ));
2539 if ( EFI_ERROR ( Status
)) {
2544 // Build the table trailer
2546 Status
= TableTrailer ( SocketFD
,
2553 // Return the operation status
2555 DBG_EXIT_STATUS ( Status
);