OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
PrelinkedInternal.h File Reference

Go to the source code of this file.

Data Structures

struct  PRELINKED_KEXT_SYMBOL
 
struct  PRELINKED_VTABLE_ENTRY
 
struct  PRELINKED_VTABLE
 
struct  PRELINKED_KEXT_
 
union  OC_KEXT_VERSION
 
struct  OC_PRELINKED_VTABLE_LOOKUP_ENTRY
 
struct  OC_VTABLE_PATCH_ENTRY
 

Macros

#define MAX_KEXT_DEPEDENCIES   16
 
#define KEXT_OFFSET_STR_LEN   24
 
#define GET_NEXT_PRELINKED_VTABLE(This)
 
#define PRELINKED_KEXT_SIGNATURE   SIGNATURE_32 ('P', 'K', 'X', 'T')
 
#define GET_PRELINKED_KEXT_FROM_LINK(This)
 
#define GET_INJECTED_KEXT_FROM_LINK(This)
 
#define KXLD_WEAK_TEST_SYMBOL   "_gOSKextUnresolved"
 
#define KXLD_ANY_NEXT(a, b)
 
#define OS_METACLASS_VTABLE_NAME   "__ZTV11OSMetaClass"
 
#define X86_64_RIP_RELATIVE_LIMIT   0x80000000ULL
 
#define SYM_MAX_NAME_LEN   256U
 
#define VTABLE_ENTRY_SIZE_32   4U
 
#define VTABLE_ENTRY_SIZE_64   8U
 
#define VTABLE_HEADER_LEN   2U
 
#define VTABLE_HEADER_SIZE_32   (VTABLE_HEADER_LEN * VTABLE_ENTRY_SIZE_32)
 
#define VTABLE_HEADER_SIZE_64   (VTABLE_HEADER_LEN * VTABLE_ENTRY_SIZE_64)
 
#define KERNEL_ADDRESS_MASK   0xFFFFFFFF00000000ULL
 
#define KERNEL_ADDRESS_KEXT   0xFFFFFF7F00000000ULL
 
#define KERNEL_ADDRESS_BASE   0xFFFFFF8000000000ULL
 
#define KERNEL_FIXUP_OFFSET   BASE_1MB
 
#define VTABLE_ENTRY_X(a, b, c)
 
#define VTABLE_ENTRY_SIZE_X(a)
 
#define VTABLE_HEADER_SIZE_X(a)
 
#define GET_NEXT_OC_VTABLE_PATCH_ENTRY(Entry)
 

Typedefs

typedef struct PRELINKED_KEXT_ PRELINKED_KEXT
 

Enumerations

enum  OC_KEXT_VERSION_STAGE {
  OcKextVersionStageDevelopment = 1 , OcKextVersionStageAlpha = 3 , OcKextVersionStageBeta = 5 , OcKextVersionStageCandidate = 7 ,
  OcKextVersionStageRelease = 9
}
 
enum  OC_GET_SYMBOL_TYPE { OcGetSymbolByName , OcGetSymbolByValue }
 
enum  OC_GET_SYMBOL_LEVEL { OcGetSymbolAnyLevel , OcGetSymbolFirstLevel , OcGetSymbolOnlyCxx }
 

Functions

PRELINKED_KEXTInternalNewPrelinkedKext (IN OC_MACHO_CONTEXT *Context, IN XML_NODE *KextPlist)
 
VOID InternalFreePrelinkedKext (IN PRELINKED_KEXT *Kext)
 
PRELINKED_KEXTInternalCachedPrelinkedKext (IN OUT PRELINKED_CONTEXT *Prelinked, IN CONST CHAR8 *Identifier)
 
EFI_STATUS InternalDropCachedPrelinkedKext (IN OUT PRELINKED_CONTEXT *Prelinked, IN CONST CHAR8 *Identifier)
 
PRELINKED_KEXTInternalCachedPrelinkedKernel (IN OUT PRELINKED_CONTEXT *Prelinked)
 
EFI_STATUS InternalScanPrelinkedKext (IN OUT PRELINKED_KEXT *Kext, IN OUT PRELINKED_CONTEXT *Context, IN BOOLEAN Dependency)
 
