OpenCore  1.0.4
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
739CONST UINT8
741 0x41, 0x83, 0x00, 0x0F,
742 0x41, 0xD3, 0x00,
743 0x00, 0x09, 0x00
744};
745
746STATIC
747CONST UINT8
749 0xFF, 0xFF, 0x00, 0xFF,
750 0xFF, 0xFF, 0x00,
751 0x00, 0xFF, 0x00
752};
753
754STATIC
755CONST UINT8
757 0x00, 0x00, 0x00, 0x3F,
758 0x00, 0x00, 0x00,
759 0x00, 0x00, 0x00
760};
761
762STATIC
763CONST UINT8
765 0x00, 0x00, 0x00, 0xFF,
766 0x00, 0x00, 0x00,
767 0x00, 0x00, 0x00
768};
769
770STATIC
773 .Comment = DEBUG_POINTER ("RemoveUsbLimitIoP1 part 2"),
774 .Base = "__ZN16AppleUSBHostPort15setPortLocationEj",
778 .ReplaceMask = mRemoveUsbLimitIoP1ReplaceMask2,
779 .Size = sizeof (mRemoveUsbLimitIoP1Replace2),
780 .Count = 1,
781 .Skip = 0,
782 .Limit = 4096
783};
784
785STATIC
786EFI_STATUS
788 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
789 IN UINT32 KernelVersion
790 )
791{
792 EFI_STATUS Status;
793
794 //
795 // On 10.14.4 and newer IOUSBHostFamily also needs limit removal.
796 // Thanks to ydeng discovering this.
797 //
799 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping port patch IOUSBHostFamily on %u\n", KernelVersion));
800 return EFI_SUCCESS;
801 }
802
803 if (Patcher == NULL) {
804 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion));
805 return EFI_NOT_FOUND;
806 }
807
809 if (EFI_ERROR (Status)) {
810 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply port patch com.apple.iokit.IOUSBHostFamily part 1 - %r\n", Status));
811 } else {
812 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success port com.apple.iokit.IOUSBHostFamily part 1\n"));
813 }
814
815 //
816 // The following patch is only needed on macOS 11.1 (Darwin 20.2.0) and above; skip it otherwise.
817 //
819 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping port patch com.apple.iokit.IOUSBHostFamily part 2 on %u\n", KernelVersion));
820 return Status;
821 }
822
824 if (EFI_ERROR (Status)) {
825 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply port patch com.apple.iokit.IOUSBHostFamily part 2 - %r\n", Status));
826 } else {
827 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success port com.apple.iokit.IOUSBHostFamily part 2\n"));
828 }
829
830 return Status;
831}
832
833STATIC
834EFI_STATUS
836 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
837 IN UINT32 KernelVersion
838 )
839{
840 EFI_STATUS Status;
841
843 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping modern port patch AppleUSBXHCI on %u\n", KernelVersion));
844 return EFI_SUCCESS;
845 }
846
847 if (Patcher == NULL) {
848 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion));
849 return EFI_NOT_FOUND;
850 }
851
852 //
853 // TODO: Implement some locationID hack in IOUSBHostFamily.
854 // The location ID is a 32 bit number which is unique among all USB devices in the system,
855 // and which will not change on a system reboot unless the topology of the bus itself changes.
856 // See AppleUSBHostPort::setPortLocation():
857 // locationId = getLocationId();
858 // if (!(locationId & 0xF)) {
859 // int32_t shift = 20;
860 // while (locationId & (0xF << shift)) {
861 // shift -= 4;
862 // if (Shift < 0) { setLocationId(locationId); return; }
863 // }
864 // setLocationId(locationId | ((portNumber & 0xF) << shift));
865 // }
866 // The value (e.g. 0x14320000) is represented as follows: 0xAABCDEFG
867 // AA — Ctrl number 8 bits (e.g. 0x14, aka XHCI)
868 // B - Port number 4 bits (e.g. 0x3, aka SS03)
869 // C~F - Bus number 4 bits (e.g. 0x2, aka IOUSBHostHIDDevice)
870 //
871 // C~F are filled as many times as many USB Hubs are there on the port.
872 //
874 if (!EFI_ERROR (Status)) {
875 //
876 // We do not need to patch com.apple.driver.usb.AppleUSBXHCI if this patch was successful.
877 // Only legacy systems require com.apple.driver.usb.AppleUSBXHCI to be patched.
878 //
879 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success com.apple.driver.usb.AppleUSBXHCI\n"));
880 } else {
881 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply patch com.apple.driver.usb.AppleUSBXHCI - %r\n", Status));
882 }
883
884 //
885 // TODO: Check when the patch changed actually.
886 //
887 if ( EFI_ERROR (Status)
889 {
890 DEBUG ((DEBUG_INFO, "OCAK: [OK] Assuming success for AppleUSBXHCI on %u\n", KernelVersion));
891 return EFI_SUCCESS;
892 }
893
894 return Status;
895}
896
897STATIC
898EFI_STATUS
900 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
901 IN UINT32 KernelVersion
902 )
903{
904 EFI_STATUS Status;
905
907 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping legacy port patch AppleUSBXHCIPCI on %u\n", KernelVersion));
908 return EFI_SUCCESS;
909 }
910
911 if (Patcher == NULL) {
912 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion));
913 return EFI_NOT_FOUND;
914 }
915
916 //
917 // If we are here, we are on legacy 10.13 or below, try the oldest patch.
918 //
920 if (EFI_ERROR (Status)) {
921 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply legacy port patch AppleUSBXHCIPCI - %r\n", Status));
922 } else {
923 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success apply legacy port AppleUSBXHCIPCI\n"));
924 }
925
926 //
927 // TODO: Check when the patch changed actually.
928 //
929 if ( EFI_ERROR (Status)
931 {
932 DEBUG ((DEBUG_INFO, "OCAK: [OK] Assuming success for legacy port AppleUSBXHCIPCI on %u\n", KernelVersion));
933 return EFI_SUCCESS;
934 }
935
936 return Status;
937}
938
939STATIC
940CONST UINT8
942 0x41, 0x50, 0x50, 0x4C, 0x45, 0x20, 0x53, 0x53, 0x44, 0x00
943};
944
945STATIC
946CONST UINT8
948 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
949};
950
951STATIC
954 .Comment = DEBUG_POINTER ("IOAHCIBlockStorageV1"),
955 .Base = NULL,
957 .Mask = NULL,
959 .ReplaceMask = NULL,
960 .Size = sizeof (mIOAHCIBlockStoragePatchV1Find),
961 .Count = 1,
962 .Skip = 0
963};
964
965STATIC
966CONST UINT8
968 0x41, 0x50, 0x50, 0x4C, 0x45, 0x00
969};
970
971STATIC
972CONST UINT8
974 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
975};
976
977STATIC
980 .Comment = DEBUG_POINTER ("IOAHCIBlockStorageV2"),
981 .Base = NULL,
983 .Mask = NULL,
985 .ReplaceMask = NULL,
986 .Size = sizeof (mIOAHCIBlockStoragePatchV2Find),
987 .Count = 1,
988 .Skip = 0
989};
990
991STATIC
992CONST UINT8
994 0x48, 0x8D, 0x3D, 0x00, 0x00, 0x00, 0x00,
995 0xBA, 0x09, 0x00, 0x00, 0x00
996};
997
998STATIC
999CONST UINT8
1001 0x48, 0x8D, 0x3D, 0x00, 0x00, 0x00, 0x00,
1002 0xBA, 0x05, 0x00, 0x00, 0x00
1003};
1004
1005STATIC
1006CONST UINT8
1008 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
1009 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
1010};
1011
1012STATIC
1013CONST UINT8
1015 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1016 0xBA, 0x00, 0x00, 0x00, 0x00
1017};
1018
1019STATIC
1020CONST UINT8
1022 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1023 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
1024};
1025
1026STATIC
1029 .Comment = DEBUG_POINTER ("IOAHCIBlockStorage trim 13.3+ part 1"),
1030 .Base = "__ZN24IOAHCIBlockStorageDriver23DetermineDeviceFeaturesEPt",
1035 .Size = sizeof (mIOAHCIBlockStoragePatch133Find1),
1036 .Count = 1,
1037 .Skip = 0,
1038 .Limit = 4096
1039};
1040
1041STATIC
1044 .Comment = DEBUG_POINTER ("IOAHCIBlockStorage trim 13.3+ part 2"),
1045 .Base = "__ZN24IOAHCIBlockStorageDriver23DetermineDeviceFeaturesEPt",
1050 .Size = sizeof (mIOAHCIBlockStoragePatch133Find2),
1051 .Count = 1,
1052 .Skip = 0,
1053 .Limit = 4096
1054};
1055
1056STATIC
1057CONST UINT8
1059 0x4C, 0x8D, 0x2D, 0x00, 0x00, 0x00, 0x00,
1060 0x4C, 0x89, 0xEF,
1061 0xE8, 0x00, 0x00, 0x00, 0x00,
1062 0x4C, 0x89, 0xEF
1063};
1064
1065STATIC
1066CONST UINT8
1068 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
1069 0xFF, 0xFF, 0xFF,
1070 0xFF, 0x00, 0x00, 0x00, 0x00,
1071 0xFF, 0xFF, 0xFF
1072};
1073
1074STATIC
1075CONST UINT8
1077 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1078 0x00, 0x00, 0x00,
1079 0x31, 0xC0, 0x90, 0x90, 0x90,
1080 0x00, 0x00, 0x00
1081};
1082
1083STATIC
1084CONST UINT8
1086 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1087 0x00, 0x00, 0x00,
1088 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1089 0x00, 0x00, 0x00
1090};
1091
1092STATIC
1095 .Comment = DEBUG_POINTER ("IOAHCIBlockStorage trim 14.4+"),
1096 .Base = "__ZN24IOAHCIBlockStorageDriver23DetermineDeviceFeaturesEPt",
1101 .Size = sizeof (mIOAHCIBlockStoragePatch144Find),
1102 .Count = 2,
1103 .Skip = 0,
1104 .Limit = 4096
1105};
1106
1107STATIC
1108EFI_STATUS
1110 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
1111 IN UINT32 KernelVersion
1112 )
1113{
1114 EFI_STATUS Status;
1115
1116 if (Patcher == NULL) {
1117 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion));
1118 return EFI_NOT_FOUND;
1119 }
1120
1121 //
1122 // macOS 14.4+ (Darwin 23.4.0) adopted different patch patterns similar to 13.3+, as below.
1123 //
1126 if (EFI_ERROR (Status)) {
1127 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply patch 14.4+ com.apple.iokit.IOAHCIBlockStorage - %r\n", Status));
1128 } else {
1129 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success 14.4+ com.apple.iokit.IOAHCIBlockStorage\n"));
1130 }
1131
1132 return Status;
1133 }
1134
1135 //
1136 // Starting with macOS 13.3 (Darwin 22.4.0), a new set of patches are required, discovered by @vit9696.
1137 //
1140 if (EFI_ERROR (Status)) {
1141 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply patch 13.3+ com.apple.iokit.IOAHCIBlockStorage part 1 - %r\n", Status));
1142 return Status;
1143 } else {
1144 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success 13.3+ com.apple.iokit.IOAHCIBlockStorage part 1\n"));
1145 }
1146
1148 if (EFI_ERROR (Status)) {
1149 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply patch 13.3+ com.apple.iokit.IOAHCIBlockStorage part 2 - %r\n", Status));
1150 } else {
1151 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success 13.3+ com.apple.iokit.IOAHCIBlockStorage part 2\n"));
1152 }
1153
1154 return Status;
1155 }
1156
1158 if (EFI_ERROR (Status)) {
1159 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply patch legacy com.apple.iokit.IOAHCIBlockStorage V1 - %r\n", Status));
1160 } else {
1161 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success legacy com.apple.iokit.IOAHCIBlockStorage V1\n"));
1162 }
1163
1166 if (EFI_ERROR (Status)) {
1167 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply patch legacy com.apple.iokit.IOAHCIBlockStorage V2 - %r\n", Status));
1168 } else {
1169 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success legacy com.apple.iokit.IOAHCIBlockStorage V2\n"));
1170 }
1171 } else {
1172 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping IOAHCIBlockStorage legacy V2 on %u\n", KernelVersion));
1173 }
1174
1175 //
1176 // This started to be required on 10.6.7 or so.
1177 // We cannot trust which minor SnowLeo version is this, just let it pass.
1178 //
1179 if ( EFI_ERROR (Status)
1181 {
1182 DEBUG ((DEBUG_INFO, "OCAK: [OK] Assuming success for legacy IOAHCIBlockStorage on %u\n", KernelVersion));
1183 return EFI_SUCCESS;
1184 }
1185
1186 return Status;
1187}
1188
1189STATIC
1190CONST UINT8
1192 0x45, 0x78, 0x74, 0x65, 0x72, 0x6E, 0x61, 0x6C
1193};
1194
1195STATIC
1196CONST UINT8
1198 0x49, 0x6E, 0x74, 0x65, 0x72, 0x6E, 0x61, 0x6C
1199};
1200
1201STATIC
1204 .Comment = DEBUG_POINTER ("IOAHCIPort"),
1205 .Base = NULL,
1206 .Find = mIOAHCIPortPatchFind,
1207 .Mask = NULL,
1208 .Replace = mIOAHCIPortPatchReplace,
1209 .ReplaceMask = NULL,
1210 .Size = sizeof (mIOAHCIPortPatchFind),
1211 .Count = 1,
1212 .Skip = 0
1213};
1214
1215STATIC
1216EFI_STATUS
1218 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
1219 IN UINT32 KernelVersion
1220 )
1221{
1222 EFI_STATUS Status;
1223
1224 if (Patcher == NULL) {
1225 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion));
1226 return EFI_NOT_FOUND;
1227 }
1228
1229 //
1230 // Override patch count to 2 on macOS 13.3+ (Darwin 22.4.0).
1231 //
1234 } else {
1236 }
1237
1238 Status = PatcherApplyGenericPatch (Patcher, &mIOAHCIPortPatch);
1239 if (EFI_ERROR (Status)) {
1240 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply patch com.apple.driver.AppleAHCIPort - %r\n", Status));
1241 } else {
1242 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success com.apple.driver.AppleAHCIPort\n"));
1243 }
1244
1245 return Status;
1246}
1247
1248STATIC
1249CONST UINT8
1251 0x44, 0x4D, 0x41, 0x52, 0x00
1252};
1253
1254STATIC
1255CONST UINT8
1257 0x52, 0x41, 0x4D, 0x44, 0x00
1258};
1259
1260STATIC
1263 .Comment = DEBUG_POINTER ("AppleIoMapper"),
1264 .Base = NULL,
1266 .Mask = NULL,
1267 .Replace = mAppleIoMapperPatchReplace,
1268 .ReplaceMask = NULL,
1269 .Size = sizeof (mAppleIoMapperPatchFind),
1270 .Count = 1,
1271 .Skip = 0
1272};
1273
1274STATIC
1275EFI_STATUS
1277 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
1278 IN UINT32 KernelVersion
1279 )
1280{
1281 EFI_STATUS Status;
1282
1284 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping AppleIoMapper patch on %u\n", KernelVersion));
1285 return EFI_SUCCESS;
1286 }
1287
1288 if (Patcher == NULL) {
1289 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion));
1290 return EFI_NOT_FOUND;
1291 }
1292
1293 Status = PatcherApplyGenericPatch (Patcher, &mAppleIoMapperPatch);
1294 if (EFI_ERROR (Status)) {
1295 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply patch com.apple.iokit.IOPCIFamily AppleIoMapper - %r\n", Status));
1296 } else {
1297 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success com.apple.iokit.IOPCIFamily AppleIoMapper\n"));
1298 }
1299
1300 return Status;
1301}
1302
1303STATIC
1304CONST UINT8
1308
1309STATIC
1312 .Comment = DEBUG_POINTER ("AppleIoMapperMapping"),
1313 .Base = "__ZN8AppleVTD14addMemoryRangeEyy",
1314 .Find = NULL,
1315 .Mask = NULL,
1317 .ReplaceMask = NULL,
1318 .Size = sizeof (mAppleIoMapperMappingPatchReplace),
1319 .Count = 1,
1320 .Skip = 0
1321};
1322
1323STATIC
1324EFI_STATUS
1326 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
1327 IN UINT32 KernelVersion
1328 )
1329{
1330 EFI_STATUS Status;
1331
1332 //
1333 // This patch is not required before macOS 13.3 (kernel 22.4.0)
1334 //
1336 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping AppleIoMapperMapping patch on %u\n", KernelVersion));
1337 return EFI_SUCCESS;
1338 }
1339
1340 if (Patcher == NULL) {
1341 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion));
1342 return EFI_NOT_FOUND;
1343 }
1344
1346 if (EFI_ERROR (Status)) {
1347 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply patch com.apple.iokit.IOPCIFamily AppleIoMapperMapping - %r\n", Status));
1348 } else {
1349 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success com.apple.iokit.IOPCIFamily AppleIoMapperMapping\n"));
1350 }
1351
1352 return Status;
1353}
1354
1355STATIC
1356CONST UINT8
1358 0xB8, 0x01, 0x00, 0x00, 0x00,
1359 0xC3
1360};
1361
1362STATIC
1365 .Comment = DEBUG_POINTER ("DummyCpuPm"),
1366 .Base = "__ZN28AppleIntelCPUPowerManagement5startEP9IOService",
1367 .Find = NULL,
1368 .Mask = NULL,
1370 .ReplaceMask = NULL,
1371 .Size = sizeof (mAppleDummyCpuPmPatchReplace),
1372 .Count = 1,
1373 .Skip = 0
1374};
1375
1376STATIC
1377EFI_STATUS
1379 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
1380 IN UINT32 KernelVersion
1381 )
1382{
1383 EFI_STATUS Status;
1384
1386 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping dummy AppleIntelCPUPowerManagement patch on %u\n", KernelVersion));
1387 return EFI_SUCCESS;
1388 }
1389
1390 if (Patcher == NULL) {
1391 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion));
1392 return EFI_NOT_FOUND;
1393 }
1394
1396 if (EFI_ERROR (Status)) {
1397 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply patch dummy AppleIntelCPUPowerManagement - %r\n", Status));
1398 } else {
1399 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success dummy AppleIntelCPUPowerManagement\n"));
1400 }
1401
1402 return Status;
1403}
1404
1405STATIC
1406CONST UINT8
1408 0x00, 0x00, 0x00, 0x40
1409};
1410
1411STATIC
1412CONST UINT8
1414 0x00, 0x00, 0x00, 0x80
1415};
1416
1417STATIC
1420 .Comment = DEBUG_POINTER ("IncreasePciBarSize"),
1421 .Base = "__ZN17IOPCIConfigurator24probeBaseAddressRegisterEP16IOPCIConfigEntryjj",
1423 .Mask = NULL,
1425 .ReplaceMask = NULL,
1426 .Size = sizeof (mIncreasePciBarSizePatchFind),
1427 .Count = 1,
1428 .Skip = 0,
1429 .Limit = 4096
1430};
1431
1432STATIC
1433CONST UINT8
1435 0x01, 0x00, 0x00, 0x40
1436};
1437
1438STATIC
1439CONST UINT8
1441 0x01, 0x00, 0x00, 0x80
1442};
1443
1444STATIC
1447 .Comment = DEBUG_POINTER ("IncreasePciBarSizeLegacy"),
1448 .Base = "__ZN17IOPCIConfigurator24probeBaseAddressRegisterEP16IOPCIConfigEntryjj",
1450 .Mask = NULL,
1452 .ReplaceMask = NULL,
1453 .Size = sizeof (mIncreasePciBarSizePatchLegacyFind),
1454 .Count = 1,
1455 .Skip = 0,
1456 .Limit = 4096
1457};
1458
1459STATIC
1460EFI_STATUS
1462 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
1463 IN UINT32 KernelVersion
1464 )
1465{
1466 EFI_STATUS Status;
1467
1469 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping com.apple.iokit.IOPCIFamily IncreasePciBarSize on %u\n", KernelVersion));
1470 return EFI_SUCCESS;
1471 }
1472
1473 if (Patcher == NULL) {
1474 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion));
1475 return EFI_NOT_FOUND;
1476 }
1477
1479 if (EFI_ERROR (Status)) {
1480 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply patch com.apple.iokit.IOPCIFamily IncreasePciBarSize - %r, trying legacy patch\n", Status));
1482 if (EFI_ERROR (Status)) {
1483 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply legacy patch com.apple.iokit.IOPCIFamily IncreasePciBarSize - %r\n", Status));
1484 } else {
1485 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success legacy com.apple.iokit.IOPCIFamily IncreasePciBarSize\n"));
1486 }
1487 } else {
1488 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success com.apple.iokit.IOPCIFamily IncreasePciBarSize\n"));
1489 }
1490
1491 return Status;
1492}
1493
1494STATIC
1495CONST UINT8
1497 0x66, 0xBA, 0xF8, 0x03
1498};
1499
1500STATIC
1501UINTN
1503
1504STATIC
1505UINT32
1507
1508STATIC
1509CONST UINTN
1511
1512VOID
1514 IN UINTN RegisterBase,
1515 IN UINT32 RegisterStride
1516 )
1517{
1518 //
1519 // FIXME: This is really ugly, make quirks take a context param.
1520 //
1521 if (RegisterBase <= MAX_UINT16) {
1522 DEBUG ((DEBUG_INFO, "OCAK: Registering PCI serial device PMIO port 0x%04X\n", RegisterBase));
1523 CopyMem (&mPmioRegisterBase, &RegisterBase, sizeof (RegisterBase));
1524
1525 DEBUG ((DEBUG_INFO, "OCAK: Registering PCI serial device register stride %u\n", RegisterStride));
1526 CopyMem (&mPmioRegisterStride, &RegisterStride, sizeof (RegisterStride));
1527 } else {
1528 DEBUG ((DEBUG_INFO, "OCAK: NOT registering unsupported PCI serial device register base 0x%X", RegisterBase));
1529 }
1530
1531 //
1532 // TODO: Add proper MMIO patch.
1533 //
1534}
1535
1536STATIC
1537EFI_STATUS
1539 IN OUT PATCHER_CONTEXT *Patcher
1540 )
1541{
1542 UINTN Count;
1543 UINT8 *Walker;
1544 UINT8 *WalkerPmio;
1545 UINTN Pmio;
1546 UINT8 *WalkerEnd;
1547 UINT8 *WalkerTmp;
1548
1549 //
1550 // This is a kernel patch, so Patcher cannot be NULL.
1551 //
1552 ASSERT (Patcher != NULL);
1553
1554 Count = 0;
1555 Walker = (UINT8 *)MachoGetMachHeader (&Patcher->MachContext);
1556 WalkerEnd = Walker + MachoGetInnerSize (&Patcher->MachContext) - mInOutMaxDistance;
1557
1558 while (Walker < WalkerEnd) {
1559 if ( (Walker[0] == mSerialDevicePmioFind[0])
1560 && (Walker[1] == mSerialDevicePmioFind[1])
1561 && ((Walker[2] & 0xF8U) == mSerialDevicePmioFind[2])
1562 && (Walker[3] == mSerialDevicePmioFind[3]))
1563 {
1564 DEBUG ((
1565 DEBUG_VERBOSE,
1566 "OCAK: Matched PMIO serial register base <%02X %02X %02X %02X>\n",
1567 Walker[0],
1568 Walker[1],
1569 Walker[2],
1570 Walker[3]
1571 ));
1572 WalkerPmio = &Walker[2];
1573
1574 WalkerTmp = Walker + mInOutMaxDistance;
1575 while (Walker < WalkerTmp) {
1576 //
1577 // Locate instruction in (0xEC) or out (0xEE).
1578 //
1579 if ((*Walker == 0xEC) || (*Walker == 0xEE)) {
1580 DEBUG ((
1581 DEBUG_VERBOSE,
1582 "OCAK: Matched PMIO serial register base context %a <%02X>, patching register base\n",
1583 *Walker == 0xEC ? "in" : "out",
1584 *Walker
1585 ));
1586
1587 //
1588 // Patch PMIO.
1589 //
1590 DEBUG ((DEBUG_VERBOSE, "OCAK: Before register base patch <%02X %02X>\n", WalkerPmio[0], WalkerPmio[1]));
1591 Pmio = mPmioRegisterBase + (*WalkerPmio & 7U) * mPmioRegisterStride;
1592 WalkerPmio[0] = Pmio & 0xFFU;
1593 WalkerPmio[1] = (Pmio >> 8U) & 0xFFU;
1594 DEBUG ((DEBUG_VERBOSE, "OCAK: After register base patch <%02X %02X>\n", WalkerPmio[0], WalkerPmio[1]));
1595
1596 ++Count;
1597 break;
1598 }
1599
1600 ++Walker;
1601 }
1602 }
1603
1604 //
1605 // Continue searching.
1606 //
1607 ++Walker;
1608 }
1609
1610 if (Count > 0) {
1611 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patched CustomPciSerialDevice PMIO port %u times\n", Count));
1612 return EFI_SUCCESS;
1613 }
1614
1615 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to patch CustomPciSerialDevice PMIO port!\n"));
1616 return EFI_NOT_FOUND;
1617}
1618
1619STATIC
1620EFI_STATUS
1622 IN OUT PATCHER_CONTEXT *Patcher,
1623 IN UINT32 KernelVersion
1624 )
1625{
1626 EFI_STATUS Status;
1627
1628 //
1629 // This is a kernel patch, so Patcher cannot be NULL.
1630 //
1631 ASSERT (Patcher != NULL);
1632
1633 Status = EFI_INVALID_PARAMETER;
1634 if ( ((mPmioRegisterBase != 0) && (mPmioRegisterStride != 0))
1635 && ((mPmioRegisterBase + 7U * mPmioRegisterStride) <= MAX_UINT16))
1636 {
1637 Status = PatchCustomPciSerialPmio (Patcher);
1638 }
1639
1640 //
1641 // TODO: Check MMIO patch again.
1642 //
1643
1644 if (EFI_ERROR (Status)) {
1645 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply patch CustomPciSerialDevice - %r\n"));
1646 } else {
1647 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success CustomPciSerialDevice\n"));
1648 }
1649
1650 return Status;
1651}
1652
1653STATIC
1654CONST UINT8
1656 0x45, 0x42, 0x39, 0x44, 0x32, 0x44, 0x33, 0x31
1657};
1658
1659STATIC
1660CONST UINT8
1662 0x45, 0x42, 0x39, 0x44, 0x32, 0x44, 0x33, 0x35
1663};
1664
1665STATIC
1668 .Comment = DEBUG_POINTER ("CustomSmbiosGuid"),
1669 .Base = NULL,
1671 .Mask = NULL,
1673 .ReplaceMask = NULL,
1674 .Size = sizeof (mCustomSmbiosGuidPatchFind),
1675 .Count = 1,
1676 .Skip = 0
1677};
1678
1679STATIC
1680EFI_STATUS
1682 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
1683 IN UINT32 KernelVersion
1684 )
1685{
1686 EFI_STATUS Status;
1687
1688 if (Patcher == NULL) {
1689 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion));
1690 return EFI_NOT_FOUND;
1691 }
1692
1694 if (!EFI_ERROR (Status)) {
1695 DEBUG ((DEBUG_INFO, "OCAK: [OK] SMBIOS Patch success\n"));
1696 } else {
1697 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply SMBIOS patch - %r\n", Status));
1698 }
1699
1700 return Status;
1701}
1702
1703STATIC
1704CONST UINT8
1706 0x00, 0x25, 0x2E, 0x2A, 0x73, 0x00
1707};
1708
1709STATIC
1710CONST UINT8
1712 0x00, 0x00, 0x2E, 0x2A, 0x73, 0x00
1713};
1714
1715STATIC
1718 .Comment = DEBUG_POINTER ("PanicKextDump"),
1719 .Base = NULL,
1721 .Mask = NULL,
1722 .Replace = mPanicKextDumpPatchReplace,
1723 .ReplaceMask = NULL,
1724 .Size = sizeof (mPanicKextDumpPatchFind),
1725 .Count = 1,
1726 .Skip = 0
1727};
1728
1729STATIC
1730EFI_STATUS
1732 IN OUT PATCHER_CONTEXT *Patcher,
1733 IN UINT32 KernelVersion
1734 )
1735{
1736 EFI_STATUS Status;
1737 UINT8 *Record;
1738 UINT8 *Last;
1739
1740 //
1741 // This is a kernel patch, so Patcher cannot be NULL.
1742 //
1743 ASSERT (Patcher != NULL);
1744
1746 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping PanicKextDump on %u\n", KernelVersion));
1747 return EFI_SUCCESS;
1748 }
1749
1750 Last = ((UINT8 *)MachoGetMachHeader (&Patcher->MachContext)
1751 + MachoGetInnerSize (&Patcher->MachContext) - EFI_PAGE_SIZE);
1752
1753 //
1754 // This should work on 10.15 and all debug kernels.
1755 //
1756 Status = PatcherGetSymbolAddress (
1757 Patcher,
1758 "__ZN6OSKext19printKextPanicListsEPFiPKczE",
1759 (UINT8 **)&Record
1760 );
1761 if (EFI_ERROR (Status) || (Record >= Last)) {
1762 DEBUG ((DEBUG_WARN, "OCAK: [FAIL] Failed to locate printKextPanicLists (%p) - %r\n", Record, Status));
1763 return EFI_NOT_FOUND;
1764 }
1765
1766 *Record = 0xC3;
1767
1768 //
1769 // This one is for 10.13~10.14 release kernels, which do dumping inline.
1770 // A bit risky, but let's hope it works well.
1771 //
1772 Status = PatcherApplyGenericPatch (Patcher, &mPanicKextDumpPatch);
1773 if (EFI_ERROR (Status)) {
1774 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply kext dump patch - %r\n", Status));
1775 } else {
1776 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success kext dump\n"));
1777 }
1778
1779 return Status;
1780}
1781
1782STATIC
1783CONST UINT8
1785 0x65, 0x8B, 0x04, 0x25, 0x00, 0x00, 0x00, 0x00,
1786 0x3B, 0x05, 0x00, 0x00, 0x00, 0x00
1787};
1788
1789STATIC
1790CONST UINT8
1792 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xFF,
1793 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00
1794};
1795
1796STATIC
1797CONST UINT8
1799 0x31, 0xC0,
1800 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90
1801};
1802
1803STATIC
1806 .Comment = DEBUG_POINTER ("LapicKernelPanic"),
1807 .Base = "_lapic_interrupt",
1811 .ReplaceMask = NULL,
1812 .Size = sizeof (mLapicKernelPanicPatchReplace),
1813 .Count = 1,
1814 .Skip = 0,
1815 .Limit = 1024
1816};
1817
1818STATIC
1819CONST UINT8
1821 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1822};
1823
1824STATIC
1825CONST UINT8
1827 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF
1828};
1829
1830STATIC
1831CONST UINT8
1833 0x31, 0xC0,
1834 0x90, 0x90, 0x90, 0x90, 0x90
1835};
1836
1837STATIC
1840 .Comment = DEBUG_POINTER ("LapicKernelPanicMaster"),
1841 .Base = "_lapic_interrupt",
1845 .ReplaceMask = NULL,
1846 .Size = sizeof (mLapicKernelPanicMasterPatchFind),
1847 .Count = 1,
1848 .Skip = 0,
1849 .Limit = 4096
1850};
1851
1852STATIC
1853EFI_STATUS
1855 IN OUT PATCHER_CONTEXT *Patcher,
1856 IN UINT32 KernelVersion
1857 )
1858{
1859 EFI_STATUS Status;
1860
1862 if (EFI_ERROR (Status)) {
1863 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply modern lapic patch - %r, trying legacy\n", Status));
1864 return Status;
1865 }
1866
1867 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success lapic\n"));
1868
1869 //
1870 // Patch away the master core check to never require lapic_dont_panic=1.
1871 //
1873 if (EFI_ERROR (Status)) {
1874 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply extended modern lapic patch - %r\n", Status));
1875 } else {
1876 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success extended modern lapic\n"));
1877 }
1878
1879 return Status;
1880}
1881
1882STATIC
1883CONST UINT8
1885 0x65, 0x8B, 0x04, 0x25, 0x14, 0x00, 0x00, 0x00,
1886 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1887 0x00, 0x00
1888};
1889
1890STATIC
1891CONST UINT8
1893 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0xFF, 0xFF, 0xFF,
1894 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1895 0x00, 0x00
1896};
1897
1898STATIC
1899CONST UINT8
1901 0x31, 0xC0,
1902 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90
1903};
1904
1905STATIC
1908 .Comment = DEBUG_POINTER ("LapicKernelPanicLegacy"),
1909 .Base = "_lapic_interrupt",
1913 .ReplaceMask = NULL,
1914 .Size = sizeof (mLapicKernelPanicPatchLegacyReplace),
1915 .Count = 1,
1916 .Skip = 0,
1917 .Limit = 1024
1918};
1919
1920STATIC
1921CONST UINT8
1923 0x48, 0x8D, 0x00, 0x00, 0x00, 0x00, 0x00,
1924 0x83, 0x00, 0x00,
1925 0x74, 0x00, 0x83, 0x00
1926};
1927
1928STATIC
1929CONST UINT8
1931 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
1932 0xFF, 0x00, 0x00,
1933 0xFF, 0x00, 0xFF, 0x00
1934};
1935
1936STATIC
1937CONST UINT8
1939 0x31, 0xC0,
1940 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
1941 0x00, 0x00, 0x00, 0x00
1942};
1943
1944STATIC
1945CONST UINT8
1947 0xFF, 0xFF,
1948 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1949 0x00, 0x00,0x00, 0x00
1950};
1951
1952STATIC
1955 .Comment = DEBUG_POINTER ("LapicKernelPanicMasterLegacy v1"),
1956 .Base = "_lapic_interrupt",
1962 .Count = 1,
1963 .Skip = 0,
1964 .Limit = 4096
1965};
1966
1967STATIC
1968CONST UINT8
1970 0x48, 0x8D, 0x05, 0x00, 0x00, 0x00, 0x00,
1971 0x44, 0x8B, 0x00,
1972 0x45, 0x85, 0xC0,
1973 0x74, 0x00, 0x8B
1974};
1975
1976STATIC
1977CONST UINT8
1979 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
1980 0xFF, 0xFF, 0xFF,
1981 0xFF, 0xFF, 0xFF,
1982 0xFF, 0x00, 0xFF
1983};
1984
1985STATIC
1986CONST UINT8
1988 0x31, 0xC0,
1989 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
1990 0x00, 0x00, 0x00
1991};
1992
1993STATIC
1994CONST UINT8
1996 0xFF, 0xFF,
1997 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1998 0x00, 0x00,0x00
1999};
2000
2001STATIC
2004 .Comment = DEBUG_POINTER ("LapicKernelPanicMasterLegacy v2"),
2005 .Base = "_lapic_interrupt",
2011 .Count = 1,
2012 .Skip = 0,
2013 .Limit = 4096
2014};
2015
2016STATIC
2017EFI_STATUS
2019 IN OUT PATCHER_CONTEXT *Patcher,
2020 IN UINT32 KernelVersion
2021 )
2022{
2023 EFI_STATUS Status;
2024
2026 if (EFI_ERROR (Status)) {
2027 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply legacy lapic patch - %r\n", Status));
2028 return Status;
2029 }
2030
2031 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success legacy lapic\n"));
2032
2033 //
2034 // Patch away the master core check to never require lapic_dont_panic=1.
2035 //
2037 if (!EFI_ERROR (Status)) {
2038 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success extended legacy lapic v1\n"));
2039 return Status;
2040 }
2041
2042 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply extended legacy lapic patch v1 - %r, trying legacy v2\n", Status));
2044 if (!EFI_ERROR (Status)) {
2045 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success extended legacy lapic v2\n"));
2046 } else {
2047 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply extended legacy lapic patch v2 - %r\n", Status));
2048 }
2049
2050 return Status;
2051}
2052
2053STATIC
2054EFI_STATUS
2056 IN OUT PATCHER_CONTEXT *Patcher,
2057 IN UINT32 KernelVersion
2058 )
2059{
2060 EFI_STATUS Status;
2061
2062 //
2063 // This is a kernel patch, so Patcher cannot be NULL.
2064 //
2065 ASSERT (Patcher != NULL);
2066
2067 Status = PatchLapicKernel (Patcher, KernelVersion);
2068 if (!EFI_ERROR (Status)) {
2069 return Status;
2070 }
2071
2072 Status = PatchLapicKernelLegacy (Patcher, KernelVersion);
2073 return Status;
2074}
2075
2076STATIC
2077CONST UINT8
2079 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x70, 0x70, 0x6C, 0x65, 0x00
2080};
2081
2082STATIC
2083CONST UINT8
2085 // not.apple\0
2086 0x6E, 0x6F, 0x74, 0x2E, 0x61, 0x70, 0x70, 0x6C, 0x65, 0x00
2087};
2088
2089STATIC
2092 .Comment = DEBUG_POINTER ("PowerStateTimeout"),
2093 .Base = NULL,
2095 .Mask = NULL,
2097 .ReplaceMask = NULL,
2098 .Size = sizeof (mPowerStateTimeoutPanicFind),
2099 .Count = 1,
2100 .Skip = 0,
2101 .Limit = 0
2102};
2103
2104STATIC
2105CONST UINT8
2107 0x80, 0x00, 0x01, 0x6F,
2108 0x75, 0x00,
2109 0x80, 0x00, 0x02, 0x6D,
2110 0x75, 0x00,
2111};
2112
2113STATIC
2114CONST UINT8
2116 0xFF, 0x00, 0xFF, 0xFF,
2117 0xFF, 0x00,
2118 0xFF, 0x00, 0xFF, 0xFF,
2119 0xFF, 0x00,
2120};
2121
2122STATIC
2123CONST UINT8
2125 0x80, 0x00, 0x01, 0x6E,
2126 0x75, 0x00,
2127 0x80, 0x00, 0x02, 0x6D,
2128 0x75, 0x00,
2129};
2130
2131STATIC
2134 .Comment = DEBUG_POINTER ("PowerStateTimeout"),
2135 .Base = "__ZN9IOService12ackTimerTickEv",
2139 .ReplaceMask = mPowerStateTimeoutPanicInlineMask,
2140 .Size = sizeof (mPowerStateTimeoutPanicInlineFind),
2141 .Count = 1,
2142 .Skip = 0,
2143 .Limit = 4096
2144};
2145
2146STATIC
2147EFI_STATUS
2149 IN OUT PATCHER_CONTEXT *Patcher,
2150 IN UINT32 KernelVersion
2151 )
2152{
2153 EFI_STATUS Status;
2154
2155 //
2156 // This is a kernel patch, so Patcher cannot be NULL.
2157 //
2158 ASSERT (Patcher != NULL);
2159
2161 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping power state patch on %u\n", KernelVersion));
2162 return EFI_SUCCESS;
2163 }
2164
2166 if (!EFI_ERROR (Status)) {
2167 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success inline power state\n"));
2168 return Status;
2169 }
2170
2171 DEBUG ((DEBUG_INFO, "OCAK: No inline power state patch - %r, trying fallback\n", Status));
2172
2174 if (EFI_ERROR (Status)) {
2175 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply power state patch - %r\n", Status));
2176 } else {
2177 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success power state\n"));
2178 }
2179
2180 //
2181 // TODO: Implement a patch to not require setpowerstate_panic=0 on debug kernels.
2182 //
2183
2184 return Status;
2185}
2186
2187//
2188// There currently are 2 places main RTC checksum is calculated in AppleRTC.kext
2189// __ZN8AppleRTC14updateChecksumEv and __ZN8AppleRTC19rtcRecordTracePointEjjj.
2190// Since we do not want to completely break RTC and/or saving tracepoints to RTC
2191// we patch-out __ZN8AppleRTC8rtcWriteEjh call arguments (0x58 and 0x59) with
2192// invalid (out of range) value 0xFFFF in 4 places.
2193//
2194// 10.5 and below do not have __ZN8AppleRTC19rtcRecordTracePointEjjj.
2195//
2196
2197STATIC
2198CONST UINT8
2200 0xC7, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00
2201};
2202
2203STATIC
2204CONST UINT8
2206 0xFF, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF
2207};
2208
2209STATIC
2210CONST UINT8
2212 0xC7, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00
2213};
2214
2215STATIC
2216CONST UINT8
2218 0xBE, 0x58, 0x00, 0x00, 0x00
2219};
2220
2221STATIC
2222CONST UINT8
2224 0xFF, 0xFE, 0xFF, 0xFF, 0xFF
2225};
2226
2227STATIC
2228CONST UINT8
2230 0xBE, 0xFF, 0xFF, 0x00, 0x00
2231};
2232
2233STATIC
2236 .Comment = DEBUG_POINTER ("DisableRtcChecksum32"),
2237 .Base = NULL,
2241 .ReplaceMask = mAppleRtcChecksumPatchMask32,
2242 .Size = sizeof (mAppleRtcChecksumPatchFind32),
2243 .Count = 4,
2244 .Skip = 0,
2245 .Limit = 0
2246};
2247
2248STATIC
2251 .Comment = DEBUG_POINTER ("DisableRtcChecksum64"),
2252 .Base = NULL,
2256 .ReplaceMask = NULL,
2257 .Size = sizeof (mAppleRtcChecksumPatchFind64),
2258 .Count = 4,
2259 .Skip = 0,
2260 .Limit = 0
2261};
2262
2263STATIC
2264EFI_STATUS
2266 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
2267 IN UINT32 KernelVersion
2268 )
2269{
2270 EFI_STATUS Status;
2271
2272 if (Patcher == NULL) {
2273 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion));
2274 return EFI_NOT_FOUND;
2275 }
2276
2277 Status = PatcherApplyGenericPatch (Patcher, Patcher->Is32Bit ? &mAppleRtcChecksumPatch32 : &mAppleRtcChecksumPatch64);
2278 if (EFI_ERROR (Status)) {
2279 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply patch com.apple.driver.AppleRTC DisableRtcChecksum - %r\n", Status));
2280 } else {
2281 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success com.apple.driver.AppleRTC DisableRtcChecksum\n"));
2282 }
2283
2284 return Status;
2285}
2286
2287STATIC
2288EFI_STATUS
2290 IN OUT PATCHER_CONTEXT *Patcher,
2291 IN UINT32 KernelVersion
2292 )
2293{
2294 EFI_STATUS Status;
2295 UINT8 *RemoveBs;
2296 UINT8 *StaticMfree;
2297 UINT8 *CurrFreeCall;
2298 CHAR8 *Jettisoning;
2299 UINT8 *Last;
2300 UINTN Index;
2301 UINT32 Diff;
2302 UINT32 Diff2;
2303
2304 //
2305 // This is a kernel patch, so Patcher cannot be NULL.
2306 //
2307 ASSERT (Patcher != NULL);
2308
2310 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping SegmentJettison on %u\n", KernelVersion));
2311 return EFI_SUCCESS;
2312 }
2313
2314 Last = (UINT8 *)MachoGetMachHeader (&Patcher->MachContext)
2315 + MachoGetInnerSize (&Patcher->MachContext) - sizeof (EFI_PAGE_SIZE) * 2;
2316
2317 Status = PatcherGetSymbolAddress (Patcher, "__ZN6OSKext19removeKextBootstrapEv", (UINT8 **)&RemoveBs);
2318 if (EFI_ERROR (Status) || (RemoveBs > Last)) {
2319 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Missing removeKextBootstrap - %r\n", Status));
2320 return EFI_NOT_FOUND;
2321 }
2322
2323 Status = PatcherGetSymbolAddress (Patcher, "_ml_static_mfree", (UINT8 **)&StaticMfree);
2324 if (EFI_ERROR (Status) || (StaticMfree > Last)) {
2325 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Missing ml_static_mfree - %r\n", Status));
2326 return EFI_NOT_FOUND;
2327 }
2328
2329 if (RemoveBs - StaticMfree > MAX_INT32) {
2330 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] ml_static_mfree %p removeKextBootstrap %p are too far\n", StaticMfree, RemoveBs));
2331 return EFI_UNSUPPORTED;
2332 }
2333
2334 //
2335 // Find the call to _ml_static_mfree.
2336 //
2337 // NOTE: One call instruction takes 5 bytes.
2338 //
2339 Diff = (UINT32)((UINTN)StaticMfree - (UINTN)RemoveBs - 5);
2340
2341 CurrFreeCall = NULL;
2342 for (Index = 0; Index < EFI_PAGE_SIZE; ++Index) {
2343 if ( (RemoveBs[0] == 0xE8)
2344 && (CompareMem (&RemoveBs[1], &Diff, sizeof (Diff)) == 0))
2345 {
2346 CurrFreeCall = RemoveBs;
2347 DEBUG ((
2348 DEBUG_VERBOSE,
2349 "OCAK: CurrFreeCall %02X %02X %02X %02X %02X %X\n",
2350 RemoveBs[0],
2351 RemoveBs[1],
2352 RemoveBs[2],
2353 RemoveBs[3],
2354 RemoveBs[4],
2355 Diff
2356 ));
2357 } else if ( (CurrFreeCall != NULL)
2358 && (RemoveBs[0] == 0x48) && (RemoveBs[1] == 0x8D) && (RemoveBs[2] == 0x15))
2359 {
2360 //
2361 // Check if this lea rdx, address is pointing to "Jettisoning fileset Linkedit segments from..."
2362 //
2363 CopyMem (&Diff2, &RemoveBs[3], sizeof (Diff2));
2364 Jettisoning = (CHAR8 *)RemoveBs + Diff2 + 7;
2365 if ( ((UINT8 *)Jettisoning <= Last)
2366 && (AsciiStrnCmp (Jettisoning, "Jettisoning fileset", L_STR_LEN ("Jettisoning fileset")) == 0))
2367 {
2368 DEBUG ((DEBUG_INFO, "OCAK: [OK] Found jettisoning fileset\n"));
2369 SetMem (CurrFreeCall, 5, 0x90);
2370 return EFI_SUCCESS;
2371 }
2372 }
2373
2374 ++RemoveBs;
2375 --Diff;
2376 }
2377
2378 DEBUG ((DEBUG_INFO, "OCAK: Failed to find jettisoning fileset - %p\n", CurrFreeCall));
2379
2380 return EFI_NOT_FOUND;
2381}
2382
2383STATIC
2384CONST UINT8
2386 0x55,
2387 0x83, 0xCE, 0x0F
2388};
2389
2390STATIC
2393 .Comment = DEBUG_POINTER ("BTFeatureFlagsV1"),
2394 .Base = "__ZN25IOBluetoothHostController25SetControllerFeatureFlagsEj",
2395 .Find = NULL,
2396 .Mask = NULL,
2397 .Replace = mBTFeatureFlagsReplace,
2398 .ReplaceMask = NULL,
2399 .Size = sizeof (mBTFeatureFlagsReplace),
2400 .Count = 1,
2401 .Skip = 0
2402};
2403
2404STATIC
2407 .Comment = DEBUG_POINTER ("BTFeatureFlagsV2"),
2408 .Base = "__ZN24IOBluetoothHCIController25SetControllerFeatureFlagsEj",
2409 .Find = NULL,
2410 .Mask = NULL,
2411 .Replace = mBTFeatureFlagsReplace,
2412 .ReplaceMask = NULL,
2413 .Size = sizeof (mBTFeatureFlagsReplace),
2414 .Count = 1,
2415 .Skip = 0
2416};
2417
2418STATIC
2421 .Comment = DEBUG_POINTER ("BTFeatureFlagsV3"),
2422 .Base = "__ZN17IOBluetoothDevice25setDeviceSupportedFeatureEj",
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
2433EFI_STATUS
2435 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
2436 IN UINT32 KernelVersion
2437 )
2438{
2439 EFI_STATUS Status;
2440
2442 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping BTFeatureFlags on %u\n", KernelVersion));
2443 return EFI_SUCCESS;
2444 }
2445
2446 if (Patcher == NULL) {
2447 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion));
2448 return EFI_NOT_FOUND;
2449 }
2450
2452 if (EFI_ERROR (Status)) {
2453 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to find BT FeatureFlags symbol v1 - %r, trying v2\n", Status));
2455 if (EFI_ERROR (Status)) {
2456 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to find BT FeatureFlags symbol v2 - %r, trying v3\n", Status));
2458 if (EFI_ERROR (Status)) {
2459 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to find BT FeatureFlags symbol v3 - %r\n", Status));
2460 } else {
2461 DEBUG ((DEBUG_INFO, "OCAK: [OK] Success BT FeatureFlags patch v3\n"));
2462 }
2463 } else {
2464 DEBUG ((DEBUG_INFO, "OCAK: [OK] Success BT FeatureFlags patch v2\n"));
2465 }
2466 } else {
2467 DEBUG ((DEBUG_INFO, "OCAK: [OK] Success BT FeatureFlags patch v1\n"));
2468 }
2469
2470 return Status;
2471}
2472
2473//
2474// 32-bit commpage_descriptor structure from XNU.
2475//
2476typedef struct {
2477 //
2478 // Address of code.
2479 //
2481 //
2482 // Length of code in bytes.
2483 //
2485 //
2486 // Address to place this function at.
2487 //
2489 //
2490 // CPU capability bits we must have.
2491 //
2492 UINT32 MustHave;
2493 //
2494 // CPU capability bits we can't have.
2495 //
2496 UINT32 CantHave;
2498
2499//
2500// 64-bit commpage_descriptor structure from XNU.
2501//
2502typedef struct {
2503 //
2504 // Address of code.
2505 //
2507 //
2508 // Length of code in bytes.
2509 //
2511 //
2512 // Address to place this function at.
2513 //
2515 //
2516 // CPU capability bits we must have.
2517 //
2518 UINT32 MustHave;
2519 //
2520 // CPU capability bits we can't have.
2521 //
2522 UINT32 CantHave;
2524
2529
2530#define COMM_PAGE_BCOPY 0xFFFF0780
2531#define kHasSupplementalSSE3 0x00000100
2532
2533STATIC
2534CONST UINT8
2536 #include "LegacyBcopy.h"
2537};
2538
2539STATIC
2540EFI_STATUS
2542 IN OUT PATCHER_CONTEXT *Patcher,
2543 IN UINT32 KernelVersion
2544 )
2545{
2546 EFI_STATUS Status;
2547 UINT8 *Start;
2548 UINT8 *Last;
2549 UINT8 *CommpageRoutines;
2550 UINT8 *Target;
2551 UINT64 Address;
2552 UINT32 MaxSize;
2553
2554 COMMPAGE_DESCRIPTOR_ANY *Commpage;
2555 UINT32 CommpageCodeLength;
2556 UINT32 CommpageAddress;
2557 UINT32 CommpageMustHave;
2558
2559 //
2560 // This is a kernel patch, so Patcher cannot be NULL.
2561 //
2562 ASSERT (Patcher != NULL);
2563
2564 Start = ((UINT8 *)MachoGetMachHeader (&Patcher->MachContext));
2565 Last = Start + MachoGetInnerSize (&Patcher->MachContext) - EFI_PAGE_SIZE * 2 - (Patcher->Is32Bit ? sizeof (COMMPAGE_DESCRIPTOR) : sizeof (COMMPAGE_DESCRIPTOR_64));
2566
2567 //
2568 // This is a table of pointers to commpage entries.
2569 //
2570 Status = PatcherGetSymbolAddress (Patcher, "_commpage_64_routines", (UINT8 **)&CommpageRoutines);
2571 if (EFI_ERROR (Status) || (CommpageRoutines >= Last)) {
2572 DEBUG ((DEBUG_WARN, "OCAK: [FAIL] Failed to locate _commpage_64_routines (%p) - %r\n", CommpageRoutines, Status));
2573 return EFI_NOT_FOUND;
2574 }
2575
2576 //
2577 // Iterate through table looking for bcopy_sse4_64 (on 10.4) or bcopy_sse3x_64 (10.5+) entry.
2578 //
2579 Address = Patcher->Is32Bit ? *((UINT32 *)CommpageRoutines) : *((UINT64 *)CommpageRoutines);
2580 while (Address > 0) {
2581 Commpage = MachoGetFilePointerByAddress (&Patcher->MachContext, Address, &MaxSize);
2582 if ( (Commpage == NULL)
2583 || (MaxSize < (Patcher->Is32Bit ? sizeof (COMMPAGE_DESCRIPTOR) : sizeof (COMMPAGE_DESCRIPTOR_64))))
2584 {
2585 break;
2586 }
2587
2588 //
2589 // Locate the bcopy commpage entry that requires SSSE3 and replace it with our own implementation.
2590 //
2591 CommpageAddress = Patcher->Is32Bit ? Commpage->Desc32.CommpageAddress : Commpage->Desc64.CommpageAddress;
2592 CommpageMustHave = Patcher->Is32Bit ? Commpage->Desc32.MustHave : Commpage->Desc64.MustHave;
2593 if ( (CommpageAddress == COMM_PAGE_BCOPY)
2594 && ((CommpageMustHave & kHasSupplementalSSE3) == kHasSupplementalSSE3))
2595 {
2596 Address = Patcher->Is32Bit ? Commpage->Desc32.CodeAddress : Commpage->Desc64.CodeAddress;
2597 CommpageCodeLength = Patcher->Is32Bit ? Commpage->Desc32.CodeLength : Commpage->Desc64.CodeLength;
2598 DEBUG ((
2599 DEBUG_VERBOSE,
2600 "OCAK: Found 64-bit _COMM_PAGE_BCOPY function @ 0x%llx (0x%X bytes)\n",
2601 Address,
2602 CommpageCodeLength
2603 ));
2604
2605 Target = MachoGetFilePointerByAddress (&Patcher->MachContext, Address, &MaxSize);
2606 if ( (Target == NULL)
2607 || (MaxSize < sizeof (mAsmLegacyBcopy64))
2608 || (CommpageCodeLength < sizeof (mAsmLegacyBcopy64)))
2609 {
2610 break;
2611 }
2612
2613 CopyMem (Target, mAsmLegacyBcopy64, sizeof (mAsmLegacyBcopy64));
2614 if (Patcher->Is32Bit) {
2615 Commpage->Desc32.CodeLength = sizeof (mAsmLegacyBcopy64);
2616 Commpage->Desc32.MustHave &= ~kHasSupplementalSSE3;
2617 } else {
2618 Commpage->Desc64.CodeLength = sizeof (mAsmLegacyBcopy64);
2619 Commpage->Desc64.MustHave &= ~kHasSupplementalSSE3;
2620 }
2621
2622 return EFI_SUCCESS;
2623 }
2624
2625 CommpageRoutines += Patcher->Is32Bit ? sizeof (UINT32) : sizeof (UINT64);
2626 if (CommpageRoutines >= Last) {
2627 break;
2628 }
2629
2630 Address = Patcher->Is32Bit ? *((UINT32 *)CommpageRoutines) : *((UINT64 *)CommpageRoutines);
2631 }
2632
2633 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to find 64-bit _COMM_PAGE_BCOPY function\n"));
2634
2635 return EFI_NOT_FOUND;
2636}
2637
2638STATIC
2639CONST UINT8
2641 0x31, 0xC0,
2642 0xE8, 0x00, 0x00, 0x00, 0x00,
2643 0x83, 0x7D, 0x00, 0x00,
2644 0x0F, 0x84, 0x00, 0x00, 0x00, 0x00
2645};
2646
2647STATIC
2648CONST UINT8
2650 0xFF, 0xFF,
2651 0xFF, 0x00,0x00, 0x00, 0x00,
2652 0xFF, 0xFF,0x00, 0x00,
2653 0xFF, 0xFF,0x00, 0x00, 0x00, 0x00
2654};
2655
2656STATIC
2657CONST UINT8
2659 0x00, 0x00,
2660 0x00, 0x00,0x00, 0x00, 0x00,
2661 0x00, 0x00,0x00, 0x00,
2662 0x90, 0x90,0x90, 0x90, 0x90, 0x90,
2663};
2664
2665STATIC
2666CONST UINT8
2668 0x00, 0x00,
2669 0x00, 0x00,0x00, 0x00, 0x00,
2670 0x00, 0x00,0x00, 0x00,
2671 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF
2672};
2673
2674STATIC
2677 .Comment = DEBUG_POINTER ("ForceAquantiaEthernetShikumo"),
2678 .Base = "__ZN27AppleEthernetAquantiaAqtion5startEP9IOService",
2683 .Size = sizeof (mAquantiaEthernetPatchFindShikumo),
2684 .Count = 1,
2685 .Skip = 0
2686};
2687
2688STATIC
2689CONST UINT8
2691 0x41, 0xC7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2692 0xE9
2693};
2694
2695STATIC
2696CONST UINT8
2698 0x41, 0xC7, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
2699 0xE9
2700};
2701
2702STATIC
2703CONST UINT8
2705 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
2706 0xFF
2707};
2708
2709STATIC
2712 .Comment = DEBUG_POINTER ("ForceAquantiaEthernetMieze"),
2713 .Base = NULL,
2717 .ReplaceMask = mAquantiaEthernetPatchMaskMieze,
2718 .Size = sizeof (mAquantiaEthernetPatchFindMieze),
2719 .Count = 1,
2720 .Skip = 0
2721};
2722
2723STATIC
2724EFI_STATUS
2726 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
2727 IN UINT32 KernelVersion
2728 )
2729{
2730 EFI_STATUS Status;
2731
2732 //
2733 // This patch is not required before macOS 10.15.4.
2734 //
2736 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping patching AquantiaEthernet on %u\n", KernelVersion));
2737 return EFI_SUCCESS;
2738 }
2739
2740 if (Patcher == NULL) {
2741 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion));
2742 return EFI_NOT_FOUND;
2743 }
2744
2745 //
2746 // Shikumo's patch can be applied to a wider range, not limited to AQC 107 series,
2747 // thus preferred.
2748 //
2750 if (!EFI_ERROR (Status)) {
2751 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success Aquantia Ethernet Shikumo\n"));
2752 return Status;
2753 }
2754
2755 //
2756 // In case Shikumo's patch failed, try Mieze's so at least AQC 107 will work.
2757 //
2758 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply Aquantia Ethernet patch Shikumo - %r, trying Mieze\n", Status));
2760 if (EFI_ERROR (Status)) {
2761 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply Aquantia Ethernet patch Mieze - %r\n", Status));
2762 } else {
2763 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success Aquantia Ethernet Mieze\n"));
2764 }
2765
2766 return Status;
2767}
2768
2769STATIC
2770EFI_STATUS
2772 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
2773 IN UINT32 KernelVersion
2774 )
2775{
2776 EFI_STATUS Status;
2777 UINT8 *Last;
2778 UINT8 *SelectAp;
2779 UINT8 *HybridAp;
2780 UINT32 Diff;
2781
2783 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping sb scheme on %u\n", KernelVersion));
2784 return EFI_SUCCESS;
2785 }
2786
2787 if (Patcher == NULL) {
2788 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion));
2789 return EFI_NOT_FOUND;
2790 }
2791
2792 //
2793 // This code is for debugging APFS snapshot verification for Big Sur.
2794 // macOS chooses verification scheme based on the hardware:
2795 // - __img4_chip_x86_software_8012 (software x86 8012)
2796 // for CPUs with VMM flag enabled via cpuid_features.
2797 // - __img4_chip_x86 (x86)
2798 // for platforms with no or v1 (0x10000) coprocessor (apple-coprocessor-version).
2799 // - __img4_chip_ap_hybrid_medium (medium-security hybrid arm/x86 ap)
2800 // for platforms with v2 (0x20000) coprocessor and medium (1) policy (AppleSecureBootPolicy).
2801 // - __img4_chip_ap_hybrid_relaxed (relaxed hybrid arm/x86 ap)
2802 // for platforms with v2 coprocessor and relaxed (0) policy.
2803 // - __img4_chip_ap_hybrid (hybrid arm/x86 ap)
2804 // for platfirms with v2 or newer coprocessor and personalised policy (2).
2805 //
2806
2807 Last = ((UINT8 *)MachoGetMachHeader (&Patcher->MachContext)
2808 + MachoGetInnerSize (&Patcher->MachContext) - 64);
2809
2810 Status = PatcherGetSymbolAddress (Patcher, "_img4_chip_select_effective_ap", &SelectAp);
2811 if (EFI_ERROR (Status) || (SelectAp > Last)) {
2812 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Missing _img4_chip_select_effective_ap - %r\n", Status));
2813 return EFI_NOT_FOUND;
2814 }
2815
2816 Status = PatcherGetSymbolAddress (Patcher, "__img4_chip_x86", &HybridAp);
2817 if (EFI_ERROR (Status) || (HybridAp > Last)) {
2818 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Missing __img4_chip_x86 - %r\n", Status));
2819 return EFI_NOT_FOUND;
2820 }
2821
2822 DEBUG ((DEBUG_INFO, "OCAK: Forcing sb scheme on %u\n", KernelVersion));
2823
2824 SelectAp[0] = 0x48;
2825 SelectAp[1] = 0x8D;
2826 SelectAp[2] = 0x05;
2827 Diff = (UINT32)(HybridAp - SelectAp - 7);
2828 CopyMem (&SelectAp[3], &Diff, sizeof (Diff));
2829 SelectAp[7] = 0xC3;
2830 return EFI_SUCCESS;
2831}
2832
2833STATIC
2834UINT8
2836 0x48, 0x3D, 0x7F, 0x96, 0x98, 0x00
2837};
2838STATIC_ASSERT (sizeof (mApfsTimeoutFind) == 6, "Unsupported mApfsTimeoutFind");
2839
2840STATIC
2841UINT8
2843 0x48, 0x3D, 0x00, 0x00, 0x00, 0x00
2844};
2845STATIC_ASSERT (sizeof (mApfsTimeoutReplace) == 6, "Unsupported mApfsTimeoutReplace");
2846
2847STATIC
2850 .Comment = DEBUG_POINTER ("ApfsTimeout"),
2851 .Base = "_nx_mount_trim_thread",
2852 .Find = mApfsTimeoutFind,
2853 .Mask = NULL,
2854 .Replace = mApfsTimeoutReplace,
2855 .ReplaceMask = NULL,
2856 .Size = sizeof (mApfsTimeoutFind),
2857 .Count = 1,
2858 .Skip = 0,
2859 .Limit = 0
2860};
2861
2862VOID
2864 IN UINT32 Timeout
2865 )
2866{
2867 //
2868 // FIXME: This is really ugly, make quirks take a context param.
2869 //
2870 DEBUG ((DEBUG_INFO, "OCAK: Registering %u APFS timeout\n", Timeout));
2871 CopyMem (&mApfsTimeoutReplace[2], &Timeout, sizeof (Timeout));
2872}
2873
2874STATIC
2875UINT8
2877 0x31, 0xC0,
2878 0xC3
2879};
2880
2881STATIC
2884 .Comment = DEBUG_POINTER ("ApfsTimeout disable trim"),
2885 .Base = "_spaceman_iterate_free_extents_internal",
2886 .Find = NULL,
2887 .Mask = NULL,
2888 .Replace = mApfsDisableTrimReplace,
2889 .ReplaceMask = NULL,
2890 .Size = sizeof (mApfsDisableTrimReplace),
2891 .Count = 1,
2892 .Skip = 0,
2893 .Limit = 0
2894};
2895
2896STATIC
2897EFI_STATUS
2899 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
2900 IN UINT32 KernelVersion
2901 )
2902{
2903 EFI_STATUS Status;
2904
2906 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping apfs timeout on %u\n", KernelVersion));
2907 return EFI_SUCCESS;
2908 }
2909
2910 if (Patcher == NULL) {
2911 DEBUG ((DEBUG_INFO, "OCAK: [OK] Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion));
2912 return EFI_NOT_FOUND;
2913 }
2914
2915 //
2916 // Disable trim using another patch when timeout is 0.
2917 //
2918 if (IsZeroBuffer (&mApfsTimeoutReplace[2], sizeof (UINT32))) {
2920 if (EFI_ERROR (Status)) {
2921 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply patch ApfsDisableTrim - %r\n", Status));
2922 } else {
2923 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success ApfsDisableTrim\n"));
2924 }
2925
2926 return Status;
2927 }
2928
2929 //
2930 // It is only possible to specify trim timeout value from 10.14 to 11.x.
2931 // Starting at 12.0 this is no longer possible.
2932 //
2934 Status = PatcherApplyGenericPatch (Patcher, &mApfsTimeoutPatch);
2935 if (EFI_ERROR (Status)) {
2936 DEBUG ((DEBUG_INFO, "OCAK: [FAIL] Failed to apply patch SetApfsTrimTimeout - %r\n", Status));
2937 } else {
2938 DEBUG ((DEBUG_INFO, "OCAK: [OK] Patch success SetApfsTrimTimeout\n"));
2939 }
2940
2941 return Status;
2942 }
2943
2944 DEBUG ((DEBUG_INFO, "OCAK: Skipping SetApfsTrimTimeout on macOS 12.0+\n"));
2945 return EFI_SUCCESS;
2946}
2947
2948//
2949// Quirks table.
2950//
2952 [KernelQuirkAppleCpuPmCfgLock] = { "com.apple.driver.AppleIntelCPUPowerManagement", PatchAppleCpuPmCfgLock },
2957 [KernelQuirkCustomSmbiosGuid1] = { "com.apple.driver.AppleSMBIOS", PatchCustomSmbiosGuid },
2958 [KernelQuirkCustomSmbiosGuid2] = { "com.apple.driver.AppleACPIPlatform", PatchCustomSmbiosGuid },
2959 [KernelQuirkDisableIoMapper] = { "com.apple.iokit.IOPCIFamily", PatchAppleIoMapperSupport },
2960 [KernelQuirkDisableIoMapperMapping] = { "com.apple.iokit.IOPCIFamily", PatchAppleIoMapperMapping },
2961 [KernelQuirkDisableRtcChecksum] = { "com.apple.driver.AppleRTC", PatchAppleRtcChecksum },
2962 [KernelQuirkDummyPowerManagement] = { "com.apple.driver.AppleIntelCPUPowerManagement", PatchDummyPowerManagement },
2963 [KernelQuirkExtendBTFeatureFlags] = { "com.apple.iokit.IOBluetoothFamily", PatchBTFeatureFlags },
2964 [KernelQuirkExternalDiskIcons] = { "com.apple.driver.AppleAHCIPort", PatchForceInternalDiskIcons },
2965 [KernelQuirkForceAquantiaEthernet] = { "com.apple.driver.AppleEthernetAquantiaAqtion", PatchAquantiaEthernet },
2966 [KernelQuirkForceSecureBootScheme] = { "com.apple.security.AppleImage4", PatchForceSecureBootScheme },
2967 [KernelQuirkIncreasePciBarSize] = { "com.apple.iokit.IOPCIFamily", PatchIncreasePciBarSize },
2973 [KernelQuirkSetApfsTrimTimeout] = { "com.apple.filesystems.apfs", PatchSetApfsTrimTimeout },
2974 [KernelQuirkThirdPartyDrives] = { "com.apple.iokit.IOAHCIBlockStorage", PatchThirdPartyDriveSupport },
2975 [KernelQuirkXhciPortLimit1] = { "com.apple.iokit.IOUSBHostFamily", PatchUsbXhciPortLimit1 },
2976 [KernelQuirkXhciPortLimit2] = { "com.apple.driver.usb.AppleUSBXHCI", PatchUsbXhciPortLimit2 },
2977 [KernelQuirkXhciPortLimit3] = { "com.apple.driver.usb.AppleUSBXHCIPCI", PatchUsbXhciPortLimit3 },
2978};
2979
2980EFI_STATUS
2982 IN KERNEL_QUIRK_NAME Name,
2983 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
2984 IN UINT32 KernelVersion
2985 )
2986{
2987 //
2988 // Patcher cannot be NULL for kernel patches, whose Identifier are NULL.
2989 //
2990 if (gKernelQuirks[Name].Identifier == NULL) {
2991 ASSERT (Patcher != NULL);
2992 }
2993
2994 return gKernelQuirks[Name].PatchFunction (Patcher, KernelVersion);
2995}
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 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
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:627
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