积分 173 最后登录 2022-8-22 精华 0 阅读权限 20 主题 14 UID 4699402 帖子 373 PB币 376 威望 4 贡献 0 技术 0 活跃 472
UID 4699402 帖子 373 PB币 376 贡献 0 技术 0 活跃 472
本帖最后由 cheneyveron 于 2017-8-31 08:21 编辑
配置:主板:华南X79 v2
CPU:E5-2670 V1 C2
显卡:GTX 1050TI
声卡:ALC662
有线网卡:RTL8168/8111/8112
目前10.12.6完美,EFI在这里:https://github.com/cheneyveron/clover-x79-e5-2670-gtx650
鲁大师配置图:
10.13 DP5:
搜了两天谷歌,按照国外大神piker alpha的分析:
https://pikeralpha.wordpress.com/2017/07/02/applesmcrtc-kext-panics
和更具体的alext jam的分析:
https://alextjam.es/debugging-appleacpiplatform
错误定位:
panic的位置在AppleACPIPlatform的_isprint 函数中,函数正文反编译如下:
int _isprint(char c)
{
return (_ctype[c] & 0x97) != 0;
}
可以看到_isprint 函数用到了_ctype 这个表,根据这个表的索引返回一个字符。
看起来 _isprint 函数重写了acpia 的_isprint函数,acpia的函数在这里:https://github.com/acpica/acpica ... clude/acclib.h#L181
AppleACPIPlatform的_isprint 函数被AcpiTbPrintTableHeader 调用,这个函数是acpia的函数了,所以也不需要反编译了,代码大概如下:
static void
AcpiTbFixString (
char *String,
ACPI_SIZE Length)
{
while (Length && *String)
{
if (!_isprint ((int) *String))
{
*String = '?';
}
String++;
Length--;
}
}
static void
AcpiTbCleanupTableHeader (
ACPI_TABLE_HEADER *OutHeader,
ACPI_TABLE_HEADER *Header)
{
memcpy (OutHeader, Header, sizeof (ACPI_TABLE_HEADER));
AcpiTbFixString (OutHeader->Signature, ACPI_NAME_SIZE);
AcpiTbFixString (OutHeader->OemId, ACPI_OEM_ID_SIZE);
AcpiTbFixString (OutHeader->OemTableId, ACPI_OEM_TABLE_ID_SIZE);
AcpiTbFixString (OutHeader->AslCompilerId, ACPI_NAME_SIZE);
}
void
AcpiTbPrintTableHeader (
ACPI_PHYSICAL_ADDRESS Address,
ACPI_TABLE_HEADER *Header)
{
[...]
else
{
/* Standard ACPI table with full common header */
AcpiTbCleanupTableHeader (&LocalHeader, Header);
ACPI_INFO ((
"%-4.4s 0x%8.8X%8.8X"
" %06X (v%.2d %-6.6s %-8.8s %08X %-4.4s %08X)",
LocalHeader.Signature, ACPI_FORMAT_UINT64 (Address),
LocalHeader.Length, LocalHeader.Revision, LocalHeader.OemId,
LocalHeader.OemTableId, LocalHeader.OemRevision,
LocalHeader.AslCompilerId, LocalHeader.AslCompilerRevision));
}
}
真正引起panic的是这句AcpiTbFixString (OutHeader->AslCompilerId, ACPI_NAME_SIZE) ,也就是说,实际上是MATSHeader->AslCompilerId 中的某个字符无法解析导致panic。
遂用iasl查看了一下MATS表如下:
[000h 0000 4] Signature : "MATS"
[004h 0004 4] Table Length : 00000034
[008h 0008 1] Revision : 02
[009h 0009 1] Checksum : 67
[00Ah 0010 6] Oem ID : "ALASKA"
[010h 0016 8] Oem Table ID : "A M I"
[018h 0024 4] Oem Revision : 00000002
[01Ch 0028 4] Asl Compiler ID : "w x2"
[020h 0032 4] Asl Compiler Revision : 00000000
**** Unknown ACPI table signature [MATS]
Raw Table Data: Length 52 (0x34)
0000: 4D 41 54 53 34 00 00 00 02 67 41 4C 41 53 4B 41 // MATS4....gALASKA
0010: 41 20 4D 20 49 00 00 00 02 00 00 00 77 98 78 32 // A M I.......w.x2
0020: 00 00 00 00 B2 00 00 00 01 00 00 00 98 7D 2F CB // .............}/.
0030: EE FF 00 00 // ....
可以看到w x2之间的值是98,而0x98是不能转换成unsigned char的,因为unsigned char的取值范围只能到0x7F,把它改小一些以后就成功的启动了。
综上所述,如果任何一个ACPI表(不止是MATS)的 Signature、OemId、OemTableId 或 AslCompilerId 有字符大于0x7F就会导致AppleACPIPlatform错误。
看到这里,会编辑DSDT或者改BIOS的ACPI表的童鞋可以去解决问题了...
但是我的奇葩的华南X79找不到BIOS的ACPI表的位置...
我在ubuntu下提取了一堆acpi表,但是没办法用MaciASL修改,因为编译不通过...
如果能有景友知道上面两个方法怎么做,求告知。。
附上ROM和原始acpi表、现在用的dsdt
2017.8.31更新:
经过了和坛友们的讨论此问题终于解决啦,见第104楼
展开阅读全文​
附件:
你需要登录 才可以下载或查看附件。没有帐号?注册