关于Haswell平台使用AIDA64提取的DSDT的错误修复办法

我刚下载这些景有的DSDT时也很吃惊,因为一般不会出现这么多的相似错误,经过一边修改,一边分析后,我发现这些错误都是由其它出现次数只有几次的错误所引起的,其实这应该是一般的思路。在编程里,这一般叫做级联错误。
分析之后,要修复就变得更有针对性了。
以下是我修复过的DSDT修复前的情况。

对于其中一个DSDT,引起提示这么多错误的原因其实是这个错误”syntax error,unexpected ‘}’,expecting ‘(’ ”,另外的这个错误” syntax error, unexpected PARSEOP_IF”也是由前者所引起的,于是,修复前者就成为了关键的一步。
对于另一个DSDT,引起提示这么多错误的原因其实是这个错误” syntax error, unexpected PARSEOP_FIELD”,所以需要先修复它,修复它后,熟悉的”syntax error,unexpected ‘}’,expecting ‘(’ ”提示就出现了,继续修复就行。

下面开始具体的修复方法。(一般,Haswell平台修复以下错误(如果你的存在),其它几十或成百的错误提示就会随之消失。)

一、错误提示”syntax error,unexpected ‘}’,expecting ‘(’”。定位到错误行后,代码如下:

1
2
3
4
If (CondRefOf (_SB.PCI0.XHC.PS0X))
{
PS0X
}

错误的提示很清楚,这是语法错误。即应该是要对PS0X进行某种操作,可是代码中却只有要操作的对象,没有操作的动作
修改方法: 在PS0X后加上一对小括号,如 PS0X ( )。 或者对PS0X添加一个操作,如Store(Zero, PS0X)

1
2
3
4
  If (CondRefOf (_SB.PCI0.XHC.PS0X))
      {
      PS0X ( )      或者可以改为Store(Zero, PS0X)
      }

其它一样的错误提示的修改方法相同,只是不是同样的字母。修改好所有这样的错误后,”Object does not exits ( )”的提示就全都消失了。
(感谢35F同学的建议:“External (PS0X,MethodObj)语句把 PS0X定义成方法,那么执行应该用 PS0X()”,本贴原本提供的方法是删除PS0X或改为Return (PS0X),还是希望高手能给出更合适的修改方法。)

二、错误提示” syntax error, unexpected PARSEOP_FIELD”,定位到错误行后,代码如下:

1
2
3
4
   OperationRegion (HRPE, SystemMemory,_GPE.MMTB (0x04), Field (HRPE, DWordAcc, Lock, Preserve)
      {
      VDPC,  32
      })

根据提示,容易知道这是语法错误,即对Field的操作有误。需要把Field从OperationRegion中分离。

1
2
3
4
5
6
OperationRegion (HRPE, SystemMemory,_GPE.MMTB (0x04), 0x04)   在这里加一个前面的0x04,最后再加上小括号

 Field (HRPE, DWordAcc, Lock, Preserve)
      {
      VDPC,  32
      }   #在这里删除小括号

修改完后,有可能会出现”syntaxerror,unexpected ‘}’,expecting ‘(’ ”,按错误一的修改方法修改即可。

三、另外,还有一个典型错误” syntax error,unexpected PARSEOP_LOCAL0”,类似地,提示相同,只是最后的字母不同,有可能是LOCAL0、LOCAL1、ARG0、Zero等。定位到错误行后,代码类似:

1
2
3
4
5
6
7
8
9
10
11
Store (CMSR (0x63), Local1)
      Store (CMSR (0x64), Local0)
      Store (^^^GFX0.DD1F.LGBR, Local1)
      Local1
      Store (^^^GFX0.DD1F.LGBR, Local0)
      Local0
      Or (ShiftLeft (Local1, 0x04), Local0,Local0)
      Or (ShiftLeft (Local0, 0x10), CAUS, Local0)
      Store (Zero, ^^EC0.WHOK)
      Store (Zero, CAUS)
      Return (Local0)

修改方法:

这是语法错误。即应该是要对” Local0”进行某种操作,可是代码中却只有要操作的对象,没有操作的动作。
在Local0前添加两个斜线,如 // Local0 ,两斜线是使该行代码无效。
或者可以直接删除Local0。
(修改的方法不太严谨,由于不知道要对Local0做何种操作,只好采取使其失效或者删除的方式,还希望高手们能给出最合适的修改方法。将该对象放到Return ( )的括号里也可行,但不知是否符合代码原本的意义,希望高手能给出最合适的修改方法。)

修复警告:

警告1: “Not allcontrol paths return a value“。一般出现在方法中,即Method中。提示的意思是,不是所有控制路径都返回了值。在程序中,方法(Method)一般需要返回一个值才能结束。于是,对于这一种情况,我们需要给方法返回一个值。

1
2
 Method (      )
      {

代码(方法中的代码可能很多,有可能会看不清哪是哪,你只需要找到Method后的第一个”{“,再找 到方法中与它平行的最后一个”}”,在”}”前加如下的代码就可以了。)

1
2
Return (Zero)
      }  //与Method的第一个”{“对应。

