1 /** 2 @file 3 Display the ACPI tables 4 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 10 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. 13 14 **/ 15 16 #include <WebServer.h> 17 #include <Guid/Acpi.h> 18 #include <IndustryStandard/Acpi10.h> 19 #include <IndustryStandard/Acpi30.h> 20 21 #if defined(_MSC_VER) // Handle Microsoft VC++ compiler specifics. 22 #pragma warning ( disable : 4305 ) 23 #endif // defined(_MSC_VER) 24 25 // 26 // Ensure proper structure formats 27 // 28 #pragma pack(1) 29 30 typedef struct { 31 UINT8 AddressSpaceId; 32 UINT8 RegisterBitWidth; 33 UINT8 RegisterBitOffset; 34 UINT8 AccessSize; 35 UINT64 Address; 36 } GENERIC_ADDRESS; 37 38 39 typedef struct { 40 UINT32 Signature; // 0 41 UINT32 Length; // 4 42 UINT8 Revision; // 8 43 UINT8 Checksum; // 9 44 UINT8 OemId[6]; // 10 45 UINT8 OemTableId[8]; // 16 46 UINT32 OemRevision; // 24 47 UINT32 CreatorId; // 28 48 UINT32 CreatorRevision; // 32 49 UINT8 DefinitionBlock[1]; // 36 50 } ACPI_DSDT; 51 52 53 typedef struct { 54 UINT32 Signature; // 0 55 UINT32 Length; // 4 56 UINT8 Revision; // 8 57 UINT8 Checksum; // 9 58 UINT8 OemId[6]; // 10 59 UINT8 OemTableId[8]; // 16 60 UINT32 OemRevision; // 24 61 UINT32 CreatorId; // 28 62 UINT32 CreatorRevision; // 32 63 UINT32 FirmwareCtrl; // 36 64 UINT32 DSDT; // 40 65 UINT8 Reserved; // 44 66 UINT8 PreferredPmProfile; // 45 67 UINT16 SciInt; // 46 68 UINT32 SmiCmd; // 48 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 79 UINT32 Gpe0Blk; // 80 80 UINT32 Gpe1Blk; // 84 81 UINT8 Pm1EvtLen; // 88 82 UINT8 Pm1CntLen; // 89 83 UINT8 PM2CntLen; // 90 84 UINT8 PmTmrLen; // 91 85 UINT8 Gpe0BlkLen; // 92 86 UINT8 Gpe1BlkLen; // 93 87 UINT8 Gpe1Base; // 94 88 UINT8 CstCnt; // 95 89 UINT16 PLvl2Lat; // 96 90 UINT16 PLvl3Lat; // 98 91 UINT16 FlushSize; // 100 92 UINT16 FlushStride; // 102 93 UINT8 DutyOffset; // 104 94 UINT8 DutyWidth; // 105 95 UINT8 DayAlrm; // 106 96 UINT8 MonAlrm; // 107 97 UINT8 Century; // 108 98 UINT16 IapcBootArch; // 109 99 UINT8 Reserved2; // 111 100 UINT32 Flags; // 112 101 UINT32 ResetReg[3]; // 116 102 UINT8 ResetValue; // 128 103 UINT8 Reserved3[3]; // 129 104 UINT64 XFirmwareCtrl; // 132 105 UINT64 XDsdt; // 140 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 114 } ACPI_FADT; 115 116 117 typedef struct { 118 UINT32 Signature; 119 UINT32 Length; 120 UINT8 Revision; 121 UINT8 Checksum; 122 UINT8 OemId[6]; 123 UINT8 OemTableId[8]; 124 UINT32 OemRevision; 125 UINT32 CreatorId; 126 UINT32 CreatorRevision; 127 UINT32 Entry[1]; 128 } ACPI_RSDT; 129 130 131 typedef struct { 132 UINT32 Signature; // 0 133 UINT32 Length; // 4 134 } ACPI_UNKNOWN; 135 136 #pragma pack() 137 138 139 typedef struct { 140 UINT32 Signature; 141 CONST CHAR8 * pTableName; 142 CONST CHAR16 * pWebPage; 143 } TABLE_SIGNATURE; 144 145 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 } 156 }; 157 158 159 /** 160 Locate the RSDT table 161 162 @return Table address or NULL if not found 163 164 **/ 165 CONST ACPI_RSDT * 166 LocateRsdt ( 167 VOID 168 ) 169 { 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; 173 EFI_STATUS Status; 174 175 // 176 // Use for/break instead of goto 177 // 178 pRsdt = NULL; 179 for ( ; ; ) { 180 // 181 // Locate the RSDT 182 // 183 Status = EfiGetSystemConfigurationTable ( &gEfiAcpiTableGuid, (VOID **)&pRsdp30 ); 184 if ( !EFI_ERROR ( Status )) { 185 pRsdt = (ACPI_RSDT *)(UINTN)pRsdp30->RsdtAddress; 186 } 187 else { 188 Status = EfiGetSystemConfigurationTable (&gEfiAcpi10TableGuid, (VOID **)&pRsdp10b ); 189 if ( EFI_ERROR ( Status )) { 190 break; 191 } 192 pRsdt = (ACPI_RSDT *)(UINTN)pRsdp10b->RsdtAddress; 193 } 194 break; 195 } 196 197 // 198 // The entry was not found 199 // 200 return pRsdt; 201 } 202 203 204 /** 205 Locate the specified table 206 207 @param [in] Signature Table signature 208 209 @return Table address or NULL if not found 210 211 **/ 212 CONST VOID * 213 LocateTable ( 214 IN UINT32 Signature 215 ) 216 { 217 CONST UINT32 * pEnd; 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; 223 EFI_STATUS Status; 224 225 // 226 // Use for/break instead of goto 227 // 228 for ( ; ; ) { 229 // 230 // Locate the RSDT 231 // 232 Status = EfiGetSystemConfigurationTable ( &gEfiAcpiTableGuid, (VOID **)&pRsdp30 ); 233 if ( !EFI_ERROR ( Status )) { 234 pRsdt = (ACPI_RSDT *)(UINTN)pRsdp30->RsdtAddress; 235 } 236 else { 237 Status = EfiGetSystemConfigurationTable (&gEfiAcpi10TableGuid, (VOID **)&pRsdp10b ); 238 if ( EFI_ERROR ( Status )) { 239 break; 240 } 241 pRsdt = (ACPI_RSDT *)(UINTN)pRsdp10b->RsdtAddress; 242 } 243 244 // 245 // Walk the list of entries 246 // 247 pEntry = &pRsdt->Entry[ 0 ]; 248 pEnd = &pEntry[(( pRsdt->Length - sizeof ( *pRsdt )) >> 2 ) + 1 ]; 249 while ( pEnd > pEntry ) { 250 // 251 // The entry is actually a 32-bit physical table address 252 // The first entry in the table is the 32-bit table signature 253 // 254 pSignature = (UINT32 *)(UINTN)*pEntry; 255 if ( *pSignature == Signature ) { 256 return (CONST VOID *)(UINTN)*pEntry; 257 } 258 259 // 260 // Set the next entry 261 // 262 pEntry++; 263 } 264 break; 265 } 266 267 // 268 // The entry was not found 269 // 270 return NULL; 271 } 272 273 274 /** 275 Display a row containing a hex value 276 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 282 283 @retval EFI_SUCCESS The request was successfully processed 284 285 **/ 286 EFI_STATUS 287 RowAnsiArray ( 288 IN int SocketFD, 289 IN WSDT_PORT * pPort, 290 IN CONST CHAR8 * pName, 291 IN UINTN Length, 292 IN CONST CHAR8 * pChar 293 ) 294 { 295 CONST CHAR8 * pData; 296 CONST CHAR8 * pEnd; 297 EFI_STATUS Status; 298 299 DBG_ENTER ( ); 300 301 // 302 // Use for/break instead of goto 303 // 304 for ( ; ; ) { 305 // 306 // Start the row 307 // 308 Status = HttpSendAnsiString ( SocketFD, 309 pPort, 310 "<tr><td>" ); 311 if ( EFI_ERROR ( Status )) { 312 break; 313 } 314 Status = HttpSendAnsiString ( SocketFD, 315 pPort, 316 pName ); 317 if ( EFI_ERROR ( Status )) { 318 break; 319 } 320 Status = HttpSendAnsiString ( SocketFD, 321 pPort, 322 "</td><td><code>" ); 323 if ( EFI_ERROR ( Status )) { 324 break; 325 } 326 327 // 328 // Display the characters 329 // 330 pData = pChar; 331 pEnd = &pChar[ Length ]; 332 while ( pEnd > pData ) { 333 Status = HttpSendCharacter ( SocketFD, 334 pPort, 335 *pData++, 336 " " ); 337 if ( EFI_ERROR ( Status )) { 338 break; 339 } 340 } 341 if ( EFI_ERROR ( Status )) { 342 break; 343 } 344 345 // 346 // Display the byte values 347 // 348 Status = HttpSendAnsiString ( SocketFD, 349 pPort, 350 "<br/>0x" ); 351 if ( EFI_ERROR ( Status )) { 352 break; 353 } 354 pData = pChar; 355 while ( pEnd > pData ) { 356 Status = HttpSendHexBits ( SocketFD, 357 pPort, 358 8, 359 *pData++ ); 360 if ( EFI_ERROR ( Status )) { 361 break; 362 } 363 if ( pEnd > pData ) { 364 Status = HttpSendAnsiString ( SocketFD, 365 pPort, 366 " 0x" ); 367 if ( EFI_ERROR ( Status )) { 368 break; 369 } 370 } 371 } 372 373 // 374 // Terminate the row 375 // 376 Status = HttpSendAnsiString ( SocketFD, 377 pPort, 378 "</code></td></tr>\r\n" ); 379 break; 380 } 381 382 // 383 // Return the operation status 384 // 385 DBG_EXIT_STATUS ( Status ); 386 return Status; 387 } 388 389 390 /** 391 Format a row with a list of bytes 392 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 398 399 @retval EFI_SUCCESS The request was successfully processed 400 401 **/ 402 EFI_STATUS 403 RowBytes ( 404 IN int SocketFD, 405 IN WSDT_PORT * pPort, 406 IN CHAR8 * pName, 407 IN UINTN ByteCount, 408 IN CONST UINT8 * pData 409 ) 410 { 411 CONST UINT8 * pEnd; 412 EFI_STATUS Status; 413 414 // 415 // Use for/break instead of goto 416 // 417 for ( ; ; ) { 418 // 419 // Start the row 420 // 421 Status = HttpSendAnsiString ( SocketFD, 422 pPort, 423 "<tr><td>" ); 424 if ( EFI_ERROR ( Status )) { 425 break; 426 } 427 428 // 429 // Display the field name 430 // 431 Status = HttpSendAnsiString ( SocketFD, 432 pPort, 433 pName ); 434 if ( EFI_ERROR ( Status )) { 435 break; 436 } 437 438 // 439 // Display the field value 440 // 441 Status = HttpSendAnsiString ( SocketFD, 442 pPort, 443 "</td><td><code>0x" ); 444 if ( EFI_ERROR ( Status )) { 445 break; 446 } 447 pEnd = &pData[ ByteCount ]; 448 while ( pEnd > pData ) { 449 Status = HttpSendHexBits ( SocketFD, 450 pPort, 451 8, 452 *pData++ ); 453 if ( EFI_ERROR ( Status )) { 454 break; 455 } 456 if ( pEnd > pData ) { 457 Status = HttpSendAnsiString ( SocketFD, 458 pPort, 459 " 0x" ); 460 if ( EFI_ERROR ( Status )) { 461 break; 462 } 463 } 464 } 465 if ( EFI_ERROR ( Status )) { 466 break; 467 } 468 469 // 470 // Terminate the row 471 // 472 Status = HttpSendAnsiString ( SocketFD, 473 pPort, 474 "</code></td></tr>\r\n" ); 475 break; 476 } 477 478 // 479 // Return the operation status 480 // 481 return Status; 482 } 483 484 485 /** 486 Format a row with a list of bytes 487 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 493 494 @retval EFI_SUCCESS The request was successfully processed 495 496 **/ 497 EFI_STATUS 498 RowDump ( 499 IN int SocketFD, 500 IN WSDT_PORT * pPort, 501 IN CHAR8 * pName, 502 IN UINTN ByteCount, 503 IN CONST UINT8 * pData 504 ) 505 { 506 EFI_STATUS Status; 507 508 // 509 // Use for/break instead of goto 510 // 511 for ( ; ; ) { 512 // 513 // Start the row 514 // 515 Status = HttpSendAnsiString ( SocketFD, 516 pPort, 517 "<tr><td>" ); 518 if ( EFI_ERROR ( Status )) { 519 break; 520 } 521 522 // 523 // Display the field name 524 // 525 Status = HttpSendAnsiString ( SocketFD, 526 pPort, 527 pName ); 528 if ( EFI_ERROR ( Status )) { 529 break; 530 } 531 532 // 533 // Start the field value 534 // 535 Status = HttpSendAnsiString ( SocketFD, 536 pPort, 537 "</td><td>" ); 538 if ( EFI_ERROR ( Status )) { 539 break; 540 } 541 542 // 543 // Dump the buffer 544 // 545 Status = HttpSendDump ( SocketFD, 546 pPort, 547 ByteCount, 548 pData ); 549 550 // 551 // Terminate the field value and row 552 // 553 Status = HttpSendAnsiString ( SocketFD, 554 pPort, 555 "</td></tr>\r\n" ); 556 break; 557 } 558 559 // 560 // Return the operation status 561 // 562 return Status; 563 } 564 565 566 /** 567 Format a row with a general address 568 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 574 575 @retval EFI_SUCCESS The request was successfully processed 576 577 **/ 578 EFI_STATUS 579 RowGenericAddress ( 580 IN int SocketFD, 581 IN WSDT_PORT * pPort, 582 IN CHAR8 * pName, 583 IN CONST UINT32 * pAddr, 584 IN CONST CHAR16 * pWebPage 585 ) 586 { 587 CONST GENERIC_ADDRESS * pGenericAddress; 588 EFI_STATUS Status; 589 590 // 591 // Use for/break instead of goto 592 // 593 for ( ; ; ) { 594 // 595 // Start the row 596 // 597 Status = HttpSendAnsiString ( SocketFD, 598 pPort, 599 "<tr><td>" ); 600 if ( EFI_ERROR ( Status )) { 601 break; 602 } 603 604 // 605 // Display the field name 606 // 607 Status = HttpSendAnsiString ( SocketFD, 608 pPort, 609 pName ); 610 if ( EFI_ERROR ( Status )) { 611 break; 612 } 613 614 // 615 // Display the field value 616 // 617 Status = HttpSendAnsiString ( SocketFD, 618 pPort, 619 "</td><td><code>" ); 620 if ( EFI_ERROR ( Status )) { 621 break; 622 } 623 624 // 625 // Determine the type of address 626 // 627 pGenericAddress = (CONST GENERIC_ADDRESS *)pAddr; 628 if ( 0 == pGenericAddress->AddressSpaceId ) { 629 Status = HttpSendAnsiString ( SocketFD, pPort, "System Memory" ); 630 } 631 else if ( 1 == pGenericAddress->AddressSpaceId ) { 632 Status = HttpSendAnsiString ( SocketFD, pPort, "I/O Space" ); 633 } 634 else if ( 2 == pGenericAddress->AddressSpaceId ) { 635 Status = HttpSendAnsiString ( SocketFD, pPort, "PCI Configuration Space" ); 636 } 637 else if ( 3 == pGenericAddress->AddressSpaceId ) { 638 Status = HttpSendAnsiString ( SocketFD, pPort, "Embedded Controller" ); 639 } 640 else if ( 4 == pGenericAddress->AddressSpaceId ) { 641 Status = HttpSendAnsiString ( SocketFD, pPort, "SMBus" ); 642 } 643 else if ( 0x7f == pGenericAddress->AddressSpaceId ) { 644 Status = HttpSendAnsiString ( SocketFD, pPort, "Functional Fixed Hardware" ); 645 } 646 else if (( 0xc0 <= pGenericAddress->AddressSpaceId ) 647 && ( 0xff >= pGenericAddress->AddressSpaceId )) { 648 Status = HttpSendAnsiString ( SocketFD, pPort, "OEM Defined" ); 649 } 650 else { 651 Status = HttpSendAnsiString ( SocketFD, pPort, "Reserved" ); 652 } 653 if ( EFI_ERROR ( Status )) { 654 break; 655 } 656 Status = HttpSendAnsiString ( SocketFD, 657 pPort, 658 "<br/>Register Bit Width: " ); 659 if ( EFI_ERROR ( Status )) { 660 break; 661 } 662 Status = HttpSendValue ( SocketFD, 663 pPort, 664 pGenericAddress->RegisterBitWidth ); 665 if ( EFI_ERROR ( Status )) { 666 break; 667 } 668 Status = HttpSendAnsiString ( SocketFD, 669 pPort, 670 "<br/>Register Bit Offset: " ); 671 if ( EFI_ERROR ( Status )) { 672 break; 673 } 674 Status = HttpSendHexValue ( SocketFD, 675 pPort, 676 pGenericAddress->RegisterBitOffset ); 677 if ( EFI_ERROR ( Status )) { 678 break; 679 } 680 Status = HttpSendAnsiString ( SocketFD, 681 pPort, 682 "<br/>Access Size: " ); 683 if ( EFI_ERROR ( Status )) { 684 break; 685 } 686 Status = HttpSendValue ( SocketFD, 687 pPort, 688 pGenericAddress->AccessSize ); 689 if ( EFI_ERROR ( Status )) { 690 break; 691 } 692 Status = HttpSendAnsiString ( SocketFD, 693 pPort, 694 "<br/>Address: " ); 695 if ( EFI_ERROR ( Status )) { 696 break; 697 } 698 699 // 700 // Add the web-page link if necessary 701 // 702 if ( NULL != pWebPage ) { 703 Status = HttpSendAnsiString ( SocketFD, 704 pPort, 705 "<a target=\"_blank\" href=\"" ); 706 if ( EFI_ERROR ( Status )) { 707 break; 708 } 709 Status = HttpSendUnicodeString ( SocketFD, 710 pPort, 711 pWebPage ); 712 if ( EFI_ERROR ( Status )) { 713 break; 714 } 715 Status = HttpSendAnsiString ( SocketFD, 716 pPort, 717 "\">" ); 718 if ( EFI_ERROR ( Status )) { 719 break; 720 } 721 } 722 723 // 724 // Display the address 725 // 726 Status = HttpSendAnsiString ( SocketFD, 727 pPort, 728 "0x" ); 729 if ( EFI_ERROR ( Status )) { 730 break; 731 } 732 Status = HttpSendHexBits ( SocketFD, 733 pPort, 734 64, 735 pGenericAddress->Address ); 736 if ( EFI_ERROR ( Status )) { 737 break; 738 } 739 740 // 741 // Finish the web-page link if necessary 742 // 743 if ( NULL != pWebPage ) { 744 Status = HttpSendAnsiString ( SocketFD, 745 pPort, 746 "</a>" ); 747 if ( EFI_ERROR ( Status )) { 748 break; 749 } 750 } 751 752 // 753 // Terminate the row 754 // 755 Status = HttpSendAnsiString ( SocketFD, 756 pPort, 757 "</code></td></tr>\r\n" ); 758 break; 759 } 760 761 // 762 // Return the operation status 763 // 764 return Status; 765 } 766 767 768 /** 769 Translate a table address into a web page 770 771 @param [in] pSignature Address of the table signature 772 @param [out] ppTableName Address to receive the table name address 773 774 @return Zero terminated web page address or NULL if not found 775 776 **/ 777 CONST CHAR16 * 778 SignatureLookup ( 779 IN UINT32 * pSignature, 780 OUT CONST CHAR8 ** ppTableName 781 ) 782 { 783 CONST TABLE_SIGNATURE * pTableId; 784 CONST TABLE_SIGNATURE * pEnd; 785 UINT32 Signature; 786 787 // 788 // Walk the list of tables 789 // 790 Signature = *pSignature; 791 pTableId = &mTableId[ 0 ]; 792 pEnd = &pTableId[ sizeof ( mTableId ) / sizeof ( mTableId[ 0 ])]; 793 while ( pEnd > pTableId ) { 794 // 795 // Attempt to locate the table signature 796 // 797 if ( pTableId->Signature == Signature ) { 798 // 799 // The signature was found 800 // Return the web page 801 // 802 *ppTableName = pTableId->pTableName; 803 return pTableId->pWebPage; 804 } 805 806 // 807 // Set the next table 808 // 809 pTableId += 1; 810 } 811 812 // 813 // The table was not found 814 // 815 *ppTableName = (CONST CHAR8 *)pSignature; 816 return NULL; 817 } 818 819 820 /** 821 Respond with the APIC table 822 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 826 827 @retval EFI_SUCCESS The request was successfully processed 828 829 **/ 830 EFI_STATUS 831 AcpiApicPage ( 832 IN int SocketFD, 833 IN WSDT_PORT * pPort, 834 OUT BOOLEAN * pbDone 835 ) 836 { 837 CONST ACPI_UNKNOWN * pApic; 838 EFI_STATUS Status; 839 840 DBG_ENTER ( ); 841 842 // 843 // Send the APIC page 844 // 845 for ( ; ; ) { 846 // 847 // Locate the APIC 848 // 849 pApic = (ACPI_UNKNOWN *)LocateTable ( APIC_SIGNATURE ); 850 if ( NULL == pApic ) { 851 Status = EFI_NOT_FOUND; 852 break; 853 } 854 855 // 856 // Send the page and table header 857 // 858 Status = TableHeader ( SocketFD, pPort, L"APIC Table", pApic ); 859 if ( EFI_ERROR ( Status )) { 860 break; 861 } 862 863 // 864 // Display the header 865 // 866 Status = RowAnsiArray ( SocketFD, 867 pPort, 868 "Signature", 869 sizeof ( pApic->Signature ), 870 (CHAR8 *)&pApic->Signature ); 871 if ( EFI_ERROR ( Status )) { 872 break; 873 } 874 Status = RowDecimalValue ( SocketFD, 875 pPort, 876 "Length", 877 pApic->Length ); 878 if ( EFI_ERROR ( Status )) { 879 break; 880 } 881 882 // 883 // Display the data from the table 884 // 885 Status = RowDump ( SocketFD, 886 pPort, 887 "Data", 888 pApic->Length - sizeof ( *pApic ) + 1, 889 (UINT8 *)( pApic + 1 )); 890 if ( EFI_ERROR ( Status )) { 891 break; 892 } 893 894 // 895 // Build the table trailer 896 // 897 Status = TableTrailer ( SocketFD, 898 pPort, 899 pbDone ); 900 break; 901 } 902 903 // 904 // Return the operation status 905 // 906 DBG_EXIT_STATUS ( Status ); 907 return Status; 908 } 909 910 911 /** 912 Respond with the BGRT table 913 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 917 918 @retval EFI_SUCCESS The request was successfully processed 919 920 **/ 921 EFI_STATUS 922 AcpiBgrtPage ( 923 IN int SocketFD, 924 IN WSDT_PORT * pPort, 925 OUT BOOLEAN * pbDone 926 ) 927 { 928 CONST ACPI_UNKNOWN * pBgrt; 929 EFI_STATUS Status; 930 931 DBG_ENTER ( ); 932 933 // 934 // Send the BGRT page 935 // 936 for ( ; ; ) { 937 // 938 // Locate the BGRT 939 // 940 pBgrt = (ACPI_UNKNOWN *)LocateTable ( BGRT_SIGNATURE ); 941 if ( NULL == pBgrt ) { 942 Status = EFI_NOT_FOUND; 943 break; 944 } 945 946 // 947 // Send the page and table header 948 // 949 Status = TableHeader ( SocketFD, pPort, L"BGRT Table", pBgrt ); 950 if ( EFI_ERROR ( Status )) { 951 break; 952 } 953 954 // 955 // Display the header 956 // 957 Status = RowAnsiArray ( SocketFD, 958 pPort, 959 "Signature", 960 sizeof ( pBgrt->Signature ), 961 (CHAR8 *)&pBgrt->Signature ); 962 if ( EFI_ERROR ( Status )) { 963 break; 964 } 965 Status = RowDecimalValue ( SocketFD, 966 pPort, 967 "Length", 968 pBgrt->Length ); 969 if ( EFI_ERROR ( Status )) { 970 break; 971 } 972 973 // 974 // Display the data from the table 975 // 976 Status = RowDump ( SocketFD, 977 pPort, 978 "Data", 979 pBgrt->Length - sizeof ( *pBgrt ) + 1, 980 (UINT8 *)( pBgrt + 1 )); 981 if ( EFI_ERROR ( Status )) { 982 break; 983 } 984 985 // 986 // Build the table trailer 987 // 988 Status = TableTrailer ( SocketFD, 989 pPort, 990 pbDone ); 991 break; 992 } 993 994 // 995 // Return the operation status 996 // 997 DBG_EXIT_STATUS ( Status ); 998 return Status; 999 } 1000 1001 1002 /** 1003 Respond with the ACPI DSDT table 1004 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 1008 1009 @retval EFI_SUCCESS The request was successfully processed 1010 1011 **/ 1012 EFI_STATUS 1013 AcpiDsdtPage ( 1014 IN int SocketFD, 1015 IN WSDT_PORT * pPort, 1016 OUT BOOLEAN * pbDone 1017 ) 1018 { 1019 CONST ACPI_DSDT * pDsdt; 1020 CONST ACPI_FADT * pFadt; 1021 EFI_STATUS Status; 1022 1023 DBG_ENTER ( ); 1024 1025 // 1026 // Send the DADT page 1027 // 1028 for ( ; ; ) { 1029 // 1030 // Locate the DADT 1031 // 1032 pFadt = (ACPI_FADT *)LocateTable ( FADT_SIGNATURE ); 1033 if ( NULL == pFadt ) { 1034 Status = EFI_NOT_FOUND; 1035 break; 1036 } 1037 pDsdt = (VOID *)(UINTN)pFadt->XDsdt; 1038 1039 // 1040 // Send the page and table header 1041 // 1042 Status = TableHeader ( SocketFD, pPort, L"DSDT - Differentiated System Description Table", pDsdt ); 1043 if ( EFI_ERROR ( Status )) { 1044 break; 1045 } 1046 1047 // 1048 // Display the DSDT header 1049 // 1050 Status = RowAnsiArray ( SocketFD, 1051 pPort, 1052 "Signature", 1053 sizeof ( pDsdt->Signature ), 1054 (CHAR8 *)&pDsdt->Signature ); 1055 if ( EFI_ERROR ( Status )) { 1056 break; 1057 } 1058 Status = RowDecimalValue ( SocketFD, 1059 pPort, 1060 "Length", 1061 pDsdt->Length ); 1062 if ( EFI_ERROR ( Status )) { 1063 break; 1064 } 1065 Status = RowDecimalValue ( SocketFD, 1066 pPort, 1067 "Revision", 1068 pDsdt->Revision ); 1069 if ( EFI_ERROR ( Status )) { 1070 break; 1071 } 1072 Status = RowHexValue ( SocketFD, 1073 pPort, 1074 "Checksum", 1075 pDsdt->Checksum, 1076 NULL ); 1077 if ( EFI_ERROR ( Status )) { 1078 break; 1079 } 1080 Status = RowAnsiArray ( SocketFD, 1081 pPort, 1082 "OEMID", 1083 sizeof ( pDsdt->OemId ), 1084 (CONST CHAR8 *)&pDsdt->OemId[ 0 ]); 1085 if ( EFI_ERROR ( Status )) { 1086 break; 1087 } 1088 Status = RowAnsiArray ( SocketFD, 1089 pPort, 1090 "OEM Table ID", 1091 sizeof ( pDsdt->OemTableId ), 1092 (CONST CHAR8 *)&pDsdt->OemTableId[ 0 ]); 1093 if ( EFI_ERROR ( Status )) { 1094 break; 1095 } 1096 Status = RowRevision ( SocketFD, 1097 pPort, 1098 "OEM Revision", 1099 pDsdt->OemRevision ); 1100 if ( EFI_ERROR ( Status )) { 1101 break; 1102 } 1103 Status = RowAnsiArray ( SocketFD, 1104 pPort, 1105 "Creator ID", 1106 sizeof ( pDsdt->CreatorId ), 1107 (CHAR8 *)&pDsdt->CreatorId ); 1108 if ( EFI_ERROR ( Status )) { 1109 break; 1110 } 1111 Status = RowRevision ( SocketFD, 1112 pPort, 1113 "Creator Revision", 1114 pDsdt->CreatorRevision ); 1115 if ( EFI_ERROR ( Status )) { 1116 break; 1117 } 1118 1119 // 1120 // Display the data from the DSDT 1121 // 1122 Status = RowDump ( SocketFD, 1123 pPort, 1124 "Definition Block", 1125 pDsdt->Length - sizeof ( *pDsdt ) + 1, 1126 &pDsdt->DefinitionBlock[0]); 1127 if ( EFI_ERROR ( Status )) { 1128 break; 1129 } 1130 1131 // 1132 // Build the table trailer 1133 // 1134 Status = TableTrailer ( SocketFD, 1135 pPort, 1136 pbDone ); 1137 break; 1138 } 1139 1140 // 1141 // Return the operation status 1142 // 1143 DBG_EXIT_STATUS ( Status ); 1144 return Status; 1145 } 1146 1147 1148 /** 1149 Respond with the ACPI FADT table 1150 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 1154 1155 @retval EFI_SUCCESS The request was successfully processed 1156 1157 **/ 1158 EFI_STATUS 1159 AcpiFadtPage ( 1160 IN int SocketFD, 1161 IN WSDT_PORT * pPort, 1162 OUT BOOLEAN * pbDone 1163 ) 1164 { 1165 CONST ACPI_FADT * pFadt; 1166 EFI_STATUS Status; 1167 1168 DBG_ENTER ( ); 1169 1170 // 1171 // Send the FADT page 1172 // 1173 for ( ; ; ) { 1174 // 1175 // Locate the FADT 1176 // 1177 pFadt = (ACPI_FADT *)LocateTable ( FADT_SIGNATURE ); 1178 if ( NULL == pFadt ) { 1179 Status = EFI_NOT_FOUND; 1180 break; 1181 } 1182 1183 // 1184 // Send the page and table header 1185 // 1186 Status = TableHeader ( SocketFD, pPort, L"FADT - Fixed ACPI Description Table", pFadt ); 1187 if ( EFI_ERROR ( Status )) { 1188 break; 1189 } 1190 1191 // 1192 // Display the FSDT header 1193 // 1194 Status = RowAnsiArray ( SocketFD, 1195 pPort, 1196 "Signature", 1197 sizeof ( pFadt->Signature ), 1198 (CHAR8 *)&pFadt->Signature ); 1199 if ( EFI_ERROR ( Status )) { 1200 break; 1201 } 1202 Status = RowDecimalValue ( SocketFD, 1203 pPort, 1204 "Length", 1205 pFadt->Length ); 1206 if ( EFI_ERROR ( Status )) { 1207 break; 1208 } 1209 Status = RowDecimalValue ( SocketFD, 1210 pPort, 1211 "Revision", 1212 pFadt->Revision ); 1213 if ( EFI_ERROR ( Status )) { 1214 break; 1215 } 1216 Status = RowHexValue ( SocketFD, 1217 pPort, 1218 "Checksum", 1219 pFadt->Checksum, 1220 NULL ); 1221 if ( EFI_ERROR ( Status )) { 1222 break; 1223 } 1224 Status = RowAnsiArray ( SocketFD, 1225 pPort, 1226 "OEMID", 1227 sizeof ( pFadt->OemId ), 1228 (CONST CHAR8 *)&pFadt->OemId[ 0 ]); 1229 if ( EFI_ERROR ( Status )) { 1230 break; 1231 } 1232 Status = RowAnsiArray ( SocketFD, 1233 pPort, 1234 "OEM Table ID", 1235 sizeof ( pFadt->OemTableId ), 1236 (CONST CHAR8 *)&pFadt->OemTableId[ 0 ]); 1237 if ( EFI_ERROR ( Status )) { 1238 break; 1239 } 1240 Status = RowRevision ( SocketFD, 1241 pPort, 1242 "OEM Revision", 1243 pFadt->OemRevision ); 1244 if ( EFI_ERROR ( Status )) { 1245 break; 1246 } 1247 Status = RowAnsiArray ( SocketFD, 1248 pPort, 1249 "Creator ID", 1250 sizeof ( pFadt->CreatorId ), 1251 (CHAR8 *)&pFadt->CreatorId ); 1252 if ( EFI_ERROR ( Status )) { 1253 break; 1254 } 1255 Status = RowRevision ( SocketFD, 1256 pPort, 1257 "Creator Revision", 1258 pFadt->CreatorRevision ); 1259 if ( EFI_ERROR ( Status )) { 1260 break; 1261 } 1262 1263 // 1264 // Display the data from the FADT 1265 // 1266 Status = RowPointer ( SocketFD, 1267 pPort, 1268 "FIRMWARE_CTRL", 1269 (CONST VOID *)(UINTN)pFadt->FirmwareCtrl, 1270 NULL ); 1271 if ( EFI_ERROR ( Status )) { 1272 break; 1273 } 1274 Status = RowPointer ( SocketFD, 1275 pPort, 1276 "DSDT", 1277 (CONST VOID *)(UINTN)pFadt->DSDT, 1278 ( pFadt->DSDT == pFadt->XDsdt ) ? PAGE_ACPI_DSDT : NULL ); 1279 if ( EFI_ERROR ( Status )) { 1280 break; 1281 } 1282 Status = RowHexValue ( SocketFD, 1283 pPort, 1284 "Reserved", 1285 pFadt->Reserved, 1286 NULL ); 1287 if ( EFI_ERROR ( Status )) { 1288 break; 1289 } 1290 Status = RowHexValue ( SocketFD, 1291 pPort, 1292 "Preferred_PM_Profile", 1293 pFadt->PreferredPmProfile, 1294 NULL ); 1295 if ( EFI_ERROR ( Status )) { 1296 break; 1297 } 1298 Status = RowHexValue ( SocketFD, 1299 pPort, 1300 "SCI_INT", 1301 pFadt->SciInt, 1302 NULL ); 1303 if ( EFI_ERROR ( Status )) { 1304 break; 1305 } 1306 Status = RowHexValue ( SocketFD, 1307 pPort, 1308 "SMI_CMD", 1309 pFadt->SmiCmd, 1310 NULL ); 1311 if ( EFI_ERROR ( Status )) { 1312 break; 1313 } 1314 Status = RowHexValue ( SocketFD, 1315 pPort, 1316 "ACPI_ENABLE", 1317 pFadt->AcpiEnable, 1318 NULL ); 1319 if ( EFI_ERROR ( Status )) { 1320 break; 1321 } 1322 Status = RowHexValue ( SocketFD, 1323 pPort, 1324 "ACPI_DISABLE", 1325 pFadt->AcpiDisable, 1326 NULL ); 1327 if ( EFI_ERROR ( Status )) { 1328 break; 1329 } 1330 Status = RowHexValue ( SocketFD, 1331 pPort, 1332 "S4BIOS_REQ", 1333 pFadt->S4BiosReq, 1334 NULL ); 1335 if ( EFI_ERROR ( Status )) { 1336 break; 1337 } 1338 Status = RowHexValue ( SocketFD, 1339 pPort, 1340 "PSTATE_CNT", 1341 pFadt->PStateCnt, 1342 NULL ); 1343 if ( EFI_ERROR ( Status )) { 1344 break; 1345 } 1346 Status = RowHexValue ( SocketFD, 1347 pPort, 1348 "PM1a_EVT_BLK", 1349 pFadt->Pm1aEvtBlk, 1350 NULL ); 1351 if ( EFI_ERROR ( Status )) { 1352 break; 1353 } 1354 Status = RowHexValue ( SocketFD, 1355 pPort, 1356 "PM1b_EVT_BLK", 1357 pFadt->Pm1bEvtBlk, 1358 NULL ); 1359 if ( EFI_ERROR ( Status )) { 1360 break; 1361 } 1362 Status = RowHexValue ( SocketFD, 1363 pPort, 1364 "PM1a_CNT_BLK", 1365 pFadt->Pm1aCntBlk, 1366 NULL ); 1367 if ( EFI_ERROR ( Status )) { 1368 break; 1369 } 1370 Status = RowHexValue ( SocketFD, 1371 pPort, 1372 "PM1b_CNT_BLK", 1373 pFadt->Pm1bCntBlk, 1374 NULL ); 1375 if ( EFI_ERROR ( Status )) { 1376 break; 1377 } 1378 Status = RowHexValue ( SocketFD, 1379 pPort, 1380 "PM2_CNT_BLK", 1381 pFadt->Pm2CntBlk, 1382 NULL ); 1383 if ( EFI_ERROR ( Status )) { 1384 break; 1385 } 1386 Status = RowHexValue ( SocketFD, 1387 pPort, 1388 "PM_TMR_BLK", 1389 pFadt->PmTmrBlk, 1390 NULL ); 1391 if ( EFI_ERROR ( Status )) { 1392 break; 1393 } 1394 1395 Status = RowHexValue ( SocketFD, 1396 pPort, 1397 "GPE0_BLK", 1398 pFadt->Gpe0Blk, 1399 NULL ); 1400 if ( EFI_ERROR ( Status )) { 1401 break; 1402 } 1403 Status = RowHexValue ( SocketFD, 1404 pPort, 1405 "GPE1_BLK", 1406 pFadt->Gpe1Blk, 1407 NULL ); 1408 if ( EFI_ERROR ( Status )) { 1409 break; 1410 } 1411 Status = RowDecimalValue ( SocketFD, 1412 pPort, 1413 "PM1_EVT_LEN", 1414 pFadt->Pm1EvtLen ); 1415 if ( EFI_ERROR ( Status )) { 1416 break; 1417 } 1418 Status = RowDecimalValue ( SocketFD, 1419 pPort, 1420 "PM1_CNT_LEN", 1421 pFadt->Pm1CntLen ); 1422 if ( EFI_ERROR ( Status )) { 1423 break; 1424 } 1425 Status = RowDecimalValue ( SocketFD, 1426 pPort, 1427 "PM2_CNT_LEN", 1428 pFadt->PM2CntLen ); 1429 if ( EFI_ERROR ( Status )) { 1430 break; 1431 } 1432 Status = RowDecimalValue ( SocketFD, 1433 pPort, 1434 "PM_TMR_LEN", 1435 pFadt->PmTmrLen ); 1436 if ( EFI_ERROR ( Status )) { 1437 break; 1438 } 1439 Status = RowDecimalValue ( SocketFD, 1440 pPort, 1441 "GPE0_BLK_LEN", 1442 pFadt->Gpe0BlkLen ); 1443 if ( EFI_ERROR ( Status )) { 1444 break; 1445 } 1446 Status = RowDecimalValue ( SocketFD, 1447 pPort, 1448 "GPE1_BLK_LEN", 1449 pFadt->Gpe1BlkLen ); 1450 if ( EFI_ERROR ( Status )) { 1451 break; 1452 } 1453 Status = RowHexValue ( SocketFD, 1454 pPort, 1455 "GPE1_BASE", 1456 pFadt->Gpe1Base, 1457 NULL ); 1458 if ( EFI_ERROR ( Status )) { 1459 break; 1460 } 1461 Status = RowDecimalValue ( SocketFD, 1462 pPort, 1463 "CST_CNT", 1464 pFadt->CstCnt ); 1465 if ( EFI_ERROR ( Status )) { 1466 break; 1467 } 1468 Status = RowHexValue ( SocketFD, 1469 pPort, 1470 "P_LVL2_LAT", 1471 pFadt->PLvl2Lat, 1472 NULL ); 1473 if ( EFI_ERROR ( Status )) { 1474 break; 1475 } 1476 Status = RowHexValue ( SocketFD, 1477 pPort, 1478 "P_LVL3_LAT", 1479 pFadt->PLvl3Lat, 1480 NULL ); 1481 if ( EFI_ERROR ( Status )) { 1482 break; 1483 } 1484 Status = RowDecimalValue ( SocketFD, 1485 pPort, 1486 "FLUSH_SIZE", 1487 pFadt->FlushSize ); 1488 if ( EFI_ERROR ( Status )) { 1489 break; 1490 } 1491 Status = RowDecimalValue ( SocketFD, 1492 pPort, 1493 "FLUSH_Stride", 1494 pFadt->FlushStride ); 1495 if ( EFI_ERROR ( Status )) { 1496 break; 1497 } 1498 Status = RowHexValue ( SocketFD, 1499 pPort, 1500 "DUTY_OFFSET", 1501 pFadt->DutyOffset, 1502 NULL ); 1503 if ( EFI_ERROR ( Status )) { 1504 break; 1505 } 1506 Status = RowHexValue ( SocketFD, 1507 pPort, 1508 "DUTY_WIDTH", 1509 pFadt->DutyWidth, 1510 NULL ); 1511 if ( EFI_ERROR ( Status )) { 1512 break; 1513 } 1514 Status = RowHexValue ( SocketFD, 1515 pPort, 1516 "DAY_ALRM", 1517 pFadt->DayAlrm, 1518 NULL ); 1519 if ( EFI_ERROR ( Status )) { 1520 break; 1521 } 1522 Status = RowHexValue ( SocketFD, 1523 pPort, 1524 "MON_ALRM", 1525 pFadt->MonAlrm, 1526 NULL ); 1527 if ( EFI_ERROR ( Status )) { 1528 break; 1529 } 1530 Status = RowHexValue ( SocketFD, 1531 pPort, 1532 "CENTURY", 1533 pFadt->Century, 1534 NULL ); 1535 if ( EFI_ERROR ( Status )) { 1536 break; 1537 } 1538 Status = RowHexValue ( SocketFD, 1539 pPort, 1540 "IAPC_BOOT_ARCH", 1541 pFadt->IapcBootArch, 1542 NULL ); 1543 if ( EFI_ERROR ( Status )) { 1544 break; 1545 } 1546 Status = RowHexValue ( SocketFD, 1547 pPort, 1548 "Reserved", 1549 pFadt->Reserved2, 1550 NULL ); 1551 if ( EFI_ERROR ( Status )) { 1552 break; 1553 } 1554 Status = RowHexValue ( SocketFD, 1555 pPort, 1556 "Flags", 1557 pFadt->Flags, 1558 NULL ); 1559 if ( EFI_ERROR ( Status )) { 1560 break; 1561 } 1562 Status = RowGenericAddress ( SocketFD, 1563 pPort, 1564 "RESET_REG", 1565 &pFadt->ResetReg[0], 1566 NULL ); 1567 if ( EFI_ERROR ( Status )) { 1568 break; 1569 } 1570 Status = RowHexValue ( SocketFD, 1571 pPort, 1572 "RESET_VALUE", 1573 pFadt->ResetValue, 1574 NULL ); 1575 if ( EFI_ERROR ( Status )) { 1576 break; 1577 } 1578 Status = RowHexValue ( SocketFD, 1579 pPort, 1580 "Reserved", 1581 pFadt->Reserved3[0], 1582 NULL ); 1583 if ( EFI_ERROR ( Status )) { 1584 break; 1585 } 1586 Status = RowHexValue ( SocketFD, 1587 pPort, 1588 "Reserved", 1589 pFadt->Reserved3[1], 1590 NULL ); 1591 if ( EFI_ERROR ( Status )) { 1592 break; 1593 } 1594 Status = RowHexValue ( SocketFD, 1595 pPort, 1596 "Reserved", 1597 pFadt->Reserved3[2], 1598 NULL ); 1599 if ( EFI_ERROR ( Status )) { 1600 break; 1601 } 1602 Status = RowHexValue ( SocketFD, 1603 pPort, 1604 "X_FIRMWARE_CTRL", 1605 pFadt->XFirmwareCtrl, 1606 NULL ); 1607 if ( EFI_ERROR ( Status )) { 1608 break; 1609 } 1610 Status = RowHexValue ( SocketFD, 1611 pPort, 1612 "X_DSDT", 1613 pFadt->XDsdt, 1614 PAGE_ACPI_DSDT ); 1615 if ( EFI_ERROR ( Status )) { 1616 break; 1617 } 1618 Status = RowGenericAddress ( SocketFD, 1619 pPort, 1620 "X_PM1a_EVT_BLK", 1621 &pFadt->XPm1aEvtBlk[0], 1622 NULL ); 1623 if ( EFI_ERROR ( Status )) { 1624 break; 1625 } 1626 Status = RowGenericAddress ( SocketFD, 1627 pPort, 1628 "X_PM1b_EVT_BLK", 1629 &pFadt->XPm1bEvtBlk[0], 1630 NULL ); 1631 if ( EFI_ERROR ( Status )) { 1632 break; 1633 } 1634 Status = RowGenericAddress ( SocketFD, 1635 pPort, 1636 "X_PM1a_CNT_BLK", 1637 &pFadt->XPm1aCntBlk[0], 1638 NULL ); 1639 if ( EFI_ERROR ( Status )) { 1640 break; 1641 } 1642 Status = RowGenericAddress ( SocketFD, 1643 pPort, 1644 "X_PM1b_CNT_BLK", 1645 &pFadt->XPm1bCntBlk[0], 1646 NULL ); 1647 if ( EFI_ERROR ( Status )) { 1648 break; 1649 } 1650 Status = RowGenericAddress ( SocketFD, 1651 pPort, 1652 "X_PM2_CNT_BLK", 1653 &pFadt->XPm2CntBlk[0], 1654 NULL ); 1655 if ( EFI_ERROR ( Status )) { 1656 break; 1657 } 1658 Status = RowGenericAddress ( SocketFD, 1659 pPort, 1660 "X_PM_TMR_BLK", 1661 &pFadt->XPmTmrBlk[0], 1662 NULL ); 1663 if ( EFI_ERROR ( Status )) { 1664 break; 1665 } 1666 Status = RowGenericAddress ( SocketFD, 1667 pPort, 1668 "X_GPE0_BLK", 1669 &pFadt->XGpe0Blk[0], 1670 NULL ); 1671 if ( EFI_ERROR ( Status )) { 1672 break; 1673 } 1674 Status = RowGenericAddress ( SocketFD, 1675 pPort, 1676 "X_GPE1_BLK", 1677 &pFadt->XGpe1Blk[0], 1678 NULL ); 1679 if ( EFI_ERROR ( Status )) { 1680 break; 1681 } 1682 1683 // 1684 // Build the table trailer 1685 // 1686 Status = TableTrailer ( SocketFD, 1687 pPort, 1688 pbDone ); 1689 break; 1690 } 1691 1692 // 1693 // Return the operation status 1694 // 1695 DBG_EXIT_STATUS ( Status ); 1696 return Status; 1697 } 1698 1699 1700 /** 1701 Respond with the HPET table 1702 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 1706 1707 @retval EFI_SUCCESS The request was successfully processed 1708 1709 **/ 1710 EFI_STATUS 1711 AcpiHpetPage ( 1712 IN int SocketFD, 1713 IN WSDT_PORT * pPort, 1714 OUT BOOLEAN * pbDone 1715 ) 1716 { 1717 CONST ACPI_UNKNOWN * pHpet; 1718 EFI_STATUS Status; 1719 1720 DBG_ENTER ( ); 1721 1722 // 1723 // Send the HPET page 1724 // 1725 for ( ; ; ) { 1726 // 1727 // Locate the HPET 1728 // 1729 pHpet = (ACPI_UNKNOWN *)LocateTable ( HPET_SIGNATURE ); 1730 if ( NULL == pHpet ) { 1731 Status = EFI_NOT_FOUND; 1732 break; 1733 } 1734 1735 // 1736 // Send the page and table header 1737 // 1738 Status = TableHeader ( SocketFD, pPort, L"HPET Table", pHpet ); 1739 if ( EFI_ERROR ( Status )) { 1740 break; 1741 } 1742 1743 // 1744 // Display the header 1745 // 1746 Status = RowAnsiArray ( SocketFD, 1747 pPort, 1748 "Signature", 1749 sizeof ( pHpet->Signature ), 1750 (CHAR8 *)&pHpet->Signature ); 1751 if ( EFI_ERROR ( Status )) { 1752 break; 1753 } 1754 Status = RowDecimalValue ( SocketFD, 1755 pPort, 1756 "Length", 1757 pHpet->Length ); 1758 if ( EFI_ERROR ( Status )) { 1759 break; 1760 } 1761 1762 // 1763 // Display the data from the table 1764 // 1765 Status = RowDump ( SocketFD, 1766 pPort, 1767 "Data", 1768 pHpet->Length - sizeof ( *pHpet ) + 1, 1769 (UINT8 *)( pHpet + 1 )); 1770 if ( EFI_ERROR ( Status )) { 1771 break; 1772 } 1773 1774 // 1775 // Build the table trailer 1776 // 1777 Status = TableTrailer ( SocketFD, 1778 pPort, 1779 pbDone ); 1780 break; 1781 } 1782 1783 // 1784 // Return the operation status 1785 // 1786 DBG_EXIT_STATUS ( Status ); 1787 return Status; 1788 } 1789 1790 1791 /** 1792 Respond with the MCFG table 1793 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 1797 1798 @retval EFI_SUCCESS The request was successfully processed 1799 1800 **/ 1801 EFI_STATUS 1802 AcpiMcfgPage ( 1803 IN int SocketFD, 1804 IN WSDT_PORT * pPort, 1805 OUT BOOLEAN * pbDone 1806 ) 1807 { 1808 CONST ACPI_UNKNOWN * pMcfg; 1809 EFI_STATUS Status; 1810 1811 DBG_ENTER ( ); 1812 1813 // 1814 // Send the MCFG page 1815 // 1816 for ( ; ; ) { 1817 // 1818 // Locate the MCFG 1819 // 1820 pMcfg = (ACPI_UNKNOWN *)LocateTable ( MCFG_SIGNATURE ); 1821 if ( NULL == pMcfg ) { 1822 Status = EFI_NOT_FOUND; 1823 break; 1824 } 1825 1826 // 1827 // Send the page and table header 1828 // 1829 Status = TableHeader ( SocketFD, pPort, L"MCFG Table", pMcfg ); 1830 if ( EFI_ERROR ( Status )) { 1831 break; 1832 } 1833 1834 // 1835 // Display the header 1836 // 1837 Status = RowAnsiArray ( SocketFD, 1838 pPort, 1839 "Signature", 1840 sizeof ( pMcfg->Signature ), 1841 (CHAR8 *)&pMcfg->Signature ); 1842 if ( EFI_ERROR ( Status )) { 1843 break; 1844 } 1845 Status = RowDecimalValue ( SocketFD, 1846 pPort, 1847 "Length", 1848 pMcfg->Length ); 1849 if ( EFI_ERROR ( Status )) { 1850 break; 1851 } 1852 1853 // 1854 // Display the data from the table 1855 // 1856 Status = RowDump ( SocketFD, 1857 pPort, 1858 "Data", 1859 pMcfg->Length - sizeof ( *pMcfg ) + 1, 1860 (UINT8 *)( pMcfg + 1 )); 1861 if ( EFI_ERROR ( Status )) { 1862 break; 1863 } 1864 1865 // 1866 // Build the table trailer 1867 // 1868 Status = TableTrailer ( SocketFD, 1869 pPort, 1870 pbDone ); 1871 break; 1872 } 1873 1874 // 1875 // Return the operation status 1876 // 1877 DBG_EXIT_STATUS ( Status ); 1878 return Status; 1879 } 1880 1881 1882 /** 1883 Respond with the ACPI RSDP 1.0b table 1884 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 1888 1889 @retval EFI_SUCCESS The request was successfully processed 1890 1891 **/ 1892 EFI_STATUS 1893 AcpiRsdp10Page ( 1894 IN int SocketFD, 1895 IN WSDT_PORT * pPort, 1896 OUT BOOLEAN * pbDone 1897 ) 1898 { 1899 CONST EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER * pRsdp10b; 1900 EFI_STATUS Status; 1901 1902 DBG_ENTER ( ); 1903 1904 // 1905 // Send the RSDP page 1906 // 1907 for ( ; ; ) { 1908 // 1909 // Locate the RSDP 1910 // 1911 Status = EfiGetSystemConfigurationTable ( &gEfiAcpi10TableGuid, (VOID **) &pRsdp10b ); 1912 if ( EFI_ERROR ( Status )) { 1913 break; 1914 } 1915 1916 // 1917 // Send the page and table header 1918 // 1919 Status = TableHeader ( SocketFD, pPort, L"RSDP - ACPI 1.0b Root System Description Pointer", pRsdp10b ); 1920 if ( EFI_ERROR ( Status )) { 1921 break; 1922 } 1923 1924 // 1925 // Display the RSDP 1926 // 1927 Status = RowAnsiArray ( SocketFD, 1928 pPort, 1929 "Signature", 1930 sizeof ( pRsdp10b->Signature ), 1931 (CHAR8 *)&pRsdp10b->Signature ); 1932 if ( EFI_ERROR ( Status )) { 1933 break; 1934 } 1935 Status = RowHexValue ( SocketFD, 1936 pPort, 1937 "Checksum", 1938 pRsdp10b->Checksum, 1939 NULL ); 1940 if ( EFI_ERROR ( Status )) { 1941 break; 1942 } 1943 Status = RowAnsiArray ( SocketFD, 1944 pPort, 1945 "OemId", 1946 sizeof ( pRsdp10b->OemId ), 1947 (CONST CHAR8 *)&pRsdp10b->OemId[ 0 ]); 1948 if ( EFI_ERROR ( Status )) { 1949 break; 1950 } 1951 Status = RowHexValue ( SocketFD, 1952 pPort, 1953 "Reserved", 1954 pRsdp10b->Reserved, 1955 NULL ); 1956 if ( EFI_ERROR ( Status )) { 1957 break; 1958 } 1959 Status = RowPointer ( SocketFD, 1960 pPort, 1961 "RsdtAddress", 1962 (VOID *)(UINTN)pRsdp10b->RsdtAddress, 1963 PAGE_ACPI_RSDT ); 1964 if ( EFI_ERROR ( Status )) { 1965 break; 1966 } 1967 1968 // 1969 // Build the table trailer 1970 // 1971 Status = TableTrailer ( SocketFD, 1972 pPort, 1973 pbDone ); 1974 break; 1975 } 1976 1977 // 1978 // Return the operation status 1979 // 1980 DBG_EXIT_STATUS ( Status ); 1981 return Status; 1982 } 1983 1984 1985 /** 1986 Respond with the ACPI RSDP 3.0 table 1987 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 1991 1992 @retval EFI_SUCCESS The request was successfully processed 1993 1994 **/ 1995 EFI_STATUS 1996 AcpiRsdp30Page ( 1997 IN int SocketFD, 1998 IN WSDT_PORT * pPort, 1999 OUT BOOLEAN * pbDone 2000 ) 2001 { 2002 CONST EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER * pRsdp30; 2003 EFI_STATUS Status; 2004 2005 DBG_ENTER ( ); 2006 2007 // 2008 // Send the RSDP page 2009 // 2010 for ( ; ; ) { 2011 // 2012 // Locate the RSDP 2013 // 2014 Status = EfiGetSystemConfigurationTable ( &gEfiAcpiTableGuid, (VOID **) &pRsdp30 ); 2015 if ( EFI_ERROR ( Status )) { 2016 break; 2017 } 2018 2019 // 2020 // Send the page and table header 2021 // 2022 Status = TableHeader ( SocketFD, pPort, L"RSDP - ACPI 3.0 Root System Description Pointer", pRsdp30 ); 2023 if ( EFI_ERROR ( Status )) { 2024 break; 2025 } 2026 2027 // 2028 // Display the RSDP 2029 // 2030 Status = RowAnsiArray ( SocketFD, 2031 pPort, 2032 "Signature", 2033 sizeof ( pRsdp30->Signature ), 2034 (CHAR8 *)&pRsdp30->Signature ); 2035 if ( EFI_ERROR ( Status )) { 2036 break; 2037 } 2038 Status = RowHexValue ( SocketFD, 2039 pPort, 2040 "Checksum", 2041 pRsdp30->Checksum, 2042 NULL ); 2043 if ( EFI_ERROR ( Status )) { 2044 break; 2045 } 2046 Status = RowAnsiArray ( SocketFD, 2047 pPort, 2048 "OemId", 2049 sizeof ( pRsdp30->OemId ), 2050 (CONST CHAR8 *)&pRsdp30->OemId[ 0 ]); 2051 if ( EFI_ERROR ( Status )) { 2052 break; 2053 } 2054 Status = RowHexValue ( SocketFD, 2055 pPort, 2056 "Revision", 2057 pRsdp30->Revision, 2058 NULL ); 2059 if ( EFI_ERROR ( Status )) { 2060 break; 2061 } 2062 Status = RowPointer ( SocketFD, 2063 pPort, 2064 "RsdtAddress", 2065 (VOID *)(UINTN)pRsdp30->RsdtAddress, 2066 PAGE_ACPI_RSDT ); 2067 if ( EFI_ERROR ( Status )) { 2068 break; 2069 } 2070 Status = RowDecimalValue ( SocketFD, 2071 pPort, 2072 "Length", 2073 pRsdp30->Length ); 2074 if ( EFI_ERROR ( Status )) { 2075 break; 2076 } 2077 Status = RowPointer ( SocketFD, 2078 pPort, 2079 "XsdtAddress", 2080 (VOID *)(UINTN)pRsdp30->XsdtAddress, 2081 NULL ); 2082 if ( EFI_ERROR ( Status )) { 2083 break; 2084 } 2085 Status = RowHexValue ( SocketFD, 2086 pPort, 2087 "ExtendedChecksum", 2088 pRsdp30->ExtendedChecksum, 2089 NULL ); 2090 if ( EFI_ERROR ( Status )) { 2091 break; 2092 } 2093 Status = RowBytes ( SocketFD, 2094 pPort, 2095 "Reserved", 2096 sizeof ( pRsdp30->Reserved ), 2097 &pRsdp30->Reserved[ 0 ]); 2098 if ( EFI_ERROR ( Status )) { 2099 break; 2100 } 2101 2102 // 2103 // Build the table trailer 2104 // 2105 Status = TableTrailer ( SocketFD, 2106 pPort, 2107 pbDone ); 2108 break; 2109 } 2110 2111 // 2112 // Return the operation status 2113 // 2114 DBG_EXIT_STATUS ( Status ); 2115 return Status; 2116 } 2117 2118 2119 /** 2120 Respond with the ACPI RSDT table 2121 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 2125 2126 @retval EFI_SUCCESS The request was successfully processed 2127 2128 **/ 2129 EFI_STATUS 2130 AcpiRsdtPage ( 2131 IN int SocketFD, 2132 IN WSDT_PORT * pPort, 2133 OUT BOOLEAN * pbDone 2134 ) 2135 { 2136 CONST UINT32 * pEnd; 2137 CONST UINT32 * pEntry; 2138 CONST ACPI_RSDT * pRsdt; 2139 CONST CHAR8 * pTableName; 2140 CONST CHAR16 * pWebPage; 2141 EFI_STATUS Status; 2142 UINT32 TableName[ 2 ]; 2143 2144 DBG_ENTER ( ); 2145 2146 // 2147 // Send the RSDT page 2148 // 2149 for ( ; ; ) { 2150 // 2151 // Locate the RSDT 2152 // 2153 pRsdt = LocateRsdt ( ); 2154 if ( NULL == pRsdt ) { 2155 Status = EFI_NOT_FOUND; 2156 break; 2157 } 2158 2159 // 2160 // Send the page and table header 2161 // 2162 Status = TableHeader ( SocketFD, pPort, L"RSDT - ACPI Root System Description Table", pRsdt ); 2163 if ( EFI_ERROR ( Status )) { 2164 break; 2165 } 2166 2167 // 2168 // Display the RSDT 2169 // 2170 Status = RowAnsiArray ( SocketFD, 2171 pPort, 2172 "Signature", 2173 sizeof ( pRsdt->Signature ), 2174 (CHAR8 *)&pRsdt->Signature ); 2175 if ( EFI_ERROR ( Status )) { 2176 break; 2177 } 2178 Status = RowDecimalValue ( SocketFD, 2179 pPort, 2180 "Length", 2181 pRsdt->Length ); 2182 if ( EFI_ERROR ( Status )) { 2183 break; 2184 } 2185 Status = RowDecimalValue ( SocketFD, 2186 pPort, 2187 "Revision", 2188 pRsdt->Revision ); 2189 if ( EFI_ERROR ( Status )) { 2190 break; 2191 } 2192 Status = RowHexValue ( SocketFD, 2193 pPort, 2194 "Checksum", 2195 pRsdt->Checksum, 2196 NULL ); 2197 if ( EFI_ERROR ( Status )) { 2198 break; 2199 } 2200 Status = RowAnsiArray ( SocketFD, 2201 pPort, 2202 "OEMID", 2203 sizeof ( pRsdt->OemId ), 2204 (CONST CHAR8 *)&pRsdt->OemId[ 0 ]); 2205 if ( EFI_ERROR ( Status )) { 2206 break; 2207 } 2208 Status = RowAnsiArray ( SocketFD, 2209 pPort, 2210 "OEM Table ID", 2211 sizeof ( pRsdt->OemTableId ), 2212 (CONST CHAR8 *)&pRsdt->OemTableId[ 0 ]); 2213 if ( EFI_ERROR ( Status )) { 2214 break; 2215 } 2216 Status = RowRevision ( SocketFD, 2217 pPort, 2218 "OEM Revision", 2219 pRsdt->OemRevision ); 2220 if ( EFI_ERROR ( Status )) { 2221 break; 2222 } 2223 Status = RowAnsiArray ( SocketFD, 2224 pPort, 2225 "Creator ID", 2226 sizeof ( pRsdt->CreatorId ), 2227 (CHAR8 *)&pRsdt->CreatorId ); 2228 if ( EFI_ERROR ( Status )) { 2229 break; 2230 } 2231 Status = RowRevision ( SocketFD, 2232 pPort, 2233 "Creator Revision", 2234 pRsdt->CreatorRevision ); 2235 if ( EFI_ERROR ( Status )) { 2236 break; 2237 } 2238 2239 // 2240 // Walk the list of entries 2241 // 2242 pEntry = &pRsdt->Entry[ 0 ]; 2243 pEnd = &pEntry[(( pRsdt->Length - sizeof ( *pRsdt )) >> 2 ) + 1 ]; 2244 TableName[ 1 ] = 0; 2245 while ( pEnd > pEntry ) { 2246 // 2247 // The entry is actually a 32-bit physical table address 2248 // The first entry in the table is the 32-bit table signature 2249 // 2250 TableName[ 0 ] = *(UINT32 *)(UINTN)*pEntry; 2251 pWebPage = SignatureLookup ( &TableName[ 0 ], &pTableName ); 2252 2253 // 2254 // Display the table address 2255 // 2256 Status = RowPointer ( SocketFD, 2257 pPort, 2258 pTableName, 2259 (VOID *)(UINTN)*pEntry, 2260 pWebPage ); 2261 if ( EFI_ERROR ( Status )) { 2262 break; 2263 } 2264 pEntry++; 2265 } 2266 if ( EFI_ERROR ( Status )) { 2267 break; 2268 } 2269 2270 // 2271 // Build the table trailer 2272 // 2273 Status = TableTrailer ( SocketFD, 2274 pPort, 2275 pbDone ); 2276 break; 2277 } 2278 2279 // 2280 // Return the operation status 2281 // 2282 DBG_EXIT_STATUS ( Status ); 2283 return Status; 2284 } 2285 2286 2287 /** 2288 Respond with the SSDT table 2289 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 2293 2294 @retval EFI_SUCCESS The request was successfully processed 2295 2296 **/ 2297 EFI_STATUS 2298 AcpiSsdtPage ( 2299 IN int SocketFD, 2300 IN WSDT_PORT * pPort, 2301 OUT BOOLEAN * pbDone 2302 ) 2303 { 2304 CONST ACPI_UNKNOWN * pSsdt; 2305 EFI_STATUS Status; 2306 2307 DBG_ENTER ( ); 2308 2309 // 2310 // Send the SSDT page 2311 // 2312 for ( ; ; ) { 2313 // 2314 // Locate the SSDT 2315 // 2316 pSsdt = (ACPI_UNKNOWN *)LocateTable ( SSDT_SIGNATURE ); 2317 if ( NULL == pSsdt ) { 2318 Status = EFI_NOT_FOUND; 2319 break; 2320 } 2321 2322 // 2323 // Send the page and table header 2324 // 2325 Status = TableHeader ( SocketFD, pPort, L"SSDT Table", pSsdt ); 2326 if ( EFI_ERROR ( Status )) { 2327 break; 2328 } 2329 2330 // 2331 // Display the header 2332 // 2333 Status = RowAnsiArray ( SocketFD, 2334 pPort, 2335 "Signature", 2336 sizeof ( pSsdt->Signature ), 2337 (CHAR8 *)&pSsdt->Signature ); 2338 if ( EFI_ERROR ( Status )) { 2339 break; 2340 } 2341 Status = RowDecimalValue ( SocketFD, 2342 pPort, 2343 "Length", 2344 pSsdt->Length ); 2345 if ( EFI_ERROR ( Status )) { 2346 break; 2347 } 2348 2349 // 2350 // Display the data from the table 2351 // 2352 Status = RowDump ( SocketFD, 2353 pPort, 2354 "Data", 2355 pSsdt->Length - sizeof ( *pSsdt ) + 1, 2356 (UINT8 *)( pSsdt + 1 )); 2357 if ( EFI_ERROR ( Status )) { 2358 break; 2359 } 2360 2361 // 2362 // Build the table trailer 2363 // 2364 Status = TableTrailer ( SocketFD, 2365 pPort, 2366 pbDone ); 2367 break; 2368 } 2369 2370 // 2371 // Return the operation status 2372 // 2373 DBG_EXIT_STATUS ( Status ); 2374 return Status; 2375 } 2376 2377 2378 /** 2379 Respond with the TCPA table 2380 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 2384 2385 @retval EFI_SUCCESS The request was successfully processed 2386 2387 **/ 2388 EFI_STATUS 2389 AcpiTcpaPage ( 2390 IN int SocketFD, 2391 IN WSDT_PORT * pPort, 2392 OUT BOOLEAN * pbDone 2393 ) 2394 { 2395 CONST ACPI_UNKNOWN * pTcpa; 2396 EFI_STATUS Status; 2397 2398 DBG_ENTER ( ); 2399 2400 // 2401 // Send the TCPA page 2402 // 2403 for ( ; ; ) { 2404 // 2405 // Locate the TCPA 2406 // 2407 pTcpa = (ACPI_UNKNOWN *)LocateTable ( TCPA_SIGNATURE ); 2408 if ( NULL == pTcpa ) { 2409 Status = EFI_NOT_FOUND; 2410 break; 2411 } 2412 2413 // 2414 // Send the page and table header 2415 // 2416 Status = TableHeader ( SocketFD, pPort, L"TCPA Table", pTcpa ); 2417 if ( EFI_ERROR ( Status )) { 2418 break; 2419 } 2420 2421 // 2422 // Display the header 2423 // 2424 Status = RowAnsiArray ( SocketFD, 2425 pPort, 2426 "Signature", 2427 sizeof ( pTcpa->Signature ), 2428 (CHAR8 *)&pTcpa->Signature ); 2429 if ( EFI_ERROR ( Status )) { 2430 break; 2431 } 2432 Status = RowDecimalValue ( SocketFD, 2433 pPort, 2434 "Length", 2435 pTcpa->Length ); 2436 if ( EFI_ERROR ( Status )) { 2437 break; 2438 } 2439 2440 // 2441 // Display the data from the table 2442 // 2443 Status = RowDump ( SocketFD, 2444 pPort, 2445 "Data", 2446 pTcpa->Length - sizeof ( *pTcpa ) + 1, 2447 (UINT8 *)( pTcpa + 1 )); 2448 if ( EFI_ERROR ( Status )) { 2449 break; 2450 } 2451 2452 // 2453 // Build the table trailer 2454 // 2455 Status = TableTrailer ( SocketFD, 2456 pPort, 2457 pbDone ); 2458 break; 2459 } 2460 2461 // 2462 // Return the operation status 2463 // 2464 DBG_EXIT_STATUS ( Status ); 2465 return Status; 2466 } 2467 2468 2469 /** 2470 Respond with the UEFI table 2471 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 2475 2476 @retval EFI_SUCCESS The request was successfully processed 2477 2478 **/ 2479 EFI_STATUS 2480 AcpiUefiPage ( 2481 IN int SocketFD, 2482 IN WSDT_PORT * pPort, 2483 OUT BOOLEAN * pbDone 2484 ) 2485 { 2486 CONST ACPI_UNKNOWN * pUefi; 2487 EFI_STATUS Status; 2488 2489 DBG_ENTER ( ); 2490 2491 // 2492 // Send the UEFI page 2493 // 2494 for ( ; ; ) { 2495 // 2496 // Locate the UEFI 2497 // 2498 pUefi = (ACPI_UNKNOWN *)LocateTable ( UEFI_SIGNATURE ); 2499 if ( NULL == pUefi ) { 2500 Status = EFI_NOT_FOUND; 2501 break; 2502 } 2503 2504 // 2505 // Send the page and table header 2506 // 2507 Status = TableHeader ( SocketFD, pPort, L"UEFI Table", pUefi ); 2508 if ( EFI_ERROR ( Status )) { 2509 break; 2510 } 2511 2512 // 2513 // Display the header 2514 // 2515 Status = RowAnsiArray ( SocketFD, 2516 pPort, 2517 "Signature", 2518 sizeof ( pUefi->Signature ), 2519 (CHAR8 *)&pUefi->Signature ); 2520 if ( EFI_ERROR ( Status )) { 2521 break; 2522 } 2523 Status = RowDecimalValue ( SocketFD, 2524 pPort, 2525 "Length", 2526 pUefi->Length ); 2527 if ( EFI_ERROR ( Status )) { 2528 break; 2529 } 2530 2531 // 2532 // Display the data from the table 2533 // 2534 Status = RowDump ( SocketFD, 2535 pPort, 2536 "Data", 2537 pUefi->Length - sizeof ( *pUefi ) + 1, 2538 (UINT8 *)( pUefi + 1 )); 2539 if ( EFI_ERROR ( Status )) { 2540 break; 2541 } 2542 2543 // 2544 // Build the table trailer 2545 // 2546 Status = TableTrailer ( SocketFD, 2547 pPort, 2548 pbDone ); 2549 break; 2550 } 2551 2552 // 2553 // Return the operation status 2554 // 2555 DBG_EXIT_STATUS ( Status ); 2556 return Status; 2557 } 2558