mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-25 16:37:42 +01:00
f35acfa5ab
Signed-off-by: Sergey Isakov <isakov-sl@bk.ru>
106 lines
3.7 KiB
C
106 lines
3.7 KiB
C
/**
|
|
|
|
Methods for setting callback jump from kernel entry point, callback, fixes to kernel boot image.
|
|
|
|
by dmazar
|
|
|
|
**/
|
|
|
|
/* DevTree may contain /chosen/memory-map
|
|
* with properties with values = UINT32 address, UINT32 length:
|
|
* "BootCLUT" = 8bit boot time colour lookup table
|
|
* "Pict-FailedBoot" = picture shown if booting fails
|
|
* "RAMDisk" = ramdisk
|
|
* "Driver-<hex addr of DriverInfo>" = Kext, UINT32 address points to BooterKextFileInfo
|
|
* "DriversPackage-..." = MKext, UINT32 address points to mkext_header (libkern/libkern/mkext.h), UINT32 length
|
|
*
|
|
*/
|
|
#define BOOTER_KEXT_PREFIX "Driver-"
|
|
#define BOOTER_MKEXT_PREFIX "DriversPackage-"
|
|
#define BOOTER_RAMDISK_PREFIX "RAMDisk"
|
|
|
|
/** Struct at the beginning of every loaded kext.
|
|
* Pointers to every loaded kext (to this struct) are
|
|
* properties Driver-<hex addr of DriverInfo> in DevTree /chosen/memory-map
|
|
*/
|
|
typedef struct _BooterKextFileInfo {
|
|
UINT32 infoDictPhysAddr;
|
|
UINT32 infoDictLength;
|
|
UINT32 executablePhysAddr;
|
|
UINT32 executableLength;
|
|
UINT32 bundlePathPhysAddr;
|
|
UINT32 bundlePathLength;
|
|
} BooterKextFileInfo;
|
|
|
|
struct DTMemMapEntry {
|
|
UINT32 Address;
|
|
UINT32 Length;
|
|
};
|
|
typedef struct DTMemMapEntry DTMemMapEntry;
|
|
|
|
typedef struct {
|
|
EFI_PHYSICAL_ADDRESS PhysicalStart;
|
|
EFI_MEMORY_TYPE Type;
|
|
} RT_RELOC_PROTECT_INFO;
|
|
|
|
typedef struct {
|
|
UINTN NumEntries;
|
|
RT_RELOC_PROTECT_INFO RelocInfo[50]; // You probably want to adapt this.
|
|
} RT_RELOC_PROTECT_DATA;
|
|
|
|
|
|
|
|
extern EFI_PHYSICAL_ADDRESS gRelocBase;
|
|
extern EFI_PHYSICAL_ADDRESS gSysTableRtArea;
|
|
extern BOOLEAN gHibernateWake;
|
|
extern UINTN gLastMemoryMapSize;
|
|
extern EFI_MEMORY_DESCRIPTOR *gLastMemoryMap;
|
|
extern UINTN gLastDescriptorSize;
|
|
extern UINT32 gLastDescriptorVersion;
|
|
|
|
EFI_STATUS PrepareJumpFromKernel(VOID);
|
|
EFI_STATUS KernelEntryPatchJump(UINT32 KernelEntry);
|
|
EFI_STATUS KernelEntryFromMachOPatchJump(VOID *MachOImage, UINTN SlideAddr);
|
|
//EFI_STATUS KernelEntryPatchJumpFill(VOID);
|
|
EFI_STATUS KernelEntryPatchHalt(UINT32 KernelEntry);
|
|
EFI_STATUS KernelEntryPatchZero(UINT32 KernelEntry);
|
|
EFI_STATUS
|
|
ExecSetVirtualAddressesToMemMap(
|
|
IN UINTN MemoryMapSize,
|
|
IN UINTN DescriptorSize,
|
|
IN UINT32 DescriptorVersion,
|
|
IN EFI_MEMORY_DESCRIPTOR *MemoryMap
|
|
);
|
|
VOID
|
|
CopyEfiSysTableToSeparateRtDataArea(IN OUT UINT32 *EfiSystemTable);
|
|
|
|
VOID
|
|
ProtectRtDataFromRelocation(
|
|
IN UINTN MemoryMapSize,
|
|
IN UINTN DescriptorSize,
|
|
IN UINT32 DescriptorVersion,
|
|
IN EFI_MEMORY_DESCRIPTOR *MemoryMap
|
|
);
|
|
|
|
VOID
|
|
VirtualizeRTShimPointers (UINTN MemoryMapSize, UINTN DescriptorSize, EFI_MEMORY_DESCRIPTOR *MemoryMap);
|
|
|
|
VOID
|
|
DefragmentRuntimeServices(
|
|
IN UINTN MemoryMapSize,
|
|
IN UINTN DescriptorSize,
|
|
IN UINT32 DescriptorVersion,
|
|
IN EFI_MEMORY_DESCRIPTOR *MemoryMap,
|
|
IN OUT UINT32 *EfiSystemTable,
|
|
IN BOOLEAN SkipOurSysTableRtArea
|
|
);
|
|
/** Fixes stuff for booting with relocation block. Called when boot.efi jumps to kernel. */
|
|
UINTN FixBootingWithRelocBlock(UINTN bootArgs, BOOLEAN ModeX64);
|
|
|
|
/** Fixes stuff for booting without relocation block. Called when boot.efi jumps to kernel. */
|
|
UINTN FixBootingWithoutRelocBlock(UINTN bootArgs, BOOLEAN ModeX64);
|
|
|
|
/** Fixes stuff for hibernate wake booting without relocation block. Called when boot.efi jumps to kernel. */
|
|
UINTN FixHibernateWakeWithoutRelocBlock(UINTN imageHeaderPage, BOOLEAN ModeX64);
|
|
|