OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
OpenCoreAcpi.c
Go to the documentation of this file.
1
15#include <Library/OcMainLib.h>
16
17#include <Library/BaseLib.h>
18#include <Library/DebugLib.h>
19#include <Library/MemoryAllocationLib.h>
20#include <Library/OcAcpiLib.h>
21#include <Library/OcMiscLib.h>
22#include <Library/OcStringLib.h>
23#include <Library/PrintLib.h>
24#include <Library/UefiBootServicesTableLib.h>
25
26STATIC
27VOID
29 IN OC_GLOBAL_CONFIG *Config,
30 IN OC_STORAGE_CONTEXT *Storage,
31 IN OC_ACPI_CONTEXT *Context
32 )
33{
34 EFI_STATUS Status;
35 UINT8 *TableData;
36 UINT32 TableDataLength;
37 UINT32 Index;
38 OC_ACPI_ADD_ENTRY *Table;
39 CONST CHAR8 *TablePath;
40 CHAR16 FullPath[OC_STORAGE_SAFE_PATH_MAX];
41
42 for (Index = 0; Index < Config->Acpi.Add.Count; ++Index) {
43 Table = Config->Acpi.Add.Values[Index];
44 TablePath = OC_BLOB_GET (&Table->Path);
45
46 if (!Table->Enabled || (TablePath[0] == '\0')) {
47 DEBUG ((DEBUG_INFO, "OC: Skipping add ACPI %a (%d)\n", TablePath, Table->Enabled));
48 continue;
49 }
50
51 Status = OcUnicodeSafeSPrint (FullPath, sizeof (FullPath), OPEN_CORE_ACPI_PATH "%a", TablePath);
52 if (EFI_ERROR (Status)) {
53 DEBUG ((
54 DEBUG_WARN,
55 "OC: Failed to fit ACPI path %s%a",
57 TablePath
58 ));
59 continue;
60 }
61
62 UnicodeUefiSlashes (FullPath);
63
64 TableData = OcStorageReadFileUnicode (Storage, FullPath, &TableDataLength);
65
66 if (TableData == NULL) {
67 DEBUG ((
68 DEBUG_WARN,
69 "OC: Failed to find ACPI %a\n",
70 TablePath
71 ));
72 continue;
73 }
74
75 Status = AcpiInsertTable (Context, TableData, TableDataLength);
76
77 if (EFI_ERROR (Status)) {
78 DEBUG ((
79 DEBUG_WARN,
80 "OC: Failed to add ACPI %a - %r\n",
81 TablePath,
82 Status
83 ));
84 }
85 }
86}
87
88STATIC
89VOID
91 IN OC_GLOBAL_CONFIG *Config,
92 IN OC_ACPI_CONTEXT *Context
93 )
94{
95 EFI_STATUS Status;
96 UINT32 Index;
97 UINT32 Signature;
98 UINT64 OemTableId;
99 OC_ACPI_DELETE_ENTRY *Table;
100
101 for (Index = 0; Index < Config->Acpi.Delete.Count; ++Index) {
102 Table = Config->Acpi.Delete.Values[Index];
103
104 if (!Table->Enabled) {
105 continue;
106 }
107
108 CopyMem (&Signature, Table->TableSignature, sizeof (Table->TableSignature));
109 CopyMem (&OemTableId, Table->OemTableId, sizeof (Table->OemTableId));
110
111 Status = AcpiDeleteTable (
112 Context,
113 Signature,
114 Table->TableLength,
115 OemTableId,
116 Table->All
117 );
118
119 if (EFI_ERROR (Status)) {
120 DEBUG ((
121 DEBUG_WARN,
122 "OC: Failed to drop ACPI %08X %016LX %u (%d) - %r\n",
123 Signature,
124 OemTableId,
125 Table->TableLength,
126 Table->All,
127 Status
128 ));
129 }
130 }
131}
132
133STATIC
134VOID
136 IN OC_GLOBAL_CONFIG *Config,
137 IN OC_ACPI_CONTEXT *Context
138 )
139{
140 EFI_STATUS Status;
141 UINT32 Index;
142 OC_ACPI_PATCH_ENTRY *UserPatch;
143 CONST CHAR8 *Comment;
144 OC_ACPI_PATCH Patch;
145
146 for (Index = 0; Index < Config->Acpi.Patch.Count; ++Index) {
147 UserPatch = Config->Acpi.Patch.Values[Index];
148
149 if (!UserPatch->Enabled) {
150 continue;
151 }
152
153 Comment = OC_BLOB_GET (&UserPatch->Comment);
154
155 //
156 // Ignore patch if:
157 // - There is nothing to replace.
158 // - Find and replace mismatch in size.
159 // - Mask and ReplaceMask mismatch in size when are available.
160 //
161 if ( (UserPatch->Replace.Size == 0)
162 || ((UserPatch->Find.Size > 0) && (UserPatch->Find.Size != UserPatch->Replace.Size))
163 || ((UserPatch->Find.Size == 0) && (OC_BLOB_GET (&UserPatch->Base)[0] == '\0'))
164 || ((UserPatch->Mask.Size > 0) && (UserPatch->Find.Size != UserPatch->Mask.Size))
165 || ((UserPatch->ReplaceMask.Size > 0) && (UserPatch->Replace.Size != UserPatch->ReplaceMask.Size)))
166 {
167 DEBUG ((DEBUG_ERROR, "OC: ACPI patch (%a) at %u is borked\n", Comment, Index));
168 continue;
169 }
170
171 ZeroMem (&Patch, sizeof (Patch));
172
173 Patch.Find = OC_BLOB_GET (&UserPatch->Find);
174 Patch.Replace = OC_BLOB_GET (&UserPatch->Replace);
175
176 if (UserPatch->Mask.Size > 0) {
177 Patch.Mask = OC_BLOB_GET (&UserPatch->Mask);
178 }
179
180 if (UserPatch->ReplaceMask.Size > 0) {
181 Patch.ReplaceMask = OC_BLOB_GET (&UserPatch->ReplaceMask);
182 }
183
184 Patch.Base = OC_BLOB_GET (&UserPatch->Base);
185 Patch.BaseSkip = UserPatch->BaseSkip;
186 Patch.Size = UserPatch->Replace.Size;
187 Patch.Count = UserPatch->Count;
188 Patch.Skip = UserPatch->Skip;
189 Patch.Limit = UserPatch->Limit;
190 CopyMem (&Patch.TableSignature, UserPatch->TableSignature, sizeof (UserPatch->TableSignature));
191 Patch.TableLength = UserPatch->TableLength;
192 CopyMem (&Patch.OemTableId, UserPatch->OemTableId, sizeof (UserPatch->OemTableId));
193
194 DEBUG ((
195 DEBUG_INFO,
196 "OC: Applying %u byte ACPI patch (%a) at %u, skip %u, count %u\n",
197 Patch.Size,
198 Comment,
199 Index,
200 Patch.Skip,
201 Patch.Count
202 ));
203
204 Status = AcpiApplyPatch (Context, &Patch);
205 if (EFI_ERROR (Status)) {
206 DEBUG ((DEBUG_WARN, "OC: ACPI patcher failed (%a) at %u - %r\n", Comment, Index, Status));
207 }
208 }
209}
210
211VOID
213 IN OC_STORAGE_CONTEXT *Storage,
214 IN OC_GLOBAL_CONFIG *Config
215 )
216{
217 EFI_STATUS Status;
218 OC_ACPI_CONTEXT Context;
219
220 Status = AcpiInitContext (&Context);
221
222 if (EFI_ERROR (Status)) {
223 DEBUG ((DEBUG_ERROR, "OC: Failed to initialize ACPI support - %r\n", Status));
224 return;
225 }
226
227 OcAcpiDeleteTables (Config, &Context);
228
229 if (Config->Acpi.Quirks.RebaseRegions) {
230 AcpiLoadRegions (&Context);
231 }
232
233 if (Config->Acpi.Quirks.FadtEnableReset) {
234 AcpiFadtEnableReset (&Context);
235 }
236
237 if (Config->Acpi.Quirks.ResetLogoStatus) {
238 AcpiResetLogoStatus (&Context);
239 }
240
241 //
242 // Log hardware signature.
243 //
244 AcpiHandleHardwareSignature (&Context, Config->Acpi.Quirks.ResetHwSig);
245
246 if (Config->Acpi.Quirks.NormalizeHeaders) {
247 AcpiNormalizeHeaders (&Context);
248 }
249
250 OcAcpiPatchTables (Config, &Context);
251
252 OcAcpiAddTables (Config, Storage, &Context);
253
254 if (Config->Acpi.Quirks.RebaseRegions) {
255 AcpiRelocateRegions (&Context);
256 }
257
258 if (Config->Acpi.Quirks.SyncTableIds) {
259 AcpiSyncTableIds (&Context);
260 }
261
262 AcpiApplyContext (&Context);
263
264 AcpiFreeContext (&Context);
265}
UINT8 Signature[8]
Definition BiosId.h:67
VOID AcpiNormalizeHeaders(IN OUT OC_ACPI_CONTEXT *Context)
Definition OcAcpiLib.c:1164
EFI_STATUS AcpiApplyContext(IN OUT OC_ACPI_CONTEXT *Context)
Definition OcAcpiLib.c:900
EFI_STATUS AcpiFadtEnableReset(IN OUT OC_ACPI_CONTEXT *Context)
Definition OcAcpiLib.c:1510
EFI_STATUS AcpiDeleteTable(IN OUT OC_ACPI_CONTEXT *Context, IN UINT32 Signature, IN UINT32 Length, IN UINT64 OemTableId, IN BOOLEAN All)
Definition OcAcpiLib.c:1015
EFI_STATUS AcpiApplyPatch(IN OUT OC_ACPI_CONTEXT *Context, IN OC_ACPI_PATCH *Patch)
Definition OcAcpiLib.c:1247
VOID AcpiSyncTableIds(IN OUT OC_ACPI_CONTEXT *Context)
Definition OcAcpiLib.c:1640
VOID AcpiFreeContext(IN OUT OC_ACPI_CONTEXT *Context)
Definition OcAcpiLib.c:884
VOID AcpiRelocateRegions(IN OUT OC_ACPI_CONTEXT *Context)
Definition OcAcpiLib.c:1465
VOID AcpiHandleHardwareSignature(IN OUT OC_ACPI_CONTEXT *Context, IN BOOLEAN Reset)
Definition OcAcpiLib.c:1700
VOID AcpiResetLogoStatus(IN OUT OC_ACPI_CONTEXT *Context)
Definition OcAcpiLib.c:1596
EFI_STATUS AcpiInitContext(IN OUT OC_ACPI_CONTEXT *Context)
Definition OcAcpiLib.c:738
EFI_STATUS AcpiLoadRegions(IN OUT OC_ACPI_CONTEXT *Context)
Definition OcAcpiLib.c:1421
EFI_STATUS AcpiInsertTable(IN OUT OC_ACPI_CONTEXT *Context, IN CONST UINT8 *Data, IN UINT32 Length)
Definition OcAcpiLib.c:1082
#define OPEN_CORE_ACPI_PATH
Definition OcMainLib.h:56
VOID * OcStorageReadFileUnicode(IN OC_STORAGE_CONTEXT *Context, IN CONST CHAR16 *FilePath, OUT UINT32 *FileSize OPTIONAL)
#define OC_STORAGE_SAFE_PATH_MAX
VOID UnicodeUefiSlashes(IN OUT CHAR16 *String)
EFI_STATUS EFIAPI OcUnicodeSafeSPrint(OUT CHAR16 *StartOfBuffer, IN UINTN BufferSize, IN CONST CHAR16 *FormatString,...)
#define OC_BLOB_GET(Blob)
STATIC VOID OcAcpiDeleteTables(IN OC_GLOBAL_CONFIG *Config, IN OC_ACPI_CONTEXT *Context)
STATIC VOID OcAcpiAddTables(IN OC_GLOBAL_CONFIG *Config, IN OC_STORAGE_CONTEXT *Storage, IN OC_ACPI_CONTEXT *Context)
VOID OcLoadAcpiSupport(IN OC_STORAGE_CONTEXT *Storage, IN OC_GLOBAL_CONFIG *Config)
STATIC VOID OcAcpiPatchTables(IN OC_GLOBAL_CONFIG *Config, IN OC_ACPI_CONTEXT *Context)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
CONST UINT8 * Find
Definition OcAcpiLib.h:113
CONST UINT8 * Replace
Definition OcAcpiLib.h:117
UINT32 TableLength
Definition OcAcpiLib.h:157
UINT32 BaseSkip
Definition OcAcpiLib.h:133
CONST UINT8 * Mask
Definition OcAcpiLib.h:121
UINT32 TableSignature
Definition OcAcpiLib.h:153
CONST UINT8 * ReplaceMask
Definition OcAcpiLib.h:125
CONST CHAR8 * Base
Definition OcAcpiLib.h:129
UINT64 OemTableId
Definition OcAcpiLib.h:161