diff --git a/Changelog.md b/Changelog.md index f65bbc4..fe9fb7c 100644 --- a/Changelog.md +++ b/Changelog.md @@ -2,6 +2,7 @@ NVMeFix Changelog ================= #### v1.0.5 - Fixed quirks enabling per controller +- Fixed initialisation on 10.15+ #### v1.0.4 - Added MacKernelSDK with Xcode 12 compatibility diff --git a/NVMeFix.xcodeproj/project.pbxproj b/NVMeFix.xcodeproj/project.pbxproj index c10ded2..619258d 100644 --- a/NVMeFix.xcodeproj/project.pbxproj +++ b/NVMeFix.xcodeproj/project.pbxproj @@ -221,7 +221,7 @@ 2FF3E70623AE1DA100D8CDEB /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1220; + LastUpgradeCheck = 1230; ORGANIZATIONNAME = acidanthera; TargetAttributes = { 2FF3E70E23AE1DA100D8CDEB = { diff --git a/NVMeFix/NVMeFix.cpp b/NVMeFix/NVMeFix.cpp index 25b23f4..6d72394 100644 --- a/NVMeFix/NVMeFix.cpp +++ b/NVMeFix/NVMeFix.cpp @@ -70,16 +70,18 @@ bool NVMeFixPlugin::solveSymbols(KernelPatcher& kp) { /* mov eax, [rdi+0xA8] */ res &= kextMembers.AppleNVMeRequest.result.fromFunc(kextFuncs.AppleNVMeRequest.GetStatus.fptr, - 0x8b, 0, 7, 4) & + 0x8b, 0, 7, 4) && /* movzx eax, byte ptr [rdi+0x10A] */ kextMembers.AppleNVMeRequest.command.fromFunc(kextFuncs.AppleNVMeRequest.GetOpcode.fptr, - 0xf, 0, 7) & + 0xf, 0, 7) && /* mov [rbx+0xC0], r12 */ kextMembers.AppleNVMeRequest.prpDescriptor.fromFunc(kextFuncs.IONVMeController.IssueIdentifyCommand.fptr, - 0x89, 4, 3) && + 0x89, 4, 3); + /* cmp byte ptr [rdi+269h], 0 */ - kextMembers.IONVMeController.ANS2MSIWorkaround.fromFunc(kextFuncs.IONVMeController.FilterInterruptRequest.fptr, + kextMembers.IONVMeController.ANS2MSIWorkaround.fromFunc(kextFuncs.IONVMeController.FilterInterruptRequest.fptr, 0x80, 7, 7, 0, 32); + if (res) kextMembers.AppleNVMeRequest.controller.offs = kextMembers.AppleNVMeRequest.result.offs - 12; @@ -195,7 +197,11 @@ void NVMeFixPlugin::handleController(ControllerEntry& entry) { * start of FilterIRQ instead so that FilterIRQ does not race with itself. This seems to eliminate * the timeouts. **/ - kextMembers.IONVMeController.ANS2MSIWorkaround.get(entry.controller) = 1; + if (kextMembers.IONVMeController.ANS2MSIWorkaround.has()) { + kextMembers.IONVMeController.ANS2MSIWorkaround.get(entry.controller) = 1; + } else { + DBGLOG(Log::Plugin, "Ignoring ANS2 workaround patch on newer system"); + } /* First get quirks based on PCI device */ entry.quirks = NVMe::quirksForController(entry.controller); diff --git a/NVMeFix/NVMeFixPlugin.hpp b/NVMeFix/NVMeFixPlugin.hpp index 1b950a5..51f0178 100644 --- a/NVMeFix/NVMeFixPlugin.hpp +++ b/NVMeFix/NVMeFixPlugin.hpp @@ -162,6 +162,10 @@ class NVMeFixPlugin { return getMember(obj, offs); } + bool has() { + return offs != 0; + } + bool fromFunc(mach_vm_address_t start, uint32_t opcode, uint32_t reg, uint32_t rm, uint32_t add=0, size_t ninsts_max=128) { if (offs)