VOID InternalUnlockContextKexts (IN PRELINKED_CONTEXT *Context)
 
PRELINKED_KEXTInternalLinkPrelinkedKext (IN OUT PRELINKED_CONTEXT *Context, IN OUT OC_MACHO_CONTEXT *Executable, IN XML_NODE *PlistRoot, IN UINT64 LoadAddress, IN UINT64 KmodAddress, IN UINT64 FileOffset)
 
EFI_STATUS InternalConnectExternalSymtab (IN OUT OC_MACHO_CONTEXT *Context, OUT OC_MACHO_CONTEXT *InnerContext, IN UINT8 *Buffer, IN UINT32 BufferSize, OUT BOOLEAN *KernelCollection OPTIONAL)
 
 STATIC_ASSERT ((sizeof(OC_PRELINKED_VTABLE_LOOKUP_ENTRY)<=sizeof(MACH_NLIST_64)), "Prelinked VTable lookup data might not safely fit LinkBuffer")
 
 STATIC_ASSERT (((sizeof(MACH_NLIST_64 *)+MAX((2 *sizeof(UINT32)), sizeof(UINT64 *)))<=sizeof(MACH_NLIST_64)), "VTable Patch data might not safely fit LinkBuffer")
 
BOOLEAN InternalGetVtableEntries (IN BOOLEAN Is32Bit, IN CONST VOID *VtableData, IN UINT32 MaxSize, OUT UINT32 *NumEntries)
 
BOOLEAN InternalPatchByVtables (IN PRELINKED_CONTEXT *Context, IN OUT PRELINKED_KEXT *Kext)
 
BOOLEAN InternalPrepareCreateVtablesPrelinked (IN PRELINKED_KEXT *Kext, IN UINT32 MaxSize, OUT UINT32 *NumVtables, OUT OC_PRELINKED_VTABLE_LOOKUP_ENTRY *Vtables)
 
VOID InternalCreateVtablesPrelinked (IN PRELINKED_CONTEXT *Context, IN OUT PRELINKED_KEXT *Kext, IN UINT32 NumVtables, IN CONST OC_PRELINKED_VTABLE_LOOKUP_ENTRY *VtableLookups, OUT PRELINKED_VTABLE *VtableBuffer)
 
CONST PRELINKED_VTABLEInternalGetOcVtableByName (IN PRELINKED_CONTEXT *Context, IN PRELINKED_KEXT *Kext, IN CONST CHAR8 *Name)
 
CONST PRELINKED_KEXT_SYMBOLInternalOcGetSymbolName (IN PRELINKED_CONTEXT *Context, IN PRELINKED_KEXT *Kext, IN CONST CHAR8 *LookupValue, IN OC_GET_SYMBOL_LEVEL SymbolLevel)
 
CONST PRELINKED_KEXT_SYMBOLInternalOcGetSymbolValue (IN PRELINKED_CONTEXT *Context, IN PRELINKED_KEXT *Kext, IN UINT64 LookupValue, IN OC_GET_SYMBOL_LEVEL SymbolLevel)
 
VOID InternalSolveSymbolValue (IN BOOLEAN Is32Bit, IN UINT64 Value, OUT MACH_NLIST_ANY *Symbol)
 
EFI_STATUS InternalPrelinkKext (IN OUT PRELINKED_CONTEXT *Context, IN PRELINKED_KEXT *Kext, IN UINT64 LoadAddress, IN UINT64 FileOffset)
 
EFI_STATUS InternalKxldStateBuildLinkedSymbolTable (IN OUT PRELINKED_KEXT *Kext, IN PRELINKED_CONTEXT *Context)
 
EFI_STATUS InternalKxldStateBuildLinkedVtables (IN OUT PRELINKED_KEXT *Kext, IN PRELINKED_CONTEXT *Context)
 
EFI_STATUS InternalKxldStateRebuild (IN OUT PRELINKED_CONTEXT *Context)
 
UINT64 InternalKxldSolveSymbol (IN BOOLEAN Is32Bit, IN CONST VOID *KxldState, IN UINT32 KxldStateSize, IN CONST CHAR8 *Name)
 

Variables

KERNEL_QUIRK gKernelQuirks []
 

Detailed Description

