花了一天的功夫终于搞定HA-943GML-ML R261SCVX BIOS SLIC表动态寻址。
为了方便大家学习交流,也为了自己日后AWARD BIOS的修改积累思路和方法。
SLIC产生的原理:
1、SLIC依靠RSDT/XSDT表的导向作用,相当于RSDT/XSDT表的子表,也就是只要把SLIC表的32位地址,记录在RSDT/XSDT表内就可以产生SLIC表。
这是所有BIOS ACPI表子表产生的原理。静态方法也是用这个原理来产生SLIC表的。
AWARD BIOS的修改的基本思路:
1、修改ACPITBL.BIN,增加SLIC表;
2、修改ORIGINAL.BIN或GGROUP.BIN,增加SLIC表的寻址;
第1步的修改很简单就能完成,关键点在于第2步的修改。
具体步骤如下:
1、用16位编辑器打开ACPITBL.BIN,将RSDT表长度数值加4,且在表尾增加4字节的00。接下来就是SLIC表的添加,通常是在ACPITBL.BIN文件尾补足1至3个字节的 00,这是为了保证合并SLIC.BIN文件后,SLIC表头的地址能能被4整除。我的做法是SLIC紧跟RSDT表,由于SLIC为374字节,不能被4整除,将影响FACP的表头,所以在SLIC表尾增加2字节的00。
改前的截图

改后的截图,黑色为差异处,蓝色为SLIC表,

新增的4字节为存放SLIC表的32位索引地址,偏移量为30。
2、修改ORIGINAL.BIN文件,查找RSDT,找到如下信息

太幸运了,前面还有刚好4字节的位置,可以放下一个表头。接下来就考虑SLIC存放的位置:
1、存放在RSDT前,将连锁影响到后面的表头索引地址偏移4字节;
2、存放在FACS后,感觉还是有点问题;(后面会提到)
3、存放在FACS前,那就是占用了FACS表头索引地址,只影响到后面的表头,比存放在RSDT前少了不少的修改,这个应该是最合适的。整个表前移4字节,由A290移到A28C,修改如图

接下来就反编译ORIGINAL.BIN,个人习惯使用hiew32进行反编译修改。
打开ORIGINAL.BIN文件,由于表由A290移到A28C,按F7,查找HEX:90A2, 来到这里

按F3把A290修改A28C。由于已经增加了SLIC索引,把“MOV cx,5”姑且改为“MOV cx,6”。RSDTFACDSDTAPICMCFGFACS不是有6个表名,怎么cx寄存器才设置为5,难道FACS不在其内?带着这个疑问,继续往下。
按照前人的修改教程可知,8E44 为RSDTFACDSDTAPICMCFGFACS中RSDT表存放其索引地址的地址。
那么其他表依次存放的地址如下:
8E44 RSDT
8E48 FACP
8E4C DSDT
8E50 APIC
8E54 MCFG
8E58 FACS
8E5C
如今我们已经新增加SLIC索引项,那么新的存放地址如下:
8E44 RSDT
8E48 FACP
8E4C DSDT
8E50 APIC
8E54 MCFG
8E58 SLIC
8E5C FACS
8E60
也就是SLIC占用了原先FACS的索引地址的地址,按F7查找HEX:588E

刚好在其下,将8E58改为8E5C,A2A4正是FACS的位置,可见FACS的索引和RSDTFACDSDTAPICMCFG的索引是分开的,这也就是我选择把SLIC放于FACS前的原因,由于FACS没移位就省得改了。再按F7查找HEX:588E

这里就是把FACS表的索引地址添加到RSDT表中,同样把8E58改为8E5C。由于FACS占用了8E5C,为了防止8E5C地址的重复使用,得再查找HEX:5C8E

按F3把8E5C改为8E60,再查找HEX:608E,这次只找到毫不相关的代码。至此RSDTFACDSDTAPICMCFG重新定位寻址算是完成了,但是新增的SLIC索引地址还没加入到RSDT表中。
回到索引地址添加的地方

由于在ACPITBL.BIN中的RSDT表已经为SLIC表的索引地址设置好了偏移量为30的存放地址,现在只要把SLIC表的索引地址存入到RSDT表偏移30的位置处就可以完成RSDT表对SLIC表索引了。

去掉两句
or eax,eax
je 00000A4BF
这本是检验数值是否是0(空指针),以防系统崩溃的预防措施。整理得到如下代码

到此全部修改完成。把ACPITBL.BIN和ORIGINAL.BIN替换掉原BIOS里的模块就OK了。
进入下载页面