From 9e8d2793ba02a58a1c97fece3cac1e2f06693f14 Mon Sep 17 00:00:00 2001 From: PMheart <17109513+PMheart@users.noreply.github.com> Date: Sun, 3 Jul 2022 12:58:14 +0200 Subject: [PATCH] OcAppleKernelLib: Make quirk Patcher parameter optional (#359) --- .../Acidanthera/Library/OcAppleKernelLib.h | 8 +- Library/OcAppleKernelLib/CommonPatches.c | 187 +++++++++++++----- 2 files changed, 143 insertions(+), 52 deletions(-) diff --git a/Include/Acidanthera/Library/OcAppleKernelLib.h b/Include/Acidanthera/Library/OcAppleKernelLib.h index 7ccd9f0c44b..fb8d12396ca 100644 --- a/Include/Acidanthera/Library/OcAppleKernelLib.h +++ b/Include/Acidanthera/Library/OcAppleKernelLib.h @@ -616,7 +616,7 @@ typedef enum { /** Kernel quirk patch function. - @param[in,out] Patcher A pointer to the patcher context. + @param[in,out] Patcher A pointer to the patcher context. Only optional for kext patching. @param[in] KernelVersion Kernel version to be matched. @return EFI_SUCCESS when the patch is successfully applied. @@ -624,7 +624,7 @@ typedef enum { typedef EFI_STATUS (KERNEL_QUIRK_PATCH_FUNCTION) ( - IN OUT PATCHER_CONTEXT *Patcher, + IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion ); @@ -646,7 +646,7 @@ typedef struct { Applies the specified quirk. @param[in] Name KERNEL_QUIRK_NAME specifying the quirk name. - @param[in,out] Patcher PATCHER_CONTEXT instance. + @param[in,out] Patcher PATCHER_CONTEXT instance. Only optional for kext patching. @param[in] KernelVersion Current kernel version. @returns EFI_SUCCESS on success. @@ -654,7 +654,7 @@ typedef struct { EFI_STATUS KernelApplyQuirk ( IN KERNEL_QUIRK_NAME Name, - IN OUT PATCHER_CONTEXT *Patcher, + IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion ); diff --git a/Library/OcAppleKernelLib/CommonPatches.c b/Library/OcAppleKernelLib/CommonPatches.c index 83b54eaf87a..267445c00f1 100644 --- a/Library/OcAppleKernelLib/CommonPatches.c +++ b/Library/OcAppleKernelLib/CommonPatches.c @@ -51,7 +51,7 @@ CONST UINTN STATIC EFI_STATUS PatchAppleCpuPmCfgLock ( - IN OUT PATCHER_CONTEXT *Patcher, + IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion ) { @@ -60,12 +60,20 @@ PatchAppleCpuPmCfgLock ( UINT8 *WalkerEnd; UINT8 *WalkerTmp; + // + // NOTE: As of macOS 13.0 AICPUPM kext is removed. + // However, we may remove this check later, if an older version can be injected correctly + // such that it will patched. + // if (OcMatchDarwinVersion (KernelVersion, KERNEL_VERSION_VENTURA_MIN, 0)) { DEBUG ((DEBUG_INFO, "OCAK: Skipping AppleCpuPmCfgLock patch on %u\n", KernelVersion)); return EFI_SUCCESS; } - ASSERT (Patcher != NULL); + if (Patcher == NULL) { + DEBUG ((DEBUG_INFO, "OCAK: Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion)); + return EFI_NOT_FOUND; + } Count = 0; Walker = (UINT8 *)MachoGetMachHeader (&Patcher->MachContext); @@ -222,7 +230,7 @@ PATCHER_GENERIC_PATCH STATIC EFI_STATUS PatchAppleXcpmCfgLock ( - IN OUT PATCHER_CONTEXT *Patcher, + IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion ) { @@ -232,6 +240,9 @@ PatchAppleXcpmCfgLock ( UINT32 Replacements; + // + // This is a kernel patch, so Patcher cannot be NULL. + // ASSERT (Patcher != NULL); // @@ -347,7 +358,7 @@ PATCHER_GENERIC_PATCH STATIC EFI_STATUS PatchAppleXcpmExtraMsrs ( - IN OUT PATCHER_CONTEXT *Patcher, + IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion ) { @@ -356,6 +367,9 @@ PatchAppleXcpmExtraMsrs ( XCPM_MSR_RECORD *Last; UINT32 Replacements; + // + // This is a kernel patch, so Patcher cannot be NULL. + // ASSERT (Patcher != NULL); // @@ -473,7 +487,7 @@ CONST UINT8 STATIC EFI_STATUS PatchAppleXcpmForceBoost ( - IN OUT PATCHER_CONTEXT *Patcher, + IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion ) { @@ -481,6 +495,9 @@ PatchAppleXcpmForceBoost ( UINT8 *Last; UINT8 *Current; + // + // This is a kernel patch, so Patcher cannot be NULL. + // ASSERT (Patcher != NULL); // @@ -633,7 +650,7 @@ PATCHER_GENERIC_PATCH STATIC EFI_STATUS PatchUsbXhciPortLimit1 ( - IN OUT PATCHER_CONTEXT *Patcher, + IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion ) { @@ -648,6 +665,11 @@ PatchUsbXhciPortLimit1 ( return EFI_SUCCESS; } + if (Patcher == NULL) { + DEBUG ((DEBUG_INFO, "OCAK: Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion)); + return EFI_NOT_FOUND; + } + Status = PatcherApplyGenericPatch (Patcher, &mRemoveUsbLimitIoP1Patch); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_INFO, "OCAK: Failed to apply port patch com.apple.iokit.IOUSBHostFamily - %r\n", Status)); @@ -661,19 +683,22 @@ PatchUsbXhciPortLimit1 ( STATIC EFI_STATUS PatchUsbXhciPortLimit2 ( - IN OUT PATCHER_CONTEXT *Patcher, + IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion ) { EFI_STATUS Status; - ASSERT (Patcher != NULL); - if (!OcMatchDarwinVersion (KernelVersion, KERNEL_VERSION_HIGH_SIERRA_MIN, 0)) { DEBUG ((DEBUG_INFO, "OCAK: Skipping modern port patch AppleUSBXHCI on %u\n", KernelVersion)); return EFI_SUCCESS; } + if (Patcher == NULL) { + DEBUG ((DEBUG_INFO, "OCAK: Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion)); + return EFI_NOT_FOUND; + } + // // TODO: Implement some locationID hack in IOUSBHostFamily. // The location ID is a 32 bit number which is unique among all USB devices in the system, @@ -722,19 +747,22 @@ PatchUsbXhciPortLimit2 ( STATIC EFI_STATUS PatchUsbXhciPortLimit3 ( - IN OUT PATCHER_CONTEXT *Patcher, + IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion ) { EFI_STATUS Status; - ASSERT (Patcher != NULL); - if (!OcMatchDarwinVersion (KernelVersion, KERNEL_VERSION_EL_CAPITAN_MIN, KERNEL_VERSION_HIGH_SIERRA_MAX)) { DEBUG ((DEBUG_INFO, "OCAK: Skipping legacy port patch AppleUSBXHCIPCI on %u\n", KernelVersion)); return EFI_SUCCESS; } + if (Patcher == NULL) { + DEBUG ((DEBUG_INFO, "OCAK: Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion)); + return EFI_NOT_FOUND; + } + // // If we are here, we are on legacy 10.13 or below, try the oldest patch. // @@ -813,13 +841,16 @@ PATCHER_GENERIC_PATCH STATIC EFI_STATUS PatchThirdPartyDriveSupport ( - IN OUT PATCHER_CONTEXT *Patcher, + IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion ) { EFI_STATUS Status; - ASSERT (Patcher != NULL); + if (Patcher == NULL) { + DEBUG ((DEBUG_INFO, "OCAK: Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion)); + return EFI_NOT_FOUND; + } Status = PatcherApplyGenericPatch (Patcher, &mIOAHCIBlockStoragePatchV1); if (EFI_ERROR (Status)) { @@ -882,13 +913,16 @@ PATCHER_GENERIC_PATCH STATIC EFI_STATUS PatchForceInternalDiskIcons ( - IN OUT PATCHER_CONTEXT *Patcher, + IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion ) { EFI_STATUS Status; - ASSERT (Patcher != NULL); + if (Patcher == NULL) { + DEBUG ((DEBUG_INFO, "OCAK: Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion)); + return EFI_NOT_FOUND; + } Status = PatcherApplyGenericPatch (Patcher, &mIOAHCIPortPatch); if (EFI_ERROR (Status)) { @@ -929,19 +963,22 @@ PATCHER_GENERIC_PATCH STATIC EFI_STATUS PatchAppleIoMapperSupport ( - IN OUT PATCHER_CONTEXT *Patcher, + IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion ) { EFI_STATUS Status; - ASSERT (Patcher != NULL); - if (!OcMatchDarwinVersion (KernelVersion, KERNEL_VERSION_MOUNTAIN_LION_MIN, 0)) { DEBUG ((DEBUG_INFO, "OCAK: Skipping AppleIoMapper patch on %u\n", KernelVersion)); return EFI_SUCCESS; } + if (Patcher == NULL) { + DEBUG ((DEBUG_INFO, "OCAK: Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion)); + return EFI_NOT_FOUND; + } + Status = PatcherApplyGenericPatch (Patcher, &mAppleIoMapperPatch); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_INFO, "OCAK: Failed to apply patch com.apple.iokit.IOPCIFamily AppleIoMapper - %r\n", Status)); @@ -976,7 +1013,7 @@ PATCHER_GENERIC_PATCH STATIC EFI_STATUS PatchDummyPowerManagement ( - IN OUT PATCHER_CONTEXT *Patcher, + IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion ) { @@ -987,7 +1024,10 @@ PatchDummyPowerManagement ( return EFI_SUCCESS; } - ASSERT (Patcher != NULL); + if (Patcher == NULL) { + DEBUG ((DEBUG_INFO, "OCAK: Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion)); + return EFI_NOT_FOUND; + } Status = PatcherApplyGenericPatch (Patcher, &mAppleDummyCpuPmPatch); if (EFI_ERROR (Status)) { @@ -1056,19 +1096,22 @@ PATCHER_GENERIC_PATCH STATIC EFI_STATUS PatchIncreasePciBarSize ( - IN OUT PATCHER_CONTEXT *Patcher, + IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion ) { EFI_STATUS Status; - ASSERT (Patcher != NULL); - if (!OcMatchDarwinVersion (KernelVersion, KERNEL_VERSION_YOSEMITE_MIN, 0)) { DEBUG ((DEBUG_INFO, "OCAK: Skipping com.apple.iokit.IOPCIFamily IncreasePciBarSize on %u\n", KernelVersion)); return EFI_SUCCESS; } + if (Patcher == NULL) { + DEBUG ((DEBUG_INFO, "OCAK: Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion)); + return EFI_NOT_FOUND; + } + Status = PatcherApplyGenericPatch (Patcher, &mIncreasePciBarSizePatch); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_INFO, "OCAK: Failed to apply patch com.apple.iokit.IOPCIFamily IncreasePciBarSize - %r, trying legacy patch\n", Status)); @@ -1140,6 +1183,9 @@ PatchCustomPciSerialPmio ( UINT8 *WalkerEnd; UINT8 *WalkerTmp; + // + // This is a kernel patch, so Patcher cannot be NULL. + // ASSERT (Patcher != NULL); Count = 0; @@ -1210,12 +1256,17 @@ PatchCustomPciSerialPmio ( STATIC EFI_STATUS PatchCustomPciSerialDevice ( - IN OUT PATCHER_CONTEXT *Patcher, + IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion ) { EFI_STATUS Status; + // + // This is a kernel patch, so Patcher cannot be NULL. + // + ASSERT (Patcher != NULL); + Status = EFI_INVALID_PARAMETER; if ( ((mPmioRegisterBase != 0) && (mPmioRegisterStride != 0)) && ((mPmioRegisterBase + 7U * mPmioRegisterStride) <= MAX_UINT16)) @@ -1265,13 +1316,16 @@ PATCHER_GENERIC_PATCH STATIC EFI_STATUS PatchCustomSmbiosGuid ( - IN OUT PATCHER_CONTEXT *Patcher, + IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion ) { EFI_STATUS Status; - ASSERT (Patcher != NULL); + if (Patcher == NULL) { + DEBUG ((DEBUG_INFO, "OCAK: Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion)); + return EFI_NOT_FOUND; + } Status = PatcherApplyGenericPatch (Patcher, &mCustomSmbiosGuidPatch); if (!EFI_ERROR (Status)) { @@ -1312,7 +1366,7 @@ PATCHER_GENERIC_PATCH STATIC EFI_STATUS PatchPanicKextDump ( - IN OUT PATCHER_CONTEXT *Patcher, + IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion ) { @@ -1320,6 +1374,9 @@ PatchPanicKextDump ( UINT8 *Record; UINT8 *Last; + // + // This is a kernel patch, so Patcher cannot be NULL. + // ASSERT (Patcher != NULL); if (!OcMatchDarwinVersion (KernelVersion, KERNEL_VERSION_HIGH_SIERRA_MIN, 0)) { @@ -1470,12 +1527,15 @@ PATCHER_GENERIC_PATCH STATIC EFI_STATUS PatchLapicKernelPanic ( - IN OUT PATCHER_CONTEXT *Patcher, + IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion ) { EFI_STATUS Status; + // + // This is a kernel patch, so Patcher cannot be NULL. + // ASSERT (Patcher != NULL); // @@ -1585,12 +1645,15 @@ PATCHER_GENERIC_PATCH STATIC EFI_STATUS PatchPowerStateTimeout ( - IN OUT PATCHER_CONTEXT *Patcher, + IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion ) { EFI_STATUS Status; + // + // This is a kernel patch, so Patcher cannot be NULL. + // ASSERT (Patcher != NULL); if (!OcMatchDarwinVersion (KernelVersion, KERNEL_VERSION_CATALINA_MIN, 0)) { @@ -1699,13 +1762,16 @@ PATCHER_GENERIC_PATCH STATIC EFI_STATUS PatchAppleRtcChecksum ( - IN OUT PATCHER_CONTEXT *Patcher, + IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion ) { EFI_STATUS Status; - ASSERT (Patcher != NULL); + if (Patcher == NULL) { + DEBUG ((DEBUG_INFO, "OCAK: Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion)); + return EFI_NOT_FOUND; + } Status = PatcherApplyGenericPatch (Patcher, Patcher->Is32Bit ? &mAppleRtcChecksumPatch32 : &mAppleRtcChecksumPatch64); if (EFI_ERROR (Status)) { @@ -1720,7 +1786,7 @@ PatchAppleRtcChecksum ( STATIC EFI_STATUS PatchSegmentJettison ( - IN OUT PATCHER_CONTEXT *Patcher, + IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion ) { @@ -1734,6 +1800,11 @@ PatchSegmentJettison ( UINT32 Diff; UINT32 Diff2; + // + // This is a kernel patch, so Patcher cannot be NULL. + // + ASSERT (Patcher != NULL); + if (!OcMatchDarwinVersion (KernelVersion, KERNEL_VERSION_BIG_SUR_MIN, 0)) { DEBUG ((DEBUG_INFO, "OCAK: Skipping SegmentJettison on %u\n", KernelVersion)); return EFI_SUCCESS; @@ -1860,19 +1931,22 @@ PATCHER_GENERIC_PATCH STATIC EFI_STATUS PatchBTFeatureFlags ( - IN OUT PATCHER_CONTEXT *Patcher, + IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion ) { EFI_STATUS Status; - ASSERT (Patcher != NULL); - if (!OcMatchDarwinVersion (KernelVersion, KERNEL_VERSION_MOUNTAIN_LION_MIN, 0)) { DEBUG ((DEBUG_INFO, "OCAK: Skipping BTFeatureFlags on %u\n", KernelVersion)); return EFI_SUCCESS; } + if (Patcher == NULL) { + DEBUG ((DEBUG_INFO, "OCAK: Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion)); + return EFI_NOT_FOUND; + } + Status = PatcherApplyGenericPatch (Patcher, &mBTFeatureFlagsPatchV1); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_INFO, "OCAK: Failed to find BT FeatureFlags symbol v1 - %r, trying v2\n", Status)); @@ -1958,7 +2032,7 @@ CONST UINT8 STATIC EFI_STATUS PatchLegacyCommpage ( - IN OUT PATCHER_CONTEXT *Patcher, + IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion ) { @@ -1975,6 +2049,9 @@ PatchLegacyCommpage ( UINT32 CommpageAddress; UINT32 CommpageMustHave; + // + // This is a kernel patch, so Patcher cannot be NULL. + // ASSERT (Patcher != NULL); Start = ((UINT8 *)MachoGetMachHeader (&Patcher->MachContext)); @@ -2135,14 +2212,12 @@ PATCHER_GENERIC_PATCH STATIC EFI_STATUS PatchAquantiaEthernet ( - IN OUT PATCHER_CONTEXT *Patcher, + IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion ) { EFI_STATUS Status; - ASSERT (Patcher != NULL); - // // This patch is not required before macOS 10.15.4. // @@ -2151,6 +2226,11 @@ PatchAquantiaEthernet ( return EFI_SUCCESS; } + if (Patcher == NULL) { + DEBUG ((DEBUG_INFO, "OCAK: Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion)); + return EFI_NOT_FOUND; + } + // // Shikumo's patch can be applied to a wider range, not limited to AQC 107 series, // thus preferred. @@ -2178,7 +2258,7 @@ PatchAquantiaEthernet ( STATIC EFI_STATUS PatchForceSecureBootScheme ( - IN OUT PATCHER_CONTEXT *Patcher, + IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion ) { @@ -2188,13 +2268,16 @@ PatchForceSecureBootScheme ( UINT8 *HybridAp; UINT32 Diff; - ASSERT (Patcher != NULL); - if (!OcMatchDarwinVersion (KernelVersion, KERNEL_VERSION_BIG_SUR_MIN, 0)) { DEBUG ((DEBUG_INFO, "OCAK: Skipping sb scheme on %u\n", KernelVersion)); return EFI_SUCCESS; } + if (Patcher == NULL) { + DEBUG ((DEBUG_INFO, "OCAK: Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion)); + return EFI_NOT_FOUND; + } + // // This code is for debugging APFS snapshot verification for Big Sur. // macOS chooses verification scheme based on the hardware: @@ -2302,19 +2385,22 @@ PATCHER_GENERIC_PATCH STATIC EFI_STATUS PatchSetApfsTrimTimeout ( - IN OUT PATCHER_CONTEXT *Patcher, + IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion ) { EFI_STATUS Status; - ASSERT (Patcher != NULL); - if (!OcMatchDarwinVersion (KernelVersion, KERNEL_VERSION_MOJAVE_MIN, 0)) { DEBUG ((DEBUG_INFO, "OCAK: Skipping apfs timeout on %u\n", KernelVersion)); return EFI_SUCCESS; } + if (Patcher == NULL) { + DEBUG ((DEBUG_INFO, "OCAK: Skipping %a on NULL Patcher on %u\n", __func__, KernelVersion)); + return EFI_NOT_FOUND; + } + // // Disable trim using another patch when timeout is 0. // @@ -2382,11 +2468,16 @@ KERNEL_QUIRK gKernelQuirks[] = { EFI_STATUS KernelApplyQuirk ( IN KERNEL_QUIRK_NAME Name, - IN OUT PATCHER_CONTEXT *Patcher, + IN OUT PATCHER_CONTEXT *Patcher OPTIONAL, IN UINT32 KernelVersion ) { - ASSERT (Patcher != NULL); + // + // Patcher cannot be NULL for kernel patches, whose Identifier are NULL. + // + if (gKernelQuirks[Name].Identifier == NULL) { + ASSERT (Patcher != NULL); + } return gKernelQuirks[Name].PatchFunction (Patcher, KernelVersion); }