Library handling KEXT prelinking. Currently limited to Intel 64 architectures.

Copyright (c) 2018, Download-Fritz. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at http://opensource.org/licenses/bsd-license.php.

THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

Definition in file PrelinkedInternal.h.

Macro Definition Documentation

◆ GET_INJECTED_KEXT_FROM_LINK

#define GET_INJECTED_KEXT_FROM_LINK ( This)
Value:
(CR ( \
(This), \
InjectedLink, \
))
#define PRELINKED_KEXT_SIGNATURE

Gets the next element in InjectedKexts list of PRELINKED_KEXT.

Parameters
[in]ThisThe current ListEntry.

Definition at line 166 of file PrelinkedInternal.h.

◆ GET_NEXT_OC_VTABLE_PATCH_ENTRY

#define GET_NEXT_OC_VTABLE_PATCH_ENTRY ( Entry)
Value:
(UINTN)((Entry) + 1) \
+ ((Entry)->NumSolveSymbols * sizeof (*(Entry)->SolveSymbols)) \
)

Definition at line 312 of file PrelinkedInternal.h.

◆ GET_NEXT_PRELINKED_VTABLE

#define GET_NEXT_PRELINKED_VTABLE ( This)
Value:
(UINTN)((This) + 1) + ((This)->NumEntries * sizeof (*(This)->Entries)) \
)

Definition at line 56 of file PrelinkedInternal.h.

◆ GET_PRELINKED_KEXT_FROM_LINK

#define GET_PRELINKED_KEXT_FROM_LINK ( This)
Value:
(CR ( \
(This), \
Link, \
))

Gets the next element in PrelinkedKexts list of PRELINKED_KEXT.

Parameters
[in]ThisThe current ListEntry.

Definition at line 153 of file PrelinkedInternal.h.

◆ KERNEL_ADDRESS_BASE

#define KERNEL_ADDRESS_BASE   0xFFFFFF8000000000ULL

Definition at line 286 of file PrelinkedInternal.h.

◆ KERNEL_ADDRESS_KEXT

#define KERNEL_ADDRESS_KEXT   0xFFFFFF7F00000000ULL

Definition at line 285 of file PrelinkedInternal.h.

◆ KERNEL_ADDRESS_MASK

#define KERNEL_ADDRESS_MASK   0xFFFFFFFF00000000ULL

Definition at line 284 of file PrelinkedInternal.h.

◆ KERNEL_FIXUP_OFFSET

#define KERNEL_FIXUP_OFFSET   BASE_1MB

Definition at line 287 of file PrelinkedInternal.h.

◆ KEXT_OFFSET_STR_LEN

#define KEXT_OFFSET_STR_LEN   24

Definition at line 33 of file PrelinkedInternal.h.

◆ KXLD_ANY_NEXT

#define KXLD_ANY_NEXT ( a,
b )
Value:
((VOID *) (((UINTN)(b)) + ((a) ? sizeof ((b)->Kxld32) : sizeof ((b)->Kxld64))))

Definition at line 270 of file PrelinkedInternal.h.

◆ KXLD_WEAK_TEST_SYMBOL

#define KXLD_WEAK_TEST_SYMBOL   "_gOSKextUnresolved"

Definition at line 268 of file PrelinkedInternal.h.

◆ MAX_KEXT_DEPEDENCIES

#define MAX_KEXT_DEPEDENCIES   16

Definition at line 28 of file PrelinkedInternal.h.

◆ OS_METACLASS_VTABLE_NAME

#define OS_METACLASS_VTABLE_NAME   "__ZTV11OSMetaClass"

Definition at line 272 of file PrelinkedInternal.h.

◆ PRELINKED_KEXT_SIGNATURE

#define PRELINKED_KEXT_SIGNATURE   SIGNATURE_32 ('P', 'K', 'X', 'T')

Definition at line 146 of file PrelinkedInternal.h.

◆ SYM_MAX_NAME_LEN

#define SYM_MAX_NAME_LEN   256U

Definition at line 276 of file PrelinkedInternal.h.

◆ VTABLE_ENTRY_SIZE_32

#define VTABLE_ENTRY_SIZE_32   4U

Definition at line 278 of file PrelinkedInternal.h.

