a2295926 发表于 2018-2-13 22:04

新 dsdt&ssdt 修复错误看法

之前的dsdt,ssdt 说明解释https://bbs.pcbeta.com/viewthread-1571455-1-1.htmlhttps://bbs.pcbeta.com/viewthread-1020621-1-1.html (2楼) 提取dsdt,ssdt1. 四叶草,启动菜单 按 f4 提取即可因为:四叶草启动过程,就算你不提供dsdt,ssdt!自动提取dsdt,ssdt!(如果没dsdt,ssdt无法启动系统)所以,四叶草获取是没问题的tonymacx86网站的RehabMan大神在论坛 在新的帖子上已经对此说明
2.反编译 dsdt,ssdt(首先 dsdt 加 ssdt才完整的APCI ,所以单dsdt反编译是不正确的!就c++一样编程,ssdt 就是dsdt分卷!)终端的反编译命令:
cd “你存放DSDT和SSDT的文件夹名”
iasl -da -dl DSDT.aml SSDT*.aml注意:有些acpi,-da 参数,会导致无法反编译的,那就把此参数删除就即可 请使用RehabMan 的 最新版的iasl 和MaciASL!可以减少错误出现!但是有些错误!无法修复,需要手动修复!( iasl 和 MaciASL是开源的!我想是,RehabMan 针对我们常用dsdt,ssdt改修代码的,测试过官方版!也是出现不少的错误)
修复前,应该了解字段对象类型(重要的)
1.字段对象 IntObjName (OOXX, Zero)外部声明External (OOXX, IntObj)2.字段对象 FieldUnitObjOperationRegion (GNVS, SystemMemory, 0x100, Zero)    Field (GNVS,AnyAcc, Lock, Preserve){Offset(0x1E),      OOXX,   16, //0x1e      OOX1,8,//0x20………….}注意:GNVS,这个是不重要的,就算改其他名称,只要”0x100, Zero”这两位参数不变,读出来数据都一样的”0x100,Zero”这两位参数此 指向地址范围Offset(0x1E) 指向OOXX 字段的偏移量地址!(可以地址偏移量0x1E代替OOXX一样是可以的,字段的偏移量值才重要的,如果OOXX和OOX1互换,就他们的数据就一样跟着互换)16 不是数据来,而是字段OOXX的占用地址16位 空间偏移量 以字节做单位,一字节等于 8位 就所以OOX1是偏移量为0x20制作 电池补丁 oem ssdt 版 需要了解的外部声明External (OOXX, FieldUnitObj) 3.字段类型 MutexObjMutex (OOXX, 0x00)外部声明External(OOXX,MutexObj) 4字段类型 PkgObj Name (OOXX, Buffer (0x07) { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00       、 })外部声明External(OOXX,PkgObj) 5字段类型 DeviceObjDevice (OOXX)外部声明External(OOXX,DeviceObj) 6字段类型 MethodObj Method (OOXX, 1, Serialized) {。。。。。。。。。。。。。。。。}注意:Method,类似dos 批处理 的 子程序一样Method 的 1 指有一个参数,如果为 3就有三个参数只要 \OOXX(参数1)即可执行Method下代码了(函数就一样使用)外部声明External(OOXX,MethodObj) 以上为字段对象说明(基本常用 6字段对象)以下重点说明dsdt ,ssdt !一些,并没声明字段的也没有外部声明!(没声明的字段无法正常执行,但是黑苹果启动时,dsdt和ssdt合一个apci加载,那是读取在其他文件中字段了)Iasl 反编译时,对没声明字段的也没有外部声明,强行添加外部声明!(External)但是时常将MethodObj,IntObj,FieldUnitObj 搞乱了所以导致错误出现(IntObj,FieldUnitObj搞错并不会出现错误,和MethodObj一定会出现错误的)提示:(自行测试)Iasl –ldsdt.aml(生成文本与文件2进制的16进制码对照表,aml文件明码没加密的)通过对External范围搜索,字段的16进制码,发现中一些字段并没进行外部声明的,只是 Iasl 反编译时,强行加上去的!(因为,不声明,一样出现的错误),声明的对象不对,就会导致程序逻辑错误 字段路径外部是示范从 MaciASL获取
\_SB.PCI0.LPCB.PWBW 为PWBW路径(_SB.PCI0.LPCB下使用就PWBW即可)在为非_SB.PCI0.LPCB下使用 就要 \_SB.PCI0.LPCB.PWBW 才能该字段

a2295926 发表于 2018-2-14 10:16

字段路径外部是示范从 MaciASL获取\_SB.PCI0.LPCB.PWBW 为PWBW路径(_SB.PCI0.LPCB下使用就PWBW即可)在为非_SB.PCI0.LPCB下使用 就要 \_SB.PCI0.LPCB.PWBW 才能该字段以下为错误修为案例例子1dsdt 文件错误提示:6126, syntax error, unexpected PARSEOP_SUBTRACT       Method (SBRN, 0, Serialized)       {            If (^^^GFX0.PRST)            {                Store (^^^GFX0.GCBL,^^^GFX0.CBLV) //要修改                Local0//真正错误                Subtract (0x0A, Local0,Local1)//提示出错                If (LNotEqual (Local1, LBTN))                {                  Store (Local1, LBTN)                }            }       } ^^^GFX0.GCBL 外部声明为External (_SB_.PCI0.GFX0.GCBL, IntObj)通过搜索(搜索 GCBL字段就可以不用添加_SB_.PCI0.GFX0添加了找不到的)ssdt 6发现Method (GCBL, 1, NotSerialized)所以External (_SB_.PCI0.GFX0.GCBL, IntObj)改External (_SB_.PCI0.GFX0.GCBL,MethodObj)          Store (^^^GFX0.GCBL, ^^^GFX0.CBLV) //要修改 Local0改 Store (^^^GFX0.GCBL(^^^GFX0.CBLV),Local0) 例子2 错误提示:6126,syntax error, unexpected PARSEOP_FIELDOperationRegion (MSID, SystemMemory,EBAS (0x50), Field (MSID, DWordAcc, Lock, Preserve) EBAS 外部声明External (EBAS, MethodObj) 通过搜索ssdt 6发现OperationRegion (SANV, SystemMemory,0xCAAE8E18, 0x016D) Field (SANV, AnyAcc, Lock, Preserve){………… EBAS,32,…………….}所以External (EBAS, MethodObj)改External (EBAS, FieldUnitObj) OperationRegion (MSID, SystemMemory,EBAS (0x50), Field (MSID, DWordAcc, Lock, Preserve)改OperationRegion (MSID, SystemMemory,EBAS,0x50)Field (MSID, DWordAcc, Lock, Preserve) 例子 3 (和例子1不过多了个参数)ssdt 7错误提示:6126,syntax error, unexpected PARSEOP_INTEGER Method (_PRW, 0, NotSerialized)            {                Return (GPRW)                0x09                0x04 //提示错误}GPRW外部声明External (GPRW, IntObj)通过搜索dsdt发现Method (GPRW, 2, NotSerialized)(有两参数)所以改为External (GPRW, IntObj)改External (GPRW, MethodObj) Return (GPRW)                0x09                0x04改 Return (GPRW(0x09,0x04)) 例子 4dsdt文件错误提示:6126,syntax error, unexpected '}'       If (CondRefOf (MDBG))       {            MNIO (Arg0)            MNIO ("\n")            Return (MDBG) //实则错误            Arg0//实则错误       }//提示错误 MDBG 外部声明External (MDBG, IntObj)通过搜索发现,字段 不存在 声明对象不过通过函数可以知道If (CondRefOf (MDBG)) //检测 MDBG 有没有此 字段 如果没即不执看来看来 dsdt 就多个配置使用(但是我从其他配置apci这MDBG应该为MethodObj)所以第一种External (MDBG, IntObj)改External (MDBG, MethodObj)             Return (MDBG) Arg0改Return (MDBG(Arg0)) 第二种            Return (MDBG) Arg0将其删除处理(将该段删除也可以,不起其他错误)没实则声明 的字段是没意义的例子 5错误提示:6074,Name already exists in scope (PPL1)   OperationRegion (MBAR, SystemMemory, Add (\_SB.PCI0.GMHB (), 0x5000),0x1000)   Field (MBAR, ByteAcc, NoLock, Preserve){。。。。。。       PPL1,   15, 。。。。。。。。。}搜索发现External (PPL1, UnknownObj)明显是重命名了处理方式两种1.删除 PPL1{。。。。。。       ,   15, //只删除 字段 ,保持其他字段的偏移量正确。。。。。。。。。}2.删除 External (PPL1, UnknownObj) 总结:1.请使用RehabMan 的 最新版的iasl 和 MaciASL!(减少错误的出现)2.确定相关字段 正确对象3.通过搜索同函数,参考如果正确使用,再去修复错误。(了解函数正确使用)4.提示错误地址,不一定错误的所在5. 尽量修复!如果实在无法修复,可以删除处理(有可能引起其他错误)!6.如果错误实在无法修复,可以放弃的!(可以通过 ome ssdt 修复)7.不用打补丁的ssdt 文件其他可以不用修复8.除了错误,其他可以不用修复的 以下为附件(各位下载测试)

DayBreak-xiaobi 发表于 2019-5-10 19:49

感谢分享!!!

tonymoses 发表于 2019-11-27 20:00

页: [1]
查看完整版本: 新 dsdt&ssdt 修复错误看法