DSDT使用及常见错误修改
对于新电脑来说,单纯有clover和config.plist并不一定能顺利安装黑苹果。在启动时,机器会去读取APIC的配置,不适配的DSDT和SSDT会导致频繁的五国和禁止图示。DSDT的重要性已经多次得到证明,曾经一台compaq ev45怎么启动都持续panic,采用F4抓取dsdt后再次启动就正常。 最近一台Dell vostro 5468也是怎么折腾都无法启动,在网上寻找到别人适用其他机器的dsdt后,顺利引导和安装黑苹果。 1, dsdt的获取 a, acpica的acpiextract命令 b, Clover的F4功能键 *保存原始DSDT到/EFI/ACPI/origin c, linux下的cat /proc/.... d, DPCIManager的Extract DSDT e, Clover Config的Export. 因为取的内容是一样的,因此虽然获取方式不同,但最终得到dsdt是没有任何区别的。 类似于linux下的动态ssdt, 通过clover提取出来后,隐含的ssdt会附加后缀x。这些ssdt是无法直接放入patched来使用的。 2, 对dsdt文件进行编译。 提取出来的dsdt就可以编辑或者直接使用了。编辑时可以采用iasl命令,也可以采用Macisal程序。 Macisal可以添加更多的补丁源,根据需要对dsdt进行patch,可以直接打开aml文件进行修改,编译,同时进行语法检查。推荐使用。因为dsdt会有很多外部定义的操作和函数,单纯解码会有很多报错,还是建议联合DSDT和SSDT进行反编译,会比较靠谱。 ssdt会有很多个文件,其中常见的SSDT的特点及功能如下: - CPU相关: 对于Sandy Bridge或更早的cpu,与cpu相关的SSDTs通过会导致问题,就需要采用DropTables或者Dropoem=true或者DropSSDT=yes来处理。在ACPI/Patched里不要包含任何会引发问题的SSDTs -SATA:可以留,也可以不留,自己决定就好。 -PTID:对苹果系统来说,基本没啥用,而且这个文件还会有很多错误。一种比较少的应用情况是,在这个文件里,可以找到 读取风扇转速,温度,或者其它系统状态 的线索。 -IAOE:如果存在这个文件,通常来讲,它会被DSDT里的 _PTS 和 _WAK方法调用。如果删除这个文件,就会影响到睡眠。 -GFX0:通常包含了 Device GFX0 的SSDT,与集成显卡相关。亮度补丁就是针对这样的文件的。老的笔记本(Haswell以前的),GFX0一般是定义在DSDT里。Haswell的笔记本,它被定义在SSDT里(虽然也可以移到DSDT里)。 -PEGP:包含PEGP的文件,一般是与独显和双显卡切换 有关。有时候不只有一个这样的SSDT,为了实现屏蔽独显等功能,需要保留所有包含PEGP的SSDT,并对它们做一些修改。 注意: Power Mgmt的SSDT一定要命名为SSDT.aml。其他的SSDT.aml的命名需要依次顺延。 iasl :这是编译命令 使用: iasl 文件名 比如 iasl DSDT.dsl,就是编译DSDT.dsl文件。 2.1 参数1: -e ,这里的e是external的首字母,意思是在操作时要包括外部的一些信息,比如把SSDT的信息,加入到DSDT的反编译过程里,对于DSDT,SSDT就是外部信息。 2.2 参数2: -d ,这里的d是disassemble的首字母,字面意思是拆卸,可以说是反编译。 3、iasl –e SSDT*.aml –d DSDT.aml iasl -da *.aml 实践证明比iasl -d *.aml -e *.aml来的更高效。。后者常常不起作用 iasl -e *.aml -d *.aml 会把所有的aml都dissemble一遍 非常方便 20140926版本及以前版本: iasl -da *.aml 20141107 版开始: iasl -da -dl *.aml 这句命令的操作:使用SSDT.aml里的相关信息,协助反编译DSDT.aml。SSDT后面的星号表示的是任意字符,比如,你的文件夹里有SSDT1.aml、SSDT2.aml、SSDT3.aml、SSDT4.aml ……。很多的SSDT,这样写,程序就会自动找这个文件夹下的所有SSDT,而不需要把所有SSDT的文件名写到命令里。 执行这句命令后,一般,就会在这个文件夹下生成一个dsl文件,它的错误大大减少了,甚至已经没有错误了。以后要修改DSDT,就可以用这个文件修改了,修改好就可以编译成aml使用了。(不建议用软件打开aml文件,编译好后,可以直接测试有没有效果了。) 联合反编译时,只对DSDT和SSDTs进行,因此一大堆标记为其他类型的aml,都可以通通不管了,不然会有各种奇怪的错误出现。 3.1 这句命令还可以反过来用,即 iasl -e DSDT.aml -d SSDT*.aml (已经有比这个命令,效果更好的命令了。) 与前一句命令相比,操作反了过来,这句命令是使用DSDT.aml里的相关信息,协助反编译SSDT.aml,这样生成的SSDT.dsl,也能减少很多错误,甚至已经都没有错误了。 iasl *.dsl 即可由 dsl源文件,生成 aml目标文件。 3, 对dsl的编译修改 对aml反编译后形成的dsl文件,为ASCII文件。可以随时采用文本编辑的方式进行修改。 因iasl的bug会产生一个ECRW关联的通用错误,这个错误的修改如下: Replace: If (LEqual (PM6H, One)) { CreateBitField (BUF0, \_SB.PCI0._Y0C._RW, ECRW) // _RW_: Read-Write Status Store (Zero, ECRW (If (PM0H) { CreateDWordField (BUF0, \_SB.PCI0._Y0D._LEN, F0LN) // _LEN: Length Store (Zero, F0LN) })) } With: If (LEqual (PM6H, One)) { CreateBitField (BUF0, \_SB.PCI0._Y0C._RW, ECRW) // _RW_: Read-Write Status Store (Zero, ECRW) } If (PM0H) { CreateDWordField (BUF0, \_SB.PCI0._Y0D._LEN, F0LN) // _LEN: Length Store (Zero, F0LN) } 4, 对于DSDT和SSDT的加载 对于DSDT和SSDT,可以通过补丁源的方式直接打补丁,也可以通过热补丁的方式进行修改。rebahman推荐的方式有几种,详情可以参考原始帖子。 抓取的APIC会保存在APIC/origin中,修改后的文件都保存在patched里。一般在这里保存dsdt和修改过的ssdt就好。最简单的方式是采用ACPI/SSDT/DropOem=true来Drop全部的ssdt, 然后提供自有的ssdt由系统加载。无关的ssdt不需要放置在patched中,以免产生问题。另外关于dsdt fixes的部分也要全部清除,不然启动时会报couldn't find driver之类的panic,然后卡住。 生成的SSDT和原始的SSDT会产生冲突。大部分关于电源管理的贴子,会让删除所有原始的SSDT。但删除所有SSDT并不好,特别是对于一些新的电脑来说,很多代码都从DSDT移到了SSDT里,最好不要一棒子把所有SSDT都打掉。只需要 把和CPU相关的SSDT删除就可以了,因为这样的SSDT对黑苹果没有效果(也许它们还会造成其它问题),留下其它有用的SSDT,用于打补丁或者就保留着不做修改。 常用的ssdt有 DptfTa SaSSDT SgRef OptRef等。 全热补丁方式: - all patching is done via config.plist - only add-on SSDTs in ACPI/patched (eg. no patched DSDT, no patched SSDTs) - SortedOrder can be left unspecified - DropOem=false Generate Pstate/Cstate 的意思是忽略已有的ssdt, 由系统自动帮你生成一个ssdt . 在dsdt里,要激活AddDTGP, 这个fix会被FixAirport等依赖。FixRegions也需要NewWay的支持。 启动参数也会与ssdt有关联,常见的参数关联如下: DropOem 参数是 使用自定的ssdt.aml文件 (true) DMAR: 可修复启动时AppleACPIPlatform.kext错误 for 10.8.2 dart=0 :bios中开启VT-x/VT-d无法启动os 的可使用这个参数 对于一个全新的电脑,初始化的启动建议如下: * remove DSDT.aml and SSDT.aml * Generate CStates and - PStates in config.plist * "Newway" * delete "Cpu0Ist" and "CpuPm" * Add Defaultvolume 个人不是特别习惯dsdt,有点复杂。如果可能,还是采用clover的配置模式进行处理,更便捷,也容易理解。 G:\origin>iasl -e SSDT*.aml -d DSDT.aml Intel ACPI Component Architecture ASL+ Optimizing Compiler version 20160212-32 Copyright (c) 2000 - 2016 Intel Corporation Input file DSDT.aml, Length 0x26A0D (158221) bytes ACPI: DSDT 0x0000000000000000 026A0D (v02 HPQOEM 225A 00000001 INTL 20130927) External object resolution file SSDT-8.aml Input file SSDT-8.aml, Length 0x92C (2348) bytes ACPI: SSDT 0x0000000000000000 00092C (v02 SaSsdt SaSsdt 00003000 INTL 20130927) Pass 1 parse of [SSDT] Pass 2 parse of [SSDT] External object resolution file SSDT-6x.aml Input file SSDT-6x.aml, Length 0x119 (281) bytes ACPI: SSDT 0x0000000000000000 000119 (v02 PmRef ApCst 00003000 INTL 20130927) Pass 1 parse of [SSDT] Pass 2 parse of [SSDT] External object resolution file SSDT-5x.aml Input file SSDT-5x.aml, Length 0x3F3 (1011) bytes ACPI: SSDT 0x0000000000000000 0003F3 (v02 PmRef Cpu0Cst 00003001 INTL 20130927) Pass 1 parse of [SSDT] Pass 2 parse of [SSDT] External object resolution file SSDT-4x.aml Input file SSDT-4x.aml, Length 0x5DB (1499) bytes ACPI: SSDT 0x0000000000000000 0005DB (v02 PmRef ApIst 00003000 INTL 20130927) Pass 1 parse of [SSDT] Pass 2 parse of [SSDT] External object resolution file SSDT-3.aml Input file SSDT-3.aml, Length 0xB8F (2959) bytes ACPI: SSDT 0x0000000000000000 000B8F (v02 CpuRef CpuSsdt 00003000 INTL 20130927) Pass 1 parse of [SSDT] Pass 2 parse of [SSDT] External object resolution file SSDT-2.aml Input file SSDT-2.aml, Length 0x544 (1348) bytes ACPI: SSDT 0x0000000000000000 000544 (v02 PmRef Cpu0Ist 00003000 INTL 20130927) Pass 1 parse of [SSDT] Pass 2 parse of [SSDT] External object resolution file SSDT-1.aml Input file SSDT-1.aml, Length 0x48A (1162) bytes ACPI: SSDT 0x0000000000000000 00048A (v01 HPQOEM PtidDevc 00001000 INTL 20130927) Pass 1 parse of [SSDT] Pass 2 parse of [SSDT] External object resolution file SSDT-0.aml Input file SSDT-0.aml, Length 0x2D9 (729) bytes ACPI: SSDT 0x0000000000000000 0002D9 (v01 HPQOEM SataAhci 00001000 INTL 20130927) Pass 1 parse of [SSDT] Pass 2 parse of [SSDT] Pass 1 parse of [DSDT] Pass 2 parse of [DSDT] Parsing Deferred Opcodes (Methods/Buffers/Packages/Regions) Parsing completed Found 19 external control methods, reparsing with new information Pass 1 parse of [DSDT] Pass 2 parse of [DSDT] Parsing Deferred Opcodes (Methods/Buffers/Packages/Regions) Parsing completed ACPI Warning: NsLookup: Type mismatch on HASH (RegionField), searching for (Buffer) (20160212/nsaccess-736) Disassembly completed ASL Output: DSDT.dsl - 1126542 bytes 常见问题及处理 1, iasl -da *.aml Pass 1 parse of [SSDT] Firmware Error (ACPI): Failure creating [\_PR.CPU0._DSM], AE_ALREADY_EXISTS (20171110/dswload-498) ACPI Error: AE_ALREADY_EXISTS, During name lookup/catalog (20171110/psobject-371) Could not parse external ACPI tables, AE_ALREADY_EXISTSPass 1 parse of [SSDT] Firmware Error (ACPI): Failure creating [\_PR.CPU0._DSM], AE_ALREADY_EXISTS (20171110/dswload-498) ACPI Error: AE_ALREADY_EXISTS, During name lookup/catalog (20171110/psobject-371) Could not parse external ACPI tables, AE_ALREADY_EXISTS 解决方法:反编译时带了过多的或者重复的SSDT。记得把重复的SSDT删除,或者把其他非SSDT(诸如APIC/XSDT等)都删除后再反编译。 2, panic(cpu 0 caller 0xffffff80006489eb): "Unable to find driver for this platform: \"ACPI\".\n"@/SourceCache/xnu/xnu-1699.22.73/iokit/Kernel/IOPlatformExpert.cpp:1504 解决方法:在dsdt fix与个人应用的dsdt冲突,导致系统panic。把config.plist里关于dsdt fixes的内容全部删除即可继续。 [Guide] Patching LAPTOP DSDT/SSDTs https://www.tonymacx86.com/threads/guide-patching-laptop-dsdt-ssdts.152573/ 采用FakeID支持各种新类型的CPU http://www.insanelymac.com/forum/topic/324857-skylake-x-testing-i7-7800x-i7-7820x-i9-7900x/ 关于Haswell平台使用AIDA64提取的DSDT的错误修复 http://bbs.pcbeta.com/forum.php?mod=viewthread&tid=1474471 联合DSDT和SSDT进行反编译——减少DSDT和SSDT错误的尝试 http://bbs.pcbeta.com/viewthread-1475332-1-1.html 浅谈DSDT的一些错误警告修复和一些必要代码 http://bbs.pcbeta.com/forum.php?mod=viewthread&tid=1084354 dsdt修复 (常用小错误解决方法讨论) http://bbs.pcbeta.com/viewthread-748485-1-1.html [转发]黑苹果修改DSDT彻底解决关机不断电和睡眠问题 http://www.tuicool.com/articles/qIfMvum 关机不关电修复 https://www.maoshu.cc/2015/09/21/dsdt-Shutdown-Error.html 关于修改DSDT出现的常见问题 http://blog.csdn.net/zengconggen/article/details/6721056 DSDT提取、修改等基础视频教程及DSDT编译错误修改方法【从零开始轻松使用上DSDT】 http://bbs.pcbeta.com/forum.php?mod=viewthread&tid=1020621 【教程】修复常见ACPI问题(DSDT等) http://blog.csdn.net/nksmiles/article/details/7466067 运用MaciASL软件的补丁源-帮你完善DSDT http://blog.163.com/l1_jun/blog/static/143863882014313435324/ http://www.voidcn.com/blog/wangmj518/article/p-5039168.html https://www.acpica.org/downloads
-
迷墙 转发了这篇日记 2018-04-30 14:43:56