◆ VTABLE_ENTRY_SIZE_64

#define VTABLE_ENTRY_SIZE_64   8U

Definition at line 279 of file PrelinkedInternal.h.

◆ VTABLE_ENTRY_SIZE_X

#define VTABLE_ENTRY_SIZE_X ( a)
Value:
#define VTABLE_ENTRY_SIZE_32
#define VTABLE_ENTRY_SIZE_64

Definition at line 290 of file PrelinkedInternal.h.

◆ VTABLE_ENTRY_X

#define VTABLE_ENTRY_X ( a,
b,
c )
Value:
((a) ? ((UINT32 *)(b))[(c)] : ((UINT64 *)(b))[(c)])

Definition at line 289 of file PrelinkedInternal.h.

◆ VTABLE_HEADER_LEN

#define VTABLE_HEADER_LEN   2U

Definition at line 280 of file PrelinkedInternal.h.

◆ VTABLE_HEADER_SIZE_32

#define VTABLE_HEADER_SIZE_32   (VTABLE_HEADER_LEN * VTABLE_ENTRY_SIZE_32)

Definition at line 281 of file PrelinkedInternal.h.

◆ VTABLE_HEADER_SIZE_64

#define VTABLE_HEADER_SIZE_64   (VTABLE_HEADER_LEN * VTABLE_ENTRY_SIZE_64)

Definition at line 282 of file PrelinkedInternal.h.

◆ VTABLE_HEADER_SIZE_X

#define VTABLE_HEADER_SIZE_X ( a)
Value:
#define VTABLE_HEADER_SIZE_64
#define VTABLE_HEADER_SIZE_32

Definition at line 291 of file PrelinkedInternal.h.

◆ X86_64_RIP_RELATIVE_LIMIT

#define X86_64_RIP_RELATIVE_LIMIT   0x80000000ULL

Definition at line 274 of file PrelinkedInternal.h.

Typedef Documentation

◆ PRELINKED_KEXT

Definition at line 40 of file PrelinkedInternal.h.

Enumeration Type Documentation

◆ OC_GET_SYMBOL_LEVEL

Enumerator
OcGetSymbolAnyLevel 
OcGetSymbolFirstLevel 
OcGetSymbolOnlyCxx 

Definition at line 403 of file PrelinkedInternal.h.

◆ OC_GET_SYMBOL_TYPE

Enumerator
OcGetSymbolByName 
OcGetSymbolByValue 

Definition at line 398 of file PrelinkedInternal.h.

◆ OC_KEXT_VERSION_STAGE

Enumerator
OcKextVersionStageDevelopment 
OcKextVersionStageAlpha 
OcKextVersionStageBeta 
OcKextVersionStageCandidate 
OcKextVersionStageRelease 

Definition at line 304 of file PrelinkedInternal.h.

Function Documentation

◆ InternalCachedPrelinkedKernel()

PRELINKED_KEXT * InternalCachedPrelinkedKernel ( IN OUT PRELINKED_CONTEXT * Prelinked)

Gets cached kernel PRELINKED_KEXT from PRELINKED_CONTEXT.

Definition at line 797 of file PrelinkedKext.c.

◆ InternalCachedPrelinkedKext()

PRELINKED_KEXT * InternalCachedPrelinkedKext ( IN OUT PRELINKED_CONTEXT * Prelinked,
IN CONST CHAR8 * Identifier )

Gets cached PRELINKED_KEXT from PRELINKED_CONTEXT.

Definition at line 700 of file PrelinkedKext.c.

◆ InternalConnectExternalSymtab()

EFI_STATUS InternalConnectExternalSymtab ( IN OUT OC_MACHO_CONTEXT * Context,
OUT OC_MACHO_CONTEXT * InnerContext,
IN UINT8 * Buffer,
IN UINT32 BufferSize,
OUT BOOLEAN *KernelCollection OPTIONAL )

Definition at line 134 of file PrelinkedContext.c.

◆ InternalCreateVtablesPrelinked()

VOID InternalCreateVtablesPrelinked ( IN PRELINKED_CONTEXT * Context,
IN OUT PRELINKED_KEXT * Kext,
IN UINT32 NumVtables,
IN CONST OC_PRELINKED_VTABLE_LOOKUP_ENTRY * VtableLookups,
OUT PRELINKED_VTABLE * VtableBuffer )