警告2: ”Called method may not always return a value”,该警告提示会随着所有警告1的修改而消失。

警告3: ”Unknown reserved name (_***)”,该警告的意思是未知的保留名称,一般,名称前有下划线的名称,是DSDT的语法里保留的名称,即编译器“认识” 很多名称前有下划线的名称,但是,有的有下划线的名称并不是保留名称(它带着迈克尔杰克逊的帽子,但它并不是迈克尔 杰克逊),这时,只要把下划线删除(摘下帽子),即改了名,就可以了。

1
2
 _WDG -> WDG
      _WED -> WED

修复提醒:

提醒1: ”Use of compiler reserved name (_T_*)”,这个提醒的意思是,使用了编译器的保留名称,即_T_*这样的名称是编译器保留的,一般就不要再用这样的名称了,删除第一个下划线就可以了。
感谢点评的同学,可以使用软件的 查找-替换功能,一次性把类似_T_*的替换成T_*
_T_0 -> T_0 等等。

提醒2: ”Effective AML package length is zero”。修改方法:
Return (Package (0x00) {})
修改为
Return (Package (Zero) {})

小结:
DSDT一般不会出现这么多的相同错误,一般这些相同错误都是由其它出现次数只有几次的错误所引起的,即级联错误。只要先修复那些出现次数只有几次的错误,其它错误也就随之解决了。建议,在安装系统时一般不需要放入DSDT,可以在安装好系统后,再在OS X下提取DSDT(也许错误会少,甚至没有,但没有实际测试过)。

一些通用的DSDT修复方法

1、Object not found or not accessible from scope ( PEG0.PEGP.TGPC) 括号里的名称不一定相同

1
CreateField (^^^PEG0.PEGP.TGPC, 0x0A, 0x02, PRGE)

修改为

1
CreateField (_PR.PEG0.PEGP.TGPC, 0x0A, 0x02, PRGE)

再在DSDT开始的地方

