33 IN CONST VOID *PrimaryEntry,
34 IN CONST VOID *SecondaryEntry
37 CONST OC_KERNEL_ADD_ENTRY *KernelAddPrimaryEntry;
38 CONST OC_KERNEL_ADD_ENTRY *KernelAddSecondaryEntry;
39 CONST CHAR8 *KernelAddPrimaryBundlePathString;
40 CONST CHAR8 *KernelAddSecondaryBundlePathString;
42 KernelAddPrimaryEntry = *(CONST OC_KERNEL_ADD_ENTRY **)PrimaryEntry;
43 KernelAddSecondaryEntry = *(CONST OC_KERNEL_ADD_ENTRY **)SecondaryEntry;
44 KernelAddPrimaryBundlePathString =
OC_BLOB_GET (&KernelAddPrimaryEntry->BundlePath);
45 KernelAddSecondaryBundlePathString =
OC_BLOB_GET (&KernelAddSecondaryEntry->BundlePath);
47 if (!KernelAddPrimaryEntry->Enabled || !KernelAddSecondaryEntry->Enabled) {
51 return StringIsDuplicated (
"Kernel->Add", KernelAddPrimaryBundlePathString, KernelAddSecondaryBundlePathString);
65 IN CONST VOID *PrimaryEntry,
66 IN CONST VOID *SecondaryEntry
69 CONST OC_KERNEL_BLOCK_ENTRY *KernelBlockPrimaryEntry;
70 CONST OC_KERNEL_BLOCK_ENTRY *KernelBlockSecondaryEntry;
71 CONST CHAR8 *KernelBlockPrimaryIdentifierString;
72 CONST CHAR8 *KernelBlockSecondaryIdentifierString;
74 KernelBlockPrimaryEntry = *(CONST OC_KERNEL_BLOCK_ENTRY **)PrimaryEntry;
75 KernelBlockSecondaryEntry = *(CONST OC_KERNEL_BLOCK_ENTRY **)SecondaryEntry;
76 KernelBlockPrimaryIdentifierString =
OC_BLOB_GET (&KernelBlockPrimaryEntry->Identifier);
77 KernelBlockSecondaryIdentifierString =
OC_BLOB_GET (&KernelBlockSecondaryEntry->Identifier);
79 if (!KernelBlockPrimaryEntry->Enabled || !KernelBlockSecondaryEntry->Enabled) {
83 return StringIsDuplicated (
"Kernel->Block", KernelBlockPrimaryIdentifierString, KernelBlockSecondaryIdentifierString);
97 IN CONST VOID *PrimaryEntry,
98 IN CONST VOID *SecondaryEntry
104 CONST OC_KERNEL_ADD_ENTRY *KernelForcePrimaryEntry;
105 CONST OC_KERNEL_ADD_ENTRY *KernelForceSecondaryEntry;
106 CONST CHAR8 *KernelForcePrimaryBundlePathString;
107 CONST CHAR8 *KernelForceSecondaryBundlePathString;
109 KernelForcePrimaryEntry = *(CONST OC_KERNEL_ADD_ENTRY **)PrimaryEntry;
110 KernelForceSecondaryEntry = *(CONST OC_KERNEL_ADD_ENTRY **)SecondaryEntry;
111 KernelForcePrimaryBundlePathString =
OC_BLOB_GET (&KernelForcePrimaryEntry->BundlePath);
112 KernelForceSecondaryBundlePathString =
OC_BLOB_GET (&KernelForceSecondaryEntry->BundlePath);
114 if (!KernelForcePrimaryEntry->Enabled || !KernelForceSecondaryEntry->Enabled) {
118 return StringIsDuplicated (
"Kernel->Force", KernelForcePrimaryBundlePathString, KernelForceSecondaryBundlePathString);
124 IN OC_GLOBAL_CONFIG *Config
130 CONST CHAR8 *BundlePath;
131 UINTN BundlePathSumSize;
132 CONST CHAR8 *Comment;
133 CONST CHAR8 *ExecutablePath;
134 UINTN ExecutableFixedSize;
135 UINTN ExecutablePathSumSize;
136 CONST CHAR8 *MaxKernel;
137 CONST CHAR8 *MinKernel;
138 CONST CHAR8 *PlistPath;
139 UINTN PlistFixedSize;
140 UINTN PlistPathSumSize;
142 BOOLEAN IsDisableLinkeditJettisonEnabled;
144 UINTN IndexKextPrecedence;
146 CONST CHAR8 *CurrentKext;
147 CONST CHAR8 *ParentKext;
148 CONST CHAR8 *ChildKext;
152 for (Index = 0; Index < Config->Kernel.Add.Count; ++Index) {
153 Arch =
OC_BLOB_GET (&Config->Kernel.Add.Values[Index]->Arch);
154 BundlePath =
OC_BLOB_GET (&Config->Kernel.Add.Values[Index]->BundlePath);
155 Comment =
OC_BLOB_GET (&Config->Kernel.Add.Values[Index]->Comment);
156 ExecutablePath =
OC_BLOB_GET (&Config->Kernel.Add.Values[Index]->ExecutablePath);
157 MaxKernel =
OC_BLOB_GET (&Config->Kernel.Add.Values[Index]->MaxKernel);
158 MinKernel =
OC_BLOB_GET (&Config->Kernel.Add.Values[Index]->MinKernel);
159 PlistPath =
OC_BLOB_GET (&Config->Kernel.Add.Values[Index]->PlistPath);
165 DEBUG ((DEBUG_WARN,
"Kernel->Add[%u]->Arch is borked (Can only be Any, i386, and x86_64)!\n", Index));
170 DEBUG ((DEBUG_WARN,
"Kernel->Add[%u]->BundlePath contains illegal character!\n", Index));
179 DEBUG ((DEBUG_WARN,
"Kernel->Add[%u]->BundlePath does NOT contain .kext suffix!\n", Index));
184 DEBUG ((DEBUG_WARN,
"Kernel->Add[%u]->Comment contains illegal character!\n", Index));
189 DEBUG ((DEBUG_WARN,
"Kernel->Add[%u]->ExecutablePath contains illegal character!\n", Index));
195 DEBUG ((DEBUG_WARN,
"Kernel->Add[%u]->PlistPath contains illegal character!\n", Index));
204 DEBUG ((DEBUG_WARN,
"Kernel->Add[%u]->PlistPath does NOT contain .plist suffix!\n", Index));
215 "Kernel->Add[%u]->BundlePath (length %u) is too long (should not exceed %u)!\n",
217 AsciiStrLen (BundlePath),
227 ExecutablePathSumSize = ExecutableFixedSize + AsciiStrSize (ExecutablePath);
231 "Kernel->Add[%u]->ExecutablePath (length %u) is too long (should not exceed %u)!\n",
233 AsciiStrLen (ExecutablePath),
243 PlistPathSumSize = PlistFixedSize + AsciiStrSize (PlistPath);
247 "Kernel->Add[%u]->PlistPath (length %u) is too long (should not exceed %u)!\n",
249 AsciiStrLen (PlistPath),
259 DEBUG ((DEBUG_WARN,
"Kernel->Add[%u]->MinKernel has a Darwin version %a, which is below 8 (macOS 10.4)!\n", Index, MinKernel));
267 DEBUG ((DEBUG_WARN,
"Kernel->Add[%u]->MaxKernel (currently set to %a) is borked!\n", Index, MaxKernel));
272 DEBUG ((DEBUG_WARN,
"Kernel->Add[%u]->MinKernel (currently set to %a) is borked!\n", Index, MinKernel));
276 for (IndexKextInfo = 0; IndexKextInfo <
mKextInfoSize; ++IndexKextInfo) {
277 if (AsciiStrCmp (BundlePath,
mKextInfo[IndexKextInfo].KextBundlePath) == 0) {
281 if ( (AsciiStrCmp (ExecutablePath,
mKextInfo[IndexKextInfo].KextExecutablePath) == 0)
282 && (AsciiStrCmp (PlistPath,
mKextInfo[IndexKextInfo].KextPlistPath) == 0))
288 IsLiluUsed = Config->Kernel.Add.Values[Index]->Enabled;
289 IsDisableLinkeditJettisonEnabled = Config->Kernel.Quirks.DisableLinkeditJettison;
290 if (IsLiluUsed && !IsDisableLinkeditJettisonEnabled) {
291 DEBUG ((DEBUG_WARN,
"Lilu.kext is loaded at Kernel->Add[%u], but DisableLinkeditJettison is not enabled at Kernel->Quirks!\n", Index));
299 if (AsciiStrCmp (BundlePath,
"BrcmFirmwareRepo.kext") == 0) {
300 DEBUG ((DEBUG_WARN,
"BrcmFirmwareRepo.kext at Kernel->Add[%u] cannot be injected by OpenCore, please remove it!\n", Index));
306 "Kernel->Add[%u] discovers %a, but its ExecutablePath (%a) or PlistPath (%a) is borked!\n",
321 for (IndexKextPrecedence = 0; IndexKextPrecedence <
mKextPrecedenceSize; ++IndexKextPrecedence) {
324 for (Index = 0; Index < Config->Kernel.Add.Count; ++Index) {
325 CurrentKext =
OC_BLOB_GET (&Config->Kernel.Add.Values[Index]->BundlePath);
329 if (AsciiStrCmp (CurrentKext, ParentKext) == 0) {
331 }
else if (AsciiStrCmp (CurrentKext, ChildKext) == 0) {
333 DEBUG ((DEBUG_WARN,
"Kernel->Add[%u] discovers %a, but its Parent (%a) is either placed after it or is missing!\n", Index, CurrentKext, ParentKext));
349 Config->Kernel.Add.Values,
350 Config->Kernel.Add.Count,
351 sizeof (Config->Kernel.Add.Values[0]),
361 IN OC_GLOBAL_CONFIG *Config
367 CONST CHAR8 *Comment;
368 CONST CHAR8 *MaxKernel;
369 CONST CHAR8 *MinKernel;
370 CONST CHAR8 *Identifier;
371 CONST CHAR8 *Strategy;
375 for (Index = 0; Index < Config->Kernel.Block.Count; ++Index) {
376 Arch =
OC_BLOB_GET (&Config->Kernel.Block.Values[Index]->Arch);
377 Comment =
OC_BLOB_GET (&Config->Kernel.Block.Values[Index]->Comment);
378 Identifier =
OC_BLOB_GET (&Config->Kernel.Block.Values[Index]->Identifier);
379 MaxKernel =
OC_BLOB_GET (&Config->Kernel.Block.Values[Index]->MaxKernel);
380 MinKernel =
OC_BLOB_GET (&Config->Kernel.Block.Values[Index]->MinKernel);
381 Strategy =
OC_BLOB_GET (&Config->Kernel.Block.Values[Index]->Strategy);
387 DEBUG ((DEBUG_WARN,
"Kernel->Block[%u]->Arch is borked (Can only be Any, i386, and x86_64)!\n", Index));
392 DEBUG ((DEBUG_WARN,
"Kernel->Block[%u]->Comment contains illegal character!\n", Index));
397 DEBUG ((DEBUG_WARN,
"Kernel->Block[%u]->Identifier contains illegal character!\n", Index));
405 DEBUG ((DEBUG_WARN,
"Kernel->Block[%u]->MinKernel has a Darwin version %a, which is below 8 (macOS 10.4)!\n", Index, MinKernel));
413 DEBUG ((DEBUG_WARN,
"Kernel->Block[%u]->MaxKernel (currently set to %a) is borked!\n", Index, MaxKernel));
418 DEBUG ((DEBUG_WARN,
"Kernel->Block[%u]->MinKernel (currently set to %a) is borked!\n", Index, MinKernel));
422 if ( (AsciiStrCmp (Strategy,
"Disable") != 0)
423 && (AsciiStrCmp (Strategy,
"Exclude") != 0))
425 DEBUG ((DEBUG_WARN,
"Kernel->Block[%u]->Strategy is borked (Can only be Disable or Exclude)!\n", Index));
434 Config->Kernel.Block.Values,
435 Config->Kernel.Block.Count,
436 sizeof (Config->Kernel.Block.Values[0]),
446 IN OC_GLOBAL_CONFIG *Config
450 CONST CHAR8 *MaxKernel;
451 CONST CHAR8 *MinKernel;
456 MaxKernel =
OC_BLOB_GET (&Config->Kernel.Emulate.MaxKernel);
457 MinKernel =
OC_BLOB_GET (&Config->Kernel.Emulate.MinKernel);
463 DEBUG ((DEBUG_WARN,
"Kernel->Emulate->MinKernel has a Darwin version %a, which is below 8 (macOS 10.4)!\n", MinKernel));
471 DEBUG ((DEBUG_WARN,
"Kernel->Emulate->MaxKernel (currently set to %a) is borked!\n", MaxKernel));
476 DEBUG ((DEBUG_WARN,
"Kernel->Emulate->MinKernel (currently set to %a) is borked!\n", MinKernel));
481 Config->Kernel.Emulate.Cpuid1Data,
482 Config->Kernel.Emulate.Cpuid1Mask,
483 sizeof (Config->Kernel.Emulate.Cpuid1Data),
484 sizeof (Config->Kernel.Emulate.Cpuid1Mask)
488 DEBUG ((DEBUG_WARN,
"Kernel->Emulate->Cpuid1Data requires Cpuid1Mask to be active for replaced bits!\n"));
498 IN OC_GLOBAL_CONFIG *Config
504 CONST CHAR8 *BundlePath;
505 CONST CHAR8 *Comment;
506 CONST CHAR8 *ExecutablePath;
507 CONST CHAR8 *Identifier;
508 CONST CHAR8 *MaxKernel;
509 CONST CHAR8 *MinKernel;
510 CONST CHAR8 *PlistPath;
514 for (Index = 0; Index < Config->Kernel.Force.Count; ++Index) {
515 Arch =
OC_BLOB_GET (&Config->Kernel.Force.Values[Index]->Arch);
516 BundlePath =
OC_BLOB_GET (&Config->Kernel.Force.Values[Index]->BundlePath);
517 Comment =
OC_BLOB_GET (&Config->Kernel.Force.Values[Index]->Comment);
518 ExecutablePath =
OC_BLOB_GET (&Config->Kernel.Force.Values[Index]->ExecutablePath);
519 Identifier =
OC_BLOB_GET (&Config->Kernel.Force.Values[Index]->Identifier);
520 MaxKernel =
OC_BLOB_GET (&Config->Kernel.Force.Values[Index]->MaxKernel);
521 MinKernel =
OC_BLOB_GET (&Config->Kernel.Force.Values[Index]->MinKernel);
522 PlistPath =
OC_BLOB_GET (&Config->Kernel.Force.Values[Index]->PlistPath);
528 DEBUG ((DEBUG_WARN,
"Kernel->Force[%u]->Arch is borked (Can only be Any, i386, and x86_64)!\n", Index));
533 DEBUG ((DEBUG_WARN,
"Kernel->Force[%u]->Identifier contains illegal character!\n", Index));
538 DEBUG ((DEBUG_WARN,
"Kernel->Force[%u]->BundlePath contains illegal character!\n", Index));
547 DEBUG ((DEBUG_WARN,
"Kernel->Force[%u]->BundlePath does NOT contain .kext suffix!\n", Index));
552 DEBUG ((DEBUG_WARN,
"Kernel->Force[%u]->Comment contains illegal character!\n", Index));
557 DEBUG ((DEBUG_WARN,
"Kernel->Force[%u]->ExecutablePath contains illegal character!\n", Index));
563 DEBUG ((DEBUG_WARN,
"Kernel->Force[%u]->PlistPath contains illegal character!\n", Index));
572 DEBUG ((DEBUG_WARN,
"Kernel->Force[%u]->PlistPath does NOT contain .plist suffix!\n", Index));
580 DEBUG ((DEBUG_WARN,
"Kernel->Force[%u]->MinKernel has a Darwin version %a, which is below 8 (macOS 10.4)!\n", Index, MinKernel));
588 DEBUG ((DEBUG_WARN,
"Kernel->Force[%u]->MaxKernel (currently set to %a) is borked!\n", Index, MaxKernel));
593 DEBUG ((DEBUG_WARN,
"Kernel->Force[%u]->MinKernel (currently set to %a) is borked!\n", Index, MinKernel));
602 Config->Kernel.Force.Values,
603 Config->Kernel.Force.Count,
604 sizeof (Config->Kernel.Force.Values[0]),
614 IN OC_GLOBAL_CONFIG *Config
620 CONST CHAR8 *Comment;
621 CONST CHAR8 *MaxKernel;
622 CONST CHAR8 *MinKernel;
623 CONST CHAR8 *Identifier;
627 CONST UINT8 *Replace;
631 CONST UINT8 *ReplaceMask;
632 UINT32 ReplaceMaskSize;
636 for (Index = 0; Index < Config->Kernel.Patch.Count; ++Index) {
637 Base =
OC_BLOB_GET (&Config->Kernel.Patch.Values[Index]->Base);
638 Comment =
OC_BLOB_GET (&Config->Kernel.Patch.Values[Index]->Comment);
639 Arch =
OC_BLOB_GET (&Config->Kernel.Patch.Values[Index]->Arch);
640 Identifier =
OC_BLOB_GET (&Config->Kernel.Patch.Values[Index]->Identifier);
641 Find =
OC_BLOB_GET (&Config->Kernel.Patch.Values[Index]->Find);
642 FindSize = Config->Kernel.Patch.Values[Index]->Find.Size;
643 Replace =
OC_BLOB_GET (&Config->Kernel.Patch.Values[Index]->Replace);
644 ReplaceSize = Config->Kernel.Patch.Values[Index]->Replace.Size;
645 Mask =
OC_BLOB_GET (&Config->Kernel.Patch.Values[Index]->Mask);
646 MaskSize = Config->Kernel.Patch.Values[Index]->Mask.Size;
647 ReplaceMask =
OC_BLOB_GET (&Config->Kernel.Patch.Values[Index]->ReplaceMask);
648 ReplaceMaskSize = Config->Kernel.Patch.Values[Index]->ReplaceMask.Size;
649 MaxKernel =
OC_BLOB_GET (&Config->Kernel.Patch.Values[Index]->MaxKernel);
650 MinKernel =
OC_BLOB_GET (&Config->Kernel.Patch.Values[Index]->MinKernel);
656 DEBUG ((DEBUG_WARN,
"Kernel->Patch[%u]->Comment contains illegal character!\n", Index));
661 DEBUG ((DEBUG_WARN,
"Kernel->Patch[%u]->Arch is borked (Can only be Any, i386, and x86_64)!\n", Index));
666 DEBUG ((DEBUG_WARN,
"Kernel->Patch[%u]->Identifier contains illegal character!\n", Index));
674 DEBUG ((DEBUG_WARN,
"Kernel->Patch[%u]->MinKernel has a Darwin version %a, which is below 8 (macOS 10.4)!\n", Index, MinKernel));
682 DEBUG ((DEBUG_WARN,
"Kernel->Patch[%u]->MaxKernel (currently set to %a) is borked!\n", Index, MaxKernel));
687 DEBUG ((DEBUG_WARN,
"Kernel->Patch[%u]->MinKernel (currently set to %a) is borked!\n", Index, MinKernel));
697 Base[0] !=
'\0' && FindSize == 0,
715 IN OC_GLOBAL_CONFIG *Config
719 BOOLEAN IsCustomSMBIOSGuidEnabled;
720 CONST CHAR8 *UpdateSMBIOSMode;
721 INT64 SetApfsTrimTimeout;
728 IsCustomSMBIOSGuidEnabled = Config->Kernel.Quirks.CustomSmbiosGuid;
729 UpdateSMBIOSMode =
OC_BLOB_GET (&Config->PlatformInfo.UpdateSmbiosMode);
730 if (IsCustomSMBIOSGuidEnabled && (AsciiStrCmp (UpdateSMBIOSMode,
"Custom") != 0)) {
731 DEBUG ((DEBUG_WARN,
"Kernel->Quirks->CustomSMBIOSGuid is enabled, but PlatformInfo->UpdateSMBIOSMode is not set to Custom!\n"));
735 SetApfsTrimTimeout = Config->Kernel.Quirks.SetApfsTrimTimeout;
736 if ( (SetApfsTrimTimeout > MAX_UINT32)
737 || (SetApfsTrimTimeout < -1))
739 DEBUG ((DEBUG_WARN,
"Kernel->Quirks->SetApfsTrimTimeout is invalid value %d!\n", SetApfsTrimTimeout));
749 IN OC_GLOBAL_CONFIG *Config
754 CONST CHAR8 *KernelCache;
761 Arch =
OC_BLOB_GET (&Config->Kernel.Scheme.KernelArch);
763 DEBUG ((DEBUG_WARN,
"Kernel->Scheme->KernelArch is borked (Can only be Auto, i386, i386-user32, or x86_64)!\n"));
767 KernelCache =
OC_BLOB_GET (&Config->Kernel.Scheme.KernelCache);
768 if ( (AsciiStrCmp (KernelCache,
"Auto") != 0)
769 && (AsciiStrCmp (KernelCache,
"Cacheless") != 0)
770 && (AsciiStrCmp (KernelCache,
"Mkext") != 0)
771 && (AsciiStrCmp (KernelCache,
"Prelinked") != 0))
773 DEBUG ((DEBUG_WARN,
"Kernel->Scheme->KernelCache is borked (Can only be Auto, Cacheless, Mkext, or Prelinked)!\n"));
#define OPEN_CORE_KEXT_PATH
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)