之前介绍过 Windows 下替换 ACPI Table 的方法【参考1】,该方法可以替换 DSDT,但是最近工作中遇到需要修改的ACPI内容并不在 DSDT中,而是存放在 SSDT 中的情况,同时一个系统中还会有多个 SSDT。
打开注册表,在 Computer\HKEY_LOCAL_MACHINE\HARDWARE\ACPI 查找你需要的SSDT:
当然你可以先用 RW Everything 查看 ACPI Table 更加直观,SSDT 有很多个,彼此的 Signature 是相同的但是OEM Table ID 是不同的字符串:
确定你要修改的SSDT,这里使用 OEM Table ID 为 “U_Rvp ”的这个 SSDT作为实验的目标:
上面提到的 U_Rvp 的 SSDT,在注册表中名称是SSD6:
接下来的操作和之前的类似
1.asl /tab=ssd6 /c保存成二进制文件:
2. 使用 iasl2016 -ve SSD60000.bin反编译之
3.修改代码,加入我们自定义的设备挂在 I2C 下面
4.再编译为 AML
5.asl /loadtable SSD60000.aml 加载这个 table
6.重启,进入设备管理器查看,再I2c 下面出现的一个 unknown 设备
参考:
1. http://www.lab-z.com/arcpi/
2024年2月2日
iasl.exe -ve dsdt.iiii 其中的 -ve 意思是只输出错误信息,不输出 warning
iasl.exe -h 输出帮助信息
可否直接替换Bios ACPI表呢?只是在原有基础做少许修改。还是说一定要源代码。作为小白,最近在弄黑苹果。然而有个问题,就是如果过选的关机,那下次一定是可以开机进系统MAC,但如果是在mac点的重启,就会有大几率进不了系统,显示禁止符号。我查看了ACPI表,他有个条件根据系统设置pci中断。不知道是否是这个原因。代码如下:
Method (_PIC, 1, NotSerialized) // _PIC: Interrupt Model
{
If (Arg0)
{
DBG8 = 0xAA
}
Else
{
DBG8 = 0xAC
}
PICM = Arg0
}
Name (OSVR, Ones)
Method (OSFL, 0, NotSerialized)
{
If ((OSVR != Ones))
{
Return (OSVR) /* \OSVR */
}
If ((PICM == Zero))
{
DBG8 = 0xAC
}
OSVR = 0x03
If (CondRefOf (_OSI, Local0))
{
If (_OSI ("Windows 2001"))
{
OSVR = 0x04
}
If (_OSI ("Windows 2001.1"))
{
OSVR = 0x05
}
If (_OSI ("FreeBSD"))
{
OSVR = 0x06
}
If (_OSI ("HP-UX"))
{
OSVR = 0x07
}
If (_OSI ("OpenVMS"))
{
OSVR = 0x08
}
If (_OSI ("Windows 2001 SP1"))
{
OSVR = 0x09
}
If (_OSI ("Windows 2001 SP2"))
{
OSVR = 0x0A
}
If (_OSI ("Windows 2001 SP3"))
{
OSVR = 0x0B
}
If (_OSI ("Windows 2006"))
{
OSVR = 0x0C
}
If (_OSI ("Windows 2006 SP1"))
{
OSVR = 0x0D
}
If (_OSI ("Windows 2009"))
{
OSVR = 0x0E
}
If (_OSI ("Windows 2012"))
{
OSVR = 0x0F
}
If (_OSI ("Windows 2013"))
{
OSVR = 0x10
}
}
Else
{
If (MCTH (_OS, "Microsoft Windows NT"))
{
OSVR = Zero
}
If (MCTH (_OS, "Microsoft Windows"))
{
OSVR = One
}
If (MCTH (_OS, "Microsoft WindowsME: Millennium Edition"))
{
OSVR = 0x02
}
If (MCTH (_OS, "Linux"))
{
OSVR = 0x03
}
If (MCTH (_OS, "FreeBSD"))
{
OSVR = 0x06
}
If (MCTH (_OS, "HP-UX"))
{
OSVR = 0x07
}
If (MCTH (_OS, "OpenVMS"))
{
OSVR = 0x08
}
}
Return (OSVR) /* \OSVR */
}
Method (MCTH, 2, NotSerialized)
{
If ((SizeOf (Arg0) < SizeOf (Arg1)))
{
Return (Zero)
}
Local0 = (SizeOf (Arg0) + One)
Name (BUF0, Buffer (Local0){})
Name (BUF1, Buffer (Local0){})
BUF0 = Arg0
BUF1 = Arg1
While (Local0)
{
Local0--
If ((DerefOf (BUF0 [Local0]) != DerefOf (BUF1 [Local0]
)))
{
Return (Zero)
}
}
Return (One)
}
Name (PRWP, Package (0x02)
{
Zero,
Zero
})
Method (GPRW, 2, NotSerialized)
{
PRWP [Zero] = Arg0
Local0 = (SS1 << One)
Local0 |= (SS2 << 0x02)
Local0 |= (SS3 << 0x03)
Local0 |= (SS4 << 0x04)
If (((One <>= One
If (((OSFL () == One) || (OSFL () == 0x02)))
{
FindSetLeftBit (Local0, PRWP [One])
}
Else
{
FindSetRightBit (Local0, PRWP [One])
}
}
Return (PRWP) /* \PRWP */
}
Name (WAKP, Package (0x02)
{
Zero,
Zero
})
OperationRegion (DEB0, SystemIO, 0x80, One)
Field (DEB0, ByteAcc, NoLock, Preserve)
{
DBG8, 8
}
OperationRegion (DEB1, SystemIO, 0x90, 0x02)
Field (DEB1, WordAcc, NoLock, Preserve)
{
DBG9, 16
}
Name (SS1, One)
Name (SS2, Zero)
Name (SS3, Zero)
Name (SS4, One)
Name (IOST, 0x0000)
Name (TOPM, 0x00000000)
Name (ROMS, 0xFFE00000)
Name (VGAF, One
你的提问是2个问题:
1.上述代码是否能解决问题。这个我没玩过,不知道唉。
2.是否有直接修改 BIOS 中 ACPI 的方法。据我所知,没有source code,这个很难完成,因为里面校验太多了,没有签名key,修改替换之后是无法启动的。另外,你可以看一下苹果的 os 是否有在启动的时候替换 acpi table 的方法,这个我也不知道了。