1
2
DefinitionBlock ()
{

在这下面添加

1
External(_PR.PEG0.PEGP.TGPC)

2、Access width of Field Unit extends beyond region limit
OperationRegion (GPIO, SystemIO, 0x1180, 0x3B) 增大0x3B,比如改为0x3C
Field (GPIO, WordAcc, Lock, Preserve)

1
2
3
4
5
6
7
8
9
{
AccessAs (DWordAcc, 0x00),
Offset (0x0F),
, 4,
LV28, 1,
Offset (0x2D),
, 5
..........
}

3、syntax error, unexpected PARSEOP_NAMESEG,expecting PARSEOP_DEFINITIONBLOCK
查看DSDT开始的地方
ACPIError (dmutils-0261): Argument count mismatch for method_SB_.VWAK 3 1 [20080926]
ACPIError (dmutils-0261): Argument count mismatch for method_GPE.VBRE 2 1 [20080926]

1
2
3
4
5
6
7
8
/*
* Intel ACPI ComponentArchitecture
* AML Disassemblerversion 20080926
修改:删除 /* 之前的语句。
删除了语句
/*
* Intel ACPI ComponentArchitecture
* AML Disassemblerversion 20080926

4、Internal compiler error ^ (null Op pointer)

1
2
3
4
If (LNot (_OSI ("Windows2006")))
{
PHSR (0x10, 0x00)
}

修改为:

1
2
3
4
5
6
7
If (_OSI ("Windows2006"))
{
}
Else
{
PHSR (0x10, 0x00)
}

5、Method local variable is not initialized (Local0) 括号里的名称不一定相同

1
2
3
4
5
6
7
8
9
10
11
Scope (_SI)
    {
       Method (_MSG, 1, NotSerialized)
       {
           Store (Local0, Local0)
       }
       Method (_SST, 1, NotSerialized)
       {
           Store (Local0, Local0)
       }
    }

修改为:

1
2
3
4
5
6
7
8
9
10
11
Scope (_SI)
    {
       Method (_MSG, 1, NotSerialized)
       {
           Store (Zero, Local0)
       }
       Method (_SST, 1, NotSerialized)
       {
           Store (Zero, Local0)
       }
    }

6、Object not found or not accessible from scope ^ (^CPU0._PPC)

1
External (^CPU0._PPC)

修改为:

1
External (_PR.CPU0._PPC)

7、Method local variable is not initialized (Local0) 错误5的另一种情况错误

1
2
3
4
5
6
7
8
9
10
11
12
13
Scope (_SI)
  {
   Method (_MSG, 1, NotSerialized)
   {
   Store (Local0, Local0)
   }
  Method (_SST, 1, NotSerialized)
   {
   Store (Local0, Local0)
   If (LEqual (Arg0, 0x03)) {}
   If (LEqual (Arg0, 0x01)) {}
   }
  }

有两段代码需要修改

1
2
3
4
5
6
7
8
9
10
11
12
13
Scope (_SI)
   {
   Method (_MSG, 1, NotSerialized)
    {
/* Store (Local0,Local0) */
    }
   Method (_SST, 1, NotSerialized)
    {
/* Store (Local0,Local0) */
   If (LEqual (Arg0, 0x03)) {}
   If (LEqual (Arg0, 0x01)) {}
    }
   }

8、Method local variable is not initialized 又一种情况

1
2
If (LNot (LEqual (ShiftRight (And (Local1, 0x10),0x03), And (Local2, 0x02))))
Error 1013 -  Method local variable is not initialized ^ (Local1)

修改

If 那一行的 Local1 修改为 Local2 ,只限于这种情况,其它情况会引起跟多的错误。

9、Missing ResourceSourcestring (required)

1
2
3
4
5
6
WordBusNumber (ResourceProducer, MinFixed, MaxFixed,PosDecode,
0x0000, /* Address SpaceGranularity */
0x0000, /* Address RangeMinimum */
0x00FF, /* Address RangeMaximum */
0x0000, /* AddressTranslation Offset */
0x0100, 0x00)

修改为:

1
2
3
4
5
6
WordBusNumber (ResourceProducer, MinFixed, MaxFixed,PosDecode,
0x0000, /* Address SpaceGranularity */
0x0000, /* Address RangeMinimum */
0x00FF, /* Address RangeMaximum */
0x0000, /* AddressTranslation Offset */
0x0100) #删除0x00

10、Reserved methodmust return a value (_WAK) 仅对于Method(_WAK),其它方法的请看主楼。
在_WAK方法的最后添加

1
2
3
4
5
Return (Package (0x02)
       {
           Zero,
           Zero
       })

例如:

1
2
Method (_WAK, 1, NotSerialized)
    {

原来的代码

1
2
3
4
5
6
Return (Package (0x02)
       {
           Zero,
           Zero
       })
    }

11、Not all control paths return a value
请看主楼

