CloverBootloader/rEFIt_UEFI/Platform/kernel_patcher.h
SergeySlice a621438d7c symbolic kexts and kernel patcher
Signed-off-by: SergeySlice <sergey.slice@gmail.com>
2020-04-27 18:16:43 +03:00

182 lines
6.1 KiB
C++

/*
* Copyright (c) 2009-2010 Frank peng. All rights reserved.
*
*/
#ifndef __LIBSAIO_KERNEL_PATCHER_H
#define __LIBSAIO_KERNEL_PATCHER_H
#include "boot.h"
#define CPUFAMILY_INTEL_6_13 0xaa33392b
#define CPUFAMILY_INTEL_YONAH 0x73d67300
#define CPUFAMILY_INTEL_MEROM 0x426f69ef
#define CPUFAMILY_INTEL_PENRYN 0x78ea4fbc
#define CPUFAMILY_INTEL_NEHALEM 0x6b5a4cd2
#define CPUFAMILY_INTEL_WESTMERE 0x573b5eec
#define CPUIDFAMILY_DEFAULT 6
#define CPUID_MODEL_6_13 13
#define CPUID_MODEL_YONAH 14
#define CPUID_MODEL_MEROM 15
#define CPUID_MODEL_PENRYN 35
#define MACH_GET_MAGIC(hdr) (((struct mach_header_64*)(hdr))->magic)
#define MACH_GET_NCMDS(hdr) (((struct mach_header_64*)(hdr))->ncmds)
#define MACH_GET_CPU(hdr) (((struct mach_header_64*)(hdr))->cputype)
#define MACH_GET_FLAGS(hdr) (((struct mach_header_64*)(hdr))->flags)
#define SC_GET_CMD(hdr) (((struct segment_command_64*)(hdr))->cmd)
#define kPrelinkTextSegment "__PRELINK_TEXT"
#define kPrelinkTextSection "__text"
#define kPrelinkLinkStateSegment "__PRELINK_STATE"
#define kPrelinkKernelLinkStateSection "__kernel"
#define kPrelinkKextsLinkStateSection "__kexts"
#define kPrelinkInfoSegment "__PRELINK_INFO"
#define kPrelinkInfoSection "__info"
#define kTextSegment "__TEXT"
#define kLinkEditSegment "__LINKEDIT"
#define kPrelinkBundlePathKey "_PrelinkBundlePath"
#define kPrelinkExecutableRelativePathKey "_PrelinkExecutableRelativePath"
#define kPrelinkExecutableLoadKey "_PrelinkExecutableLoadAddr"
#define kPrelinkExecutableSourceKey "_PrelinkExecutableSourceAddr"
#define kPrelinkExecutableSizeKey "_PrelinkExecutableSize"
#define kPrelinkInfoDictionaryKey "_PrelinkInfoDictionary"
#define kPrelinkInterfaceUUIDKey "_PrelinkInterfaceUUID"
#define kPrelinkKmodInfoKey "_PrelinkKmodInfo"
#define kPrelinkLinkStateKey "_PrelinkLinkState"
#define kPrelinkLinkStateSizeKey "_PrelinkLinkStateSize"
#define kPropCFBundleIdentifier ("CFBundleIdentifier")
#define kPropCFBundleExecutable ("CFBundleExecutable")
#define kPropOSBundleRequired ("OSBundleRequired")
#define kPropOSBundleLibraries ("OSBundleLibraries")
#define kPropIOKitPersonalities ("IOKitPersonalities")
#define kPropIONameMatch ("IONameMatch")
typedef struct _BooterKextFileInfo {
UINT32 infoDictPhysAddr;
UINT32 infoDictLength;
UINT32 executablePhysAddr;
UINT32 executableLength;
UINT32 bundlePathPhysAddr;
UINT32 bundlePathLength;
} _BooterKextFileInfo;
typedef struct _DeviceTreeBuffer {
uint32_t paddr;
uint32_t length;
} _DeviceTreeBuffer;
typedef struct VTABLE {
UINT32 NameOffset;
UINT32 Attr;
UINT64 ProcAddr;
} VTABLE;
typedef struct SEGMENT {
CHAR8 Name[16]; //0
UINT64 SegAddress; //16
UINT32 Cmd[12]; //24
UINT32 AddrVtable; //72
UINT32 SizeVtable; //76
UINT32 AddrNames; //80
} SEGMENT;
extern EFI_PHYSICAL_ADDRESS KernelRelocBase;
extern BootArgs1 *bootArgs1;
extern BootArgs2 *bootArgs2;
extern CHAR8 *dtRoot;
extern UINT32 *dtLength;
extern UINT8 *KernelData;
extern UINT32 KernelSlide;
extern BOOLEAN isKernelcache;
extern BOOLEAN is64BitKernel;
extern BOOLEAN gSNBEAICPUFixRequire; // SandyBridge-E AppleIntelCpuPowerManagement patch require or not
extern BOOLEAN gBDWEIOPCIFixRequire; // Broadwell-E IOPCIFamily fix require or not
// notes:
// - 64bit segCmd64->vmaddr is 0xffffff80xxxxxxxx and we are taking
// only lower 32bit part into PrelinkTextAddr
// - PrelinkTextAddr is segCmd64->vmaddr + KernelRelocBase
extern UINT32 PrelinkTextLoadCmdAddr;
extern UINT32 PrelinkTextAddr;
extern UINT32 PrelinkTextSize;
// notes:
// - 64bit sect->addr is 0xffffff80xxxxxxxx and we are taking
// only lower 32bit part into PrelinkInfoAddr
// - PrelinkInfoAddr is sect->addr + KernelRelocBase
extern UINT32 PrelinkInfoLoadCmdAddr;
extern UINT32 PrelinkInfoAddr;
extern UINT32 PrelinkInfoSize;
extern UINT32 DisplayVendor[];
//VOID findCPUfamily();
extern BOOLEAN SSSE3;
//UINT64 kernelsize;
VOID Patcher_SSE3_5(VOID* kernelData);
VOID Patcher_SSE3_6(VOID* kernelData);
VOID Patcher_SSE3_7(VOID* kernelData);
#include "../gui/menu_items/menu_items.h" // for LOADER_ENTRY
class LOADER_ENTRY;
VOID KernelAndKextsPatcherStart(IN LOADER_ENTRY *Entry);
//VOID register_kernel_symbol(CONST CHAR8* name);
//UINT64 symbol_handler(CHAR8* symbolName, UINT64 addr);
//INTN locate_symbols(VOID* kernelData);
/////////////////////
//
// kext_patcher.c
//
//
// Called from SetFSInjection(), before boot.efi is started,
// to allow patchers to prepare FSInject to force load needed kexts.
//
VOID KextPatcherRegisterKexts(FSINJECTION_PROTOCOL *FSInject, FSI_STRING_LIST *ForceLoadKexts, LOADER_ENTRY *Entry);
//
// Entry for all kext patches.
// Will iterate through kext in prelinked kernel (kernelcache)
// or DevTree (drivers boot) and do patches.
//
VOID KextPatcherStart(LOADER_ENTRY *Entry);
//
// Searches Source for Search pattern of size SearchSize
// and returns the number of occurences.
//
UINTN SearchAndCount(UINT8 *Source, UINT64 SourceSize, UINT8 *Search, UINTN SearchSize);
BOOLEAN CompareMemMask(UINT8 *Source, UINT8 *Search, UINT8 *Mask, UINTN SearchSize);
//
// Searches Source for Search pattern of size SearchSize
// and replaces it with Replace up to MaxReplaces times.
// If MaxReplaces <= 0, then there is no restriction on number of replaces.
// Replace should have the same size as Search.
// Returns number of replaces done.
//
UINTN SearchAndReplace(UINT8 *Source, UINT64 SourceSize, UINT8 *Search, UINTN SearchSize, UINT8 *Replace, INTN MaxReplaces);
UINTN SearchAndReplaceMask(UINT8 *Source, UINT64 SourceSize, UINT8 *Search, UINT8 *MaskSearch, UINTN SearchSize, UINT8 *Replace, UINT8 *MaskReplace, INTN MaxReplaces);
UINTN searchProc(unsigned char * kernel, UINTN kernelSize, const char *procedure, UINTN *procLen);
#endif /* !__LIBSAIO_KERNEL_PATCHER_H */