Definition at line 235 of file Vtables.c.

◆ InternalDropCachedPrelinkedKext()

EFI_STATUS InternalDropCachedPrelinkedKext ( IN OUT PRELINKED_CONTEXT * Prelinked,
IN CONST CHAR8 * Identifier )

Drops cached PRELINKED_KEXT from PRELINKED_CONTEXT.

Definition at line 751 of file PrelinkedKext.c.

◆ InternalFreePrelinkedKext()

VOID InternalFreePrelinkedKext ( IN PRELINKED_KEXT * Kext)

Frees PRELINKED_KEXT.

Definition at line 682 of file PrelinkedKext.c.

◆ InternalGetOcVtableByName()

CONST PRELINKED_VTABLE * InternalGetOcVtableByName ( IN PRELINKED_CONTEXT * Context,
IN PRELINKED_KEXT * Kext,
IN CONST CHAR8 * Name )

Definition at line 75 of file Vtables.c.

◆ InternalGetVtableEntries()

BOOLEAN InternalGetVtableEntries ( IN BOOLEAN Is32Bit,
IN CONST VOID * VtableData,
IN UINT32 MaxSize,
OUT UINT32 * NumEntries )

Definition at line 151 of file Vtables.c.

◆ InternalKxldSolveSymbol()

UINT64 InternalKxldSolveSymbol ( IN BOOLEAN Is32Bit,
IN CONST VOID * KxldState,
IN UINT32 KxldStateSize,
IN CONST CHAR8 * Name )

Solve symbol through KXLD state.

Parameters
[in]Is32BitKXLD is 32-bit.
[in]KxldStateKXLD state.
[in]KxldStateSizeKXLD state size.
[in]NameSymbol name.
Return values
Addresson success.
0on failure.

Definition at line 579 of file KxldState.c.

◆ InternalKxldStateBuildLinkedSymbolTable()

EFI_STATUS InternalKxldStateBuildLinkedSymbolTable ( IN OUT PRELINKED_KEXT * Kext,
IN PRELINKED_CONTEXT * Context )

Build symbol table from KXLD state.

Parameters
[in,out]KextKext dependency.
[in]ContextPrelinking context.
Return values
EFI_SUCCESSon success.

Definition at line 192 of file KxldState.c.

◆ InternalKxldStateBuildLinkedVtables()

EFI_STATUS InternalKxldStateBuildLinkedVtables ( IN OUT PRELINKED_KEXT * Kext,
IN PRELINKED_CONTEXT * Context )

Build virtual tables from KXLD state.

Parameters
[in,out]KextKext dependency.
[in]ContextPrelinking context.
Return values
EFI_SUCCESSon success.

Definition at line 292 of file KxldState.c.

◆ InternalKxldStateRebuild()

EFI_STATUS InternalKxldStateRebuild ( IN OUT PRELINKED_CONTEXT * Context)

Update KXLD state in the resulting image.

Parameters
[in,out]ContextPrelinking context.
Return values
EFI_SUCCESSon success.

Definition at line 459 of file KxldState.c.

◆ InternalLinkPrelinkedKext()

PRELINKED_KEXT * InternalLinkPrelinkedKext ( IN OUT PRELINKED_CONTEXT * Context,
IN OUT OC_MACHO_CONTEXT * Executable,
IN XML_NODE * PlistRoot,
IN UINT64 LoadAddress,
IN UINT64 KmodAddress,
IN UINT64 FileOffset )

Link executable within current prelink context.

Parameters
[in,out]ContextPrelinked context.
[in,out]ExecutableKext executable copied to prelinked.
[in]PlistRootCurrent kext info.plist.
[in]LoadAddressKext load address.
[in]KmodAddressKext kmod address.
[in]FileOffsetThe file offset of the first segment.
Returns
prelinked kext to be inserted into PRELINKED_CONTEXT.

Definition at line 1146 of file PrelinkedKext.c.

◆ InternalNewPrelinkedKext()

PRELINKED_KEXT * InternalNewPrelinkedKext ( IN OC_MACHO_CONTEXT * Context,
IN XML_NODE * KextPlist )

