]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/AcpiPlatformDxe/CloudHvAcpi.c
OvmfPkg: Generate CloudHv as a PVH ELF binary
[mirror_edk2.git] / OvmfPkg / AcpiPlatformDxe / CloudHvAcpi.c
CommitLineData
7594c5bf
SB
1/** @file\r
2 OVMF ACPI Cloud Hypervisor support\r
3\r
4 Copyright (c) 2021, Intel Corporation. All rights reserved.\r
5\r
6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
7\r
8**/\r
9\r
10#include <IndustryStandard/CloudHv.h> // CLOUDHV_RSDP_ADDRESS\r
11#include <Library/BaseLib.h> // CpuDeadLoop()\r
12#include <Library/DebugLib.h> // DEBUG()\r
13\r
14#include "AcpiPlatform.h"\r
15\r
16// Get the ACPI tables from EBDA start\r
17EFI_STATUS\r
18EFIAPI\r
19InstallCloudHvTables (\r
20 IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol\r
21 )\r
22{\r
23 EFI_STATUS Status;\r
24 UINTN TableHandle;\r
25\r
26 EFI_ACPI_DESCRIPTION_HEADER *Xsdt;\r
27 VOID *CurrentTableEntry;\r
28 UINTN CurrentTablePointer;\r
29 EFI_ACPI_DESCRIPTION_HEADER *CurrentTable;\r
30 UINTN Index;\r
31 UINTN NumberOfTableEntries;\r
32 EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *Fadt2Table;\r
33 EFI_ACPI_DESCRIPTION_HEADER *DsdtTable;\r
34\r
35 Fadt2Table = NULL;\r
36 DsdtTable = NULL;\r
37 TableHandle = 0;\r
38 NumberOfTableEntries = 0;\r
39 EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *AcpiRsdpStructurePtr = (VOID *)CLOUDHV_RSDP_ADDRESS;\r
40\r
41 // If XSDT table is found, just install its tables.\r
42 // Otherwise, try to find and install the RSDT tables.\r
43 //\r
44 if (AcpiRsdpStructurePtr->XsdtAddress) {\r
45 //\r
46 // Retrieve the addresses of XSDT and\r
47 // calculate the number of its table entries.\r
48 //\r
49 Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)\r
50 AcpiRsdpStructurePtr->XsdtAddress;\r
51 NumberOfTableEntries = (Xsdt->Length -\r
52 sizeof (EFI_ACPI_DESCRIPTION_HEADER)) /\r
53 sizeof (UINT64);\r
54\r
55 //\r
56 // Install ACPI tables found in XSDT.\r
57 //\r
58 for (Index = 0; Index < NumberOfTableEntries; Index++) {\r
59 //\r
60 // Get the table entry from XSDT\r
61 //\r
62 CurrentTableEntry = (VOID *)((UINT8 *)Xsdt +\r
63 sizeof (EFI_ACPI_DESCRIPTION_HEADER) +\r
64 Index * sizeof (UINT64));\r
65 CurrentTablePointer = (UINTN)*(UINT64 *)CurrentTableEntry;\r
66 CurrentTable = (EFI_ACPI_DESCRIPTION_HEADER *)CurrentTablePointer;\r
67\r
68 //\r
69 // Install the XSDT tables\r
70 //\r
71 Status = AcpiProtocol->InstallAcpiTable (\r
72 AcpiProtocol,\r
73 CurrentTable,\r
74 CurrentTable->Length,\r
75 &TableHandle\r
76 );\r
77\r
78 if (EFI_ERROR (Status)) {\r
79 ASSERT_EFI_ERROR (Status);\r
80 return Status;\r
81 }\r
82\r
83 //\r
84 // Get the X-DSDT table address from the table FADT\r
85 //\r
86 if (!AsciiStrnCmp ((CHAR8 *)&CurrentTable->Signature, "FACP", 4)) {\r
87 Fadt2Table = (EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *)\r
88 (UINTN)CurrentTablePointer;\r
89 DsdtTable = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Fadt2Table->XDsdt;\r
90 }\r
91 }\r
92 } else {\r
93 return EFI_NOT_FOUND;\r
94 }\r
95\r
96 //\r
97 // Install DSDT table. If we reached this point without finding the DSDT,\r
98 // then we're out of sync with the hypervisor, and cannot continue.\r
99 //\r
100 if (DsdtTable == NULL) {\r
101 DEBUG ((DEBUG_ERROR, "%a: no DSDT found\n", __FUNCTION__));\r
102 ASSERT (FALSE);\r
103 CpuDeadLoop ();\r
104 }\r
105\r
106 Status = AcpiProtocol->InstallAcpiTable (\r
107 AcpiProtocol,\r
108 DsdtTable,\r
109 DsdtTable->Length,\r
110 &TableHandle\r
111 );\r
112 if (EFI_ERROR (Status)) {\r
113 ASSERT_EFI_ERROR (Status);\r
114 return Status;\r
115 }\r
116\r
117 return EFI_SUCCESS;\r
118}\r