OpenCore  1.0.7
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#define KERNEL_VERSION_TAHOE 25
135
136//
137// Minimum kernel versions for each release.
138//
139#define KERNEL_VERSION_TIGER_MIN KERNEL_VERSION (KERNEL_VERSION_TIGER, 0, 0)
140#define KERNEL_VERSION_LEOPARD_MIN KERNEL_VERSION (KERNEL_VERSION_LEOPARD, 0, 0)
141#define KERNEL_VERSION_SNOW_LEOPARD_MIN KERNEL_VERSION (KERNEL_VERSION_SNOW_LEOPARD, 0, 0)
142#define KERNEL_VERSION_LION_MIN KERNEL_VERSION (KERNEL_VERSION_LION, 0, 0)
143#define KERNEL_VERSION_MOUNTAIN_LION_MIN KERNEL_VERSION (KERNEL_VERSION_MOUNTAIN_LION, 0, 0)
144#define KERNEL_VERSION_MAVERICKS_MIN KERNEL_VERSION (KERNEL_VERSION_MAVERICKS, 0, 0)
145#define KERNEL_VERSION_YOSEMITE_MIN KERNEL_VERSION (KERNEL_VERSION_YOSEMITE, 0, 0)
146#define KERNEL_VERSION_EL_CAPITAN_MIN KERNEL_VERSION (KERNEL_VERSION_EL_CAPITAN, 0, 0)
147#define KERNEL_VERSION_SIERRA_MIN KERNEL_VERSION (KERNEL_VERSION_SIERRA, 0, 0)
148#define KERNEL_VERSION_HIGH_SIERRA_MIN KERNEL_VERSION (KERNEL_VERSION_HIGH_SIERRA, 0, 0)
149#define KERNEL_VERSION_MOJAVE_MIN KERNEL_VERSION (KERNEL_VERSION_MOJAVE, 0, 0)
150#define KERNEL_VERSION_CATALINA_MIN KERNEL_VERSION (KERNEL_VERSION_CATALINA, 0, 0)
151#define KERNEL_VERSION_BIG_SUR_MIN KERNEL_VERSION (KERNEL_VERSION_BIG_SUR, 0, 0)
152#define KERNEL_VERSION_MONTEREY_MIN KERNEL_VERSION (KERNEL_VERSION_MONTEREY, 0, 0)
153#define KERNEL_VERSION_VENTURA_MIN KERNEL_VERSION (KERNEL_VERSION_VENTURA, 0, 0)
154#define KERNEL_VERSION_SONOMA_MIN KERNEL_VERSION (KERNEL_VERSION_SONOMA, 0, 0)
155#define KERNEL_VERSION_SEQUOIA_MIN KERNEL_VERSION (KERNEL_VERSION_SEQUOIA, 0, 0)
156#define KERNEL_VERSION_TAHOE_MIN KERNEL_VERSION (KERNEL_VERSION_TAHOE, 0, 0)
157
158//
159// Maximum kernel versions for each release.
160//
161#define KERNEL_VERSION_TIGER_MAX (KERNEL_VERSION_LEOPARD_MIN - 1)
162#define KERNEL_VERSION_LEOPARD_MAX (KERNEL_VERSION_SNOW_LEOPARD_MIN - 1)
163#define KERNEL_VERSION_SNOW_LEOPARD_MAX (KERNEL_VERSION_LION_MIN - 1)
164#define KERNEL_VERSION_LION_MAX (KERNEL_VERSION_MOUNTAIN_LION_MIN - 1)
165#define KERNEL_VERSION_MOUNTAIN_LION_MAX (KERNEL_VERSION_MAVERICKS_MIN - 1)
166#define KERNEL_VERSION_MAVERICKS_MAX (KERNEL_VERSION_YOSEMITE_MIN - 1)
167#define KERNEL_VERSION_YOSEMITE_MAX (KERNEL_VERSION_EL_CAPITAN_MIN - 1)
168#define KERNEL_VERSION_EL_CAPITAN_MAX (KERNEL_VERSION_SIERRA_MIN - 1)
169#define KERNEL_VERSION_SIERRA_MAX (KERNEL_VERSION_HIGH_SIERRA_MIN - 1)
170#define KERNEL_VERSION_HIGH_SIERRA_MAX (KERNEL_VERSION_MOJAVE_MIN - 1)
171#define KERNEL_VERSION_MOJAVE_MAX (KERNEL_VERSION_CATALINA_MIN - 1)
172#define KERNEL_VERSION_CATALINA_MAX (KERNEL_VERSION_BIG_SUR_MIN - 1)
173#define KERNEL_VERSION_BIG_SUR_MAX (KERNEL_VERSION_MONTEREY_MIN - 1)
174#define KERNEL_VERSION_MONTEREY_MAX (KERNEL_VERSION_VENTURA_MIN - 1)
175#define KERNEL_VERSION_VENTURA_MAX (KERNEL_VERSION_SONOMA_MIN - 1)
176#define KERNEL_VERSION_SONOMA_MAX (KERNEL_VERSION_SEQUOIA_MIN - 1)
177
178//
179// Prelinked context used for kernel modification.
180//
181typedef struct {
182 //
183 // Current version of prelinkedkernel. It takes a reference of user-allocated
184 // memory block from pool, and grows if needed.
185 //
186 UINT8 *Prelinked;
187 //
188 // Exportable prelinkedkernel size, i.e. the payload size. Also references user field.
189 //
191 //
192 // Currently allocated prelinkedkernel size, used for reduced rellocations.
193 //
195 //
196 // Current last virtual address (kext source files and plist are put here).
197 //
199 //
200 // Current last virtual load address (kexts are loaded here after kernel startup).
201 //
203 //
204 // Mach-O context for prelinkedkernel.
205 //
207 //
208 // Pointer to PRELINK_INFO_SEGMENT.
209 //
211 //
212 // Pointer to PRELINK_INFO_SECTION.
213 //
215 //
216 // Pointer to PRELINK_TEXT_SEGMENT (for prelinkedkernel, NULL for KC).
217 // As of macOS 13 Developer Beta 3, this segment may have corrupted
218 // information.
219 //
221 //
222 // Pointer to PRELINK_TEXT_SECTION.
223 //
225 //
226 // Pointer to PRELINK_STATE_SEGMENT (for 10.6.8).
227 //
229 //
230 // Pointer to PRELINK_STATE_SECTION_KERNEL (for 10.6.8).
231 //
233 //
234 // Pointer to PRELINK_STATE_SECTION_KEXTS (for 10.6.8).
235 //
237 //
238 // Contents of PRELINK_STATE_SECTION_KERNEL section (for 10.6.8).
239 //
241 //
242 // Contents of PRELINK_STATE_SECTION_KEXTS (for 10.6.8).
243 //
245 //
246 // PRELINK_STATE_SECTION_KEXTS original load address.
247 //
249 //
250 // PRELINK_STATE_SECTION_KERNEL section size (for 10.6.8).
251 //
253 //
254 // PRELINK_STATE_SECTION_KEXTS section size (for 10.6.8).
255 //
257 //
258 // Pointer to KC_LINKEDIT_SEGMENT (for KC mode).
259 //
261 //
262 // Pointer to KC_REGION0_SEGMENT (for KC mode).
263 //
265 //
266 // Mach-O context for inner prelinkedkernel (for KC mode).
267 //
269 //
270 // Pointer to PRELINK_INFO_SEGMENT in the inner prelinkedkernel.
271 //
273 //
274 // Pointer to PRELINK_INFO_SECTION in the inner prelinkedkernel.
275 //
277 //
278 // Copy of prelinkedkernel PRELINK_INFO_SECTION used for XML_DOCUMENT.
279 // Freed upon context destruction.
280 //
282 //
283 // Parsed instance of PlistInfo. New entries are added here.
284 //
286 //
287 // Reference for PRELINK_INFO_DICTIONARY_KEY in PlistDocument.
288 // This reference is used for quick path during kext injection.
289 //
291 //
292 // Plist scratch buffer used when updating values.
293 //
295 //
296 // Buffers allocated from pool for internal needs.
297 //
299 //
300 // Currently used pooled buffers.
301 //
303 //
304 // Currently allocated pooled buffers. PooledBuffersAllocCount >= PooledBuffersCount.
305 //
309 //
310 // Used for caching all prelinked kexts.
311 // I.e. this contains kernel, injected kexts, and kexts used as dependencies.
312 //
313 LIST_ENTRY PrelinkedKexts;
314 //
315 // Used for caching prelinked kexts, which we inject.
316 // This is a sublist of PrelinkedKexts.
317 //
318 LIST_ENTRY InjectedKexts;
319 //
320 // Whether this kernel is a kernel collection (used by macOS 11.0+).
321 //
323 //
324 // Kext segment file location for kernel collection.
325 //
327 //
328 // Kext segment memory location for kernel collection.
329 //
331 //
332 // Kext fixup chain for kernel collection.
333 //
335 //
336 // Kernel virtual base.
337 //
339 //
340 // Prelinked is 32-bit.
341 //
342 BOOLEAN Is32Bit;
344
345//
346// Kernel and kext patching context.
347//
348typedef struct {
349 //
350 // Mach-O context for patched binary.
351 //
353 //
354 // Virtual base of text segment.
355 //
357 //
358 // File offset.
359 //
361 //
362 // Virtual kmod_info_t address.
363 //
365 //
366 // Pointer to KXLD state (read only, it is allocated in PrelinkedStateKexts).
367 //
368 CONST VOID *KxldState;
369 //
370 // Pointer to KXLD state (read only, it is allocated in PrelinkedStateKexts).
371 //
373 //
374 // Binary is 32-bit.
375 //
376 BOOLEAN Is32Bit;
377 //
378 // Patcher context is contained within a kernel collection.
379 //
382
383//
384// Kernel and kext patch description.
385//
386typedef struct {
387 //
388 // Comment or NULL.
389 //
390 CONST CHAR8 *Comment;
391 //
392 // Symbol base or NULL (0 base is used then).
393 //
394 CONST CHAR8 *Base;
395 //
396 // Find bytes or NULL (data is written to base then).
397 //
398 CONST UINT8 *Find;
399 //
400 // Replace bytes.
401 //
402 CONST UINT8 *Replace;
403 //
404 // Find mask or NULL.
405 //
406 CONST UINT8 *Mask;
407 //
408 // Replace mask or NULL.
409 //
410 CONST UINT8 *ReplaceMask;
411 //
412 // Patch size.
413 //
414 UINT32 Size;
415 //
416 // Replace count or 0 for all.
417 //
418 UINT32 Count;
419 //
420 // Skip count or 0 to start from 1 match.
421 //
422 UINT32 Skip;
423 //
424 // Limit replacement size to this value or 0, which assumes table size.
425 //
426 UINT32 Limit;
428
429//
430// Context for cacheless boot (S/L/E).
431//
432typedef struct {
433 //
434 // Extensions directory EFI_FILE_PROTOCOL instance.
435 //
436 EFI_FILE_PROTOCOL *ExtensionsDir;
437 //
438 // Extensions directory filename. This is freed by the caller.
439 //
441 //
442 // List of injected kexts.
443 //
444 LIST_ENTRY InjectedKexts;
445 //
446 // List of dependencies that need to be injected.
447 //
449 //
450 // List of kext patches for built-in shipping kexts.
451 //
452 LIST_ENTRY PatchedKexts;
453 //
454 // List of built-in shipping kexts.
455 //
456 LIST_ENTRY BuiltInKexts;
457 //
458 // Current kernel version.
459 //
461 //
462 // System is booting in 32-bit mode.
463 //
464 BOOLEAN Is32Bit;
465 //
466 // Flag to indicate if above list is valid. List is built during the first read from SLE.
467 //
470
471//
472// Mkext context.
473//
474typedef struct {
475 //
476 // Current version of mkext. It takes a reference of user-allocated
477 // memory block from pool, and grows if needed.
478 //
479 UINT8 *Mkext;
480 //
481 // Exportable mkext size, i.e. the payload size. Also references user field.
482 //
483 UINT32 MkextSize;
484 //
485 // Currently allocated mkext size, used for reduced rellocations.
486 //
488 //
489 // Mkext header.
490 //
492 //
493 // Version.
494 //
496 //
497 // CPU type.
498 //
499 BOOLEAN Is32Bit;
500 //
501 // Current number of kexts.
502 //
503 UINT32 NumKexts;
504 //
505 // Max kexts for allocation.
506 //
508 //
509 // Offset of mkext plist.
510 //
512 //
513 // Copy of mkext plist used for XML_DOCUMENT.
514 // Freed upon context destruction.
515 //
516 UINT8 *MkextInfo;
517 //
518 // Parsed instance of mkext plist. New entries are added here.
519 //
521 //
522 // Array of kexts.
523 //
525 //
526 // List of cached kexts, used for patching and blocking.
527 //
528 LIST_ENTRY CachedKexts;
530
531//
532// Kernel quirk names.
533//
534typedef enum {
535 //
536 // Apply MSR E2 patches to AppleIntelCPUPowerManagement kext.
537 //
539 //
540 // Apply MSR E2 patches to XNU kernel (XCPM).
541 //
543 //
544 // Apply extra MSR patches to XNU kernel (XCPM).
545 //
547 //
548 // Apply max MSR_IA32_PERF_CONTROL patches to XNU kernel (XCPM).
549 //
551 //
552 // Apply regiser base change patch for customised PCI serial device to XNU.
553 //
555 //
556 // Apply custom AppleSMBIOS kext GUID patch for Custom UpdateSMBIOSMode.
557 //
560 //
561 // Apply VT-d disabling patches to IOPCIFamily kext to disable IOMapper in macOS.
562 //
564 //
565 // Disable mapping PCI bridge device memory in IOMMU (VT-d) to resolve compatibility issues.
566 //
568 //
569 // Disable AppleRTC checksum writing.
570 //
572 //
573 // Apply dummy power management patches to AppleIntelCPUPowerManagement in macOS.
574 //
576 //
577 // Apply feature flags patches to IOBluetoothFamily kext to ensure full Bluetooth functionality.
578 //
580 //
581 // Apply icon type patches to IOAHCIPort kext to force internal disk icons.
582 //
584 //
585 // Enable Aquantia AQtion AQC-107s support.
586 //
588 //
589 // Force SecureBoot support for all CPUs.
590 //
592 //
593 // Apply PCI bar size patches to IOPCIFamily kext for compatibility with select configuration.
594 //
596 //
597 // Disable LAPIC interrupt kernel panic on AP cores.
598 //
600 //
601 // Replace the 64-bit commpage bcopy implementation with one that does not use SSSE3.
602 //
604 //
605 // Apply kernel patches to remove kext dumping in the panic log.
606 //
608 //
609 // Disable power state change timeout kernel panic (10.15+).
610 //
612 //
613 // Remove kernel __LINKEDIT jetisson.
614 //
616 //
617 // Set custom APFS trim timeout.
618 //
620 //
621 // Apply vendor patches to IOAHCIFamily kext to enable native features for third-party drives,
622 // such as TRIM on SSDs or hibernation support on 10.15.
623 //
625 //
626 // Apply port limit patches to AppleUSBXHCI and AppleUSBXHCIPCI kexts.
627 //
631
634
643typedef
644EFI_STATUS
646 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
647 IN UINT32 KernelVersion
648 );
649
650//
651// Kernel quirk.
652//
653typedef struct {
654 //
655 // Target bundle identifier. NULL for kernel.
656 //
657 CONST CHAR8 *Identifier;
658 //
659 // Quirk patch function.
660 //
663
673EFI_STATUS
675 IN KERNEL_QUIRK_NAME Name,
676 IN OUT PATCHER_CONTEXT *Patcher OPTIONAL,
677 IN UINT32 KernelVersion
678 );
679
696EFI_STATUS
698 IN EFI_FILE_PROTOCOL *File,
699 IN BOOLEAN Prefer32Bit,
700 OUT BOOLEAN *Is32Bit,
701 OUT UINT8 **Kernel,
702 OUT UINT32 *KernelSize,
703 OUT UINT32 *AllocatedSize,
704 IN UINT32 ReservedSize,
705 OUT UINT8 *Digest OPTIONAL
706 );
707
723EFI_STATUS
725 IN EFI_FILE_PROTOCOL *File,
726 IN BOOLEAN Prefer32Bit,
727 OUT UINT8 **Mkext,
728 OUT UINT32 *MkextSize,
729 OUT UINT32 *AllocatedSize,
730 IN UINT32 ReservedSize,
731 IN UINT32 NumReservedKexts
732 );
733
742UINT32
744 IN CONST CHAR8 *String
745 );
746
755UINT32
757 IN CONST UINT8 *Kernel,
758 IN UINT32 KernelSize
759 );
760
771BOOLEAN
773 IN UINT32 CurrentVersion OPTIONAL,
774 IN UINT32 MinVersion OPTIONAL,
775 IN UINT32 MaxVersion OPTIONAL
776 );
777
791EFI_STATUS
793 IN OUT PRELINKED_CONTEXT *Context,
794 IN OUT UINT8 *Prelinked,
795 IN UINT32 PrelinkedSize,
796 IN UINT32 PrelinkedAllocSize,
797 IN BOOLEAN Is32Bit
798 );
799
805VOID
807 IN OUT PRELINKED_CONTEXT *Context
808 );
809
819EFI_STATUS
821 IN OUT PRELINKED_CONTEXT *Context,
822 IN VOID *Buffer
823 );
824
835EFI_STATUS
837 IN OUT PRELINKED_CONTEXT *Context,
838 IN UINT32 LinkedExpansion,
839 IN UINT32 ReservedExeSize
840 );
841
849EFI_STATUS
851 IN OUT PRELINKED_CONTEXT *Context
852 );
853
866EFI_STATUS
868 IN OUT UINT32 *ReservedInfoSize,
869 IN OUT UINT32 *ReservedExeSize,
870 IN UINT32 InfoPlistSize,
871 IN UINT8 *Executable OPTIONAL,
872 IN UINT32 ExecutableSize OPTIONAL,
873 IN BOOLEAN Is32Bit
874 );
875
892EFI_STATUS
894 IN OUT PRELINKED_CONTEXT *Context,
895 IN CONST CHAR8 *Identifier OPTIONAL,
896 IN CONST CHAR8 *BundlePath,
897 IN CONST CHAR8 *InfoPlist,
898 IN UINT32 InfoPlistSize,
899 IN CONST CHAR8 *ExecutablePath OPTIONAL,
900 IN OUT CONST UINT8 *Executable OPTIONAL,
901 IN UINT32 ExecutableSize OPTIONAL,
902 OUT CHAR8 BundleVersion[MAX_INFO_BUNDLE_VERSION_KEY_SIZE] OPTIONAL
903 );
904
914EFI_STATUS
916 IN OUT PRELINKED_CONTEXT *Context,
917 IN CONST CHAR8 *Identifier,
918 IN PATCHER_GENERIC_PATCH *Patch
919 );
920
930EFI_STATUS
932 IN OUT PRELINKED_CONTEXT *Context,
933 IN KERNEL_QUIRK_NAME Quirk,
934 IN UINT32 KernelVersion
935 );
936
946EFI_STATUS
948 IN OUT PRELINKED_CONTEXT *Context,
949 IN CONST CHAR8 *Identifier,
950 IN BOOLEAN Exclude
951 );
952
960EFI_STATUS
962 IN OUT PRELINKED_CONTEXT *Context
963 );
964
974UINT32
976 IN UINT32 SegmentSize
977 );
978
987EFI_STATUS
989 IN OUT PRELINKED_CONTEXT *Context,
990 IN UINT32 SegChainSize,
991 IN UINT32 ReservedSize
992 );
993
1002VOID
1004 IN OUT PRELINKED_CONTEXT *Context,
1005 IN OC_MACHO_CONTEXT *MachContext
1006 );
1007
1017UINT32
1019 IN PRELINKED_CONTEXT *Context,
1020 IN UINT64 SourceAddress
1021 );
1022
1033EFI_STATUS
1035 IN PRELINKED_CONTEXT *PrelinkedContext,
1036 IN OUT OC_MACHO_CONTEXT *Context,
1037 IN UINT32 Delta
1038 );
1039
1048UINT64
1050 IN UINT64 Value,
1051 IN CONST CHAR8 *Name OPTIONAL
1052 );
1053
1063EFI_STATUS
1065 IN OUT PATCHER_CONTEXT *Context,
1066 IN OUT PRELINKED_CONTEXT *Prelinked,
1067 IN CONST CHAR8 *Name
1068 );
1069
1079EFI_STATUS
1081 IN OUT PATCHER_CONTEXT *Context,
1082 IN OUT MKEXT_CONTEXT *Mkext,
1083 IN CONST CHAR8 *Name
1084 );
1085
1096EFI_STATUS
1098 IN OUT PATCHER_CONTEXT *Context,
1099 IN OUT UINT8 *Buffer,
1100 IN UINT32 BufferSize,
1101 IN BOOLEAN Use32Bit
1102 );
1103
1113EFI_STATUS
1115 IN OUT PATCHER_CONTEXT *Context,
1116 IN CONST CHAR8 *Name,
1117 IN OUT UINT8 **Address
1118 );
1119
1129EFI_STATUS
1131 IN OUT PATCHER_CONTEXT *Context,
1132 IN CONST CHAR8 *Name,
1133 IN OUT UINT64 *Value
1134 );
1135
1146EFI_STATUS
1148 IN OUT PATCHER_CONTEXT *Context,
1149 IN CONST CHAR8 *Name,
1150 IN OUT UINT8 **Address,
1151 IN OUT UINT64 *Value
1152 );
1153
1162EFI_STATUS
1164 IN OUT PATCHER_CONTEXT *Context,
1165 IN PATCHER_GENERIC_PATCH *Patch
1166 );
1167
1177EFI_STATUS
1179 IN CONST CHAR8 *Identifier,
1180 IN OUT PATCHER_CONTEXT *PatcherContext,
1181 IN OUT PRELINKED_CONTEXT *PrelinkedContext
1182 );
1183
1192EFI_STATUS
1194 IN OUT MKEXT_CONTEXT *MkextContext,
1195 IN CONST CHAR8 *Identifier
1196 );
1197
1205EFI_STATUS
1207 IN OUT PATCHER_CONTEXT *Context
1208 );
1209
1220BOOLEAN
1222 IN OC_MACHO_CONTEXT *ExecutableContext,
1223 IN UINT64 LoadAddress,
1224 IN UINT32 Size,
1225 OUT UINT64 *Kmod
1226 );
1227
1233VOID
1235 IN UINT32 Timeout
1236 );
1237
1244VOID
1246 IN UINTN RegisterBase,
1247 IN UINT32 RegisterStride
1248 );
1249
1261EFI_STATUS
1263 IN OUT PATCHER_CONTEXT *Patcher,
1264 IN OC_CPU_INFO *CpuInfo,
1265 IN UINT32 *Data,
1266 IN UINT32 *DataMask,
1267 IN UINT32 KernelVersion
1268 );
1269
1279EFI_STATUS
1281 IN OUT PATCHER_CONTEXT *Patcher,
1282 IN OC_CPU_INFO *CpuInfo,
1283 IN UINT32 KernelVersion
1284 );
1285
1298EFI_STATUS
1300 IN OUT CACHELESS_CONTEXT *Context,
1301 IN CONST CHAR16 *FileName,
1302 IN EFI_FILE_PROTOCOL *ExtensionsDir,
1303 IN UINT32 KernelVersion,
1304 IN BOOLEAN Is32Bit
1305 );
1306
1314VOID
1316 IN OUT CACHELESS_CONTEXT *Context
1317 );
1318
1331EFI_STATUS
1333 IN OUT CACHELESS_CONTEXT *Context,
1334 IN CONST CHAR8 *InfoPlist,
1335 IN UINT32 InfoPlistSize,
1336 IN UINT8 *Executable OPTIONAL,
1337 IN UINT32 ExecutableSize OPTIONAL,
1338 OUT CHAR8 BundleVersion[MAX_INFO_BUNDLE_VERSION_KEY_SIZE] OPTIONAL
1339 );
1340
1349EFI_STATUS
1351 IN OUT CACHELESS_CONTEXT *Context,
1352 IN CONST CHAR8 *Identifier
1353 );
1354
1364EFI_STATUS
1366 IN OUT CACHELESS_CONTEXT *Context,
1367 IN CONST CHAR8 *Identifier,
1368 IN PATCHER_GENERIC_PATCH *Patch
1369 );
1370
1379EFI_STATUS
1381 IN OUT CACHELESS_CONTEXT *Context,
1382 IN KERNEL_QUIRK_NAME Quirk
1383 );
1384
1394EFI_STATUS
1396 IN OUT CACHELESS_CONTEXT *Context,
1397 IN CONST CHAR8 *Identifier,
1398 IN BOOLEAN Exclude
1399 );
1400
1409EFI_STATUS
1411 IN OUT CACHELESS_CONTEXT *Context,
1412 OUT EFI_FILE_PROTOCOL **File
1413 );
1414
1424EFI_STATUS
1426 IN OUT CACHELESS_CONTEXT *Context,
1427 IN CONST CHAR16 *FileName,
1428 OUT EFI_FILE_PROTOCOL **VirtualFile
1429 );
1430
1441EFI_STATUS
1443 IN OUT CACHELESS_CONTEXT *Context,
1444 IN CONST CHAR16 *FileName,
1445 IN EFI_FILE_PROTOCOL *File,
1446 OUT EFI_FILE_PROTOCOL **VirtualFile
1447 );
1448
1464EFI_STATUS
1466 IN CONST UINT8 *Buffer,
1467 IN UINT32 BufferSize,
1468 IN UINT32 NumReservedKexts,
1469 IN OUT UINT8 *OutBuffer OPTIONAL,
1470 IN UINT32 OutBufferSize OPTIONAL,
1471 IN OUT UINT32 *OutMkextSize
1472 );
1473
1483BOOLEAN
1485 IN UINT8 *Mkext,
1486 IN UINT32 MkextSize,
1487 IN MACH_CPU_TYPE CpuType
1488 );
1489
1505EFI_STATUS
1507 IN OUT MKEXT_CONTEXT *Context,
1508 IN OUT UINT8 *Mkext,
1509 IN UINT32 MkextSize,
1510 IN UINT32 MkextAllocSize
1511 );
1512
1518VOID
1520 IN OUT MKEXT_CONTEXT *Context
1521 );
1522
1535EFI_STATUS
1537 IN OUT UINT32 *ReservedInfoSize,
1538 IN OUT UINT32 *ReservedExeSize,
1539 IN UINT32 InfoPlistSize,
1540 IN UINT8 *Executable OPTIONAL,
1541 IN UINT32 ExecutableSize OPTIONAL,
1542 IN BOOLEAN Is32Bit
1543 );
1544
1560EFI_STATUS
1562 IN OUT MKEXT_CONTEXT *Context,
1563 IN CONST CHAR8 *Identifier OPTIONAL,
1564 IN CONST CHAR8 *BundlePath,
1565 IN CONST CHAR8 *InfoPlist,
1566 IN UINT32 InfoPlistSize,
1567 IN UINT8 *Executable OPTIONAL,
1568 IN UINT32 ExecutableSize OPTIONAL,
1569 OUT CHAR8 BundleVersion[MAX_INFO_BUNDLE_VERSION_KEY_SIZE] OPTIONAL
1570 );
1571
1581EFI_STATUS
1583 IN OUT MKEXT_CONTEXT *Context,
1584 IN CONST CHAR8 *Identifier,
1585 IN PATCHER_GENERIC_PATCH *Patch
1586 );
1587
1597EFI_STATUS
1599 IN OUT MKEXT_CONTEXT *Context,
1600 IN KERNEL_QUIRK_NAME Quirk,
1601 IN UINT32 KernelVersion
1602 );
1603
1613EFI_STATUS
1615 IN OUT MKEXT_CONTEXT *Context,
1616 IN CONST CHAR8 *Identifier,
1617 IN BOOLEAN Exclude
1618 );
1619
1628EFI_STATUS
1630 IN OUT MKEXT_CONTEXT *Context
1631 );
1632
1633#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