diff --git a/rEFIt_UEFI/Platform/kext_inject.c b/rEFIt_UEFI/Platform/kext_inject.c index 5b6b808272..81e94cbcbf 100644 --- a/rEFIt_UEFI/Platform/kext_inject.c +++ b/rEFIt_UEFI/Platform/kext_inject.c @@ -576,147 +576,6 @@ EFI_STATUS LoadKexts(IN LOADER_ENTRY *Entry) } -/* - * Adler32 from Chameleon - */ -#define BASE 65521L /* largest prime smaller than 65536 */ -#define NMAX 5000 -// NMAX (was 5521) the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 - -#define DO1(buf,i) {s1 += buf[i]; s2 += s1;} -#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); -#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); -#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); -#define DO16(buf) DO8(buf,0); DO8(buf,8); - -static unsigned long Adler32(unsigned char *buf, long len) -{ - unsigned long s1 = 1; // adler & 0xffff; - unsigned long s2 = 0; // (adler >> 16) & 0xffff; - unsigned long result; - int k; - - while (len > 0) { - k = len < NMAX ? len : NMAX; - len -= k; - while (k >= 16) { - DO16(buf); - buf += 16; - k -= 16; - } - if (k != 0) do { - s1 += *buf++; - s2 += s1; - } while (--k); - s1 %= BASE; - s2 %= BASE; - } - result = (s2 << 16) | s1; - // result is in big endian - return result; -} - -typedef struct { - UINT32 Magic; - UINT32 Signature; - UINT32 Length; - UINT32 Adler32; - UINT32 Version; - UINT32 NumKexts; - UINT32 CpuType; - UINT32 CpuSubtype; -} MKextHeader; - -typedef struct { - UINT32 PlistOffset; - UINT32 PlistCompressedSize; - UINT32 PlistFullSize; - UINT32 PlistModifiedSeconds; - UINT32 BinaryOffset; - UINT32 BinaryCompressedSize; - UINT32 BinaryFullSize; - UINT32 BinaryModifiedSeconds; -} MKextFile; - -#define MKEXT_MAGIC 0x54584b4d -#define MKEXT_SIGNATURE 0x58534f4d -#define MKEXT_VERSION_1 0x00800001 - -int is_mkext_v1(LOADER_ENTRY *Entry, UINT8* drvPtr) { - _DeviceTreeBuffer *dtb = (_DeviceTreeBuffer*) (((UINT8*)drvPtr) + sizeof(DeviceTreeNodeProperty)); - MKextHeader* mkext_ptr = (MKextHeader*)(UINTN)(dtb->paddr); - - if (mkext_ptr->Magic == MKEXT_MAGIC - && mkext_ptr->Signature == MKEXT_SIGNATURE - && mkext_ptr->Version == MKEXT_VERSION_1) { - DBG_RT(Entry, "MKext_v1 found at paddr=0x%08x, length=0x%08x\n", dtb->paddr, dtb->length); - return 1; - } - return 0; -} - -void patch_mkext_v1(LOADER_ENTRY *Entry, UINT8 *drvPtr) { - _DeviceTreeBuffer *dtb = (_DeviceTreeBuffer*) (((UINT8*)drvPtr) + sizeof(DeviceTreeNodeProperty)); - MKextHeader* mkext_ptr = (MKextHeader*)(UINTN)dtb->paddr; - - UINT32 mkext_len = SwapBytes32(mkext_ptr->Length); - UINT32 mkext_numKexts = SwapBytes32(mkext_ptr->NumKexts); - - LIST_ENTRY *Link; - KEXT_ENTRY *KextEntry; - if(!IsListEmpty(&gKextList)) { - for (Link = gKextList.ForwardLink; Link != &gKextList; Link = Link->ForwardLink) { - KextEntry = CR(Link, KEXT_ENTRY, Link, KEXT_SIGNATURE); - MKextFile *mkext_insert = (MKextFile*)((UINT8*)mkext_ptr + sizeof(MKextHeader) + mkext_numKexts * sizeof(MKextFile)); - - // free some space - CopyMem((UINT8*)mkext_insert + sizeof(MKextFile), - (UINT8*)mkext_insert, - mkext_len - (sizeof(MKextHeader) + mkext_numKexts * sizeof(MKextFile))); - mkext_len += sizeof(MKextFile); - - // update the offsets to reflect 0x20 bytes moved above - for (UINT32 i = 0; i < mkext_numKexts; i++) { - MKextFile *kext_base = (MKextFile*)((UINT8*)mkext_ptr + sizeof(MKextHeader) + i * sizeof(MKextFile)); - UINT32 plist_offset = SwapBytes32(kext_base->PlistOffset) + sizeof(MKextFile); - UINT32 binary_offset = SwapBytes32(kext_base->BinaryOffset) + sizeof(MKextFile); - kext_base->PlistOffset = SwapBytes32(plist_offset); - kext_base->BinaryOffset = SwapBytes32(binary_offset); - } - - // copy kext data (plist+binary) - CopyMem((UINT8*)mkext_ptr + mkext_len, - (UINT8*)(KextEntry->kext.paddr + sizeof(_BooterKextFileInfo)), - (UINT32)((_BooterKextFileInfo*)(UINTN)(KextEntry->kext.paddr))->infoDictLength - + (UINT32)((_BooterKextFileInfo*)(UINTN)(KextEntry->kext.paddr))->executableLength); - - // insert kext offsets - mkext_insert->PlistOffset = SwapBytes32(mkext_len); - mkext_len += ((_BooterKextFileInfo*)(UINTN)(KextEntry->kext.paddr))->infoDictLength; - mkext_insert->PlistCompressedSize = 0; - mkext_insert->PlistFullSize = SwapBytes32((UINT32)((_BooterKextFileInfo*)(UINTN)(KextEntry->kext.paddr))->infoDictLength); - mkext_insert->PlistModifiedSeconds = 0; - mkext_insert->BinaryOffset = SwapBytes32(mkext_len); - mkext_len += ((_BooterKextFileInfo*)(UINTN)(KextEntry->kext.paddr))->executableLength; - mkext_insert->BinaryCompressedSize = 0; - mkext_insert->BinaryFullSize = SwapBytes32((UINT32)((_BooterKextFileInfo*)(UINTN)(KextEntry->kext.paddr))->executableLength); - mkext_insert->BinaryModifiedSeconds = 0; - mkext_numKexts ++; - - // update the header - mkext_ptr->Length = SwapBytes32(mkext_len); - mkext_ptr->NumKexts = SwapBytes32(mkext_numKexts); - - // update the checksum - mkext_ptr->Adler32 = SwapBytes32(Adler32((UINT8*)mkext_ptr + 0x10, mkext_len - 0x10)); - - // update the memory-map reference - dtb->length = mkext_len; - } - } -} - - //////////////////// // OnExitBootServices //////////////////// @@ -802,17 +661,6 @@ EFI_STATUS InjectKexts(/*IN EFI_MEMORY_DESCRIPTOR *Desc*/ IN UINT32 deviceTreeP, return EFI_INVALID_PARAMETER; } - - UINT64 os_version = AsciiOSVersionToUint64(Entry->OSVersion); - if (os_version < AsciiOSVersionToUint64("10.6")) { - DBG_RT(Entry, "no kernel patch for Tiger/Leopard; try to patch mkext\n"); - if (is_mkext_v1(Entry, drvPtr)) { - patch_mkext_v1(Entry, drvPtr); - return EFI_SUCCESS; - } - } - - // make space for memory map entries platformEntry->NumProperties -= 2; offset = sizeof(DeviceTreeNodeProperty) + ((DeviceTreeNodeProperty*) infoPtr)->Length;