OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
ValidateAcpi.c
Go to the documentation of this file.
1
16#include "ocvalidate.h"
17#include "OcValidateLib.h"
18
27STATIC
28BOOLEAN
30 IN CONST VOID *PrimaryEntry,
31 IN CONST VOID *SecondaryEntry
32 )
33{
34 CONST OC_ACPI_ADD_ENTRY *ACPIAddPrimaryEntry;
35 CONST OC_ACPI_ADD_ENTRY *ACPIAddSecondaryEntry;
36 CONST CHAR8 *ACPIAddPrimaryPathString;
37 CONST CHAR8 *ACPIAddSecondaryPathString;
38
39 ACPIAddPrimaryEntry = *(CONST OC_ACPI_ADD_ENTRY **)PrimaryEntry;
40 ACPIAddSecondaryEntry = *(CONST OC_ACPI_ADD_ENTRY **)SecondaryEntry;
41 ACPIAddPrimaryPathString = OC_BLOB_GET (&ACPIAddPrimaryEntry->Path);
42 ACPIAddSecondaryPathString = OC_BLOB_GET (&ACPIAddSecondaryEntry->Path);
43
44 if (!ACPIAddPrimaryEntry->Enabled || !ACPIAddSecondaryEntry->Enabled) {
45 return FALSE;
46 }
47
48 return StringIsDuplicated ("ACPI->Add", ACPIAddPrimaryPathString, ACPIAddSecondaryPathString);
49}
50
51STATIC
52UINT32
54 IN OC_GLOBAL_CONFIG *Config
55 )
56{
57 UINT32 ErrorCount;
58 UINT32 Index;
59 CONST CHAR8 *Path;
60 CONST CHAR8 *Comment;
61 UINTN AcpiAddSumSize;
62
63 ErrorCount = 0;
64
65 for (Index = 0; Index < Config->Acpi.Add.Count; ++Index) {
66 Path = OC_BLOB_GET (&Config->Acpi.Add.Values[Index]->Path);
67 Comment = OC_BLOB_GET (&Config->Acpi.Add.Values[Index]->Comment);
68
69 //
70 // Sanitise strings.
71 //
72 if (!AsciiFileSystemPathIsLegal (Path)) {
73 DEBUG ((DEBUG_WARN, "ACPI->Add[%u]->Path contains illegal character!\n", Index));
74 ++ErrorCount;
75 continue;
76 }
77
78 if (!AsciiCommentIsLegal (Comment)) {
79 DEBUG ((DEBUG_WARN, "ACPI->Add[%u]->Comment contains illegal character!\n", Index));
80 ++ErrorCount;
81 }
82
83 if (!OcAsciiEndsWith (Path, ".aml", TRUE) && !OcAsciiEndsWith (Path, ".bin", TRUE)) {
84 DEBUG ((DEBUG_WARN, "ACPI->Add[%u]->Path has filename suffix other than .aml and .bin!\n", Index));
85 ++ErrorCount;
86 }
87
88 //
89 // Check the length of path relative to OC directory.
90 //
91 AcpiAddSumSize = L_STR_LEN (OPEN_CORE_ACPI_PATH) + AsciiStrSize (Path);
92 if (AcpiAddSumSize > OC_STORAGE_SAFE_PATH_MAX) {
93 DEBUG ((
94 DEBUG_WARN,
95 "ACPI->Add[%u]->Path (length %u) is too long (should not exceed %u)!\n",
96 Index,
97 AsciiStrLen (Path),
99 ));
100 ++ErrorCount;
101 }
102 }
103
104 //
105 // Check duplicated entries in ACPI->Add.
106 //
107 ErrorCount += FindArrayDuplication (
108 Config->Acpi.Add.Values,
109 Config->Acpi.Add.Count,
110 sizeof (Config->Acpi.Add.Values[0]),
112 );
113
114 return ErrorCount;
115}
116
117STATIC
118UINT32
120 IN OC_GLOBAL_CONFIG *Config
121 )
122{
123 UINT32 ErrorCount;
124 UINT32 Index;
125 CONST CHAR8 *Comment;
126
127 ErrorCount = 0;
128
129 for (Index = 0; Index < Config->Acpi.Delete.Count; ++Index) {
130 Comment = OC_BLOB_GET (&Config->Acpi.Delete.Values[Index]->Comment);
131
132 //
133 // Sanitise strings.
134 //
135 if (!AsciiCommentIsLegal (Comment)) {
136 DEBUG ((DEBUG_WARN, "ACPI->Delete[%u]->Comment contains illegal character!\n", Index));
137 ++ErrorCount;
138 }
139
140 //
141 // Size of OemTableId and TableSignature cannot be checked,
142 // as serialisation kills it.
143 //
144 }
145
146 return ErrorCount;
147}
148
149STATIC
150UINT32
152 IN OC_GLOBAL_CONFIG *Config
153 )
154{
155 UINT32 ErrorCount;
156 UINT32 Index;
157 CONST CHAR8 *Comment;
158 CONST UINT8 *Find;
159 UINT32 FindSize;
160 CONST UINT8 *Replace;
161 UINT32 ReplaceSize;
162 CONST UINT8 *Mask;
163 UINT32 MaskSize;
164 CONST UINT8 *ReplaceMask;
165 UINT32 ReplaceMaskSize;
166
167 ErrorCount = 0;
168
169 for (Index = 0; Index < Config->Acpi.Patch.Count; ++Index) {
170 Comment = OC_BLOB_GET (&Config->Acpi.Patch.Values[Index]->Comment);
171 Find = OC_BLOB_GET (&Config->Acpi.Patch.Values[Index]->Find);
172 FindSize = Config->Acpi.Patch.Values[Index]->Find.Size;
173 Replace = OC_BLOB_GET (&Config->Acpi.Patch.Values[Index]->Replace);
174 ReplaceSize = Config->Acpi.Patch.Values[Index]->Replace.Size;
175 Mask = OC_BLOB_GET (&Config->Acpi.Patch.Values[Index]->Mask);
176 MaskSize = Config->Acpi.Patch.Values[Index]->Mask.Size;
177 ReplaceMask = OC_BLOB_GET (&Config->Acpi.Patch.Values[Index]->ReplaceMask);
178 ReplaceMaskSize = Config->Acpi.Patch.Values[Index]->ReplaceMask.Size;
179
180 //
181 // Sanitise strings.
182 //
183 if (!AsciiCommentIsLegal (Comment)) {
184 DEBUG ((DEBUG_WARN, "ACPI->Patch[%u]->Comment contains illegal character!\n", Index));
185 ++ErrorCount;
186 }
187
188 //
189 // Size of OemTableId and TableSignature cannot be checked,
190 // as serialisation kills it.
191 //
192
193 //
194 // Checks for size.
195 //
196 ErrorCount += ValidatePatch (
197 "ACPI->Patch",
198 Index,
199 FALSE,
200 Find,
201 FindSize,
202 Replace,
203 ReplaceSize,
204 Mask,
205 MaskSize,
206 ReplaceMask,
207 ReplaceMaskSize
208 );
209 }
210
211 return ErrorCount;
212}
213
214UINT32
216 IN OC_GLOBAL_CONFIG *Config
217 )
218{
219 UINT32 ErrorCount;
220 UINTN Index;
221 STATIC CONFIG_CHECK ACPICheckers[] = {
225 };
226
227 DEBUG ((DEBUG_VERBOSE, "config loaded into %a!\n", __func__));
228
229 ErrorCount = 0;
230
231 for (Index = 0; Index < ARRAY_SIZE (ACPICheckers); ++Index) {
232 ErrorCount += ACPICheckers[Index](Config);
233 }
234
235 return ReportError (__func__, ErrorCount);
236}
#define ARRAY_SIZE(Array)
Definition AppleMacEfi.h:34
#define OPEN_CORE_ACPI_PATH
Definition OcMainLib.h:56
#define OC_STORAGE_SAFE_PATH_MAX
#define L_STR_LEN(String)
Definition OcStringLib.h:26
BOOLEAN EFIAPI OcAsciiEndsWith(IN CONST CHAR8 *String, IN CONST CHAR8 *SearchString, IN BOOLEAN CaseInsensitiveMatch)
Definition OcAsciiLib.c:265
#define OC_BLOB_GET(Blob)
UINT32 ReportError(IN CONST CHAR8 *FuncName, IN UINT32 ErrorCount)
UINT32 ValidatePatch(IN CONST CHAR8 *PatchSection, IN UINT32 PatchIndex, IN BOOLEAN FindSizeCanBeZero, IN CONST UINT8 *Find, IN UINT32 FindSize, IN CONST UINT8 *Replace, IN UINT32 ReplaceSize, IN CONST UINT8 *Mask, IN UINT32 MaskSize, IN CONST UINT8 *ReplaceMask, IN UINT32 ReplaceMaskSize)
BOOLEAN StringIsDuplicated(IN CONST CHAR8 *EntrySection, IN CONST CHAR8 *FirstString, IN CONST CHAR8 *SecondString)
UINT32 FindArrayDuplication(IN VOID *First, IN UINTN Number, IN UINTN Size, IN DUPLICATION_CHECK DupChecker)
BOOLEAN AsciiFileSystemPathIsLegal(IN CONST CHAR8 *Path)
BOOLEAN AsciiCommentIsLegal(IN CONST CHAR8 *Comment)
STATIC BOOLEAN ACPIAddHasDuplication(IN CONST VOID *PrimaryEntry, IN CONST VOID *SecondaryEntry)
STATIC UINT32 CheckACPIDelete(IN OC_GLOBAL_CONFIG *Config)
STATIC UINT32 CheckACPIPatch(IN OC_GLOBAL_CONFIG *Config)
UINT32 CheckACPI(IN OC_GLOBAL_CONFIG *Config)
STATIC UINT32 CheckACPIAdd(IN OC_GLOBAL_CONFIG *Config)
UINT32(* CONFIG_CHECK)(IN OC_GLOBAL_CONFIG *Config)
Definition ocvalidate.h:27