Creates new PRELINKED_KEXT from OC_MACHO_CONTEXT.

Definition at line 665 of file PrelinkedKext.c.

◆ InternalOcGetSymbolName()

CONST PRELINKED_KEXT_SYMBOL * InternalOcGetSymbolName ( IN PRELINKED_CONTEXT * Context,
IN PRELINKED_KEXT * Kext,
IN CONST CHAR8 * LookupValue,
IN OC_GET_SYMBOL_LEVEL SymbolLevel )

Definition at line 191 of file Link.c.

◆ InternalOcGetSymbolValue()

CONST PRELINKED_KEXT_SYMBOL * InternalOcGetSymbolValue ( IN PRELINKED_CONTEXT * Context,
IN PRELINKED_KEXT * Kext,
IN UINT64 LookupValue,
IN OC_GET_SYMBOL_LEVEL SymbolLevel )

Definition at line 246 of file Link.c.

◆ InternalPatchByVtables()

BOOLEAN InternalPatchByVtables ( IN PRELINKED_CONTEXT * Context,
IN OUT PRELINKED_KEXT * Kext )

Definition at line 584 of file Vtables.c.

◆ InternalPrelinkKext()

EFI_STATUS InternalPrelinkKext ( IN OUT PRELINKED_CONTEXT * Context,
IN PRELINKED_KEXT * Kext,
IN UINT64 LoadAddress,
IN UINT64 FileOffset )

Prelinks the specified KEXT against the specified LoadAddress and the data of its dependencies.

Parameters
[in,out]ContextPrelinking context.
[in]KextKEXT prelinking context.
[in]LoadAddressThe address this KEXT shall be linked against.
[in]FileOffsetThe file offset of the first segment.
Return values
Returnedis whether the prelinking process has been successful. The state of the KEXT is undefined in case this routine fails.

Definition at line 1503 of file Link.c.

◆ InternalPrepareCreateVtablesPrelinked()

BOOLEAN InternalPrepareCreateVtablesPrelinked ( IN PRELINKED_KEXT * Kext,
IN UINT32 MaxSize,
OUT UINT32 * NumVtables,
OUT OC_PRELINKED_VTABLE_LOOKUP_ENTRY * Vtables )

Definition at line 179 of file Vtables.c.

◆ InternalScanPrelinkedKext()

EFI_STATUS InternalScanPrelinkedKext ( IN OUT PRELINKED_KEXT * Kext,
IN OUT PRELINKED_CONTEXT * Context,
IN BOOLEAN Dependency )

Scan PRELINKED_KEXT for dependencies.

Definition at line 978 of file PrelinkedKext.c.

◆ InternalSolveSymbolValue()

VOID InternalSolveSymbolValue ( IN BOOLEAN Is32Bit,
IN UINT64 Value,
OUT MACH_NLIST_ANY * Symbol )

Patches Symbol with Value and marks it as solved.

Parameters
[in]Is32BitSymbol is 32-bit.
[in]ValueThe value to solve Symbol with.
[out]SymbolThe symbol to solve.

Definition at line 294 of file Link.c.

◆ InternalUnlockContextKexts()

VOID InternalUnlockContextKexts ( IN PRELINKED_CONTEXT * Context)

Unlock all context dependency kexts by unsetting Processed flag.

Parameters
[in]ContextPrelinked context.

Definition at line 1132 of file PrelinkedKext.c.

◆ STATIC_ASSERT() [1/2]

STATIC_ASSERT ( ((sizeof(MACH_NLIST_64 *)+MAX((2 *sizeof(UINT32)), sizeof(UINT64 *)))<=sizeof(MACH_NLIST_64)) ,
"VTable Patch data might not safely fit LinkBuffer"  )

◆ STATIC_ASSERT() [2/2]

STATIC_ASSERT ( (sizeof(OC_PRELINKED_VTABLE_LOOKUP_ENTRY)<=sizeof(MACH_NLIST_64)) ,
"Prelinked VTable lookup data might not safely fit LinkBuffer"  )

Variable Documentation

◆ gKernelQuirks

KERNEL_QUIRK gKernelQuirks[]
extern

Definition at line 2951 of file CommonPatches.c.