1*09a274d8SLaszlo Ersek /** @file 2*09a274d8SLaszlo Ersek Expose the address(es) of the ACPI RSD PTR table(s) in a MB-aligned structure 3*09a274d8SLaszlo Ersek to the hypervisor. 4*09a274d8SLaszlo Ersek 5*09a274d8SLaszlo Ersek The hypervisor locates the MB-aligned structure based on the signature GUID 6*09a274d8SLaszlo Ersek that is at offset 0 in the structure. Once the RSD PTR address(es) are 7*09a274d8SLaszlo Ersek retrieved, the hypervisor may perform various ACPI checks. 8*09a274d8SLaszlo Ersek 9*09a274d8SLaszlo Ersek This feature is a development aid, for supporting ACPI table unit tests in 10*09a274d8SLaszlo Ersek hypervisors. Do not enable in production builds. 11*09a274d8SLaszlo Ersek 12*09a274d8SLaszlo Ersek Copyright (C) 2019, Red Hat, Inc. 13*09a274d8SLaszlo Ersek 14*09a274d8SLaszlo Ersek This program and the accompanying materials are licensed and made available 15*09a274d8SLaszlo Ersek under the terms and conditions of the BSD License that accompanies this 16*09a274d8SLaszlo Ersek distribution. The full text of the license may be found at 17*09a274d8SLaszlo Ersek <http://opensource.org/licenses/bsd-license.php>. 18*09a274d8SLaszlo Ersek 19*09a274d8SLaszlo Ersek THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT 20*09a274d8SLaszlo Ersek WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 21*09a274d8SLaszlo Ersek **/ 22*09a274d8SLaszlo Ersek 23*09a274d8SLaszlo Ersek #ifndef __BIOS_TABLES_TEST_H__ 24*09a274d8SLaszlo Ersek #define __BIOS_TABLES_TEST_H__ 25*09a274d8SLaszlo Ersek 26*09a274d8SLaszlo Ersek #include <Uefi/UefiBaseType.h> 27*09a274d8SLaszlo Ersek 28*09a274d8SLaszlo Ersek #define BIOS_TABLES_TEST_GUID \ 29*09a274d8SLaszlo Ersek { \ 30*09a274d8SLaszlo Ersek 0x5478594e, \ 31*09a274d8SLaszlo Ersek 0xdfcb, \ 32*09a274d8SLaszlo Ersek 0x425f, \ 33*09a274d8SLaszlo Ersek { 0x8e, 0x42, 0xc8, 0xaf, 0xf8, 0x8a, 0x88, 0x7a } \ 34*09a274d8SLaszlo Ersek } 35*09a274d8SLaszlo Ersek 36*09a274d8SLaszlo Ersek extern EFI_GUID gBiosTablesTestGuid; 37*09a274d8SLaszlo Ersek 38*09a274d8SLaszlo Ersek // 39*09a274d8SLaszlo Ersek // The following structure must be allocated in Boot Services Data type memory, 40*09a274d8SLaszlo Ersek // aligned at a 1MB boundary. 41*09a274d8SLaszlo Ersek // 42*09a274d8SLaszlo Ersek #pragma pack (1) 43*09a274d8SLaszlo Ersek typedef struct { 44*09a274d8SLaszlo Ersek // 45*09a274d8SLaszlo Ersek // The signature GUID is written to the MB-aligned structure from 46*09a274d8SLaszlo Ersek // gBiosTablesTestGuid, but with all bits inverted. That's the actual GUID 47*09a274d8SLaszlo Ersek // value that the hypervisor should look for at each MB boundary, looping 48*09a274d8SLaszlo Ersek // over all guest RAM pages with that alignment, until a match is found. The 49*09a274d8SLaszlo Ersek // bit-flipping occurs in order not to store the actual GUID in any UEFI 50*09a274d8SLaszlo Ersek // executable, which might confuse guest memory analysis. Note that EFI_GUID 51*09a274d8SLaszlo Ersek // has little endian representation. 52*09a274d8SLaszlo Ersek // 53*09a274d8SLaszlo Ersek EFI_GUID InverseSignatureGuid; 54*09a274d8SLaszlo Ersek // 55*09a274d8SLaszlo Ersek // The Rsdp10 and Rsdp20 fields may be read when the signature GUID matches. 56*09a274d8SLaszlo Ersek // Rsdp10 is the guest-physical address of the ACPI 1.0 specification RSD PTR 57*09a274d8SLaszlo Ersek // table, in 8-byte little endian representation. Rsdp20 is the same, for the 58*09a274d8SLaszlo Ersek // ACPI 2.0 or later specification RSD PTR table. Each of these fields may be 59*09a274d8SLaszlo Ersek // zero (independently of the other) if the UEFI System Table does not 60*09a274d8SLaszlo Ersek // provide the corresponding UEFI Configuration Table. 61*09a274d8SLaszlo Ersek // 62*09a274d8SLaszlo Ersek EFI_PHYSICAL_ADDRESS Rsdp10; 63*09a274d8SLaszlo Ersek EFI_PHYSICAL_ADDRESS Rsdp20; 64*09a274d8SLaszlo Ersek } BIOS_TABLES_TEST; 65*09a274d8SLaszlo Ersek #pragma pack () 66*09a274d8SLaszlo Ersek 67*09a274d8SLaszlo Ersek #endif // __BIOS_TABLES_TEST_H__ 68