OpenCore  1.0.7
OpenCore Bootloader
Loading...
Searching...
No Matches
CommonPatches.c
Go to the documentation of this file.
1
15#include <Base.h>
16
18#include <Library/BaseMemoryLib.h>
21#include <Library/PrintLib.h>
22#include <Library/OcFileLib.h>
23#include <Library/OcStringLib.h>
24#include <Library/UefiLib.h>
25
26STATIC
27CONST UINT8
29 0xB9, 0xE2, 0x00, 0x00, 0x00
30};
31STATIC_ASSERT (sizeof (mMovEcxE2) == 5, "Unsupported mMovEcxE2");
32
33STATIC
34CONST UINT8
36 0x66, 0xB9, 0xE2, 0x00
37};
38STATIC_ASSERT (sizeof (mMovCxE2) == 4, "Unsupported mMovCxE2");
39
40STATIC
41CONST UINT8
42 mWrmsr[] = {
43 0x0F, 0x30
44};
45STATIC_ASSERT (sizeof (mWrmsr) == 2, "Unsupported mWrmsr");
46
47STATIC
48CONST UINTN
50
51STATIC
52EFI_STATUS
54 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
55 IN UINT32 KernelVersion
56 )
57{
58 UINTN Count;
59 UINT8 *Walker;
60 UINT8 *WalkerEnd;
61 UINT8 *WalkerTmp;
62
63 //
64 // NOTE: As of macOS 13.0 AICPUPM kext is removed.
65 // However, legacy version of this kext may be injected and patched,
66 // thus no need to perform system version check here.
67 //
68
69 if (Patcher == NULL) {
70 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping %a on NULL Patcher on kernel version %u\n", __func__, KernelVersion));
71 return OcMatchDarwinVersion (KernelVersion, KERNEL_VERSION_VENTURA_MIN, 0) ? EFI_SUCCESS : EFI_NOT_FOUND;
72 }
73
74 Count = 0;
75 Walker = (UINT8 *)MachoGetMachHeader (&Patcher->MachContext);
76 WalkerEnd = Walker + MachoGetInnerSize (&Patcher->MachContext) - mWrmsrMaxDistance;
77
78 //
79 // Thanks to Clover developers for the approach.
80 //
81 while (Walker < WalkerEnd) {
82 //
83 // Match (e)cx E2h assignment.
84 //
85 if ( (Walker[0] == mMovEcxE2[0])
86 && (Walker[1] == mMovEcxE2[1])
87 && (Walker[2] == mMovEcxE2[2])
88 && (Walker[3] == mMovEcxE2[3])
89 && (Walker[4] == mMovEcxE2[4]))
90 {
91 Walker += sizeof (mMovEcxE2);
92 } else if ( (Walker[0] == mMovCxE2[0])
93 && (Walker[1] == mMovCxE2[1])
94 && (Walker[2] == mMovCxE2[2])
95 && (Walker[3] == mMovCxE2[3]))
96 {
97 Walker += sizeof (mMovCxE2);
98 } else {
99 ++Walker;
100 continue;
101 }
102
103 WalkerTmp = Walker + mWrmsrMaxDistance;
104
105 while (Walker < WalkerTmp) {
106 if ( (Walker[0] == mWrmsr[0])
107 && (Walker[1] == mWrmsr[1]))
108 {
109 ++Count;
110 //
111 // Patch matched wrmsr with nop.
112 //
113 *Walker++ = 0x90;
114 *Walker++ = 0x90;
115 break;
116 }
117
118 if ( ((Walker[0] == 0xC9) && (Walker[1] == 0xC3))
119 || ((Walker[0] == 0x5D) && (Walker[1] == 0xC3)))
120 //
121 // Stop searching upon matching return sequences.
122 //
123 {
124 Walker += 2;
125 break;
126 }
127
128 if ( ((Walker[0] == 0xB9) && (Walker[3] == 0) && (Walker[4] == 0))
129 || ((Walker[0] == 0x66) && (Walker[1] == 0xB9) && (Walker[3] == 0)))
130 //
131 // Stop searching upon matching reassign sequences.
132 //
133 {
134 break;
135 }
136
137 //
138 // Continue searching.
139 //
140 ++Walker;
141 }
142 }
143
144 //
145 // At least one patch must be successful for this to work.
146 //
147 if (Count > 0) {
148 DEBUG ((DEBUG_INFO, "OCAK: [OK] Success AppleCpuPmCfgLock patch\n"));
149 return EFI_SUCCESS;
150 }
151
152 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply AppleCpuPmCfgLock patch\n"));
153 return EFI_NOT_FOUND;
154}
155
156#pragma pack(push, 1)
157
158//
159// XCPM record definition, extracted from XNU debug kernel.
160//
170
171#pragma pack(pop)
172
173STATIC
174CONST UINT8
176 0xB9, 0xE2, 0x00, 0x00, 0x00,
177 0x0F, 0x30
178};
179
180STATIC
181CONST UINT8
183 0xB9, 0xE2, 0x00, 0x00, 0x00,
184 0x90, 0x90
185};
186
187STATIC
190 .Comment = DEBUG_POINTER ("XcpmCfgLockRel"),
191 .Base = "_xcpm_idle",
192 .Find = mXcpmCfgLockRelFind,
193 .Mask = NULL,
194 .Replace = mXcpmCfgLockRelReplace,
195 .ReplaceMask = NULL,
196 .Size = sizeof (mXcpmCfgLockRelFind),
197 .Count = 2,
198 .Skip = 0,
199 .Limit = 4096
200};
201
202STATIC
203CONST UINT8
205 0xBF, 0xE2, 0x00, 0x00, 0x00,
206 0xE8
207};
208
209STATIC
210CONST UINT8
212 0xEB, 0x08,
213 0x90, 0x90, 0x90,
214 0xE8
215};
216
217STATIC
220 .Comment = DEBUG_POINTER ("XcpmCfgLockDbg"),
221 .Base = "_xcpm_cst_control_evaluate",
222 .Find = mXcpmCfgLockDbgFind,
223 .Mask = NULL,
224 .Replace = mXcpmCfgLockDbgReplace,
225 .ReplaceMask = NULL,
226 .Size = sizeof (mXcpmCfgLockDbgFind),
227 .Count = 2,
228 .Skip = 0,
229 .Limit = 4096
230};
231
232STATIC
233EFI_STATUS
235 IN OUT PATCHER_CONTEXT *Patcher,
236 IN UINT32 KernelVersion
237 )
238{
239 EFI_STATUS Status;
240 XCPM_MSR_RECORD *Record;
241 XCPM_MSR_RECORD *Last;
242
243 UINT32 Replacements;
244
245 //
246 // This is a kernel patch, so Patcher cannot be NULL.
247 //
248 ASSERT (Patcher != NULL);
249
250 //
251 // XCPM is not available before macOS 10.8.5.
252 //
254 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping XcpmCfgLock on %u\n", KernelVersion));
255 return EFI_SUCCESS;
256 }
257
258 Last = (XCPM_MSR_RECORD *)((UINT8 *)MachoGetMachHeader (&Patcher->MachContext)
259 + MachoGetInnerSize (&Patcher->MachContext) - sizeof (XCPM_MSR_RECORD));
260
261 Replacements = 0;
262
263 Status = PatcherGetSymbolAddress (Patcher, "_xcpm_core_scope_msrs", (UINT8 **)&Record);
264 if (EFI_ERROR (Status)) {
265 DEBUG ((DEBUG_WARN, "OCAK: [FAIL] Failed to locate _xcpm_core_scope_msrs for XcpmCfgLock patch - %r\n", Status));
266 return EFI_NOT_FOUND;
267 }
268
269 while (Record < Last) {
270 if (Record->xcpm_msr_num != 0xE2) {
271 break;
272 }
273
274 DEBUG ((
275 DEBUG_INFO,
276 "OCAK: Zeroing _xcpm_core_scope_msrs 0x%X applicable CPUs (%u)\n",
277 Record->xcpm_msr_num,
279 ));
280 Record->xcpm_msr_applicable_cpus = 0;
281 ++Replacements;
282
283 ++Record;
284 }
285
286 //
287 // Now the HWP patch at _xcpm_idle() for Release XNU.
288 //
290 if (EFI_ERROR (Status)) {
291 DEBUG ((DEBUG_INFO, "OCAK: Failed to apply _xcpm_idle release patch - %r, trying dbg\n", Status));
293 if (EFI_ERROR (Status)) {
294 DEBUG ((DEBUG_WARN, "OCAK: Failed to apply dbg _xcpm_cst_control_evaluate patches - %r\n", Status));
295 }
296 }
297
298 if ((Replacements > 0) && !EFI_ERROR (Status)) {
299 DEBUG ((DEBUG_INFO, "OCAK: [OK] Success XcpmCfgLock patch\n"));
300 return EFI_SUCCESS;
301 }
302
303 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply XcpmCfgLock patch\n"));
304 return EFI_NOT_FOUND;
305}
306
307STATIC
308CONST UINT8
310 0xB9, 0xAA, 0x01, 0x00, 0x00,
311 0x0F, 0x30
312};
313
314STATIC
315CONST UINT8
317 0xB9, 0xAA, 0x01, 0x00, 0x00,
318 0x90, 0x90
319};
320
321STATIC
324 .Comment = DEBUG_POINTER ("MiscPwrMgmtRel"),
325 .Base = NULL,
326 .Find = mMiscPwrMgmtRelFind,
327 .Mask = NULL,
328 .Replace = mMiscPwrMgmtRelReplace,
329 .ReplaceMask = NULL,
330 .Size = sizeof (mMiscPwrMgmtRelFind),
331 .Count = 0,
332 .Skip = 0,
333 .Limit = 0
334};
335
336STATIC
337CONST UINT8
339 0xB9, 0xAA, 0x01, 0x00, 0x00,
340 0x0F, 0x32,
341 0x89, 0xD2,
342 0x83, 0x00, 0x00,
343 0x0F, 0x30
344};
345
346STATIC
347CONST UINT8
349 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
350 0xFF, 0xFF,
351 0xFF, 0xFF,
352 0xFF, 0x00, 0x00,
353 0xFF, 0xFF
354};
355
356STATIC
357CONST UINT8
359 0x00, 0x00, 0x00, 0x00, 0x00,
360 0x00, 0x00,
361 0x00, 0x00,
362 0x00, 0x00, 0x00,
363 0x90, 0x90
364};
365
366STATIC
367CONST UINT8
369 0x00, 0x00, 0x00, 0x00, 0x00,
370 0x00, 0x00,
371 0x00, 0x00,
372 0x00, 0x00, 0x00,
373 0xFF, 0xFF
374};
375
376STATIC
379 .Comment = DEBUG_POINTER ("MiscPwrMgmtRel Sequoia"),
380 .Base = NULL,
381 .Find = mMiscPwrMgmtRelFind15,
382 .Mask = mMiscPwrMgmtRelMask15,
383 .Replace = mMiscPwrMgmtRelReplace15,
384 .ReplaceMask = mMiscPwrMgmtRelReplaceMask15,
385 .Size = sizeof (mMiscPwrMgmtRelFind15),
386 .Count = 0,
387 .Skip = 0,
388 .Limit = 0
389};
390
391STATIC
392CONST UINT8
394 0xBF, 0xAA, 0x01, 0x00, 0x00,
395 0xE8
396};
397
398STATIC
399CONST UINT8
401 0xEB, 0x08,
402 0x90, 0x90, 0x90,
403 0xE8
404};
405
406STATIC
409 .Comment = DEBUG_POINTER ("MiscPwrMgmtDbg"),
410 .Base = NULL,
411 .Find = mMiscPwrMgmtDbgFind,
412 .Mask = NULL,
413 .Replace = mMiscPwrMgmtDbgReplace,
414 .ReplaceMask = NULL,
415 .Size = sizeof (mMiscPwrMgmtDbgFind),
416 .Count = 0,
417 .Skip = 0,
418 .Limit = 0
419};
420
421STATIC
422EFI_STATUS
424 IN OUT PATCHER_CONTEXT *Patcher,
425 IN UINT32 KernelVersion
426 )
427{
428 EFI_STATUS Status;
429 XCPM_MSR_RECORD *Record;
430 XCPM_MSR_RECORD *Last;
431 UINT32 Replacements;
432
433 //
434 // This is a kernel patch, so Patcher cannot be NULL.
435 //
436 ASSERT (Patcher != NULL);
437
438 //
439 // XCPM is not available before macOS 10.8.5.
440 //
442 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping XcpmExtraMsrs on %u\n", KernelVersion));
443 return EFI_SUCCESS;
444 }
445
446 Last = (XCPM_MSR_RECORD *)((UINT8 *)MachoGetMachHeader (&Patcher->MachContext)
447 + MachoGetInnerSize (&Patcher->MachContext) - sizeof (XCPM_MSR_RECORD));
448
449 Replacements = 0;
450
451 Status = PatcherGetSymbolAddress (Patcher, "_xcpm_pkg_scope_msrs", (UINT8 **)&Record);
452 if (EFI_ERROR (Status)) {
453 DEBUG ((DEBUG_WARN, "OCAK: [FAIL] Failed to locate _xcpm_pkg_scope_msrs for XcpmExtraMsrs patch - %r\n", Status));
454 return EFI_NOT_FOUND;
455 }
456
457 while (Record < Last) {
458 //
459 // Most Record->xcpm_msr_applicable_cpus has
460 // 0xDC or 0xDE in its lower 16-bit and thus here we
461 // AND 0xFF0000FDU in order to match both. (The result will be 0xDC)
462 //
463 if ((Record->xcpm_msr_applicable_cpus & 0xFF0000FDU) != 0xDC) {
464 break;
465 }
466
467 DEBUG ((
468 DEBUG_INFO,
469 "OCAK: Zeroing _xcpm_pkg_scope_msrs 0x%X applicable CPUs (%u)\n",
470 Record->xcpm_msr_num,
472 ));
473 Record->xcpm_msr_applicable_cpus = 0;
474 ++Replacements;
475
476 ++Record;
477 }
478
479 Status = PatcherGetSymbolAddress (Patcher, "_xcpm_SMT_scope_msrs", (UINT8 **)&Record);
480 if (EFI_ERROR (Status)) {
481 DEBUG ((DEBUG_WARN, "OCAK: [FAIL] Failed to locate _xcpm_SMT_scope_msrs for XcpmExtraMsrs patch - %r\n", Status));
482 return EFI_NOT_FOUND;
483 }
484
485 while (Record < Last) {
486 if (Record->xcpm_msr_flag_p != NULL) {
487 break;
488 }
489
490 DEBUG ((
491 DEBUG_INFO,
492 "OCAK: Zeroing _xcpm_SMT_scope_msrs data 0x%X applicable CPUs (%u)\n",
493 Record->xcpm_msr_num,
495 ));
496 Record->xcpm_msr_applicable_cpus = 0;
497 ++Replacements;
498
499 ++Record;
500 }
501
502 //
503 // Now patch writes to MSR_MISC_PWR_MGMT.
504 //
506 //
507 // TODO: Find dbg patch on macOS 15+.
508 //
510 if (EFI_ERROR (Status)) {
511 DEBUG ((DEBUG_WARN, "OCAK: Failed to patch writes to XcpmExtraMsrs MSR_MISC_PWR_MGMT macOS 15+ - %r\n", Status));
512 }
513 } else {
515 if (EFI_ERROR (Status)) {
516 DEBUG ((DEBUG_INFO, "OCAK: Failed to patch writes to XcpmExtraMsrs MSR_MISC_PWR_MGMT old - %r, trying dbg\n", Status));
518 if (EFI_ERROR (Status)) {
519 DEBUG ((DEBUG_WARN, "OCAK: Failed to patch writes to XcpmExtraMsrs MSR_MISC_PWR_MGMT old - %r\n", Status));
520 }
521 }
522 }
523
524 if ((Replacements > 0) && !EFI_ERROR (Status)) {
525 DEBUG ((DEBUG_INFO, "OCAK: [OK] Success XcpmExtraMsrs patch\n"));
526 return EFI_SUCCESS;
527 }
528
529 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply XcpmExtraMsrs patch\n"));
530 return EFI_NOT_FOUND;
531}
532
533STATIC
534CONST UINT8
536 0xB9, 0x99, 0x01, 0x00, 0x00,
537 0x0F, 0x30
538};
539
540STATIC
541CONST UINT8
543 0xB9, 0x99, 0x01, 0x00, 0x00,
544 0x31, 0xD2,
545 0x0F, 0x30
546};
547
548STATIC
549CONST UINT8
551 0xB9, 0x99, 0x01, 0x00, 0x00,
552 0x4C, 0x89, 0xF0,
553 0x0F, 0x30
554};
555
556STATIC
557CONST UINT8
559 0xB9, 0x99, 0x01, 0x00, 0x00,
560 0x48, 0x89, 0xD8,
561 0x0F, 0x30
562};
563
564STATIC
565CONST UINT8
567 0xB9, 0x99, 0x01, 0x00, 0x00,
568 0x31, 0xD2,
569 0xB8, 0x00, 0xFF, 0x00, 0x00,
570 0x0F, 0x30,
571 0xC3
572};
573
574STATIC
575EFI_STATUS
577 IN OUT PATCHER_CONTEXT *Patcher,
578 IN UINT32 KernelVersion
579 )
580{
581 UINT8 *Start;
582 UINT8 *Last;
583 UINT8 *Current;
584
585 //
586 // This is a kernel patch, so Patcher cannot be NULL.
587 //
588 ASSERT (Patcher != NULL);
589
590 //
591 // XCPM is not available before macOS 10.8.5.
592 //
594 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping XcpmForceBoost on %u\n", KernelVersion));
595 return EFI_SUCCESS;
596 }
597
598 Start = (UINT8 *)MachoGetMachHeader (&Patcher->MachContext);
599 Last = Start + MachoGetInnerSize (&Patcher->MachContext) - EFI_PAGE_SIZE * 2;
600 Start += EFI_PAGE_SIZE;
601 Current = Start;
602
603 while (Current < Last) {
604 //
605 // Compare <mov ecx, 0x199> in common.
606 //
607 if ( (Current[0] == mPerfCtrlFind1[0])
608 && (Current[1] == mPerfCtrlFind1[1])
609 && (Current[2] == mPerfCtrlFind1[2])
610 && (Current[3] == mPerfCtrlFind1[3]))
611 {
612 if ( (CompareMem (&Current[4], &mPerfCtrlFind1[4], sizeof (mPerfCtrlFind1) - 4) == 0)
613 || (CompareMem (&Current[4], &mPerfCtrlFind2[4], sizeof (mPerfCtrlFind2) - 4) == 0)
614 || (CompareMem (&Current[4], &mPerfCtrlFind3[4], sizeof (mPerfCtrlFind3) - 4) == 0)
615 || (CompareMem (&Current[4], &mPerfCtrlFind4[4], sizeof (mPerfCtrlFind4) - 4) == 0))
616 {
617 break;
618 }
619 }
620
621 ++Current;
622 }
623
624 if (Current == Last) {
625 DEBUG ((DEBUG_WARN, "OCAK: [FAIL] Failed to locate MSR_IA32_PERF_CONTROL write for XcpmForceBoost patch\n"));
626 return EFI_NOT_FOUND;
627 }
628
629 Start = Current - EFI_PAGE_SIZE;
630 Current -= 4;
631
632 while (Current >= Start) {
633 //
634 // Locate the beginning.
635 //
636 if ( (Current[0] == 0x55)
637 && (Current[1] == 0x48)
638 && (Current[2] == 0x89)
639 && (Current[3] == 0xE5))
640 {
641 break;
642 }
643
644 --Current;
645 }
646
647 if (Current < Start) {
648 DEBUG ((DEBUG_WARN, "OCAK: [FAIL] Failed to locate MSR_IA32_PERF_CONTROL prologue for XcpmForceBoost patch\n"));
649 return EFI_NOT_FOUND;
650 }
651
652 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch write max to MSR_IA32_PERF_CONTROL for XcpmForceBoost patch\n"));
653 CopyMem (Current, mPerfCtrlMax, sizeof (mPerfCtrlMax));
654 return EFI_SUCCESS;
655}
656
657STATIC
658CONST UINT8
660 0xFF, 0xFF, 0x10
661};
662
663STATIC
664CONST UINT8
666 0xFF, 0xFF, 0x40
667};
668
669STATIC
672 .Comment = DEBUG_POINTER ("RemoveUsbLimitV1"),
673 .Base = "__ZN15AppleUSBXHCIPCI11createPortsEv",
674 .Find = mRemoveUsbLimitV1Find,
675 .Mask = NULL,
676 .Replace = mRemoveUsbLimitV1Replace,
677 .ReplaceMask = NULL,
678 .Size = sizeof (mRemoveUsbLimitV1Replace),
679 .Count = 1,
680 .Skip = 0,
681 .Limit = 8192
682};
683
684STATIC
685CONST UINT8
687 0x0F, 0x0F, 0x83
688};
689
690STATIC
691CONST UINT8
693 0x40, 0x0F, 0x83
694};
695
696STATIC
699 .Comment = DEBUG_POINTER ("RemoveUsbLimitV2"),
700 .Base = "__ZN12AppleUSBXHCI11createPortsEv",
701 .Find = mRemoveUsbLimitV2Find,
702 .Mask = NULL,
703 .Replace = mRemoveUsbLimitV2Replace,
704 .ReplaceMask = NULL,
705 .Size = sizeof (mRemoveUsbLimitV2Replace),
706 .Count = 1,
707 .Skip = 0,
708 .Limit = 4096
709};
710
711STATIC
712CONST UINT8
714 0x0F, 0x0F, 0x87
715};
716
717STATIC
718CONST UINT8
720 0x40, 0x0F, 0x87
721};
722
723STATIC
726 .Comment = DEBUG_POINTER ("RemoveUsbLimitIoP1 part 1"),
727 .Base = "__ZN16AppleUSBHostPort15setPortLocationEj",
729 .Mask = NULL,
731 .ReplaceMask = NULL,
732 .Size = sizeof (mRemoveUsbLimitIoP1Replace1),
733 .Count = 1,
734 .Skip = 0,
735 .Limit = 4096
736};
737
738STATIC
741 .Comment = DEBUG_POINTER ("RemoveUsbLimitIoP1 part 1"),
742 .Base = "__ZN16AppleUSBHostPort15setPortLocationEv",
744 .Mask = NULL,
746 .ReplaceMask = NULL,
747 .Size = sizeof (mRemoveUsbLimitIoP1Replace1),
748 .Count = 1,
749 .Skip = 0,
750 .Limit = 4096
751};
752
753STATIC
754CONST UINT8
756 0x41, 0x83, 0x00, 0x0F,
757 0x41, 0xD3, 0x00,
758 0x00, 0x09, 0x00
759};
760
761STATIC
762CONST UINT8
764 0xFF, 0xFF, 0x00, 0xFF,
765 0xFF, 0xFF, 0x00,
766 0x00, 0xFF, 0x00
767};
768
769STATIC
770CONST UINT8
772 0x00, 0x00, 0x00, 0x3F,
773 0x00, 0x00, 0x00,
774 0x00, 0x00, 0x00
775};
776
777STATIC
778CONST UINT8
780 0x00, 0x00, 0x00, 0xFF,
781 0x00, 0x00, 0x00,
782 0x00, 0x00, 0x00
783};
784
785STATIC
788 .Comment = DEBUG_POINTER ("RemoveUsbLimitIoP1 part 2"),
789 .Base = "__ZN16AppleUSBHostPort15setPortLocationEj",
793 .ReplaceMask = mRemoveUsbLimitIoP1ReplaceMask2,
794 .Size = sizeof (mRemoveUsbLimitIoP1Replace2),
795 .Count = 1,
796 .Skip = 0,
797 .Limit = 4096
798};
799
800STATIC
801EFI_STATUS
803 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
804 IN UINT32 KernelVersion
805 )
806{
807 EFI_STATUS Status;
808
809 //
810 // On 10.14.4 and newer IOUSBHostFamily also needs limit removal.
811 // Thanks to ydeng discovering this.
812 //
814 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping port patch IOUSBHostFamily on %u\n", KernelVersion));
815 return EFI_SUCCESS;
816 }
817
818 if (Patcher == NULL) {
819 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion));
820 return EFI_NOT_FOUND;
821 }
822
823 //
824 // For macOS 26.0 (Darwin 25.0.0) and above use Tahoe-specific patch,
825 // otherwise use the original patch.
826 //
829 if (EFI_ERROR (Status)) {
830 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply Tahoe port patch com.apple.iokit.IOUSBHostFamily part 1 - %r\n", Status));
831 } else {
832 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success Tahoe port com.apple.iokit.IOUSBHostFamily part 1\n"));
833 }
834 } else {
836 if (EFI_ERROR (Status)) {
837 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply pre-Tahoe port patch com.apple.iokit.IOUSBHostFamily part 1 - %r\n", Status));
838 } else {
839 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success pre-Tahoe port com.apple.iokit.IOUSBHostFamily part 1\n"));
840 }
841 }
842
843 //
844 // The following patch is only needed on macOS 11.1 (Darwin 20.2.0) and above; skip it otherwise.
845 //
847 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping port patch com.apple.iokit.IOUSBHostFamily part 2 on %u\n", KernelVersion));
848 return Status;
849 }
850
852 if (EFI_ERROR (Status)) {
853 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply port patch com.apple.iokit.IOUSBHostFamily part 2 - %r\n", Status));
854 } else {
855 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success port com.apple.iokit.IOUSBHostFamily part 2\n"));
856 }
857
858 return Status;
859}
860
861STATIC
862EFI_STATUS
864 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
865 IN UINT32 KernelVersion
866 )
867{
868 EFI_STATUS Status;
869
871 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping modern port patch AppleUSBXHCI on %u\n", KernelVersion));
872 return EFI_SUCCESS;
873 }
874
875 if (Patcher == NULL) {
876 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion));
877 return EFI_NOT_FOUND;
878 }
879
880 //
881 // TODO: Implement some locationID hack in IOUSBHostFamily.
882 // The location ID is a 32 bit number which is unique among all USB devices in the system,
883 // and which will not change on a system reboot unless the topology of the bus itself changes.
884 // See AppleUSBHostPort::setPortLocation():
885 // locationId = getLocationId();
886 // if (!(locationId & 0xF)) {
887 // int32_t shift = 20;
888 // while (locationId & (0xF << shift)) {
889 // shift -= 4;
890 // if (Shift < 0) { setLocationId(locationId); return; }
891 // }
892 // setLocationId(locationId | ((portNumber & 0xF) << shift));
893 // }
894 // The value (e.g. 0x14320000) is represented as follows: 0xAABCDEFG
895 // AA — Ctrl number 8 bits (e.g. 0x14, aka XHCI)
896 // B - Port number 4 bits (e.g. 0x3, aka SS03)
897 // C~F - Bus number 4 bits (e.g. 0x2, aka IOUSBHostHIDDevice)
898 //
899 // C~F are filled as many times as many USB Hubs are there on the port.
900 //
902 if (!EFI_ERROR (Status)) {
903 //
904 // We do not need to patch com.apple.driver.usb.AppleUSBXHCI if this patch was successful.
905 // Only legacy systems require com.apple.driver.usb.AppleUSBXHCI to be patched.
906 //
907 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success com.apple.driver.usb.AppleUSBXHCI\n"));
908 } else {
909 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply patch com.apple.driver.usb.AppleUSBXHCI - %r\n", Status));
910 }
911
912 //
913 // TODO: Check when the patch changed actually.
914 //
915 if ( EFI_ERROR (Status)
917 {
918 DEBUG ((DEBUG_INFO, "OCAK: [OK] Assuming success for AppleUSBXHCI on %u\n", KernelVersion));
919 return EFI_SUCCESS;
920 }
921
922 return Status;
923}
924
925STATIC
926EFI_STATUS
928 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
929 IN UINT32 KernelVersion
930 )
931{
932 EFI_STATUS Status;
933
935 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping legacy port patch AppleUSBXHCIPCI on %u\n", KernelVersion));
936 return EFI_SUCCESS;
937 }
938
939 if (Patcher == NULL) {
940 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion));
941 return EFI_NOT_FOUND;
942 }
943
944 //
945 // If we are here, we are on legacy 10.13 or below, try the oldest patch.
946 //
948 if (EFI_ERROR (Status)) {
949 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply legacy port patch AppleUSBXHCIPCI - %r\n", Status));
950 } else {
951 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success apply legacy port AppleUSBXHCIPCI\n"));
952 }
953
954 //
955 // TODO: Check when the patch changed actually.
956 //
957 if ( EFI_ERROR (Status)
959 {
960 DEBUG ((DEBUG_INFO, "OCAK: [OK] Assuming success for legacy port AppleUSBXHCIPCI on %u\n", KernelVersion));
961 return EFI_SUCCESS;
962 }
963
964 return Status;
965}
966
967STATIC
968CONST UINT8
970 0x41, 0x50, 0x50, 0x4C, 0x45, 0x20, 0x53, 0x53, 0x44, 0x00
971};
972
973STATIC
974CONST UINT8
976 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
977};
978
979STATIC
982 .Comment = DEBUG_POINTER ("IOAHCIBlockStorageV1"),
983 .Base = NULL,
985 .Mask = NULL,
987 .ReplaceMask = NULL,
988 .Size = sizeof (mIOAHCIBlockStoragePatchV1Find),
989 .Count = 1,
990 .Skip = 0
991};
992
993STATIC
994CONST UINT8
996 0x41, 0x50, 0x50, 0x4C, 0x45, 0x00
997};
998
999STATIC
1000CONST UINT8
1002 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1003};
1004
1005STATIC
1008 .Comment = DEBUG_POINTER ("IOAHCIBlockStorageV2"),
1009 .Base = NULL,
1011 .Mask = NULL,
1013 .ReplaceMask = NULL,
1014 .Size = sizeof (mIOAHCIBlockStoragePatchV2Find),
1015 .Count = 1,
1016 .Skip = 0
1017};
1018
1019STATIC
1020CONST UINT8
1022 0x48, 0x8D, 0x3D, 0x00, 0x00, 0x00, 0x00,
1023 0xBA, 0x09, 0x00, 0x00, 0x00
1024};
1025
1026STATIC
1027CONST UINT8
1029 0x48, 0x8D, 0x3D, 0x00, 0x00, 0x00, 0x00,
1030 0xBA, 0x05, 0x00, 0x00, 0x00
1031};
1032
1033STATIC
1034CONST UINT8
1036 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
1037 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
1038};
1039
1040STATIC
1041CONST UINT8
1043 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1044 0xBA, 0x00, 0x00, 0x00, 0x00
1045};
1046
1047STATIC
1048CONST UINT8
1050 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1051 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
1052};
1053
1054STATIC
1057 .Comment = DEBUG_POINTER ("IOAHCIBlockStorage trim 13.3+ part 1"),
1058 .Base = "__ZN24IOAHCIBlockStorageDriver23DetermineDeviceFeaturesEPt",
1063 .Size = sizeof (mIOAHCIBlockStoragePatch133Find1),
1064 .Count = 1,
1065 .Skip = 0,
1066 .Limit = 4096
1067};
1068
1069STATIC
1072 .Comment = DEBUG_POINTER ("IOAHCIBlockStorage trim 13.3+ part 2"),
1073 .Base = "__ZN24IOAHCIBlockStorageDriver23DetermineDeviceFeaturesEPt",
1078 .Size = sizeof (mIOAHCIBlockStoragePatch133Find2),
1079 .Count = 1,
1080 .Skip = 0,
1081 .Limit = 4096
1082};
1083
1084STATIC
1085CONST UINT8
1087 0x4C, 0x8D, 0x2D, 0x00, 0x00, 0x00, 0x00,
1088 0x4C, 0x89, 0xEF,
1089 0xE8, 0x00, 0x00, 0x00, 0x00,
1090 0x4C, 0x89, 0xEF
1091};
1092
1093STATIC
1094CONST UINT8
1096 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
1097 0xFF, 0xFF, 0xFF,
1098 0xFF, 0x00, 0x00, 0x00, 0x00,
1099 0xFF, 0xFF, 0xFF
1100};
1101
1102STATIC
1103CONST UINT8
1105 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1106 0x00, 0x00, 0x00,
1107 0x31, 0xC0, 0x90, 0x90, 0x90,
1108 0x00, 0x00, 0x00
1109};
1110
1111STATIC
1112CONST UINT8
1114 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1115 0x00, 0x00, 0x00,
1116 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1117 0x00, 0x00, 0x00
1118};
1119
1120STATIC
1123 .Comment = DEBUG_POINTER ("IOAHCIBlockStorage trim 14.4+"),
1124 .Base = "__ZN24IOAHCIBlockStorageDriver23DetermineDeviceFeaturesEPt",
1129 .Size = sizeof (mIOAHCIBlockStoragePatch144Find),
1130 .Count = 2,
1131 .Skip = 0,
1132 .Limit = 4096
1133};
1134
1135STATIC
1136EFI_STATUS
1138 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
1139 IN UINT32 KernelVersion
1140 )
1141{
1142 EFI_STATUS Status;
1143
1144 if (Patcher == NULL) {
1145 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion));
1146 return EFI_NOT_FOUND;
1147 }
1148
1149 //
1150 // macOS 14.4+ (Darwin 23.4.0) adopted different patch patterns similar to 13.3+, as below.
1151 //
1154 if (EFI_ERROR (Status)) {
1155 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply patch 14.4+ com.apple.iokit.IOAHCIBlockStorage - %r\n", Status));
1156 } else {
1157 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success 14.4+ com.apple.iokit.IOAHCIBlockStorage\n"));
1158 }
1159
1160 return Status;
1161 }
1162
1163 //
1164 // Starting with macOS 13.3 (Darwin 22.4.0), a new set of patches are required, discovered by @vit9696.
1165 //
1168 if (EFI_ERROR (Status)) {
1169 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply patch 13.3+ com.apple.iokit.IOAHCIBlockStorage part 1 - %r\n", Status));
1170 return Status;
1171 } else {
1172 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success 13.3+ com.apple.iokit.IOAHCIBlockStorage part 1\n"));
1173 }
1174
1176 if (EFI_ERROR (Status)) {
1177 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply patch 13.3+ com.apple.iokit.IOAHCIBlockStorage part 2 - %r\n", Status));
1178 } else {
1179 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success 13.3+ com.apple.iokit.IOAHCIBlockStorage part 2\n"));
1180 }
1181
1182 return Status;
1183 }
1184
1186 if (EFI_ERROR (Status)) {
1187 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply patch legacy com.apple.iokit.IOAHCIBlockStorage V1 - %r\n", Status));
1188 } else {
1189 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success legacy com.apple.iokit.IOAHCIBlockStorage V1\n"));
1190 }
1191
1194 if (EFI_ERROR (Status)) {
1195 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply patch legacy com.apple.iokit.IOAHCIBlockStorage V2 - %r\n", Status));
1196 } else {
1197 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success legacy com.apple.iokit.IOAHCIBlockStorage V2\n"));
1198 }
1199 } else {
1200 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping IOAHCIBlockStorage legacy V2 on %u\n", KernelVersion));
1201 }
1202
1203 //
1204 // This started to be required on 10.6.7 or so.
1205 // We cannot trust which minor SnowLeo version is this, just let it pass.
1206 //
1207 if ( EFI_ERROR (Status)
1209 {
1210 DEBUG ((DEBUG_INFO, "OCAK: [OK] Assuming success for legacy IOAHCIBlockStorage on %u\n", KernelVersion));
1211 return EFI_SUCCESS;
1212 }
1213
1214 return Status;
1215}
1216
1217STATIC
1218CONST UINT8
1220 0x45, 0x78, 0x74, 0x65, 0x72, 0x6E, 0x61, 0x6C
1221};
1222
1223STATIC
1224CONST UINT8
1226 0x49, 0x6E, 0x74, 0x65, 0x72, 0x6E, 0x61, 0x6C
1227};
1228
1229STATIC
1232 .Comment = DEBUG_POINTER ("IOAHCIPort"),
1233 .Base = NULL,
1234 .Find = mIOAHCIPortPatchFind,
1235 .Mask = NULL,
1236 .Replace = mIOAHCIPortPatchReplace,
1237 .ReplaceMask = NULL,
1238 .Size = sizeof (mIOAHCIPortPatchFind),
1239 .Count = 1,
1240 .Skip = 0
1241};
1242
1243STATIC
1244EFI_STATUS
1246 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
1247 IN UINT32 KernelVersion
1248 )
1249{
1250 EFI_STATUS Status;
1251
1252 if (Patcher == NULL) {
1253 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion));
1254 return EFI_NOT_FOUND;
1255 }
1256
1257 //
1258 // Override patch count to 2 on macOS 13.3+ (Darwin 22.4.0).
1259 //
1262 } else {
1264 }
1265
1266 Status = PatcherApplyGenericPatch (Patcher, &mIOAHCIPortPatch);
1267 if (EFI_ERROR (Status)) {
1268 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply patch com.apple.driver.AppleAHCIPort - %r\n", Status));
1269 } else {
1270 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success com.apple.driver.AppleAHCIPort\n"));
1271 }
1272
1273 return Status;
1274}
1275
1276STATIC
1277CONST UINT8
1279 0x44, 0x4D, 0x41, 0x52, 0x00
1280};
1281
1282STATIC
1283CONST UINT8
1285 0x52, 0x41, 0x4D, 0x44, 0x00
1286};
1287
1288STATIC
1291 .Comment = DEBUG_POINTER ("AppleIoMapper"),
1292 .Base = NULL,
1294 .Mask = NULL,
1295 .Replace = mAppleIoMapperPatchReplace,
1296 .ReplaceMask = NULL,
1297 .Size = sizeof (mAppleIoMapperPatchFind),
1298 .Count = 1,
1299 .Skip = 0
1300};
1301
1302STATIC
1303EFI_STATUS
1305 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
1306 IN UINT32 KernelVersion
1307 )
1308{
1309 EFI_STATUS Status;
1310
1312 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping AppleIoMapper patch on %u\n", KernelVersion));
1313 return EFI_SUCCESS;
1314 }
1315
1316 if (Patcher == NULL) {
1317 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion));
1318 return EFI_NOT_FOUND;
1319 }
1320
1321 Status = PatcherApplyGenericPatch (Patcher, &mAppleIoMapperPatch);
1322 if (EFI_ERROR (Status)) {
1323 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply patch com.apple.iokit.IOPCIFamily AppleIoMapper - %r\n", Status));
1324 } else {
1325 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success com.apple.iokit.IOPCIFamily AppleIoMapper\n"));
1326 }
1327
1328 return Status;
1329}
1330
1331STATIC
1332CONST UINT8
1336
1337STATIC
1340 .Comment = DEBUG_POINTER ("AppleIoMapperMapping"),
1341 .Base = "__ZN8AppleVTD14addMemoryRangeEyy",
1342 .Find = NULL,
1343 .Mask = NULL,
1345 .ReplaceMask = NULL,
1346 .Size = sizeof (mAppleIoMapperMappingPatchReplace),
1347 .Count = 1,
1348 .Skip = 0
1349};
1350
1351STATIC
1352EFI_STATUS
1354 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
1355 IN UINT32 KernelVersion
1356 )
1357{
1358 EFI_STATUS Status;
1359
1360 //
1361 // This patch is not required before macOS 13.3 (kernel 22.4.0)
1362 //
1364 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping AppleIoMapperMapping patch on %u\n", KernelVersion));
1365 return EFI_SUCCESS;
1366 }
1367
1368 if (Patcher == NULL) {
1369 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion));
1370 return EFI_NOT_FOUND;
1371 }
1372
1374 if (EFI_ERROR (Status)) {
1375 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply patch com.apple.iokit.IOPCIFamily AppleIoMapperMapping - %r\n", Status));
1376 } else {
1377 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success com.apple.iokit.IOPCIFamily AppleIoMapperMapping\n"));
1378 }
1379
1380 return Status;
1381}
1382
1383STATIC
1384CONST UINT8
1386 0xB8, 0x01, 0x00, 0x00, 0x00,
1387 0xC3
1388};
1389
1390STATIC
1393 .Comment = DEBUG_POINTER ("DummyCpuPm"),
1394 .Base = "__ZN28AppleIntelCPUPowerManagement5startEP9IOService",
1395 .Find = NULL,
1396 .Mask = NULL,
1398 .ReplaceMask = NULL,
1399 .Size = sizeof (mAppleDummyCpuPmPatchReplace),
1400 .Count = 1,
1401 .Skip = 0
1402};
1403
1404STATIC
1405EFI_STATUS
1407 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
1408 IN UINT32 KernelVersion
1409 )
1410{
1411 EFI_STATUS Status;
1412
1414 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping dummy AppleIntelCPUPowerManagement patch on %u\n", KernelVersion));
1415 return EFI_SUCCESS;
1416 }
1417
1418 if (Patcher == NULL) {
1419 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion));
1420 return EFI_NOT_FOUND;
1421 }
1422
1424 if (EFI_ERROR (Status)) {
1425 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply patch dummy AppleIntelCPUPowerManagement - %r\n", Status));
1426 } else {
1427 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success dummy AppleIntelCPUPowerManagement\n"));
1428 }
1429
1430 return Status;
1431}
1432
1433STATIC
1434CONST UINT8
1436 0x00, 0x00, 0x00, 0x40
1437};
1438
1439STATIC
1440CONST UINT8
1442 0x00, 0x00, 0x00, 0x80
1443};
1444
1445STATIC
1448 .Comment = DEBUG_POINTER ("IncreasePciBarSize"),
1449 .Base = "__ZN17IOPCIConfigurator24probeBaseAddressRegisterEP16IOPCIConfigEntryjj",
1451 .Mask = NULL,
1453 .ReplaceMask = NULL,
1454 .Size = sizeof (mIncreasePciBarSizePatchFind),
1455 .Count = 1,
1456 .Skip = 0,
1457 .Limit = 4096
1458};
1459
1460STATIC
1461CONST UINT8
1463 0x01, 0x00, 0x00, 0x40
1464};
1465
1466STATIC
1467CONST UINT8
1469 0x01, 0x00, 0x00, 0x80
1470};
1471
1472STATIC
1475 .Comment = DEBUG_POINTER ("IncreasePciBarSizeLegacy"),
1476 .Base = "__ZN17IOPCIConfigurator24probeBaseAddressRegisterEP16IOPCIConfigEntryjj",
1478 .Mask = NULL,
1480 .ReplaceMask = NULL,
1481 .Size = sizeof (mIncreasePciBarSizePatchLegacyFind),
1482 .Count = 1,
1483 .Skip = 0,
1484 .Limit = 4096
1485};
1486
1487STATIC
1488EFI_STATUS
1490 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
1491 IN UINT32 KernelVersion
1492 )
1493{
1494 EFI_STATUS Status;
1495
1497 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping com.apple.iokit.IOPCIFamily IncreasePciBarSize on %u\n", KernelVersion));
1498 return EFI_SUCCESS;
1499 }
1500
1501 if (Patcher == NULL) {
1502 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion));
1503 return EFI_NOT_FOUND;
1504 }
1505
1507 if (EFI_ERROR (Status)) {
1508 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply patch com.apple.iokit.IOPCIFamily IncreasePciBarSize - %r, trying legacy patch\n", Status));
1510 if (EFI_ERROR (Status)) {
1511 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply legacy patch com.apple.iokit.IOPCIFamily IncreasePciBarSize - %r\n", Status));
1512 } else {
1513 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success legacy com.apple.iokit.IOPCIFamily IncreasePciBarSize\n"));
1514 }
1515 } else {
1516 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success com.apple.iokit.IOPCIFamily IncreasePciBarSize\n"));
1517 }
1518
1519 return Status;
1520}
1521
1522STATIC
1523CONST UINT8
1525 0x66, 0xBA, 0xF8, 0x03
1526};
1527
1528STATIC
1529UINTN
1531
1532STATIC
1533UINT32
1535
1536STATIC
1537CONST UINTN
1539
1540VOID
1542 IN UINTN RegisterBase,
1543 IN UINT32 RegisterStride
1544 )
1545{
1546 //
1547 // FIXME: This is really ugly, make quirks take a context param.
1548 //
1549 if (RegisterBase <= MAX_UINT16) {
1550 DEBUG ((DEBUG_INFO, "OCAK: Registering PCI serial device PMIO port 0x%04X\n", RegisterBase));
1551 CopyMem (&mPmioRegisterBase, &RegisterBase, sizeof (RegisterBase));
1552
1553 DEBUG ((DEBUG_INFO, "OCAK: Registering PCI serial device register stride %u\n", RegisterStride));
1554 CopyMem (&mPmioRegisterStride, &RegisterStride, sizeof (RegisterStride));
1555 } else {
1556 DEBUG ((DEBUG_INFO, "OCAK: NOT registering unsupported PCI serial device register base 0x%X", RegisterBase));
1557 }
1558
1559 //
1560 // TODO: Add proper MMIO patch.
1561 //
1562}
1563
1564STATIC
1565EFI_STATUS
1567 IN OUT PATCHER_CONTEXT *Patcher
1568 )
1569{
1570 UINTN Count;
1571 UINT8 *Walker;
1572 UINT8 *WalkerPmio;
1573 UINTN Pmio;
1574 UINT8 *WalkerEnd;
1575 UINT8 *WalkerTmp;
1576
1577 //
1578 // This is a kernel patch, so Patcher cannot be NULL.
1579 //
1580 ASSERT (Patcher != NULL);
1581
1582 Count = 0;
1583 Walker = (UINT8 *)MachoGetMachHeader (&Patcher->MachContext);
1584 WalkerEnd = Walker + MachoGetInnerSize (&Patcher->MachContext) - mInOutMaxDistance;
1585
1586 while (Walker < WalkerEnd) {
1587 if ( (Walker[0] == mSerialDevicePmioFind[0])
1588 && (Walker[1] == mSerialDevicePmioFind[1])
1589 && ((Walker[2] & 0xF8U) == mSerialDevicePmioFind[2])
1590 && (Walker[3] == mSerialDevicePmioFind[3]))
1591 {
1592 DEBUG ((
1593 DEBUG_VERBOSE,
1594 "OCAK: Matched PMIO serial register base <%02X %02X %02X %02X>\n",
1595 Walker[0],
1596 Walker[1],
1597 Walker[2],
1598 Walker[3]
1599 ));
1600 WalkerPmio = &Walker[2];
1601
1602 WalkerTmp = Walker + mInOutMaxDistance;
1603 while (Walker < WalkerTmp) {
1604 //
1605 // Locate instruction in (0xEC) or out (0xEE).
1606 //
1607 if ((*Walker == 0xEC) || (*Walker == 0xEE)) {
1608 DEBUG ((
1609 DEBUG_VERBOSE,
1610 "OCAK: Matched PMIO serial register base context %a <%02X>, patching register base\n",
1611 *Walker == 0xEC ? "in" : "out",
1612 *Walker
1613 ));
1614
1615 //
1616 // Patch PMIO.
1617 //
1618 DEBUG ((DEBUG_VERBOSE, "OCAK: Before register base patch <%02X %02X>\n", WalkerPmio[0], WalkerPmio[1]));
1619 Pmio = mPmioRegisterBase + (*WalkerPmio & 7U) * mPmioRegisterStride;
1620 WalkerPmio[0] = Pmio & 0xFFU;
1621 WalkerPmio[1] = (Pmio >> 8U) & 0xFFU;
1622 DEBUG ((DEBUG_VERBOSE, "OCAK: After register base patch <%02X %02X>\n", WalkerPmio[0], WalkerPmio[1]));
1623
1624 ++Count;
1625 break;
1626 }
1627
1628 ++Walker;
1629 }
1630 }
1631
1632 //
1633 // Continue searching.
1634 //
1635 ++Walker;
1636 }
1637
1638 if (Count > 0) {
1639 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patched CustomPciSerialDevice PMIO port %u times\n", Count));
1640 return EFI_SUCCESS;
1641 }
1642
1643 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to patch CustomPciSerialDevice PMIO port!\n"));
1644 return EFI_NOT_FOUND;
1645}
1646
1647STATIC
1648EFI_STATUS
1650 IN OUT PATCHER_CONTEXT *Patcher,
1651 IN UINT32 KernelVersion
1652 )
1653{
1654 EFI_STATUS Status;
1655
1656 //
1657 // This is a kernel patch, so Patcher cannot be NULL.
1658 //
1659 ASSERT (Patcher != NULL);
1660
1661 Status = EFI_INVALID_PARAMETER;
1662 if ( ((mPmioRegisterBase != 0) && (mPmioRegisterStride != 0))
1663 && ((mPmioRegisterBase + 7U * mPmioRegisterStride) <= MAX_UINT16))
1664 {
1665 Status = PatchCustomPciSerialPmio (Patcher);
1666 }
1667
1668 //
1669 // TODO: Check MMIO patch again.
1670 //
1671
1672 if (EFI_ERROR (Status)) {
1673 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply patch CustomPciSerialDevice - %r\n"));
1674 } else {
1675 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success CustomPciSerialDevice\n"));
1676 }
1677
1678 return Status;
1679}
1680
1681STATIC
1682CONST UINT8
1684 0x45, 0x42, 0x39, 0x44, 0x32, 0x44, 0x33, 0x31
1685};
1686
1687STATIC
1688CONST UINT8
1690 0x45, 0x42, 0x39, 0x44, 0x32, 0x44, 0x33, 0x35
1691};
1692
1693STATIC
1696 .Comment = DEBUG_POINTER ("CustomSmbiosGuid"),
1697 .Base = NULL,
1699 .Mask = NULL,
1701 .ReplaceMask = NULL,
1702 .Size = sizeof (mCustomSmbiosGuidPatchFind),
1703 .Count = 1,
1704 .Skip = 0
1705};
1706
1707STATIC
1708EFI_STATUS
1710 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
1711 IN UINT32 KernelVersion
1712 )
1713{
1714 EFI_STATUS Status;
1715
1716 if (Patcher == NULL) {
1717 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion));
1718 return EFI_NOT_FOUND;
1719 }
1720
1722 if (!EFI_ERROR (Status)) {
1723 DEBUG ((DEBUG_INFO, "OCAK: [OK] SMBIOS Patch success\n"));
1724 } else {
1725 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply SMBIOS patch - %r\n", Status));
1726 }
1727
1728 return Status;
1729}
1730
1731STATIC
1732CONST UINT8
1734 0x00, 0x25, 0x2E, 0x2A, 0x73, 0x00
1735};
1736
1737STATIC
1738CONST UINT8
1740 0x00, 0x00, 0x2E, 0x2A, 0x73, 0x00
1741};
1742
1743STATIC
1746 .Comment = DEBUG_POINTER ("PanicKextDump"),
1747 .Base = NULL,
1749 .Mask = NULL,
1750 .Replace = mPanicKextDumpPatchReplace,
1751 .ReplaceMask = NULL,
1752 .Size = sizeof (mPanicKextDumpPatchFind),
1753 .Count = 1,
1754 .Skip = 0
1755};
1756
1757STATIC
1758EFI_STATUS
1760 IN OUT PATCHER_CONTEXT *Patcher,
1761 IN UINT32 KernelVersion
1762 )
1763{
1764 EFI_STATUS Status;
1765 UINT8 *Record;
1766 UINT8 *Last;
1767
1768 //
1769 // This is a kernel patch, so Patcher cannot be NULL.
1770 //
1771 ASSERT (Patcher != NULL);
1772
1774 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping PanicKextDump on %u\n", KernelVersion));
1775 return EFI_SUCCESS;
1776 }
1777
1778 Last = ((UINT8 *)MachoGetMachHeader (&Patcher->MachContext)
1779 + MachoGetInnerSize (&Patcher->MachContext) - EFI_PAGE_SIZE);
1780
1781 //
1782 // This should work on 10.15 and all debug kernels.
1783 //
1784 Status = PatcherGetSymbolAddress (
1785 Patcher,
1786 "__ZN6OSKext19printKextPanicListsEPFiPKczE",
1787 (UINT8 **)&Record
1788 );
1789 if (EFI_ERROR (Status) || (Record >= Last)) {
1790 DEBUG ((DEBUG_WARN, "OCAK: [FAIL] Failed to locate printKextPanicLists (%p) - %r\n", Record, Status));
1791 return EFI_NOT_FOUND;
1792 }
1793
1794 *Record = 0xC3;
1795
1796 //
1797 // This one is for 10.13~10.14 release kernels, which do dumping inline.
1798 // A bit risky, but let's hope it works well.
1799 //
1800 Status = PatcherApplyGenericPatch (Patcher, &mPanicKextDumpPatch);
1801 if (EFI_ERROR (Status)) {
1802 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply kext dump patch - %r\n", Status));
1803 } else {
1804 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success kext dump\n"));
1805 }
1806
1807 return Status;
1808}
1809
1810STATIC
1811CONST UINT8
1813 0x65, 0x8B, 0x04, 0x25, 0x00, 0x00, 0x00, 0x00,
1814 0x3B, 0x05, 0x00, 0x00, 0x00, 0x00
1815};
1816
1817STATIC
1818CONST UINT8
1820 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xFF,
1821 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00
1822};
1823
1824STATIC
1825CONST UINT8
1827 0x31, 0xC0,
1828 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90
1829};
1830
1831STATIC
1834 .Comment = DEBUG_POINTER ("LapicKernelPanic"),
1835 .Base = "_lapic_interrupt",
1839 .ReplaceMask = NULL,
1840 .Size = sizeof (mLapicKernelPanicPatchReplace),
1841 .Count = 1,
1842 .Skip = 0,
1843 .Limit = 1024
1844};
1845
1846STATIC
1847CONST UINT8
1849 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1850};
1851
1852STATIC
1853CONST UINT8
1855 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF
1856};
1857
1858STATIC
1859CONST UINT8
1861 0x31, 0xC0,
1862 0x90, 0x90, 0x90, 0x90, 0x90
1863};
1864
1865STATIC
1868 .Comment = DEBUG_POINTER ("LapicKernelPanicMaster"),
1869 .Base = "_lapic_interrupt",
1873 .ReplaceMask = NULL,
1874 .Size = sizeof (mLapicKernelPanicMasterPatchFind),
1875 .Count = 1,
1876 .Skip = 0,
1877 .Limit = 4096
1878};
1879
1880STATIC
1881EFI_STATUS
1883 IN OUT PATCHER_CONTEXT *Patcher,
1884 IN UINT32 KernelVersion
1885 )
1886{
1887 EFI_STATUS Status;
1888
1890 if (EFI_ERROR (Status)) {
1891 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply modern lapic patch - %r, trying legacy\n", Status));
1892 return Status;
1893 }
1894
1895 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success lapic\n"));
1896
1897 //
1898 // Patch away the master core check to never require lapic_dont_panic=1.
1899 //
1901 if (EFI_ERROR (Status)) {
1902 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply extended modern lapic patch - %r\n", Status));
1903 } else {
1904 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success extended modern lapic\n"));
1905 }
1906
1907 return Status;
1908}
1909
1910STATIC
1911CONST UINT8
1913 0x65, 0x8B, 0x04, 0x25, 0x14, 0x00, 0x00, 0x00,
1914 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1915 0x00, 0x00
1916};
1917
1918STATIC
1919CONST UINT8
1921 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0xFF, 0xFF, 0xFF,
1922 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1923 0x00, 0x00
1924};
1925
1926STATIC
1927CONST UINT8
1929 0x31, 0xC0,
1930 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90
1931};
1932
1933STATIC
1936 .Comment = DEBUG_POINTER ("LapicKernelPanicLegacy"),
1937 .Base = "_lapic_interrupt",
1941 .ReplaceMask = NULL,
1942 .Size = sizeof (mLapicKernelPanicPatchLegacyReplace),
1943 .Count = 1,
1944 .Skip = 0,
1945 .Limit = 1024
1946};
1947
1948STATIC
1949CONST UINT8
1951 0x48, 0x8D, 0x00, 0x00, 0x00, 0x00, 0x00,
1952 0x83, 0x00, 0x00,
1953 0x74, 0x00, 0x83, 0x00
1954};
1955
1956STATIC
1957CONST UINT8
1959 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
1960 0xFF, 0x00, 0x00,
1961 0xFF, 0x00, 0xFF, 0x00
1962};
1963
1964STATIC
1965CONST UINT8
1967 0x31, 0xC0,
1968 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
1969 0x00, 0x00, 0x00, 0x00
1970};
1971
1972STATIC
1973CONST UINT8
1975 0xFF, 0xFF,
1976 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1977 0x00, 0x00,0x00, 0x00
1978};
1979
1980STATIC
1983 .Comment = DEBUG_POINTER ("LapicKernelPanicMasterLegacy v1"),
1984 .Base = "_lapic_interrupt",
1990 .Count = 1,
1991 .Skip = 0,
1992 .Limit = 4096
1993};
1994
1995STATIC
1996CONST UINT8
1998 0x48, 0x8D, 0x05, 0x00, 0x00, 0x00, 0x00,
1999 0x44, 0x8B, 0x00,
2000 0x45, 0x85, 0xC0,
2001 0x74, 0x00, 0x8B
2002};
2003
2004STATIC
2005CONST UINT8
2007 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
2008 0xFF, 0xFF, 0xFF,
2009 0xFF, 0xFF, 0xFF,
2010 0xFF, 0x00, 0xFF
2011};
2012
2013STATIC
2014CONST UINT8
2016 0x31, 0xC0,
2017 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
2018 0x00, 0x00, 0x00
2019};
2020
2021STATIC
2022CONST UINT8
2024 0xFF, 0xFF,
2025 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
2026 0x00, 0x00,0x00
2027};
2028
2029STATIC
2032 .Comment = DEBUG_POINTER ("LapicKernelPanicMasterLegacy v2"),
2033 .Base = "_lapic_interrupt",
2039 .Count = 1,
2040 .Skip = 0,
2041 .Limit = 4096
2042};
2043
2044STATIC
2045EFI_STATUS
2047 IN OUT PATCHER_CONTEXT *Patcher,
2048 IN UINT32 KernelVersion
2049 )
2050{
2051 EFI_STATUS Status;
2052
2054 if (EFI_ERROR (Status)) {
2055 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply legacy lapic patch - %r\n", Status));
2056 return Status;
2057 }
2058
2059 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success legacy lapic\n"));
2060
2061 //
2062 // Patch away the master core check to never require lapic_dont_panic=1.
2063 //
2065 if (!EFI_ERROR (Status)) {
2066 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success extended legacy lapic v1\n"));
2067 return Status;
2068 }
2069
2070 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply extended legacy lapic patch v1 - %r, trying legacy v2\n", Status));
2072 if (!EFI_ERROR (Status)) {
2073 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success extended legacy lapic v2\n"));
2074 } else {
2075 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply extended legacy lapic patch v2 - %r\n", Status));
2076 }
2077
2078 return Status;
2079}
2080
2081STATIC
2082EFI_STATUS
2084 IN OUT PATCHER_CONTEXT *Patcher,
2085 IN UINT32 KernelVersion
2086 )
2087{
2088 EFI_STATUS Status;
2089
2090 //
2091 // This is a kernel patch, so Patcher cannot be NULL.
2092 //
2093 ASSERT (Patcher != NULL);
2094
2095 Status = PatchLapicKernel (Patcher, KernelVersion);
2096 if (!EFI_ERROR (Status)) {
2097 return Status;
2098 }
2099
2100 Status = PatchLapicKernelLegacy (Patcher, KernelVersion);
2101 return Status;
2102}
2103
2104STATIC
2105CONST UINT8
2107 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x70, 0x70, 0x6C, 0x65, 0x00
2108};
2109
2110STATIC
2111CONST UINT8
2113 // not.apple\0
2114 0x6E, 0x6F, 0x74, 0x2E, 0x61, 0x70, 0x70, 0x6C, 0x65, 0x00
2115};
2116
2117STATIC
2120 .Comment = DEBUG_POINTER ("PowerStateTimeout"),
2121 .Base = NULL,
2123 .Mask = NULL,
2125 .ReplaceMask = NULL,
2126 .Size = sizeof (mPowerStateTimeoutPanicFind),
2127 .Count = 1,
2128 .Skip = 0,
2129 .Limit = 0
2130};
2131
2132STATIC
2133CONST UINT8
2135 0x80, 0x00, 0x01, 0x6F,
2136 0x75, 0x00,
2137 0x80, 0x00, 0x02, 0x6D,
2138 0x75, 0x00,
2139};
2140
2141STATIC
2142CONST UINT8
2144 0xFF, 0x00, 0xFF, 0xFF,
2145 0xFF, 0x00,
2146 0xFF, 0x00, 0xFF, 0xFF,
2147 0xFF, 0x00,
2148};
2149
2150STATIC
2151CONST UINT8
2153 0x80, 0x00, 0x01, 0x6E,
2154 0x75, 0x00,
2155 0x80, 0x00, 0x02, 0x6D,
2156 0x75, 0x00,
2157};
2158
2159STATIC
2162 .Comment = DEBUG_POINTER ("PowerStateTimeout"),
2163 .Base = "__ZN9IOService12ackTimerTickEv",
2167 .ReplaceMask = mPowerStateTimeoutPanicInlineMask,
2168 .Size = sizeof (mPowerStateTimeoutPanicInlineFind),
2169 .Count = 1,
2170 .Skip = 0,
2171 .Limit = 4096
2172};
2173
2174STATIC
2175EFI_STATUS
2177 IN OUT PATCHER_CONTEXT *Patcher,
2178 IN UINT32 KernelVersion
2179 )
2180{
2181 EFI_STATUS Status;
2182
2183 //
2184 // This is a kernel patch, so Patcher cannot be NULL.
2185 //
2186 ASSERT (Patcher != NULL);
2187
2189 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping power state patch on %u\n", KernelVersion));
2190 return EFI_SUCCESS;
2191 }
2192
2194 if (!EFI_ERROR (Status)) {
2195 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success inline power state\n"));
2196 return Status;
2197 }
2198
2199 DEBUG ((DEBUG_INFO, "OCAK: No inline power state patch - %r, trying fallback\n", Status));
2200
2202 if (EFI_ERROR (Status)) {
2203 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply power state patch - %r\n", Status));
2204 } else {
2205 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success power state\n"));
2206 }
2207
2208 //
2209 // TODO: Implement a patch to not require setpowerstate_panic=0 on debug kernels.
2210 //
2211
2212 return Status;
2213}
2214
2215//
2216// There currently are 2 places main RTC checksum is calculated in AppleRTC.kext
2217// __ZN8AppleRTC14updateChecksumEv and __ZN8AppleRTC19rtcRecordTracePointEjjj.
2218// Since we do not want to completely break RTC and/or saving tracepoints to RTC
2219// we patch-out __ZN8AppleRTC8rtcWriteEjh call arguments (0x58 and 0x59) with
2220// invalid (out of range) value 0xFFFF in 4 places.
2221//
2222// 10.5 and below do not have __ZN8AppleRTC19rtcRecordTracePointEjjj.
2223//
2224
2225STATIC
2226CONST UINT8
2228 0xC7, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00
2229};
2230
2231STATIC
2232CONST UINT8
2234 0xFF, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF
2235};
2236
2237STATIC
2238CONST UINT8
2240 0xC7, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00
2241};
2242
2243STATIC
2244CONST UINT8
2246 0xBE, 0x58, 0x00, 0x00, 0x00
2247};
2248
2249STATIC
2250CONST UINT8
2252 0xFF, 0xFE, 0xFF, 0xFF, 0xFF
2253};
2254
2255STATIC
2256CONST UINT8
2258 0xBE, 0xFF, 0xFF, 0x00, 0x00
2259};
2260
2261STATIC
2264 .Comment = DEBUG_POINTER ("DisableRtcChecksum32"),
2265 .Base = NULL,
2269 .ReplaceMask = mAppleRtcChecksumPatchMask32,
2270 .Size = sizeof (mAppleRtcChecksumPatchFind32),
2271 .Count = 4,
2272 .Skip = 0,
2273 .Limit = 0
2274};
2275
2276STATIC
2279 .Comment = DEBUG_POINTER ("DisableRtcChecksum64"),
2280 .Base = NULL,
2284 .ReplaceMask = NULL,
2285 .Size = sizeof (mAppleRtcChecksumPatchFind64),
2286 .Count = 4,
2287 .Skip = 0,
2288 .Limit = 0
2289};
2290
2291STATIC
2292EFI_STATUS
2294 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
2295 IN UINT32 KernelVersion
2296 )
2297{
2298 EFI_STATUS Status;
2299
2300 if (Patcher == NULL) {
2301 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion));
2302 return EFI_NOT_FOUND;
2303 }
2304
2305 Status = PatcherApplyGenericPatch (Patcher, Patcher->Is32Bit ? &mAppleRtcChecksumPatch32 : &mAppleRtcChecksumPatch64);
2306 if (EFI_ERROR (Status)) {
2307 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply patch com.apple.driver.AppleRTC DisableRtcChecksum - %r\n", Status));
2308 } else {
2309 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success com.apple.driver.AppleRTC DisableRtcChecksum\n"));
2310 }
2311
2312 return Status;
2313}
2314
2315STATIC
2316EFI_STATUS
2318 IN OUT PATCHER_CONTEXT *Patcher,
2319 IN UINT32 KernelVersion
2320 )
2321{
2322 EFI_STATUS Status;
2323 UINT8 *RemoveBs;
2324 UINT8 *StaticMfree;
2325 UINT8 *CurrFreeCall;
2326 CHAR8 *Jettisoning;
2327 UINT8 *Last;
2328 UINTN Index;
2329 UINT32 Diff;
2330 UINT32 Diff2;
2331
2332 //
2333 // This is a kernel patch, so Patcher cannot be NULL.
2334 //
2335 ASSERT (Patcher != NULL);
2336
2338 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping SegmentJettison on %u\n", KernelVersion));
2339 return EFI_SUCCESS;
2340 }
2341
2342 Last = (UINT8 *)MachoGetMachHeader (&Patcher->MachContext)
2343 + MachoGetInnerSize (&Patcher->MachContext) - sizeof (EFI_PAGE_SIZE) * 2;
2344
2345 Status = PatcherGetSymbolAddress (Patcher, "__ZN6OSKext19removeKextBootstrapEv", (UINT8 **)&RemoveBs);
2346 if (EFI_ERROR (Status) || (RemoveBs > Last)) {
2347 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Missing removeKextBootstrap - %r\n", Status));
2348 return EFI_NOT_FOUND;
2349 }
2350
2351 Status = PatcherGetSymbolAddress (Patcher, "_ml_static_mfree", (UINT8 **)&StaticMfree);
2352 if (EFI_ERROR (Status) || (StaticMfree > Last)) {
2353 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Missing ml_static_mfree - %r\n", Status));
2354 return EFI_NOT_FOUND;
2355 }
2356
2357 if (RemoveBs - StaticMfree > MAX_INT32) {
2358 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] ml_static_mfree %p removeKextBootstrap %p are too far\n", StaticMfree, RemoveBs));
2359 return EFI_UNSUPPORTED;
2360 }
2361
2362 //
2363 // Find the call to _ml_static_mfree.
2364 //
2365 // NOTE: One call instruction takes 5 bytes.
2366 //
2367 Diff = (UINT32)((UINTN)StaticMfree - (UINTN)RemoveBs - 5);
2368
2369 CurrFreeCall = NULL;
2370 for (Index = 0; Index < EFI_PAGE_SIZE; ++Index) {
2371 if ( (RemoveBs[0] == 0xE8)
2372 && (CompareMem (&RemoveBs[1], &Diff, sizeof (Diff)) == 0))
2373 {
2374 CurrFreeCall = RemoveBs;
2375 DEBUG ((
2376 DEBUG_VERBOSE,
2377 "OCAK: CurrFreeCall %02X %02X %02X %02X %02X %X\n",
2378 RemoveBs[0],
2379 RemoveBs[1],
2380 RemoveBs[2],
2381 RemoveBs[3],
2382 RemoveBs[4],
2383 Diff
2384 ));
2385 } else if ( (CurrFreeCall != NULL)
2386 && (RemoveBs[0] == 0x48) && (RemoveBs[1] == 0x8D) && (RemoveBs[2] == 0x15))
2387 {
2388 //
2389 // Check if this lea rdx, address is pointing to "Jettisoning fileset Linkedit segments from..."
2390 //
2391 CopyMem (&Diff2, &RemoveBs[3], sizeof (Diff2));
2392 Jettisoning = (CHAR8 *)RemoveBs + Diff2 + 7;
2393 if ( ((UINT8 *)Jettisoning <= Last)
2394 && (AsciiStrnCmp (Jettisoning, "Jettisoning fileset", L_STR_LEN ("Jettisoning fileset")) == 0))
2395 {
2396 DEBUG ((DEBUG_INFO, "OCAK: [OK] Found jettisoning fileset\n"));
2397 SetMem (CurrFreeCall, 5, 0x90);
2398 return EFI_SUCCESS;
2399 }
2400 }
2401
2402 ++RemoveBs;
2403 --Diff;
2404 }
2405
2406 DEBUG ((DEBUG_INFO, "OCAK: Failed to find jettisoning fileset - %p\n", CurrFreeCall));
2407
2408 return EFI_NOT_FOUND;
2409}
2410
2411STATIC
2412CONST UINT8
2414 0x55,
2415 0x83, 0xCE, 0x0F
2416};
2417
2418STATIC
2421 .Comment = DEBUG_POINTER ("BTFeatureFlagsV1"),
2422 .Base = "__ZN25IOBluetoothHostController25SetControllerFeatureFlagsEj",
2423 .Find = NULL,
2424 .Mask = NULL,
2425 .Replace = mBTFeatureFlagsReplace,
2426 .ReplaceMask = NULL,
2427 .Size = sizeof (mBTFeatureFlagsReplace),
2428 .Count = 1,
2429 .Skip = 0
2430};
2431
2432STATIC
2435 .Comment = DEBUG_POINTER ("BTFeatureFlagsV2"),
2436 .Base = "__ZN24IOBluetoothHCIController25SetControllerFeatureFlagsEj",
2437 .Find = NULL,
2438 .Mask = NULL,
2439 .Replace = mBTFeatureFlagsReplace,
2440 .ReplaceMask = NULL,
2441 .Size = sizeof (mBTFeatureFlagsReplace),
2442 .Count = 1,
2443 .Skip = 0
2444};
2445
2446STATIC
2449 .Comment = DEBUG_POINTER ("BTFeatureFlagsV3"),
2450 .Base = "__ZN17IOBluetoothDevice25setDeviceSupportedFeatureEj",
2451 .Find = NULL,
2452 .Mask = NULL,
2453 .Replace = mBTFeatureFlagsReplace,
2454 .ReplaceMask = NULL,
2455 .Size = sizeof (mBTFeatureFlagsReplace),
2456 .Count = 1,
2457 .Skip = 0
2458};
2459
2460STATIC
2461EFI_STATUS
2463 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
2464 IN UINT32 KernelVersion
2465 )
2466{
2467 EFI_STATUS Status;
2468
2470 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping BTFeatureFlags on %u\n", KernelVersion));
2471 return EFI_SUCCESS;
2472 }
2473
2474 if (Patcher == NULL) {
2475 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion));
2476 return EFI_NOT_FOUND;
2477 }
2478
2480 if (EFI_ERROR (Status)) {
2481 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to find BT FeatureFlags symbol v1 - %r, trying v2\n", Status));
2483 if (EFI_ERROR (Status)) {
2484 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to find BT FeatureFlags symbol v2 - %r, trying v3\n", Status));
2486 if (EFI_ERROR (Status)) {
2487 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to find BT FeatureFlags symbol v3 - %r\n", Status));
2488 } else {
2489 DEBUG ((DEBUG_INFO, "OCAK: [OK] Success BT FeatureFlags patch v3\n"));
2490 }
2491 } else {
2492 DEBUG ((DEBUG_INFO, "OCAK: [OK] Success BT FeatureFlags patch v2\n"));
2493 }
2494 } else {
2495 DEBUG ((DEBUG_INFO, "OCAK: [OK] Success BT FeatureFlags patch v1\n"));
2496 }
2497
2498 return Status;
2499}
2500
2501//
2502// 32-bit commpage_descriptor structure from XNU.
2503//
2504typedef struct {
2505 //
2506 // Address of code.
2507 //
2509 //
2510 // Length of code in bytes.
2511 //
2513 //
2514 // Address to place this function at.
2515 //
2517 //
2518 // CPU capability bits we must have.
2519 //
2520 UINT32 MustHave;
2521 //
2522 // CPU capability bits we can't have.
2523 //
2524 UINT32 CantHave;
2526
2527//
2528// 64-bit commpage_descriptor structure from XNU.
2529//
2530typedef struct {
2531 //
2532 // Address of code.
2533 //
2535 //
2536 // Length of code in bytes.
2537 //
2539 //
2540 // Address to place this function at.
2541 //
2543 //
2544 // CPU capability bits we must have.
2545 //
2546 UINT32 MustHave;
2547 //
2548 // CPU capability bits we can't have.
2549 //
2550 UINT32 CantHave;
2552
2557
2558#define COMM_PAGE_BCOPY 0xFFFF0780
2559#define kHasSupplementalSSE3 0x00000100
2560
2561STATIC
2562CONST UINT8
2564 #include "LegacyBcopy.h"
2565};
2566
2567STATIC
2568EFI_STATUS
2570 IN OUT PATCHER_CONTEXT *Patcher,
2571 IN UINT32 KernelVersion
2572 )
2573{
2574 EFI_STATUS Status;
2575 UINT8 *Start;
2576 UINT8 *Last;
2577 UINT8 *CommpageRoutines;
2578 UINT8 *Target;
2579 UINT64 Address;
2580 UINT32 MaxSize;
2581
2582 COMMPAGE_DESCRIPTOR_ANY *Commpage;
2583 UINT32 CommpageCodeLength;
2584 UINT32 CommpageAddress;
2585 UINT32 CommpageMustHave;
2586
2587 //
2588 // This is a kernel patch, so Patcher cannot be NULL.
2589 //
2590 ASSERT (Patcher != NULL);
2591
2592 Start = ((UINT8 *)MachoGetMachHeader (&Patcher->MachContext));
2593 Last = Start + MachoGetInnerSize (&Patcher->MachContext) - EFI_PAGE_SIZE * 2 - (Patcher->Is32Bit ? sizeof (COMMPAGE_DESCRIPTOR) : sizeof (COMMPAGE_DESCRIPTOR_64));
2594
2595 //
2596 // This is a table of pointers to commpage entries.
2597 //
2598 Status = PatcherGetSymbolAddress (Patcher, "_commpage_64_routines", (UINT8 **)&CommpageRoutines);
2599 if (EFI_ERROR (Status) || (CommpageRoutines >= Last)) {
2600 DEBUG ((DEBUG_WARN, "OCAK: [FAIL] Failed to locate _commpage_64_routines (%p) - %r\n", CommpageRoutines, Status));
2601 return EFI_NOT_FOUND;
2602 }
2603
2604 //
2605 // Iterate through table looking for bcopy_sse4_64 (on 10.4) or bcopy_sse3x_64 (10.5+) entry.
2606 //
2607 Address = Patcher->Is32Bit ? *((UINT32 *)CommpageRoutines) : *((UINT64 *)CommpageRoutines);
2608 while (Address > 0) {
2609 Commpage = MachoGetFilePointerByAddress (&Patcher->MachContext, Address, &MaxSize);
2610 if ( (Commpage == NULL)
2611 || (MaxSize < (Patcher->Is32Bit ? sizeof (COMMPAGE_DESCRIPTOR) : sizeof (COMMPAGE_DESCRIPTOR_64))))
2612 {
2613 break;
2614 }
2615
2616 //
2617 // Locate the bcopy commpage entry that requires SSSE3 and replace it with our own implementation.
2618 //
2619 CommpageAddress = Patcher->Is32Bit ? Commpage->Desc32.CommpageAddress : Commpage->Desc64.CommpageAddress;
2620 CommpageMustHave = Patcher->Is32Bit ? Commpage->Desc32.MustHave : Commpage->Desc64.MustHave;
2621 if ( (CommpageAddress == COMM_PAGE_BCOPY)
2622 && ((CommpageMustHave & kHasSupplementalSSE3) == kHasSupplementalSSE3))
2623 {
2624 Address = Patcher->Is32Bit ? Commpage->Desc32.CodeAddress : Commpage->Desc64.CodeAddress;
2625 CommpageCodeLength = Patcher->Is32Bit ? Commpage->Desc32.CodeLength : Commpage->Desc64.CodeLength;
2626 DEBUG ((
2627 DEBUG_VERBOSE,
2628 "OCAK: Found 64-bit _COMM_PAGE_BCOPY function @ 0x%llx (0x%X bytes)\n",
2629 Address,
2630 CommpageCodeLength
2631 ));
2632
2633 Target = MachoGetFilePointerByAddress (&Patcher->MachContext, Address, &MaxSize);
2634 if ( (Target == NULL)
2635 || (MaxSize < sizeof (mAsmLegacyBcopy64))
2636 || (CommpageCodeLength < sizeof (mAsmLegacyBcopy64)))
2637 {
2638 break;
2639 }
2640
2641 CopyMem (Target, mAsmLegacyBcopy64, sizeof (mAsmLegacyBcopy64));
2642 if (Patcher->Is32Bit) {
2643 Commpage->Desc32.CodeLength = sizeof (mAsmLegacyBcopy64);
2644 Commpage->Desc32.MustHave &= ~kHasSupplementalSSE3;
2645 } else {
2646 Commpage->Desc64.CodeLength = sizeof (mAsmLegacyBcopy64);
2647 Commpage->Desc64.MustHave &= ~kHasSupplementalSSE3;
2648 }
2649
2650 return EFI_SUCCESS;
2651 }
2652
2653 CommpageRoutines += Patcher->Is32Bit ? sizeof (UINT32) : sizeof (UINT64);
2654 if (CommpageRoutines >= Last) {
2655 break;
2656 }
2657
2658 Address = Patcher->Is32Bit ? *((UINT32 *)CommpageRoutines) : *((UINT64 *)CommpageRoutines);
2659 }
2660
2661 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to find 64-bit _COMM_PAGE_BCOPY function\n"));
2662
2663 return EFI_NOT_FOUND;
2664}
2665
2666STATIC
2667CONST UINT8
2669 0x31, 0xC0,
2670 0xE8, 0x00, 0x00, 0x00, 0x00,
2671 0x83, 0x7D, 0x00, 0x00,
2672 0x0F, 0x84, 0x00, 0x00, 0x00, 0x00
2673};
2674
2675STATIC
2676CONST UINT8
2678 0xFF, 0xFF,
2679 0xFF, 0x00,0x00, 0x00, 0x00,
2680 0xFF, 0xFF,0x00, 0x00,
2681 0xFF, 0xFF,0x00, 0x00, 0x00, 0x00
2682};
2683
2684STATIC
2685CONST UINT8
2687 0x00, 0x00,
2688 0x00, 0x00,0x00, 0x00, 0x00,
2689 0x00, 0x00,0x00, 0x00,
2690 0x90, 0x90,0x90, 0x90, 0x90, 0x90,
2691};
2692
2693STATIC
2694CONST UINT8
2696 0x00, 0x00,
2697 0x00, 0x00,0x00, 0x00, 0x00,
2698 0x00, 0x00,0x00, 0x00,
2699 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF
2700};
2701
2702STATIC
2705 .Comment = DEBUG_POINTER ("ForceAquantiaEthernetShikumo"),
2706 .Base = "__ZN27AppleEthernetAquantiaAqtion5startEP9IOService",
2711 .Size = sizeof (mAquantiaEthernetPatchFindShikumo),
2712 .Count = 1,
2713 .Skip = 0
2714};
2715
2716STATIC
2717CONST UINT8
2719 0x41, 0xC7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2720 0xE9
2721};
2722
2723STATIC
2724CONST UINT8
2726 0x41, 0xC7, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
2727 0xE9
2728};
2729
2730STATIC
2731CONST UINT8
2733 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
2734 0xFF
2735};
2736
2737STATIC
2740 .Comment = DEBUG_POINTER ("ForceAquantiaEthernetMieze"),
2741 .Base = NULL,
2745 .ReplaceMask = mAquantiaEthernetPatchMaskMieze,
2746 .Size = sizeof (mAquantiaEthernetPatchFindMieze),
2747 .Count = 1,
2748 .Skip = 0
2749};
2750
2751STATIC
2752EFI_STATUS
2754 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
2755 IN UINT32 KernelVersion
2756 )
2757{
2758 EFI_STATUS Status;
2759
2760 //
2761 // This patch is not required before macOS 10.15.4.
2762 //
2764 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping patching AquantiaEthernet on %u\n", KernelVersion));
2765 return EFI_SUCCESS;
2766 }
2767
2768 if (Patcher == NULL) {
2769 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion));
2770 return EFI_NOT_FOUND;
2771 }
2772
2773 //
2774 // Shikumo's patch can be applied to a wider range, not limited to AQC 107 series,
2775 // thus preferred.
2776 //
2778 if (!EFI_ERROR (Status)) {
2779 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success Aquantia Ethernet Shikumo\n"));
2780 return Status;
2781 }
2782
2783 //
2784 // In case Shikumo's patch failed, try Mieze's so at least AQC 107 will work.
2785 //
2786 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply Aquantia Ethernet patch Shikumo - %r, trying Mieze\n", Status));
2788 if (EFI_ERROR (Status)) {
2789 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply Aquantia Ethernet patch Mieze - %r\n", Status));
2790 } else {
2791 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success Aquantia Ethernet Mieze\n"));
2792 }
2793
2794 return Status;
2795}
2796
2797STATIC
2798EFI_STATUS
2800 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
2801 IN UINT32 KernelVersion
2802 )
2803{
2804 EFI_STATUS Status;
2805 UINT8 *Last;
2806 UINT8 *SelectAp;
2807 UINT8 *HybridAp;
2808 UINT32 Diff;
2809
2811 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping sb scheme on %u\n", KernelVersion));
2812 return EFI_SUCCESS;
2813 }
2814
2815 if (Patcher == NULL) {
2816 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion));
2817 return EFI_NOT_FOUND;
2818 }
2819
2820 //
2821 // This code is for debugging APFS snapshot verification for Big Sur.
2822 // macOS chooses verification scheme based on the hardware:
2823 // - __img4_chip_x86_software_8012 (software x86 8012)
2824 // for CPUs with VMM flag enabled via cpuid_features.
2825 // - __img4_chip_x86 (x86)
2826 // for platforms with no or v1 (0x10000) coprocessor (apple-coprocessor-version).
2827 // - __img4_chip_ap_hybrid_medium (medium-security hybrid arm/x86 ap)
2828 // for platforms with v2 (0x20000) coprocessor and medium (1) policy (AppleSecureBootPolicy).
2829 // - __img4_chip_ap_hybrid_relaxed (relaxed hybrid arm/x86 ap)
2830 // for platforms with v2 coprocessor and relaxed (0) policy.
2831 // - __img4_chip_ap_hybrid (hybrid arm/x86 ap)
2832 // for platfirms with v2 or newer coprocessor and personalised policy (2).
2833 //
2834
2835 Last = ((UINT8 *)MachoGetMachHeader (&Patcher->MachContext)
2836 + MachoGetInnerSize (&Patcher->MachContext) - 64);
2837
2838 Status = PatcherGetSymbolAddress (Patcher, "_img4_chip_select_effective_ap", &SelectAp);
2839 if (EFI_ERROR (Status) || (SelectAp > Last)) {
2840 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Missing _img4_chip_select_effective_ap - %r\n", Status));
2841 return EFI_NOT_FOUND;
2842 }
2843
2844 Status = PatcherGetSymbolAddress (Patcher, "__img4_chip_x86", &HybridAp);
2845 if (EFI_ERROR (Status) || (HybridAp > Last)) {
2846 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Missing __img4_chip_x86 - %r\n", Status));
2847 return EFI_NOT_FOUND;
2848 }
2849
2850 DEBUG ((DEBUG_INFO, "OCAK: Forcing sb scheme on %u\n", KernelVersion));
2851
2852 SelectAp[0] = 0x48;
2853 SelectAp[1] = 0x8D;
2854 SelectAp[2] = 0x05;
2855 Diff = (UINT32)(HybridAp - SelectAp - 7);
2856 CopyMem (&SelectAp[3], &Diff, sizeof (Diff));
2857 SelectAp[7] = 0xC3;
2858 return EFI_SUCCESS;
2859}
2860
2861STATIC
2862UINT8
2864 0x48, 0x3D, 0x7F, 0x96, 0x98, 0x00
2865};
2866STATIC_ASSERT (sizeof (mApfsTimeoutFind) == 6, "Unsupported mApfsTimeoutFind");
2867
2868STATIC
2869UINT8
2871 0x48, 0x3D, 0x00, 0x00, 0x00, 0x00
2872};
2873STATIC_ASSERT (sizeof (mApfsTimeoutReplace) == 6, "Unsupported mApfsTimeoutReplace");
2874
2875STATIC
2878 .Comment = DEBUG_POINTER ("ApfsTimeout"),
2879 .Base = "_nx_mount_trim_thread",
2880 .Find = mApfsTimeoutFind,
2881 .Mask = NULL,
2882 .Replace = mApfsTimeoutReplace,
2883 .ReplaceMask = NULL,
2884 .Size = sizeof (mApfsTimeoutFind),
2885 .Count = 1,
2886 .Skip = 0,
2887 .Limit = 0
2888};
2889
2890VOID
2892 IN UINT32 Timeout
2893 )
2894{
2895 //
2896 // FIXME: This is really ugly, make quirks take a context param.
2897 //
2898 DEBUG ((DEBUG_INFO, "OCAK: Registering %u APFS timeout\n", Timeout));
2899 CopyMem (&mApfsTimeoutReplace[2], &Timeout, sizeof (Timeout));
2900}
2901
2902STATIC
2903UINT8
2905 0x31, 0xC0,
2906 0xC3
2907};
2908
2909STATIC
2912 .Comment = DEBUG_POINTER ("ApfsTimeout disable trim"),
2913 .Base = "_spaceman_iterate_free_extents_internal",
2914 .Find = NULL,
2915 .Mask = NULL,
2916 .Replace = mApfsDisableTrimReplace,
2917 .ReplaceMask = NULL,
2918 .Size = sizeof (mApfsDisableTrimReplace),
2919 .Count = 1,
2920 .Skip = 0,
2921 .Limit = 0
2922};
2923
2924STATIC
2925EFI_STATUS
2927 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
2928 IN UINT32 KernelVersion
2929 )
2930{
2931 EFI_STATUS Status;
2932
2934 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping apfs timeout on %u\n", KernelVersion));
2935 return EFI_SUCCESS;
2936 }
2937
2938 if (Patcher == NULL) {
2939 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion));
2940 return EFI_NOT_FOUND;
2941 }
2942
2943 //
2944 // Disable trim using another patch when timeout is 0.
2945 //
2946 if (IsZeroBuffer (&mApfsTimeoutReplace[2], sizeof (UINT32))) {
2948 if (EFI_ERROR (Status)) {
2949 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply patch ApfsDisableTrim - %r\n", Status));
2950 } else {
2951 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success ApfsDisableTrim\n"));
2952 }
2953
2954 return Status;
2955 }
2956
2957 //
2958 // It is only possible to specify trim timeout value from 10.14 to 11.x.
2959 // Starting at 12.0 this is no longer possible.
2960 //
2962 Status = PatcherApplyGenericPatch (Patcher, &mApfsTimeoutPatch);
2963 if (EFI_ERROR (Status)) {
2964 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply patch SetApfsTrimTimeout - %r\n", Status));
2965 } else {
2966 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success SetApfsTrimTimeout\n"));
2967 }
2968
2969 return Status;
2970 }
2971
2972 DEBUG ((DEBUG_INFO, "OCAK: Skipping SetApfsTrimTimeout on macOS 12.0+\n"));
2973 return EFI_SUCCESS;
2974}
2975
2976//
2977// Quirks table.
2978//
2980 [KernelQuirkAppleCpuPmCfgLock] = { "com.apple.driver.AppleIntelCPUPowerManagement", PatchAppleCpuPmCfgLock },
2985 [KernelQuirkCustomSmbiosGuid1] = { "com.apple.driver.AppleSMBIOS", PatchCustomSmbiosGuid },
2986 [KernelQuirkCustomSmbiosGuid2] = { "com.apple.driver.AppleACPIPlatform", PatchCustomSmbiosGuid },
2987 [KernelQuirkDisableIoMapper] = { "com.apple.iokit.IOPCIFamily", PatchAppleIoMapperSupport },
2988 [KernelQuirkDisableIoMapperMapping] = { "com.apple.iokit.IOPCIFamily", PatchAppleIoMapperMapping },
2989 [KernelQuirkDisableRtcChecksum] = { "com.apple.driver.AppleRTC", PatchAppleRtcChecksum },
2990 [KernelQuirkDummyPowerManagement] = { "com.apple.driver.AppleIntelCPUPowerManagement", PatchDummyPowerManagement },
2991 [KernelQuirkExtendBTFeatureFlags] = { "com.apple.iokit.IOBluetoothFamily", PatchBTFeatureFlags },
2992 [KernelQuirkExternalDiskIcons] = { "com.apple.driver.AppleAHCIPort", PatchForceInternalDiskIcons },
2993 [KernelQuirkForceAquantiaEthernet] = { "com.apple.driver.AppleEthernetAquantiaAqtion", PatchAquantiaEthernet },
2994 [KernelQuirkForceSecureBootScheme] = { "com.apple.security.AppleImage4", PatchForceSecureBootScheme },
2995 [KernelQuirkIncreasePciBarSize] = { "com.apple.iokit.IOPCIFamily", PatchIncreasePciBarSize },
3001 [KernelQuirkSetApfsTrimTimeout] = { "com.apple.filesystems.apfs", PatchSetApfsTrimTimeout },
3002 [KernelQuirkThirdPartyDrives] = { "com.apple.iokit.IOAHCIBlockStorage", PatchThirdPartyDriveSupport },
3003 [KernelQuirkXhciPortLimit1] = { "com.apple.iokit.IOUSBHostFamily", PatchUsbXhciPortLimit1 },
3004 [KernelQuirkXhciPortLimit2] = { "com.apple.driver.usb.AppleUSBXHCI", PatchUsbXhciPortLimit2 },
3005 [KernelQuirkXhciPortLimit3] = { "com.apple.driver.usb.AppleUSBXHCIPCI", PatchUsbXhciPortLimit3 },
3006};
3007
3008EFI_STATUS
3010 IN KERNEL_QUIRK_NAME Name,
3011 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
3012 IN UINT32 KernelVersion
3013 )
3014{
3015 //
3016 // Patcher cannot be NULL for kernel patches, whose Identifier are NULL.
3017 //
3018 if (gKernelQuirks[Name].Identifier == NULL) {
3019 ASSERT (Patcher != NULL);
3020 }
3021
3022 return gKernelQuirks[Name].PatchFunction (Patcher, KernelVersion);
3023}
UINT64 Start
STATIC CONST UINT8 mIOAHCIBlockStoragePatch144FindMask[]
STATIC EFI_STATUS PatchBTFeatureFlags(IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion)
STATIC PATCHER_GENERIC_PATCH mIOAHCIBlockStoragePatchV2
STATIC UINTN mPmioRegisterBase
To be set by PatchSetPciSerialDevice()
STATIC CONST UINT8 mAquantiaEthernetPatchFindMaskShikumo[]
struct XCPM_MSR_RECORD_ XCPM_MSR_RECORD
STATIC EFI_STATUS PatchAppleRtcChecksum(IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion)
STATIC EFI_STATUS PatchSegmentJettison(IN OUT PATCHER_CONTEXT *Patcher, IN UINT32 KernelVersion)
STATIC CONST UINT8 mMovCxE2[]
STATIC CONST UINT8 mIncreasePciBarSizePatchLegacyReplace[]
STATIC PATCHER_GENERIC_PATCH mAquantiaEthernetPatchShikumo
STATIC CONST UINT8 mBTFeatureFlagsReplace[]
STATIC PATCHER_GENERIC_PATCH mIOAHCIBlockStoragePatchV1
STATIC CONST UINT8 mLapicKernelPanicMasterPatchLegacyFind1[]
STATIC CONST UINT8 mPowerStateTimeoutPanicFind[]
STATIC CONST UINT8 mAppleRtcChecksumPatchMask32[]
STATIC EFI_STATUS PatchAppleXcpmCfgLock(IN OUT PATCHER_CONTEXT *Patcher, IN UINT32 KernelVersion)
STATIC PATCHER_GENERIC_PATCH mBTFeatureFlagsPatchV2
STATIC PATCHER_GENERIC_PATCH mPowerStateTimeoutPanicInlinePatch
STATIC CONST UINT8 mLapicKernelPanicMasterPatchLegacyReplaceMask2[]
STATIC PATCHER_GENERIC_PATCH mIOAHCIBlockStoragePatch133Part1
STATIC CONST UINT8 mLapicKernelPanicMasterPatchLegacyReplaceMask1[]
VOID PatchSetApfsTimeout(IN UINT32 Timeout)
STATIC CONST UINT8 mRemoveUsbLimitIoP1Mask2[]
STATIC CONST UINT8 mLapicKernelPanicMasterPatchFind[]
STATIC CONST UINT8 mAppleIoMapperPatchFind[]
STATIC PATCHER_GENERIC_PATCH mLapicKernelPanicMasterLegacyPatch2
#define COMM_PAGE_BCOPY
STATIC CONST UINT8 mMiscPwrMgmtDbgFind[]
STATIC EFI_STATUS PatchUsbXhciPortLimit3(IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion)
STATIC CONST UINT8 mRemoveUsbLimitIoP1Replace2[]
STATIC PATCHER_GENERIC_PATCH mLapicKernelPanicMasterLegacyPatch1
STATIC PATCHER_GENERIC_PATCH mApfsDisableTrimPatch
STATIC CONST UINT8 mAppleRtcChecksumPatchReplace32[]
STATIC PATCHER_GENERIC_PATCH mAppleIoMapperPatch
STATIC CONST UINT8 mPerfCtrlFind1[]
STATIC CONST UINT8 mIOAHCIBlockStoragePatch133Find2[]
STATIC CONST UINT8 mIncreasePciBarSizePatchReplace[]
STATIC CONST UINT8 mPerfCtrlFind3[]
STATIC PATCHER_GENERIC_PATCH mPowerStateTimeoutPanicMasterPatch
STATIC CONST UINT8 mSerialDevicePmioFind[]
STATIC CONST UINT8 mAsmLegacyBcopy64[]
STATIC PATCHER_GENERIC_PATCH mApfsTimeoutPatch
STATIC UINT8 mApfsTimeoutFind[]
STATIC PATCHER_GENERIC_PATCH mIOAHCIPortPatch
EFI_STATUS KernelApplyQuirk(IN KERNEL_QUIRK_NAME Name, IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion)
STATIC CONST UINT8 mAppleDummyCpuPmPatchReplace[]
STATIC CONST UINT8 mPerfCtrlFind4[]
STATIC CONST UINT8 mXcpmCfgLockRelFind[]
STATIC CONST UINT8 mRemoveUsbLimitIoP1Find2[]
STATIC CONST UINT8 mLapicKernelPanicMasterPatchMask[]
STATIC CONST UINT8 mXcpmCfgLockDbgReplace[]
STATIC EFI_STATUS PatchAppleIoMapperMapping(IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion)
STATIC EFI_STATUS PatchIncreasePciBarSize(IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion)
STATIC EFI_STATUS PatchUsbXhciPortLimit1(IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion)
STATIC CONST UINT8 mRemoveUsbLimitV2Replace[]
VOID PatchSetPciSerialDevice(IN UINTN RegisterBase, IN UINT32 RegisterStride)
STATIC CONST UINT8 mIOAHCIBlockStoragePatch133Find1[]
STATIC_ASSERT(sizeof(mMovEcxE2)==5, "Unsupported mMovEcxE2")
STATIC CONST UINT8 mAquantiaEthernetPatchMaskMieze[]
STATIC CONST UINT8 mMiscPwrMgmtDbgReplace[]
STATIC CONST UINT8 mIOAHCIPortPatchFind[]
STATIC PATCHER_GENERIC_PATCH mMiscPwrMgmtDbgPatch
STATIC CONST UINT8 mIncreasePciBarSizePatchFind[]
STATIC CONST UINT8 mPanicKextDumpPatchReplace[]
STATIC CONST UINT8 mMiscPwrMgmtRelMask15[]
STATIC CONST UINT8 mAquantiaEthernetPatchReplaceShikumo[]
STATIC CONST UINT8 mIOAHCIBlockStoragePatch144Find[]
STATIC CONST UINT8 mRemoveUsbLimitV2Find[]
STATIC EFI_STATUS PatchLapicKernel(IN OUT PATCHER_CONTEXT *Patcher, IN UINT32 KernelVersion)
STATIC CONST UINT8 mAppleIoMapperPatchReplace[]
STATIC PATCHER_GENERIC_PATCH mAppleRtcChecksumPatch32
STATIC CONST UINT8 mMiscPwrMgmtRelReplaceMask15[]
STATIC CONST UINT8 mRemoveUsbLimitIoP1Replace1[]
STATIC CONST UINT8 mLapicKernelPanicPatchMask[]
STATIC CONST UINT8 mAquantiaEthernetPatchReplaceMieze[]
STATIC PATCHER_GENERIC_PATCH mXcpmCfgLockDbgPatch
STATIC CONST UINT8 mLapicKernelPanicPatchLegacyFind[]
STATIC EFI_STATUS PatchForceSecureBootScheme(IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion)
STATIC PATCHER_GENERIC_PATCH mAppleIoMapperMappingPatch
STATIC CONST UINT8 mPerfCtrlMax[]
STATIC CONST UINT8 mMiscPwrMgmtRelFind[]
STATIC PATCHER_GENERIC_PATCH mLapicKernelPanicPatch
STATIC CONST UINT8 mRemoveUsbLimitIoP1Find1[]
STATIC CONST UINT8 mAppleRtcChecksumPatchReplace64[]
STATIC PATCHER_GENERIC_PATCH mPanicKextDumpPatch
STATIC CONST UINT8 mMiscPwrMgmtRelFind15[]
STATIC CONST UINT8 mPowerStateTimeoutPanicInlineReplace[]
STATIC CONST UINT8 mAquantiaEthernetPatchFindMieze[]
STATIC EFI_STATUS PatchCustomPciSerialPmio(IN OUT PATCHER_CONTEXT *Patcher)
STATIC CONST UINT8 mAquantiaEthernetPatchReplaceMaskShikumo[]
STATIC EFI_STATUS PatchAppleIoMapperSupport(IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion)
STATIC CONST UINT8 mIOAHCIBlockStoragePatchV1Find[]
STATIC PATCHER_GENERIC_PATCH mBTFeatureFlagsPatchV3
STATIC CONST UINT8 mXcpmCfgLockRelReplace[]
STATIC CONST UINT8 mLapicKernelPanicPatchLegacyReplace[]
STATIC CONST UINT8 mMovEcxE2[]
KERNEL_QUIRK gKernelQuirks[]
STATIC PATCHER_GENERIC_PATCH mXcpmCfgLockRelPatch
STATIC CONST UINT8 mIOAHCIBlockStoragePatch133Replace[]
STATIC EFI_STATUS PatchSetApfsTrimTimeout(IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion)
STATIC PATCHER_GENERIC_PATCH mRemoveUsbLimitIoP1Patch2
STATIC EFI_STATUS PatchCustomSmbiosGuid(IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion)
STATIC EFI_STATUS PatchAppleCpuPmCfgLock(IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion)
STATIC CONST UINT8 mLapicKernelPanicMasterPatchReplace[]
STATIC UINT8 mApfsDisableTrimReplace[]
STATIC EFI_STATUS PatchPanicKextDump(IN OUT PATCHER_CONTEXT *Patcher, IN UINT32 KernelVersion)
STATIC PATCHER_GENERIC_PATCH mAquantiaEthernetPatchMieze
STATIC PATCHER_GENERIC_PATCH mLapicKernelPanicLegacyPatch
STATIC EFI_STATUS PatchThirdPartyDriveSupport(IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion)
STATIC CONST UINT8 mIOAHCIBlockStoragePatchV1Replace[]
STATIC PATCHER_GENERIC_PATCH mMiscPwrMgmtRelPatch
STATIC CONST UINT8 mRemoveUsbLimitV1Replace[]
STATIC PATCHER_GENERIC_PATCH mCustomSmbiosGuidPatch
STATIC CONST UINT8 mAppleRtcChecksumPatchFind64[]
STATIC PATCHER_GENERIC_PATCH mIOAHCIBlockStoragePatch144
STATIC PATCHER_GENERIC_PATCH mMiscPwrMgmtRel15Patch
STATIC PATCHER_GENERIC_PATCH mRemoveUsbLimitIoP1Patch1Tahoe
STATIC CONST UINT8 mAppleRtcChecksumPatchMask64[]
STATIC CONST UINT8 mAquantiaEthernetPatchFindShikumo[]
STATIC CONST UINT8 mIOAHCIBlockStoragePatchV2Find[]
STATIC EFI_STATUS PatchAquantiaEthernet(IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion)
STATIC CONST UINT8 mIOAHCIBlockStoragePatch133FindMask[]
STATIC PATCHER_GENERIC_PATCH mIncreasePciBarSizeLegacyPatch
STATIC PATCHER_GENERIC_PATCH mAppleRtcChecksumPatch64
STATIC CONST UINT8 mPanicKextDumpPatchFind[]
STATIC CONST UINT8 mPowerStateTimeoutPanicInlineFind[]
STATIC EFI_STATUS PatchLapicKernelLegacy(IN OUT PATCHER_CONTEXT *Patcher, IN UINT32 KernelVersion)
STATIC CONST UINT8 mAppleRtcChecksumPatchFind32[]
STATIC EFI_STATUS PatchForceInternalDiskIcons(IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion)
STATIC PATCHER_GENERIC_PATCH mLapicKernelPanicMasterPatch
STATIC CONST UINT8 mLapicKernelPanicMasterPatchLegacyReplace2[]
STATIC EFI_STATUS PatchLapicKernelPanic(IN OUT PATCHER_CONTEXT *Patcher, IN UINT32 KernelVersion)
STATIC PATCHER_GENERIC_PATCH mIOAHCIBlockStoragePatch133Part2
STATIC CONST UINT8 mXcpmCfgLockDbgFind[]
STATIC CONST UINT8 mLapicKernelPanicMasterPatchLegacyMask1[]
STATIC UINT32 mPmioRegisterStride
To be set by PatchSetPciSerialDevice()
STATIC EFI_STATUS PatchLegacyCommpage(IN OUT PATCHER_CONTEXT *Patcher, IN UINT32 KernelVersion)
STATIC PATCHER_GENERIC_PATCH mBTFeatureFlagsPatchV1
STATIC EFI_STATUS PatchCustomPciSerialDevice(IN OUT PATCHER_CONTEXT *Patcher, IN UINT32 KernelVersion)
STATIC CONST UINT8 mMiscPwrMgmtRelReplace[]
STATIC CONST UINTN mWrmsrMaxDistance
STATIC CONST UINT8 mLapicKernelPanicMasterPatchLegacyFind2[]
STATIC CONST UINT8 mPowerStateTimeoutPanicInlineMask[]
STATIC CONST UINT8 mIOAHCIPortPatchReplace[]
#define kHasSupplementalSSE3
STATIC CONST UINT8 mAppleIoMapperMappingPatchReplace[]
STATIC CONST UINT8 mIOAHCIBlockStoragePatch144ReplaceMask[]
STATIC CONST UINT8 mIOAHCIBlockStoragePatch133ReplaceMask[]
STATIC CONST UINT8 mRemoveUsbLimitV1Find[]
STATIC EFI_STATUS PatchAppleXcpmExtraMsrs(IN OUT PATCHER_CONTEXT *Patcher, IN UINT32 KernelVersion)
STATIC CONST UINT8 mLapicKernelPanicMasterPatchLegacyReplace1[]
STATIC CONST UINT8 mIncreasePciBarSizePatchLegacyFind[]
STATIC PATCHER_GENERIC_PATCH mRemoveUsbLimitIoP1Patch1
STATIC CONST UINT8 mLapicKernelPanicPatchLegacyMask[]
STATIC CONST UINT8 mRemoveUsbLimitIoP1ReplaceMask2[]
STATIC EFI_STATUS PatchUsbXhciPortLimit2(IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion)
STATIC CONST UINT8 mCustomSmbiosGuidPatchReplace[]
STATIC PATCHER_GENERIC_PATCH mRemoveUsbLimitV1Patch
STATIC EFI_STATUS PatchPowerStateTimeout(IN OUT PATCHER_CONTEXT *Patcher, IN UINT32 KernelVersion)
STATIC CONST UINT8 mLapicKernelPanicPatchReplace[]
STATIC EFI_STATUS PatchAppleXcpmForceBoost(IN OUT PATCHER_CONTEXT *Patcher, IN UINT32 KernelVersion)
STATIC CONST UINT8 mIOAHCIBlockStoragePatchV2Replace[]
STATIC CONST UINTN mInOutMaxDistance
STATIC EFI_STATUS PatchDummyPowerManagement(IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion)
STATIC CONST UINT8 mCustomSmbiosGuidPatchFind[]
STATIC CONST UINT8 mPowerStateTimeoutPanicReplace[]
STATIC UINT8 mApfsTimeoutReplace[]
STATIC CONST UINT8 mLapicKernelPanicPatchFind[]
STATIC CONST UINT8 mIOAHCIBlockStoragePatch144Replace[]
STATIC CONST UINT8 mLapicKernelPanicMasterPatchLegacyMask2[]
STATIC PATCHER_GENERIC_PATCH mAppleDummyCpuPmPatch
STATIC CONST UINT8 mMiscPwrMgmtRelReplace15[]
STATIC PATCHER_GENERIC_PATCH mIncreasePciBarSizePatch
STATIC PATCHER_GENERIC_PATCH mRemoveUsbLimitV2Patch
STATIC CONST UINT8 mPerfCtrlFind2[]
STATIC CONST UINT8 mWrmsr[]
STATIC UINT32 KernelVersion
Definition KextInject.c:28
#define KERNEL_VERSION_SNOW_LEOPARD_MIN
#define KERNEL_VERSION_MONTEREY_MIN
#define KERNEL_VERSION_MOJAVE
#define KERNEL_VERSION_HIGH_SIERRA_MIN
#define KERNEL_VERSION_VENTURA
#define KERNEL_VERSION_MOUNTAIN_LION_MIN
EFI_STATUS PatcherGetSymbolAddress(IN OUT PATCHER_CONTEXT *Context, IN CONST CHAR8 *Name, IN OUT UINT8 **Address)
#define KERNEL_VERSION_YOSEMITE_MIN
#define KERNEL_VERSION_CATALINA_MIN
#define KERNEL_VERSION_VENTURA_MIN
#define KERNEL_VERSION_SNOW_LEOPARD_MAX
BOOLEAN OcMatchDarwinVersion(IN UINT32 CurrentVersion OPTIONAL, IN UINT32 MinVersion OPTIONAL, IN UINT32 MaxVersion OPTIONAL)
#define KERNEL_VERSION(A, B, C)
#define KERNEL_VERSION_BIG_SUR
#define KERNEL_VERSION_TAHOE_MIN
EFI_STATUS PatcherApplyGenericPatch(IN OUT PATCHER_CONTEXT *Context, IN PATCHER_GENERIC_PATCH *Patch)
#define KERNEL_VERSION_HIGH_SIERRA_MAX
#define KERNEL_VERSION_MOUNTAIN_LION
#define KERNEL_VERSION_CATALINA
#define KERNEL_VERSION_SEQUOIA_MIN
#define KERNEL_VERSION_MOJAVE_MIN
KERNEL_QUIRK_NAME
@ KernelQuirkDisableRtcChecksum
@ KernelQuirkPanicNoKextDump
@ KernelQuirkCustomSmbiosGuid1
@ KernelQuirkForceSecureBootScheme
@ KernelQuirkPowerTimeoutKernelPanic
@ KernelQuirkLapicKernelPanic
@ KernelQuirkCustomSmbiosGuid2
@ KernelQuirkAppleCpuPmCfgLock
@ KernelQuirkAppleXcpmExtraMsrs
@ KernelQuirkAppleXcpmForceBoost
@ KernelQuirkXhciPortLimit2
@ KernelQuirkSetApfsTrimTimeout
@ KernelQuirkThirdPartyDrives
@ KernelQuirkDisableIoMapperMapping
@ KernelQuirkAppleXcpmCfgLock
@ KernelQuirkDummyPowerManagement
@ KernelQuirkDisableIoMapper
@ KernelQuirkLegacyCommpage
@ KernelQuirkExternalDiskIcons
@ KernelQuirkXhciPortLimit1
@ KernelQuirkExtendBTFeatureFlags
@ KernelQuirkForceAquantiaEthernet
@ KernelQuirkXhciPortLimit3
@ KernelQuirkSegmentJettison
@ KernelQuirkIncreasePciBarSize
@ KernelQuirkCustomPciSerialDevice
#define KERNEL_VERSION_SONOMA
#define KERNEL_VERSION_BIG_SUR_MIN
#define KERNEL_VERSION_EL_CAPITAN_MIN
UINT32 MachoGetInnerSize(IN OUT OC_MACHO_CONTEXT *Context)
Definition Header.c:55
VOID * MachoGetFilePointerByAddress(IN OUT OC_MACHO_CONTEXT *Context, IN UINT64 Address, OUT UINT32 *MaxSize OPTIONAL)
Definition Header.c:588
MACH_HEADER_ANY * MachoGetMachHeader(IN OUT OC_MACHO_CONTEXT *Context)
Definition Header.c:44
#define L_STR_LEN(String)
Definition OcStringLib.h:26
INTN EFIAPI CompareMem(IN CONST VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI SetMem(OUT VOID *Buffer, IN UINTN Length, IN UINT8 Value)
BOOLEAN EFIAPI IsZeroBuffer(IN CONST VOID *Buffer, IN UINTN Length)
#define ASSERT(x)
Definition coder.h:55
KERNEL_QUIRK_PATCH_FUNCTION * PatchFunction
UINT32 * xcpm_msr_flag_p
UINT32 xcpm_msr_applicable_cpus
UINT64 xcpm_msr_initial_value
COMMPAGE_DESCRIPTOR_64 Desc64
COMMPAGE_DESCRIPTOR Desc32