OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
OcAppleKernelLib.h
Go to the documentation of this file.
1
15#ifndef OC_APPLE_KERNEL_LIB_H
16#define OC_APPLE_KERNEL_LIB_H
17
19#include <Library/OcCpuLib.h>
20#include <Library/OcMachoLib.h>
21#include <Library/OcXmlLib.h>
22#include <Protocol/SimpleFileSystem.h>
23
24#define PRELINK_KERNEL_IDENTIFIER "__kernel__"
25#define PRELINK_KPI_IDENTIFIER_PREFIX "com.apple.kpi."
26
27#define PRELINK_INFO_SEGMENT "__PRELINK_INFO"
28#define PRELINK_INFO_SECTION "__info"
29#define PRELINK_TEXT_SEGMENT "__PRELINK_TEXT"
30#define PRELINK_TEXT_SECTION "__text"
31#define PRELINK_STATE_SEGMENT "__PRELINK_STATE"
32#define PRELINK_STATE_SECTION_KERNEL "__kernel"
33#define PRELINK_STATE_SECTION_KEXTS "__kexts"
34
35#define PRELINK_INFO_DICTIONARY_KEY "_PrelinkInfoDictionary"
36#define PRELINK_INFO_KMOD_INFO_KEY "_PrelinkKmodInfo"
37#define PRELINK_INFO_BUNDLE_PATH_KEY "_PrelinkBundlePath"
38#define PRELINK_INFO_EXECUTABLE_RELATIVE_PATH_KEY "_PrelinkExecutableRelativePath"
39#define PRELINK_INFO_EXECUTABLE_LOAD_ADDR_KEY "_PrelinkExecutableLoadAddr"
40#define PRELINK_INFO_EXECUTABLE_SOURCE_ADDR_KEY "_PrelinkExecutableSourceAddr"
41#define PRELINK_INFO_EXECUTABLE_SIZE_KEY "_PrelinkExecutableSize"
42#define PRELINK_INFO_LINK_STATE_ADDR_KEY "_PrelinkLinkState"
43#define PRELINK_INFO_LINK_STATE_SIZE_KEY "_PrelinkLinkStateSize"
44
45#define INFO_BUNDLE_IDENTIFIER_KEY "CFBundleIdentifier"
46#define INFO_BUNDLE_EXECUTABLE_KEY "CFBundleExecutable"
47#define INFO_BUNDLE_LIBRARIES_KEY "OSBundleLibraries"
48#define INFO_BUNDLE_LIBRARIES_64_KEY "OSBundleLibraries_x86_64"
49#define INFO_BUNDLE_VERSION_KEY "CFBundleVersion"
50#define INFO_BUNDLE_COMPATIBLE_VERSION_KEY "OSBundleCompatibleVersion"
51#define INFO_BUNDLE_OS_BUNDLE_REQUIRED_KEY "OSBundleRequired"
52
53#define OS_BUNDLE_REQUIRED_ROOT "Root"
54#define OS_BUNDLE_REQUIRED_SAFE_BOOT "Safe Boot"
55
56#define MKEXT_INFO_DICTIONARIES_KEY "_MKEXTInfoDictionaries"
57#define MKEXT_BUNDLE_PATH_KEY "_MKEXTBundlePath"
58#define MKEXT_EXECUTABLE_RELATIVE_PATH_KEY "_MKEXTExecutableRelativePath"
59#define MKEXT_EXECUTABLE_KEY "_MKEXTExecutable"
60
61#define PRELINK_INFO_INTEGER_ATTRIBUTES "size=\"64\""
62#define MKEXT_INFO_INTEGER_ATTRIBUTES "size=\"32\""
63
64#define KC_REGION_SEGMENT_PREFIX "__REGION"
65#define KC_REGION0_SEGMENT "__REGION0"
66#define KC_TEXT_SEGMENT "__TEXT"
67#define KC_LINKEDIT_SEGMENT "__LINKEDIT"
68#define KC_MOSCOW_SEGMENT "__MOSCOW101"
69
70//
71// Maximum allowed size of kext bundle version (CFBundleVersion) string.
72//
73#define MAX_INFO_BUNDLE_VERSION_KEY_SIZE 32
74
75//
76// Kernel cache types.
77//
84
85//
86// Macro to print kernel cache type.
87//
88#define PRINT_KERNEL_CACHE_TYPE(a) (\
89 (a) == CacheTypeCacheless ? "Cacheless" : \
90 ((a) == CacheTypeMkext ? "Mkext" : \
91 (((a) == CacheTypePrelinked ? "Prelinked" : "Kernel"))))
92
93//
94// As PageCount is UINT16, we can only index 2^16 * 4096 Bytes with one chain.
95//
96#define PRELINKED_KEXTS_MAX_SIZE (BIT16 * MACHO_PAGE_SIZE)
97
98//
99// Failsafe default for plist reserve allocation.
100//
101#define PRELINK_INFO_RESERVE_SIZE (5U * 1024U * 1024U)
102
103//
104// Size to reserve per kext for plist expansion.
105// Additional properties are added to prelinked and mkext v2, this should account for those.
106//
107#define PLIST_EXPANSION_SIZE 512
108
109//
110// Make integral kernel version (major, minor, revision).
111//
112#define KERNEL_VERSION(A, B, C) ((A) * 10000 + (B) * 100 + (C))
113
114//
115// Darwin versions for each release.
116//
117#define KERNEL_VERSION_TIGER 8
118#define KERNEL_VERSION_LEOPARD 9
119#define KERNEL_VERSION_SNOW_LEOPARD 10
120#define KERNEL_VERSION_LION 11
121#define KERNEL_VERSION_MOUNTAIN_LION 12
122#define KERNEL_VERSION_MAVERICKS 13
123#define KERNEL_VERSION_YOSEMITE 14
124#define KERNEL_VERSION_EL_CAPITAN 15
125#define KERNEL_VERSION_SIERRA 16
126#define KERNEL_VERSION_HIGH_SIERRA 17
127#define KERNEL_VERSION_MOJAVE 18
128#define KERNEL_VERSION_CATALINA 19
129#define KERNEL_VERSION_BIG_SUR 20
130#define KERNEL_VERSION_MONTEREY 21
131#define KERNEL_VERSION_VENTURA 22
132#define KERNEL_VERSION_SONOMA 23
133#define KERNEL_VERSION_SEQUOIA 24
134
135//
136// Minimum kernel versions for each release.
137//
138#define KERNEL_VERSION_TIGER_MIN KERNEL_VERSION (KERNEL_VERSION_TIGER, 0, 0)
139#define KERNEL_VERSION_LEOPARD_MIN KERNEL_VERSION (KERNEL_VERSION_LEOPARD, 0, 0)
140#define KERNEL_VERSION_SNOW_LEOPARD_MIN KERNEL_VERSION (KERNEL_VERSION_SNOW_LEOPARD, 0, 0)
141#define KERNEL_VERSION_LION_MIN KERNEL_VERSION (KERNEL_VERSION_LION, 0, 0)
142#define KERNEL_VERSION_MOUNTAIN_LION_MIN KERNEL_VERSION (KERNEL_VERSION_MOUNTAIN_LION, 0, 0)
143#define KERNEL_VERSION_MAVERICKS_MIN KERNEL_VERSION (KERNEL_VERSION_MAVERICKS, 0, 0)
144#define KERNEL_VERSION_YOSEMITE_MIN KERNEL_VERSION (KERNEL_VERSION_YOSEMITE, 0, 0)
145#define KERNEL_VERSION_EL_CAPITAN_MIN KERNEL_VERSION (KERNEL_VERSION_EL_CAPITAN, 0, 0)
146#define KERNEL_VERSION_SIERRA_MIN KERNEL_VERSION (KERNEL_VERSION_SIERRA, 0, 0)
147#define KERNEL_VERSION_HIGH_SIERRA_MIN KERNEL_VERSION (KERNEL_VERSION_HIGH_SIERRA, 0, 0)
148#define KERNEL_VERSION_MOJAVE_MIN KERNEL_VERSION (KERNEL_VERSION_MOJAVE, 0, 0)
149#define KERNEL_VERSION_CATALINA_MIN KERNEL_VERSION (KERNEL_VERSION_CATALINA, 0, 0)
150#define KERNEL_VERSION_BIG_SUR_MIN KERNEL_VERSION (KERNEL_VERSION_BIG_SUR, 0, 0)
151#define KERNEL_VERSION_MONTEREY_MIN KERNEL_VERSION (KERNEL_VERSION_MONTEREY, 0, 0)
152#define KERNEL_VERSION_VENTURA_MIN KERNEL_VERSION (KERNEL_VERSION_VENTURA, 0, 0)
153#define KERNEL_VERSION_SONOMA_MIN KERNEL_VERSION (KERNEL_VERSION_SONOMA, 0, 0)
154#define KERNEL_VERSION_SEQUOIA_MIN KERNEL_VERSION (KERNEL_VERSION_SEQUOIA, 0, 0)
155
156//
157// Maximum kernel versions for each release.
158//
159#define KERNEL_VERSION_TIGER_MAX (KERNEL_VERSION_LEOPARD_MIN - 1)
160#define KERNEL_VERSION_LEOPARD_MAX (KERNEL_VERSION_SNOW_LEOPARD_MIN - 1)
161#define KERNEL_VERSION_SNOW_LEOPARD_MAX (KERNEL_VERSION_LION_MIN - 1)
162#define KERNEL_VERSION_LION_MAX (KERNEL_VERSION_MOUNTAIN_LION_MIN - 1)
163#define KERNEL_VERSION_MOUNTAIN_LION_MAX (KERNEL_VERSION_MAVERICKS_MIN - 1)
164#define KERNEL_VERSION_MAVERICKS_MAX (KERNEL_VERSION_YOSEMITE_MIN - 1)
165#define KERNEL_VERSION_YOSEMITE_MAX (KERNEL_VERSION_EL_CAPITAN_MIN - 1)
166#define KERNEL_VERSION_EL_CAPITAN_MAX (KERNEL_VERSION_SIERRA_MIN - 1)
167#define KERNEL_VERSION_SIERRA_MAX (KERNEL_VERSION_HIGH_SIERRA_MIN - 1)
168#define KERNEL_VERSION_HIGH_SIERRA_MAX (KERNEL_VERSION_MOJAVE_MIN - 1)
169#define KERNEL_VERSION_MOJAVE_MAX (KERNEL_VERSION_CATALINA_MIN - 1)
170#define KERNEL_VERSION_CATALINA_MAX (KERNEL_VERSION_BIG_SUR_MIN - 1)
171#define KERNEL_VERSION_BIG_SUR_MAX (KERNEL_VERSION_MONTEREY_MIN - 1)
172#define KERNEL_VERSION_MONTEREY_MAX (KERNEL_VERSION_VENTURA_MIN - 1)
173#define KERNEL_VERSION_VENTURA_MAX (KERNEL_VERSION_SONOMA_MIN - 1)
174#define KERNEL_VERSION_SONOMA_MAX (KERNEL_VERSION_SEQUOIA_MIN - 1)
175
176//
177// Prelinked context used for kernel modification.
178//
179typedef struct {
180 //
181 // Current version of prelinkedkernel. It takes a reference of user-allocated
182 // memory block from pool, and grows if needed.
183 //
184 UINT8 *Prelinked;
185 //
186 // Exportable prelinkedkernel size, i.e. the payload size. Also references user field.
187 //
189 //
190 // Currently allocated prelinkedkernel size, used for reduced rellocations.
191 //
193 //
194 // Current last virtual address (kext source files and plist are put here).
195 //
197 //
198 // Current last virtual load address (kexts are loaded here after kernel startup).
199 //
201 //
202 // Mach-O context for prelinkedkernel.
203 //
205 //
206 // Pointer to PRELINK_INFO_SEGMENT.
207 //
209 //
210 // Pointer to PRELINK_INFO_SECTION.
211 //
213 //
214 // Pointer to PRELINK_TEXT_SEGMENT (for prelinkedkernel, NULL for KC).
215 // As of macOS 13 Developer Beta 3, this segment may have corrupted
216 // information.
217 //
219 //
220 // Pointer to PRELINK_TEXT_SECTION.
221 //
223 //
224 // Pointer to PRELINK_STATE_SEGMENT (for 10.6.8).
225 //
227 //
228 // Pointer to PRELINK_STATE_SECTION_KERNEL (for 10.6.8).
229 //
231 //
232 // Pointer to PRELINK_STATE_SECTION_KEXTS (for 10.6.8).
233 //
235 //
236 // Contents of PRELINK_STATE_SECTION_KERNEL section (for 10.6.8).
237 //
239 //
240 // Contents of PRELINK_STATE_SECTION_KEXTS (for 10.6.8).
241 //
243 //
244 // PRELINK_STATE_SECTION_KEXTS original load address.
245 //
247 //
248 // PRELINK_STATE_SECTION_KERNEL section size (for 10.6.8).
249 //
251 //
252 // PRELINK_STATE_SECTION_KEXTS section size (for 10.6.8).
253 //
255 //
256 // Pointer to KC_LINKEDIT_SEGMENT (for KC mode).
257 //
259 //
260 // Pointer to KC_REGION0_SEGMENT (for KC mode).
261 //
263 //
264 // Mach-O context for inner prelinkedkernel (for KC mode).
265 //
267 //
268 // Pointer to PRELINK_INFO_SEGMENT in the inner prelinkedkernel.
269 //
271 //
272 // Pointer to PRELINK_INFO_SECTION in the inner prelinkedkernel.
273 //
275 //
276 // Copy of prelinkedkernel PRELINK_INFO_SECTION used for XML_DOCUMENT.
277 // Freed upon context destruction.
278 //
280 //
281 // Parsed instance of PlistInfo. New entries are added here.
282 //
284 //
285 // Reference for PRELINK_INFO_DICTIONARY_KEY in PlistDocument.
286 // This reference is used for quick path during kext injection.
287 //
289 //
290 // Plist scratch buffer used when updating values.
291 //
293 //
294 // Buffers allocated from pool for internal needs.
295 //
297 //
298 // Currently used pooled buffers.
299 //
301 //
302 // Currently allocated pooled buffers. PooledBuffersAllocCount >= PooledBuffersCount.
303 //
307 //
308 // Used for caching all prelinked kexts.
309 // I.e. this contains kernel, injected kexts, and kexts used as dependencies.
310 //
311 LIST_ENTRY PrelinkedKexts;
312 //
313 // Used for caching prelinked kexts, which we inject.
314 // This is a sublist of PrelinkedKexts.
315 //
316 LIST_ENTRY InjectedKexts;
317 //
318 // Whether this kernel is a kernel collection (used by macOS 11.0+).
319 //
321 //
322 // Kext segment file location for kernel collection.
323 //
325 //
326 // Kext segment memory location for kernel collection.
327 //
329 //
330 // Kext fixup chain for kernel collection.
331 //
333 //
334 // Kernel virtual base.
335 //
337 //
338 // Prelinked is 32-bit.
339 //
340 BOOLEAN Is32Bit;
342
343//
344// Kernel and kext patching context.
345//
346typedef struct {
347 //
348 // Mach-O context for patched binary.
349 //
351 //
352 // Virtual base of text segment.
353 //
355 //
356 // File offset.
357 //
359 //
360 // Virtual kmod_info_t address.
361 //
363 //
364 // Pointer to KXLD state (read only, it is allocated in PrelinkedStateKexts).
365 //
366 CONST VOID *KxldState;
367 //
368 // Pointer to KXLD state (read only, it is allocated in PrelinkedStateKexts).
369 //
371 //
372 // Binary is 32-bit.
373 //
374 BOOLEAN Is32Bit;
375 //
376 // Patcher context is contained within a kernel collection.
377 //
380
381//
382// Kernel and kext patch description.
383//
384typedef struct {
385 //
386 // Comment or NULL.
387 //
388 CONST CHAR8 *Comment;
389 //
390 // Symbol base or NULL (0 base is used then).
391 //
392 CONST CHAR8 *Base;
393 //
394 // Find bytes or NULL (data is written to base then).
395 //
396 CONST UINT8 *Find;
397 //
398 // Replace bytes.
399 //
400 CONST UINT8 *Replace;
401 //
402 // Find mask or NULL.
403 //
404 CONST UINT8 *Mask;
405 //
406 // Replace mask or NULL.
407 //
408 CONST UINT8 *ReplaceMask;
409 //
410 // Patch size.
411 //
412 UINT32 Size;
413 //
414 // Replace count or 0 for all.
415 //
416 UINT32 Count;
417 //
418 // Skip count or 0 to start from 1 match.
419 //
420 UINT32 Skip;
421 //
422 // Limit replacement size to this value or 0, which assumes table size.
423 //
424 UINT32 Limit;
426
427//
428// Context for cacheless boot (S/L/E).
429//
430typedef struct {
431 //
432 // Extensions directory EFI_FILE_PROTOCOL instance.
433 //
434 EFI_FILE_PROTOCOL *ExtensionsDir;
435 //
436 // Extensions directory filename. This is freed by the caller.
437 //
439 //
440 // List of injected kexts.
441 //
442 LIST_ENTRY InjectedKexts;
443 //
444 // List of dependencies that need to be injected.
445 //
447 //
448 // List of kext patches for built-in shipping kexts.
449 //
450 LIST_ENTRY PatchedKexts;
451 //
452 // List of built-in shipping kexts.
453 //
454 LIST_ENTRY BuiltInKexts;
455 //
456 // Current kernel version.
457 //
459 //
460 // System is booting in 32-bit mode.
461 //
462 BOOLEAN Is32Bit;
463 //
464 // Flag to indicate if above list is valid. List is built during the first read from SLE.
465 //
468
469//
470// Mkext context.
471//
472typedef struct {
473 //
474 // Current version of mkext. It takes a reference of user-allocated
475 // memory block from pool, and grows if needed.
476 //
477 UINT8 *Mkext;
478 //
479 // Exportable mkext size, i.e. the payload size. Also references user field.
480 //
481 UINT32 MkextSize;
482 //
483 // Currently allocated mkext size, used for reduced rellocations.
484 //
486 //
487 // Mkext header.
488 //
490 //
491 // Version.
492 //
494 //
495 // CPU type.
496 //
497 BOOLEAN Is32Bit;
498 //
499 // Current number of kexts.
500 //
501 UINT32 NumKexts;
502 //
503 // Max kexts for allocation.
504 //
506 //
507 // Offset of mkext plist.
508 //
510 //
511 // Copy of mkext plist used for XML_DOCUMENT.
512 // Freed upon context destruction.
513 //
514 UINT8 *MkextInfo;
515 //
516 // Parsed instance of mkext plist. New entries are added here.
517 //
519 //
520 // Array of kexts.
521 //
523 //
524 // List of cached kexts, used for patching and blocking.
525 //
526 LIST_ENTRY CachedKexts;
528
529//
530// Kernel quirk names.
531//
532typedef enum {
533 //
534 // Apply MSR E2 patches to AppleIntelCPUPowerManagement kext.
535 //
537 //
538 // Apply MSR E2 patches to XNU kernel (XCPM).
539 //
541 //
542 // Apply extra MSR patches to XNU kernel (XCPM).
543 //
545 //
546 // Apply max MSR_IA32_PERF_CONTROL patches to XNU kernel (XCPM).
547 //
549 //
550 // Apply regiser base change patch for customised PCI serial device to XNU.
551 //
553 //
554 // Apply custom AppleSMBIOS kext GUID patch for Custom UpdateSMBIOSMode.
555 //
558 //
559 // Apply VT-d disabling patches to IOPCIFamily kext to disable IOMapper in macOS.
560 //
562 //
563 // Disable mapping PCI bridge device memory in IOMMU (VT-d) to resolve compatibility issues.
564 //
566 //
567 // Disable AppleRTC checksum writing.
568 //
570 //
571 // Apply dummy power management patches to AppleIntelCPUPowerManagement in macOS.
572 //
574 //
575 // Apply feature flags patches to IOBluetoothFamily kext to ensure full Bluetooth functionality.
576 //
578 //
579 // Apply icon type patches to IOAHCIPort kext to force internal disk icons.
580 //
582 //
583 // Enable Aquantia AQtion AQC-107s support.
584 //
586 //
587 // Force SecureBoot support for all CPUs.
588 //
590 //
591 // Apply PCI bar size patches to IOPCIFamily kext for compatibility with select configuration.
592 //
594 //
595 // Disable LAPIC interrupt kernel panic on AP cores.
596 //
598 //
599 // Replace the 64-bit commpage bcopy implementation with one that does not use SSSE3.
600 //
602 //
603 // Apply kernel patches to remove kext dumping in the panic log.
604 //
606 //
607 // Disable power state change timeout kernel panic (10.15+).
608 //
610 //
611 // Remove kernel __LINKEDIT jetisson.
612 //
614 //
615 // Set custom APFS trim timeout.
616 //
618 //
619 // Apply vendor patches to IOAHCIFamily kext to enable native features for third-party drives,
620 // such as TRIM on SSDs or hibernation support on 10.15.
621 //
623 //
624 // Apply port limit patches to AppleUSBXHCI and AppleUSBXHCIPCI kexts.
625 //
629
632
641typedef
642EFI_STATUS
644 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
645 IN UINT32 KernelVersion
646 );
647
648//
649// Kernel quirk.
650//
651typedef struct {
652 //
653 // Target bundle identifier. NULL for kernel.
654 //
655 CONST CHAR8 *Identifier;
656 //
657 // Quirk patch function.
658 //
661
671EFI_STATUS
673 IN KERNEL_QUIRK_NAME Name,
674 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
675 IN UINT32 KernelVersion
676 );
677
694EFI_STATUS
696 IN EFI_FILE_PROTOCOL *File,
697 IN BOOLEAN Prefer32Bit,
698 OUT BOOLEAN *Is32Bit,
699 OUT UINT8 **Kernel,
700 OUT UINT32 *KernelSize,
701 OUT UINT32 *AllocatedSize,
702 IN UINT32 ReservedSize,
703 OUT UINT8 *Digest OPTIONAL
704 );
705
721EFI_STATUS
723 IN EFI_FILE_PROTOCOL *File,
724 IN BOOLEAN Prefer32Bit,
725 OUT UINT8 **Mkext,
726 OUT UINT32 *MkextSize,
727 OUT UINT32 *AllocatedSize,
728 IN UINT32 ReservedSize,
729 IN UINT32 NumReservedKexts
730 );
731
740UINT32
742 IN CONST CHAR8 *String
743 );
744
753UINT32
755 IN CONST UINT8 *Kernel,
756 IN UINT32 KernelSize
757 );
758
769BOOLEAN
771 IN UINT32 CurrentVersion OPTIONAL,
772 IN UINT32 MinVersion OPTIONAL,
773 IN UINT32 MaxVersion OPTIONAL
774 );
775
789EFI_STATUS
791 IN OUT PRELINKED_CONTEXT *Context,
792 IN OUT UINT8 *Prelinked,
793 IN UINT32 PrelinkedSize,
794 IN UINT32 PrelinkedAllocSize,
795 IN BOOLEAN Is32Bit
796 );
797
803VOID
805 IN OUT PRELINKED_CONTEXT *Context
806 );
807
817EFI_STATUS
819 IN OUT PRELINKED_CONTEXT *Context,
820 IN VOID *Buffer
821 );
822
833EFI_STATUS
835 IN OUT PRELINKED_CONTEXT *Context,
836 IN UINT32 LinkedExpansion,
837 IN UINT32 ReservedExeSize
838 );
839
847EFI_STATUS
849 IN OUT PRELINKED_CONTEXT *Context
850 );
851
864EFI_STATUS
866 IN OUT UINT32 *ReservedInfoSize,
867 IN OUT UINT32 *ReservedExeSize,
868 IN UINT32 InfoPlistSize,
869 IN UINT8 *Executable OPTIONAL,
870 IN UINT32 ExecutableSize OPTIONAL,
871 IN BOOLEAN Is32Bit
872 );
873
890EFI_STATUS
892 IN OUT PRELINKED_CONTEXT *Context,
893 IN CONST CHAR8 *Identifier OPTIONAL,
894 IN CONST CHAR8 *BundlePath,
895 IN CONST CHAR8 *InfoPlist,
896 IN UINT32 InfoPlistSize,
897 IN CONST CHAR8 *ExecutablePath OPTIONAL,
898 IN OUT CONST UINT8 *Executable OPTIONAL,
899 IN UINT32 ExecutableSize OPTIONAL,
900 OUT CHAR8 BundleVersion[MAX_INFO_BUNDLE_VERSION_KEY_SIZE] OPTIONAL
901 );
902
912EFI_STATUS
914 IN OUT PRELINKED_CONTEXT *Context,
915 IN CONST CHAR8 *Identifier,
916 IN PATCHER_GENERIC_PATCH *Patch
917 );
918
928EFI_STATUS
930 IN OUT PRELINKED_CONTEXT *Context,
931 IN KERNEL_QUIRK_NAME Quirk,
932 IN UINT32 KernelVersion
933 );
934
944EFI_STATUS
946 IN OUT PRELINKED_CONTEXT *Context,
947 IN CONST CHAR8 *Identifier,
948 IN BOOLEAN Exclude
949 );
950
958EFI_STATUS
960 IN OUT PRELINKED_CONTEXT *Context
961 );
962
972UINT32
974 IN UINT32 SegmentSize
975 );
976
985EFI_STATUS
987 IN OUT PRELINKED_CONTEXT *Context,
988 IN UINT32 SegChainSize,
989 IN UINT32 ReservedSize
990 );
991
1000VOID
1002 IN OUT PRELINKED_CONTEXT *Context,
1003 IN OC_MACHO_CONTEXT *MachContext
1004 );
1005
1015UINT32
1017 IN PRELINKED_CONTEXT *Context,
1018 IN UINT64 SourceAddress
1019 );
1020
1031EFI_STATUS
1033 IN PRELINKED_CONTEXT *PrelinkedContext,
1034 IN OUT OC_MACHO_CONTEXT *Context,
1035 IN UINT32 Delta
1036 );
1037
1046UINT64
1048 IN UINT64 Value,
1049 IN CONST CHAR8 *Name OPTIONAL
1050 );
1051
1061EFI_STATUS
1063 IN OUT PATCHER_CONTEXT *Context,
1064 IN OUT PRELINKED_CONTEXT *Prelinked,
1065 IN CONST CHAR8 *Name
1066 );
1067
1077EFI_STATUS
1079 IN OUT PATCHER_CONTEXT *Context,
1080 IN OUT MKEXT_CONTEXT *Mkext,
1081 IN CONST CHAR8 *Name
1082 );
1083
1094EFI_STATUS
1096 IN OUT PATCHER_CONTEXT *Context,
1097 IN OUT UINT8 *Buffer,
1098 IN UINT32 BufferSize,
1099 IN BOOLEAN Use32Bit
1100 );
1101
1111EFI_STATUS
1113 IN OUT PATCHER_CONTEXT *Context,
1114 IN CONST CHAR8 *Name,
1115 IN OUT UINT8 **Address
1116 );
1117
1127EFI_STATUS
1129 IN OUT PATCHER_CONTEXT *Context,
1130 IN CONST CHAR8 *Name,
1131 IN OUT UINT64 *Value
1132 );
1133
1144EFI_STATUS
1146 IN OUT PATCHER_CONTEXT *Context,
1147 IN CONST CHAR8 *Name,
1148 IN OUT UINT8 **Address,
1149 IN OUT UINT64 *Value
1150 );
1151
1160EFI_STATUS
1162 IN OUT PATCHER_CONTEXT *Context,
1163 IN PATCHER_GENERIC_PATCH *Patch
1164 );
1165
1175EFI_STATUS
1177 IN CONST CHAR8 *Identifier,
1178 IN OUT PATCHER_CONTEXT *PatcherContext,
1179 IN OUT PRELINKED_CONTEXT *PrelinkedContext
1180 );
1181
1190EFI_STATUS
1192 IN OUT MKEXT_CONTEXT *MkextContext,
1193 IN CONST CHAR8 *Identifier
1194 );
1195
1203EFI_STATUS
1205 IN OUT PATCHER_CONTEXT *Context
1206 );
1207
1218BOOLEAN
1220 IN OC_MACHO_CONTEXT *ExecutableContext,
1221 IN UINT64 LoadAddress,
1222 IN UINT32 Size,
1223 OUT UINT64 *Kmod
1224 );
1225
1231VOID
1233 IN UINT32 Timeout
1234 );
1235
1242VOID
1244 IN UINTN RegisterBase,
1245 IN UINT32 RegisterStride
1246 );
1247
1259EFI_STATUS
1261 IN OUT PATCHER_CONTEXT *Patcher,
1262 IN OC_CPU_INFO *CpuInfo,
1263 IN UINT32 *Data,
1264 IN UINT32 *DataMask,
1265 IN UINT32 KernelVersion
1266 );
1267
1277EFI_STATUS
1279 IN OUT PATCHER_CONTEXT *Patcher,
1280 IN OC_CPU_INFO *CpuInfo,
1281 IN UINT32 KernelVersion
1282 );
1283
1296EFI_STATUS
1298 IN OUT CACHELESS_CONTEXT *Context,
1299 IN CONST CHAR16 *FileName,
1300 IN EFI_FILE_PROTOCOL *ExtensionsDir,
1301 IN UINT32 KernelVersion,
1302 IN BOOLEAN Is32Bit
1303 );
1304
1312VOID
1314 IN OUT CACHELESS_CONTEXT *Context
1315 );
1316
1329EFI_STATUS
1331 IN OUT CACHELESS_CONTEXT *Context,
1332 IN CONST CHAR8 *InfoPlist,
1333 IN UINT32 InfoPlistSize,
1334 IN UINT8 *Executable OPTIONAL,
1335 IN UINT32 ExecutableSize OPTIONAL,
1336 OUT CHAR8 BundleVersion[MAX_INFO_BUNDLE_VERSION_KEY_SIZE] OPTIONAL
1337 );
1338
1347EFI_STATUS
1349 IN OUT CACHELESS_CONTEXT *Context,
1350 IN CONST CHAR8 *Identifier
1351 );
1352
1362EFI_STATUS
1364 IN OUT CACHELESS_CONTEXT *Context,
1365 IN CONST CHAR8 *Identifier,
1366 IN PATCHER_GENERIC_PATCH *Patch
1367 );
1368
1377EFI_STATUS
1379 IN OUT CACHELESS_CONTEXT *Context,
1380 IN KERNEL_QUIRK_NAME Quirk
1381 );
1382
1392EFI_STATUS
1394 IN OUT CACHELESS_CONTEXT *Context,
1395 IN CONST CHAR8 *Identifier,
1396 IN BOOLEAN Exclude
1397 );
1398
1407EFI_STATUS
1409 IN OUT CACHELESS_CONTEXT *Context,
1410 OUT EFI_FILE_PROTOCOL **File
1411 );
1412
1422EFI_STATUS
1424 IN OUT CACHELESS_CONTEXT *Context,
1425 IN CONST CHAR16 *FileName,
1426 OUT EFI_FILE_PROTOCOL **VirtualFile
1427 );
1428
1439EFI_STATUS
1441 IN OUT CACHELESS_CONTEXT *Context,
1442 IN CONST CHAR16 *FileName,
1443 IN EFI_FILE_PROTOCOL *File,
1444 OUT EFI_FILE_PROTOCOL **VirtualFile
1445 );
1446
1462EFI_STATUS
1464 IN CONST UINT8 *Buffer,
1465 IN UINT32 BufferSize,
1466 IN UINT32 NumReservedKexts,
1467 IN OUT UINT8 *OutBuffer OPTIONAL,
1468 IN UINT32 OutBufferSize OPTIONAL,
1469 IN OUT UINT32 *OutMkextSize
1470 );
1471
1481BOOLEAN
1483 IN UINT8 *Mkext,
1484 IN UINT32 MkextSize,
1485 IN MACH_CPU_TYPE CpuType
1486 );
1487
1503EFI_STATUS
1505 IN OUT MKEXT_CONTEXT *Context,
1506 IN OUT UINT8 *Mkext,
1507 IN UINT32 MkextSize,
1508 IN UINT32 MkextAllocSize
1509 );
1510
1516VOID
1518 IN OUT MKEXT_CONTEXT *Context
1519 );
1520
1533EFI_STATUS
1535 IN OUT UINT32 *ReservedInfoSize,
1536 IN OUT UINT32 *ReservedExeSize,
1537 IN UINT32 InfoPlistSize,
1538 IN UINT8 *Executable OPTIONAL,
1539 IN UINT32 ExecutableSize OPTIONAL,
1540 IN BOOLEAN Is32Bit
1541 );
1542
1558EFI_STATUS
1560 IN OUT MKEXT_CONTEXT *Context,
1561 IN CONST CHAR8 *Identifier OPTIONAL,
1562 IN CONST CHAR8 *BundlePath,
1563 IN CONST CHAR8 *InfoPlist,
1564 IN UINT32 InfoPlistSize,
1565 IN UINT8 *Executable OPTIONAL,
1566 IN UINT32 ExecutableSize OPTIONAL,
1567 OUT CHAR8 BundleVersion[MAX_INFO_BUNDLE_VERSION_KEY_SIZE] OPTIONAL
1568 );
1569
1579EFI_STATUS
1581 IN OUT MKEXT_CONTEXT *Context,
1582 IN CONST CHAR8 *Identifier,
1583 IN PATCHER_GENERIC_PATCH *Patch
1584 );
1585
1595EFI_STATUS
1597 IN OUT MKEXT_CONTEXT *Context,
1598 IN KERNEL_QUIRK_NAME Quirk,
1599 IN UINT32 KernelVersion
1600 );
1601
1611EFI_STATUS
1613 IN OUT MKEXT_CONTEXT *Context,
1614 IN CONST CHAR8 *Identifier,
1615 IN BOOLEAN Exclude
1616 );
1617
1626EFI_STATUS
1628 IN OUT MKEXT_CONTEXT *Context
1629 );
1630
1631#endif // OC_APPLE_KERNEL_LIB_H
INT32 MACH_CPU_TYPE
STATIC UINT32 KernelVersion
Definition KextInject.c:28
DMG_SIZE_DEVICE_PATH Size
VOID CachelessContextFree(IN OUT CACHELESS_CONTEXT *Context)
EFI_STATUS PrelinkedContextApplyPatch(IN OUT PRELINKED_CONTEXT *Context, IN CONST CHAR8 *Identifier, IN PATCHER_GENERIC_PATCH *Patch)
EFI_STATUS KcRebuildMachHeader(IN OUT PRELINKED_CONTEXT *Context)
EFI_STATUS PatcherGetSymbolValue(IN OUT PATCHER_CONTEXT *Context, IN CONST CHAR8 *Name, IN OUT UINT64 *Value)
UINT32 KcGetKextSize(IN PRELINKED_CONTEXT *Context, IN UINT64 SourceAddress)
EFI_STATUS CachelessContextHookBuiltin(IN OUT CACHELESS_CONTEXT *Context, IN CONST CHAR16 *FileName, IN EFI_FILE_PROTOCOL *File, OUT EFI_FILE_PROTOCOL **VirtualFile)
EFI_STATUS ReadAppleKernel(IN EFI_FILE_PROTOCOL *File, IN BOOLEAN Prefer32Bit, OUT BOOLEAN *Is32Bit, OUT UINT8 **Kernel, OUT UINT32 *KernelSize, OUT UINT32 *AllocatedSize, IN UINT32 ReservedSize, OUT UINT8 *Digest OPTIONAL)
EFI_STATUS MkextContextApplyQuirk(IN OUT MKEXT_CONTEXT *Context, IN KERNEL_QUIRK_NAME Quirk, IN UINT32 KernelVersion)
enum KERNEL_CACHE_TYPE_ KERNEL_CACHE_TYPE
VOID PatchSetApfsTimeout(IN UINT32 Timeout)
EFI_STATUS PatcherBlockKext(IN OUT PATCHER_CONTEXT *Context)
VOID PrelinkedContextFree(IN OUT PRELINKED_CONTEXT *Context)
EFI_STATUS PatcherGetSymbolAddressValue(IN OUT PATCHER_CONTEXT *Context, IN CONST CHAR8 *Name, IN OUT UINT8 **Address, IN OUT UINT64 *Value)
EFI_STATUS PrelinkedDependencyInsert(IN OUT PRELINKED_CONTEXT *Context, IN VOID *Buffer)
EFI_STATUS CachelessContextPerformInject(IN OUT CACHELESS_CONTEXT *Context, IN CONST CHAR16 *FileName, OUT EFI_FILE_PROTOCOL **VirtualFile)
EFI_STATUS KERNEL_QUIRK_PATCH_FUNCTION(IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion)
EFI_STATUS PatcherInitContextFromMkext(IN OUT PATCHER_CONTEXT *Context, IN OUT MKEXT_CONTEXT *Mkext, IN CONST CHAR8 *Name)
EFI_STATUS PatcherExcludePrelinkedKext(IN CONST CHAR8 *Identifier, IN OUT PATCHER_CONTEXT *PatcherContext, IN OUT PRELINKED_CONTEXT *PrelinkedContext)
EFI_STATUS PrelinkedContextInit(IN OUT PRELINKED_CONTEXT *Context, IN OUT UINT8 *Prelinked, IN UINT32 PrelinkedSize, IN UINT32 PrelinkedAllocSize, IN BOOLEAN Is32Bit)
EFI_STATUS KernelApplyQuirk(IN KERNEL_QUIRK_NAME Name, IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion)
EFI_STATUS PrelinkedInjectPrepare(IN OUT PRELINKED_CONTEXT *Context, IN UINT32 LinkedExpansion, IN UINT32 ReservedExeSize)
EFI_STATUS MkextContextBlock(IN OUT MKEXT_CONTEXT *Context, IN CONST CHAR8 *Identifier, IN BOOLEAN Exclude)
EFI_STATUS PrelinkedContextBlock(IN OUT PRELINKED_CONTEXT *Context, IN CONST CHAR8 *Identifier, IN BOOLEAN Exclude)
EFI_STATUS MkextInjectPatchComplete(IN OUT MKEXT_CONTEXT *Context)
VOID PatchSetPciSerialDevice(IN UINTN RegisterBase, IN UINT32 RegisterStride)
EFI_STATUS PatcherExcludeMkextKext(IN OUT MKEXT_CONTEXT *MkextContext, IN CONST CHAR8 *Identifier)
EFI_STATUS MkextReserveKextSize(IN OUT UINT32 *ReservedInfoSize, IN OUT UINT32 *ReservedExeSize, IN UINT32 InfoPlistSize, IN UINT8 *Executable OPTIONAL, IN UINT32 ExecutableSize OPTIONAL, IN BOOLEAN Is32Bit)
BOOLEAN MkextCheckCpuType(IN UINT8 *Mkext, IN UINT32 MkextSize, IN MACH_CPU_TYPE CpuType)
EFI_STATUS CachelessContextInit(IN OUT CACHELESS_CONTEXT *Context, IN CONST CHAR16 *FileName, IN EFI_FILE_PROTOCOL *ExtensionsDir, IN UINT32 KernelVersion, IN BOOLEAN Is32Bit)
EFI_STATUS PatcherGetSymbolAddress(IN OUT PATCHER_CONTEXT *Context, IN CONST CHAR8 *Name, IN OUT UINT8 **Address)
#define MAX_INFO_BUNDLE_VERSION_KEY_SIZE
EFI_STATUS CachelessContextAddQuirk(IN OUT CACHELESS_CONTEXT *Context, IN KERNEL_QUIRK_NAME Quirk)
VOID KcKextIndexFixups(IN OUT PRELINKED_CONTEXT *Context, IN OC_MACHO_CONTEXT *MachContext)
EFI_STATUS ReadAppleMkext(IN EFI_FILE_PROTOCOL *File, IN BOOLEAN Prefer32Bit, OUT UINT8 **Mkext, OUT UINT32 *MkextSize, OUT UINT32 *AllocatedSize, IN UINT32 ReservedSize, IN UINT32 NumReservedKexts)
EFI_STATUS MkextContextApplyPatch(IN OUT MKEXT_CONTEXT *Context, IN CONST CHAR8 *Identifier, IN PATCHER_GENERIC_PATCH *Patch)
EFI_STATUS CachelessContextAddKext(IN OUT CACHELESS_CONTEXT *Context, IN CONST CHAR8 *InfoPlist, IN UINT32 InfoPlistSize, IN UINT8 *Executable OPTIONAL, IN UINT32 ExecutableSize OPTIONAL, OUT CHAR8 BundleVersion[MAX_INFO_BUNDLE_VERSION_KEY_SIZE] OPTIONAL)
EFI_STATUS CachelessContextForceKext(IN OUT CACHELESS_CONTEXT *Context, IN CONST CHAR8 *Identifier)
BOOLEAN OcMatchDarwinVersion(IN UINT32 CurrentVersion OPTIONAL, IN UINT32 MinVersion OPTIONAL, IN UINT32 MaxVersion OPTIONAL)
EFI_STATUS PrelinkedContextApplyQuirk(IN OUT PRELINKED_CONTEXT *Context, IN KERNEL_QUIRK_NAME Quirk, IN UINT32 KernelVersion)
VOID MkextContextFree(IN OUT MKEXT_CONTEXT *Context)
EFI_STATUS PrelinkedReserveKextSize(IN OUT UINT32 *ReservedInfoSize, IN OUT UINT32 *ReservedExeSize, IN UINT32 InfoPlistSize, IN UINT8 *Executable OPTIONAL, IN UINT32 ExecutableSize OPTIONAL, IN BOOLEAN Is32Bit)
EFI_STATUS PrelinkedInjectKext(IN OUT PRELINKED_CONTEXT *Context, IN CONST CHAR8 *Identifier OPTIONAL, IN CONST CHAR8 *BundlePath, IN CONST CHAR8 *InfoPlist, IN UINT32 InfoPlistSize, IN CONST CHAR8 *ExecutablePath OPTIONAL, IN OUT CONST UINT8 *Executable OPTIONAL, IN UINT32 ExecutableSize OPTIONAL, OUT CHAR8 BundleVersion[MAX_INFO_BUNDLE_VERSION_KEY_SIZE] OPTIONAL)
EFI_STATUS CachelessContextOverlayExtensionsDir(IN OUT CACHELESS_CONTEXT *Context, OUT EFI_FILE_PROTOCOL **File)
EFI_STATUS PatcherApplyGenericPatch(IN OUT PATCHER_CONTEXT *Context, IN PATCHER_GENERIC_PATCH *Patch)
EFI_STATUS MkextContextInit(IN OUT MKEXT_CONTEXT *Context, IN OUT UINT8 *Mkext, IN UINT32 MkextSize, IN UINT32 MkextAllocSize)
EFI_STATUS MkextInjectKext(IN OUT MKEXT_CONTEXT *Context, IN CONST CHAR8 *Identifier OPTIONAL, IN CONST CHAR8 *BundlePath, IN CONST CHAR8 *InfoPlist, IN UINT32 InfoPlistSize, IN UINT8 *Executable OPTIONAL, IN UINT32 ExecutableSize OPTIONAL, OUT CHAR8 BundleVersion[MAX_INFO_BUNDLE_VERSION_KEY_SIZE] OPTIONAL)
EFI_STATUS KcInitKextFixupChains(IN OUT PRELINKED_CONTEXT *Context, IN UINT32 SegChainSize, IN UINT32 ReservedSize)
EFI_STATUS PatchProvideCurrentCpuInfo(IN OUT PATCHER_CONTEXT *Patcher, IN OC_CPU_INFO *CpuInfo, IN UINT32 KernelVersion)
KERNEL_CACHE_TYPE_
@ CacheTypeMkext
@ CacheTypeNone
@ CacheTypePrelinked
@ CacheTypeCacheless
EFI_STATUS MkextDecompress(IN CONST UINT8 *Buffer, IN UINT32 BufferSize, IN UINT32 NumReservedKexts, IN OUT UINT8 *OutBuffer OPTIONAL, IN UINT32 OutBufferSize OPTIONAL, IN OUT UINT32 *OutMkextSize)
UINT32 OcKernelReadDarwinVersion(IN CONST UINT8 *Kernel, IN UINT32 KernelSize)
UINT32 OcParseDarwinVersion(IN CONST CHAR8 *String)
EFI_STATUS CachelessContextAddPatch(IN OUT CACHELESS_CONTEXT *Context, IN CONST CHAR8 *Identifier, IN PATCHER_GENERIC_PATCH *Patch)
EFI_STATUS CachelessContextBlock(IN OUT CACHELESS_CONTEXT *Context, IN CONST CHAR8 *Identifier, IN BOOLEAN Exclude)
EFI_STATUS KcKextApplyFileDelta(IN PRELINKED_CONTEXT *PrelinkedContext, IN OUT OC_MACHO_CONTEXT *Context, IN UINT32 Delta)
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
@ KernelQuirkMax
@ KernelQuirkCustomPciSerialDevice
EFI_STATUS PatcherInitContextFromBuffer(IN OUT PATCHER_CONTEXT *Context, IN OUT UINT8 *Buffer, IN UINT32 BufferSize, IN BOOLEAN Use32Bit)
UINT64 KcFixupValue(IN UINT64 Value, IN CONST CHAR8 *Name OPTIONAL)
EFI_STATUS PatcherInitContextFromPrelinked(IN OUT PATCHER_CONTEXT *Context, IN OUT PRELINKED_CONTEXT *Prelinked, IN CONST CHAR8 *Name)
Definition KextPatcher.c:99
EFI_STATUS PrelinkedInjectComplete(IN OUT PRELINKED_CONTEXT *Context)
BOOLEAN KextFindKmodAddress(IN OC_MACHO_CONTEXT *ExecutableContext, IN UINT64 LoadAddress, IN UINT32 Size, OUT UINT64 *Kmod)
UINT32 KcGetSegmentFixupChainsSize(IN UINT32 SegmentSize)
EFI_STATUS PatchKernelCpuId(IN OUT PATCHER_CONTEXT *Patcher, IN OC_CPU_INFO *CpuInfo, IN UINT32 *Data, IN UINT32 *DataMask, IN UINT32 KernelVersion)
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
Definition OcTypingLib.h:42
LIST_ENTRY InjectedDependencies
CONST CHAR16 * ExtensionsDirFileName
EFI_FILE_PROTOCOL * ExtensionsDir
KERNEL_QUIRK_PATCH_FUNCTION * PatchFunction
CONST CHAR8 * Identifier
XML_DOCUMENT * MkextInfoDocument
XML_NODE * MkextKexts
LIST_ENTRY CachedKexts
MKEXT_HEADER_ANY * MkextHeader
OC_MACHO_CONTEXT MachContext
CONST VOID * KxldState
MACH_SEGMENT_COMMAND_64 * InnerInfoSegment
MACH_SECTION_ANY * PrelinkedStateSectionKexts
MACH_SEGMENT_COMMAND_ANY * PrelinkedTextSegment
MACH_SEGMENT_COMMAND_ANY * LinkEditSegment
MACH_SEGMENT_COMMAND_ANY * PrelinkedStateSegment
OC_MACHO_CONTEXT InnerMachContext
MACH_SEGMENT_COMMAND_ANY * PrelinkedInfoSegment
MACH_DYLD_CHAINED_STARTS_IN_SEGMENT * KextsFixupChains
MACH_SECTION_64 * InnerInfoSection
OC_MACHO_CONTEXT PrelinkedMachContext
XML_DOCUMENT * PrelinkedInfoDocument
MACH_SECTION_ANY * PrelinkedInfoSection
MACH_SECTION_ANY * PrelinkedTextSection
MACH_SECTION_ANY * PrelinkedStateSectionKernel
MACH_SEGMENT_COMMAND_64 * RegionSegment