+/**\r
+ Respond with the SSDT table\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [out] pbDone Address to receive the request completion status\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+AcpiSsdtPage (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ OUT BOOLEAN * pbDone\r
+ )\r
+{\r
+ CONST ACPI_UNKNOWN * pSsdt;\r
+ EFI_STATUS Status;\r
+\r
+ DBG_ENTER ( );\r
+\r
+ //\r
+ // Send the SSDT page\r
+ //\r
+ for ( ; ; ) {\r
+ //\r
+ // Locate the SSDT\r
+ //\r
+ pSsdt = (ACPI_UNKNOWN *)LocateTable ( SSDT_SIGNATURE );\r
+ if ( NULL == pSsdt ) {\r
+ Status = EFI_NOT_FOUND;\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Send the page and table header\r
+ //\r
+ Status = TableHeader ( SocketFD, pPort, L"SSDT Table", pSsdt );\r
+ if ( EFI_ERROR ( Status )) {\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Display the header\r
+ //\r
+ Status = RowAnsiArray ( SocketFD,\r
+ pPort,\r
+ "Signature",\r
+ sizeof ( pSsdt->Signature ),\r
+ (CHAR8 *)&pSsdt->Signature );\r
+ if ( EFI_ERROR ( Status )) {\r
+ break;\r
+ }\r
+ Status = RowDecimalValue ( SocketFD,\r
+ pPort,\r
+ "Length",\r
+ pSsdt->Length );\r
+ if ( EFI_ERROR ( Status )) {\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Display the data from the table\r
+ //\r
+ Status = RowDump ( SocketFD,\r
+ pPort,\r
+ "Data",\r
+ pSsdt->Length - sizeof ( *pSsdt ) + 1,\r
+ (UINT8 *)( pSsdt + 1 ));\r
+ if ( EFI_ERROR ( Status )) {\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Build the table trailer\r
+ //\r
+ Status = TableTrailer ( SocketFD,\r
+ pPort,\r
+ pbDone );\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Return the operation status\r
+ //\r
+ DBG_EXIT_STATUS ( Status );\r
+ return Status;\r
+}\r
+\r
+\r
+/**\r
+ Respond with the TCPA table\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [out] pbDone Address to receive the request completion status\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+AcpiTcpaPage (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ OUT BOOLEAN * pbDone\r
+ )\r
+{\r
+ CONST ACPI_UNKNOWN * pTcpa;\r
+ EFI_STATUS Status;\r
+\r
+ DBG_ENTER ( );\r
+\r
+ //\r
+ // Send the TCPA page\r
+ //\r
+ for ( ; ; ) {\r
+ //\r
+ // Locate the TCPA\r
+ //\r
+ pTcpa = (ACPI_UNKNOWN *)LocateTable ( TCPA_SIGNATURE );\r
+ if ( NULL == pTcpa ) {\r
+ Status = EFI_NOT_FOUND;\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Send the page and table header\r
+ //\r
+ Status = TableHeader ( SocketFD, pPort, L"TCPA Table", pTcpa );\r
+ if ( EFI_ERROR ( Status )) {\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Display the header\r
+ //\r
+ Status = RowAnsiArray ( SocketFD,\r
+ pPort,\r
+ "Signature",\r
+ sizeof ( pTcpa->Signature ),\r
+ (CHAR8 *)&pTcpa->Signature );\r
+ if ( EFI_ERROR ( Status )) {\r
+ break;\r
+ }\r
+ Status = RowDecimalValue ( SocketFD,\r
+ pPort,\r
+ "Length",\r
+ pTcpa->Length );\r
+ if ( EFI_ERROR ( Status )) {\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Display the data from the table\r
+ //\r
+ Status = RowDump ( SocketFD,\r
+ pPort,\r
+ "Data",\r
+ pTcpa->Length - sizeof ( *pTcpa ) + 1,\r
+ (UINT8 *)( pTcpa + 1 ));\r
+ if ( EFI_ERROR ( Status )) {\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Build the table trailer\r
+ //\r
+ Status = TableTrailer ( SocketFD,\r
+ pPort,\r
+ pbDone );\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Return the operation status\r
+ //\r
+ DBG_EXIT_STATUS ( Status );\r
+ return Status;\r
+}\r
+\r
+\r
+/**\r
+ Respond with the UEFI table\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [out] pbDone Address to receive the request completion status\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+AcpiUefiPage (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ OUT BOOLEAN * pbDone\r
+ )\r
+{\r
+ CONST ACPI_UNKNOWN * pUefi;\r
+ EFI_STATUS Status;\r
+\r
+ DBG_ENTER ( );\r
+\r
+ //\r
+ // Send the UEFI page\r
+ //\r
+ for ( ; ; ) {\r
+ //\r
+ // Locate the UEFI\r
+ //\r
+ pUefi = (ACPI_UNKNOWN *)LocateTable ( UEFI_SIGNATURE );\r
+ if ( NULL == pUefi ) {\r
+ Status = EFI_NOT_FOUND;\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Send the page and table header\r
+ //\r
+ Status = TableHeader ( SocketFD, pPort, L"UEFI Table", pUefi );\r
+ if ( EFI_ERROR ( Status )) {\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Display the header\r
+ //\r
+ Status = RowAnsiArray ( SocketFD,\r
+ pPort,\r
+ "Signature",\r
+ sizeof ( pUefi->Signature ),\r
+ (CHAR8 *)&pUefi->Signature );\r
+ if ( EFI_ERROR ( Status )) {\r
+ break;\r
+ }\r
+ Status = RowDecimalValue ( SocketFD,\r
+ pPort,\r
+ "Length",\r
+ pUefi->Length );\r
+ if ( EFI_ERROR ( Status )) {\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Display the data from the table\r
+ //\r
+ Status = RowDump ( SocketFD,\r
+ pPort,\r
+ "Data",\r
+ pUefi->Length - sizeof ( *pUefi ) + 1,\r
+ (UINT8 *)( pUefi + 1 ));\r
+ if ( EFI_ERROR ( Status )) {\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Build the table trailer\r
+ //\r
+ Status = TableTrailer ( SocketFD,\r
+ pPort,\r
+ pbDone );\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Return the operation status\r
+ //\r
+ DBG_EXIT_STATUS ( Status );\r
+ return Status;\r
+}\r