12、Not all control paths return a value 又一种情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Device (CMB0)
{
   Name (_HID, EisaId ("PNP0C0A"))
   Name (_UID, 0x01)
   Name (BATP, Ones)
   Name (_PCL, Package (0x01)
    {
       _SB
    })
    ...
   Method (_BTP, 1, NotSerialized)
    {
       If (LEqual (ECFL, Zero))
       {
           Return (0x0F)
       }
       Else
       {
           Store ("_SB.CMB0._BTP", Debug)

把Debug修改为上面的 If 的 Return的值,对于本例Store (“_SB.CMB0._BTP”, 0x0F)

1
2
3
4
  }
    }
    ...
}

13、Object does not exist (括号里有提示的名称)
在DSDT开始的地方
DefinitionBlock ()
{在这下面添加
External (括号里有提示的名称)
例如:
DefinitionBlock (等等名称, 等等名称, 等等名称, 等等名称, 等等名称,等等名称)
{
External (C001) 根据提示添加的
External (_PR.C000) 根据提示添加的

14、Object does not exist ^ (LOR)

1
If (LOr (_OSI ("Darwin"), _OSI ("Windows2001")))

修改为:

1
If (LOr (_OSI ("Darwin"), _OSI ("Windows2001")))

或者修改为:

1
If (LOr (_OSI ("Darwin"), _OSI ("Windows2001")))

15、Operation Region requires ByteAcc
把那一行代码中的AnyAcc改为ByteAcc
16、Possible operator timeout is ignored
0x****改为0xFFFF

17、Reserved method has too fewarguments (_EJ0 requires 1)
或者Reserved method has too many arguments

1
Method (_EJ0, 0, NotSerialized)

把0改为提示中requires后面的值,本例是1。

1
Method (_EJ0, 1, NotSerialized)

18、Reserved method must return a value (_PSR)

1
2
3
4
5
6
7
Method (_PSR, 0, NotSerialized)
           {
               If (_SB.PCI0.PIB.EC.ECOK)
               {
                  Return (_SB.PCI0.PIB.EC.ADP)
               }
           }

修改为:

1
2
3
4
5
6
7
8
9
10
11
Method (_PSR, 0, NotSerialized)
{
   If (_SB.PCI0.PIB.EC.ECOK)
    {
       Return (0x01)
    }
    Else
    {
       Return (0x00)
    }
}

19、Reserved method must return a value (_STA)

1
2
3
4
Method (_STA, 0, NotSerialized)
           {
               STAL (0x60)
           }

修改为:

1
2
3
4
Method (_STA, 0, NotSerialized)
           {
               Return (STAL (0x60))
           }

20、Result is not used, operator has no effect ^
…..

1
2
3
4
5
6
Store (AAXB, MBUF)
  ShiftRight (BUF2, 0x04) < ------- Error
  Store (BUF2, Local3)
  Store (CMER, BUF0)
  Store (0xFF, BUF1)
  Store (Zero, BUF2)

…..
修改为:

1
2
3
4
5
6
7
Store (BUF2, Local4)  <-------  添加                
Store (AAXB, MBUF)
Store (BUF2, Local4)   <------- 修改
Store (BUF2, Local3)
Store (CMER, BUF0)
Store (0xFF, BUF1)
Store (Zero, BUF2)

21、Result is not used, operator has no effect ^ 另一种情况

1
And (CTRL, 0x1E)

修改为:

1
And (CTRL, 0x1E, CTRL)

22、String must be entirely alphanumeric

1
(*PNP0A03)

修改为:

1
(PNP0A03)

23、Reserved method has too many arguments ( _GLK requires 0)

1
Method (_GLK, 1, NotSerialized)

修改为:因为提示requires 0,可以把后面的部分删除。

1
Method (_GLK)

##修复DSDT源代码错误

1、Must be a multiple of alignment/granularity value

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
StartDependentFn (0x01, 0x01)
{
IO (Decode16,
0x03BC, // Range Minimum
0x03BC, // Range Maximum
0x08, // Alignment
0x08, // Length
)
IO (Decode16,
0x07BC, // Range Minimum
0x07BC, // Range Maximum
0x08, // Alignment
0x08, // Length
)
IRQNoFlags ()
{7}
DMA (Compatibility, NotBusMaster, Transfer8, )
{0}
}
EndDependentFn ()

修改为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
StartDependentFn (0x01, 0x01)
{
IO (Decode16,
0x03BC, // Range Minimum
0x03BC, // Range Maximum
0x01, // Alignment
0x08, // Length
)
IO (Decode16,
0x07BC, // Range Minimum
0x07BC, // Range Maximum
0x01, // Alignment
0x08, // Length
)
IRQNoFlags ()
{7}
DMA (Compatibility, NotBusMaster, Transfer8, )
{0}
}
EndDependentFn ()

解释:只需把0x08, // Alignment 修改为0x01, // Alignment

2、Result is not used, operator has no effect

1
2
3
4
5
6
7
8
9
10
11
12
Method (SX41, 0, NotSerialized)
{
Store (SXX2, Local0)
Add (Local0, 0x02)
If (LLessEqual (Local0, SizeOf (SXX0)))
{
CreateWordField (SXX0, SXX2, SX21)
Store (Local0, SXX2)
Return (SX21)
}
Return (Zero)
}

修改为

1
2
3
4
5
6
7
8
9
10
11
12
Method (SX41, 0, NotSerialized)
{
Store (SXX2, Local0)
Add (Local0, 0x02, Local0)
If (LLessEqual (Local0, SizeOf (SXX0)))
{
CreateWordField (SXX0, SXX2, SX21)
Store (Local0, SXX2)
Return (SX21)
}
Return (Zero)
}

解释:只需把Add (Local0, 0x02)修改为 Add (Local0, 0x02, Local0) 即可

3、Invalid lrading asterisk

1
2
3
4
5
Device (AMW0)
{
Mutex (WMIX, 0x01)
Name (_HID, "*pnp0c14")
Name (_UID, Zero)

修改为

1
2
3
4
5
Device (AMW0)
{
Mutex (WMIX, 0x01)
Name (_HID, "PNP0C14")
Name (_UID, Zero)

解释:只需把小写的pnp0c14修改为全大写的PNP0C14(还要注意把号也删掉)

4、Called method may not always return a value

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Method (LFLS, 0, NotSerialized)
{
Name (TMPB, Buffer (0x02)
{
0x00, 0x00
})
CreateByteField (TMPB, 0x00, LPCT)
CreateByteField (TMPB, 0x01, SSUM)
TPHY (0x00)
Store (PH02, LPCT)
If (LPCT)
{
Store (0x00, SSUM)
Add (SSUM, PH01, SSUM)
Add (SSUM, PH02, SSUM)
Add (SSUM, PH03, SSUM)
Add (SSUM, PPRQ, SSUM)
Add (SSUM, PPLO, SSUM)
Add (SSUM, PPRP, SSUM)
Add (SSUM, PPOR, SSUM)
Add (SSUM, TPRS, SSUM)
Add (SSUM, TPMV, SSUM)
Add (SSUM, MOR, SSUM)
Add (SSUM, RSV0, SSUM)
If (SSUM) {}
Else
{
Return (0x00)
}
Return (0x02)
}
}

修改为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Method (LFLS, 0, NotSerialized)
{
Name (TMPB, Buffer (0x02)
{
0x00, 0x00
})
CreateByteField (TMPB, 0x00, LPCT)
CreateByteField (TMPB, 0x01, SSUM)
TPHY (0x00)
Store (PH02, LPCT)
If (LPCT)
{
Store (0x00, SSUM)
Add (SSUM, PH01, SSUM)
Add (SSUM, PH02, SSUM)
Add (SSUM, PH03, SSUM)
Add (SSUM, PPRQ, SSUM)
Add (SSUM, PPLO, SSUM)
Add (SSUM, PPRP, SSUM)
Add (SSUM, PPOR, SSUM)
Add (SSUM, TPRS, SSUM)
Add (SSUM, TPMV, SSUM)
Add (SSUM, MOR, SSUM)
Add (SSUM, RSV0, SSUM)
If (SSUM) {}
Else
{
Return (0x00)
}
Return (0x02)
}
Return (Zero)
/*返回一个值*/
}

解释:只需在整段的末尾返回一个值,即代码中的Return (Zero)

5、Effective AML package length is zero

1
2
Name (PIC3, Package (0x00) {})
Name (API3, Package (0x00) {})

修改为

1
2
Name (PIC3, Package (Zero) {})
Name (API3, Package (Zero) {})

解释:只需将0x00修改为Zero

6、Recursive method call (STDG)

1
2
3
4
5
6
7
8
9
10
11
12
13
Method (STDG, 3, NotSerialized)
{
Store (Arg0, Local0)
If (LGreaterEqual (Arg0, 0x0A))
{
Divide (Arg0, 0x0A, Local0, Local1)
Store (STDG (Local1, Arg1, Arg2), Arg2)
}
Add (Local0, 0x30, Local0)
Store (Local0, Index (Arg1, Arg2))
Increment (Arg2)
Return (Arg2)
}

修改为

1
2
3
4
5
6
7
8
9
10
11
12
Method (STDG, 3, NotSerialized)
{
Store (Arg0, Local0)
If (LGreaterEqual (Arg0, 0x0A))
{
Divide (Arg0, 0x0A, Local0, Local1)
Store (STDG (Local1, Arg1, Arg2), Arg2)
}
Add (Local0, 0x30, Local0)
Increment (Arg2)
Return (Arg2)
}

解释:将原文中的Store (Local0, Index (Arg1, Arg2))删除

7、ResourceTag larger than Field (Tag 64 bits, Field 8 bits) 注意注意啦:此处是Field 8 bit ,不是16bit或32bit

1
CreateByteField (BUF0, _SB.PCI0._Y0F._LEN, MSLN

修改为

1
CreateQWordField (BUF0, _SB.PCI0._Y0F._LEN, MSLN)

解释:其实大家只需要注意错误中的Tag Bits是多少即可,如果Tag 64 bits,那就将Field中的CreateByteField修改为CreateQWordField,如果是32 Bits,那就修改为CreateDWordField,如果是16Bits,那就修改为CreateDWordField,如果是8bits,那就修改为CreateByteField。
普及姿势:Byte = 8, Word = 16, DWord = 32, QWord = 64.
8、Object does not exist (LNKA)

1
2
3
4
5
6
7
Package (0x04)
{
0xFFFF,
Zero,
LNKA,
Zero
},

在整个aml文件开头添加External (LNKA)

1
2
3
DefinitionBlock ("<span class='wp_keywordlink_affiliate'><a href="http://maoshu.cc/tag/dsdt" title="View all posts in dsdt" target="_blank">dsdt</a></span>.aml", "DSDT", 2, "5442B", "5442B170", 0x00000170)
{
External (LNKA)

解释:在整个aml文件开头的大括号 { 后面添加External (LNKA),由几个就添加几个,像我的Dell C6100服务器主板就添加了LNKA、LNKB、LNKC、LNKD、LNKE和LNKH
9、_HID suffix must be all hex digits (I000)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Scope (_SB)
{
Device (AC)
{
Name (_HID, "ACPI000")
Name (_PCL, Package (0x01)
{
BAT0
})
Method (_PSR, 0, NotSerialized)
{
And (MIS0, One, Local0)
Return (Local0)
}
Method (_STA, 0, NotSerialized)
{
Return (0x0F)
}
}
}

修改为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Scope (_SB)
{
Device (AC)
{
Name (_HID, "ACPI0000")
Name (_PCL, Package (0x01)
{
BAT0
})
Method (_PSR, 0, NotSerialized)
{
And (MIS0, One, Local0)
Return (Local0)
}
Method (_STA, 0, NotSerialized)
{
Return (0x0F)
}
}
}

10、Object is not accessible from this scope (ATT3)

1
2
3
4
Method (_CRS, 0, NotSerialized)
{
Return (ATT3)
}

修改为

1
2
3
4
Method (_CRS, 0, NotSerialized)
{
Return (BUF0)
}
-------------本文结束感谢您的阅读-------------