AML デバッグの例
AML デバッグを開始する方法の例を次に示します。
フリーズしたコンピューターの調査
ターゲット コンピューターがフリーズしていて、ACPI の問題である可能性がある場合は、!amli lc 拡張コマンドを使用してすべてのアクティブなコンテキストを表示することから始めます。
kd> !amli lc
*Ctxt=ffffffff8128d000, ThID=ffffffff81277880, Flgs=----R----, pbOp=ffffffff8124206c, Obj=\_SB.PCI0.ISA0.FDC0._CRS
コンテキストが表示されない場合、エラーはおそらく ACPI 関連ではありません。
コンテキストが表示されている場合は、アスタリスクでマークされたコンテキストを探します。 これは現在のコンテキスト (現在インタープリターによって実行されているコンテキスト) です。
この例では、ターゲット コンピューターが 32 ビット プロセッサで Windows を実行しています。 したがって、すべてのアドレスは 64 ビットにキャストされ、上位 32 ビットで余計な FFFFFFFF が生成されます。 略語 pbOp は、命令ポインター ("バイナリ op コードへのポインター") を示します。 Obj フィールドには、ACPI テーブルに表示されるメソッドの完全なパスと名前が表示されます。 フラグの説明については、「!amli lc」を参照してください。
!amli u コマンドを使用して、_CRS メソッドを次のように逆アセンブルできます。
kd> !amli u \_SB.PCI0.ISA0.FDC0._CRS
ffffffff80e4a535 : CreateDWordFieldCRES, 0x76, RAMT)
ffffffff80e4a540 : CreateDWordField(CRES, 0x82, PCIT)
ffffffff80e4a54b : Add(MLEN(), 0x100000, RAMT)
ffffffff80e4a559 : Subtract(0xffe00000, RAMT, PCIT)
ffffffff80e4a567 : Return(CRES)
AMLI デバッガーの分割
!amli デバッガー コマンドを実行すると、次回 AML コードが実行されるときに、AML インタープリターが AMLI デバッガーに分割されます。
AMLI デバッガー プロンプトが表示されたら、AMLI デバッガー コマンドのいずれかを使用できます。 前に "!amli"を付けないで !amli 拡張コマンドを使用することもできます。
kd> !amli debugger
kd> g
AMLI(? for help)-> find _crs
\_SB.LNKA._CRS
\_SB.LNKB._CRS
\_SB.LNKC._CRS
\_SB.LNKD._CRS
\_SB.PCI0._CRS
\_SB.PCI0.LPC.NCP._CRS
\_SB.PCI0.LPC.PIC._CRS
\_SB.PCI0.LPC.TIME._CRS
\_SB.PCI0.LPC.IDMA._CRS
\_SB.PCI0.LPC.RTC._CRS
\_SB.PCI0.LPC.SPKR._CRS
\_SB.PCI0.LPC.FHUB._CRS
\_SB.PCI0.SBD1._CRS
\_SB.PCI0.SBD2._CRS
\_SB.MBRD._CRS
AMLI(? for help)-> u \_SB.PCI0._CRS
ffffffff80e4a535 : CreateDWordFieldCRES, 0x76, RAMT)
ffffffff80e4a540 : CreateDWordField(CRES, 0x82, PCIT)
ffffffff80e4a54b : Add(MLEN(), 0x100000, RAMT)
ffffffff80e4a559 : Subtract(0xffe00000, RAMT, PCIT)
ffffffff80e4a567 : Return(CRES)
ブレークポイントの使用
次の例では、メソッド _BST が実行される前に AMLI デバッガーに分割します。
_BST オブジェクトを見つけた場合でも、それが実際にメソッドであることを確認する必要があります。 これを行うには、!amli dns 拡張コマンドを使用できます。
kd> !amli dns /s \_sb.pci0.isa.bat1._bst
ACPI Name Space: \_SB.PCI0.ISA.BAT1._BST (c29c2044)
Method(_BST:Flags=0x0,CodeBuff=c29c20a5,Len=103)
これで、!amli bp コマンドを使用してブレークポイントを配置できます。
kd> !amli bp \_sb.pci0.isa.bat1._bst
メソッド内にブレークポイントを配置することもできます。 !amli u コマンドを使用して _BST を逆アセンブルし、その手順のいずれかにブレークポイントを配置できます。
kd> !amli u _sb.pci0.isa.bat1._bst
ffffffffc29c20a5: Acquire(\_SB_.PCI0.ISA_.EC0_.MUT1, 0xffff)
ffffffffc29c20c0: Store("CMBatt - _BST.BAT1", Debug)
ffffffffc29c20d7: \_SB_.PCI0.ISA_.EC0_.CPOL()
ffffffffc29c20ee: Release(\_SB_.PCI0.ISA_.EC0_.MUT1)
ffffffffc29c2107: Return(PBST)
kd> !amli bp c29c20ee
トリガーされたブレークポイントへの応答
次の例では、_WAK メソッドが実行され、ブレークポイントが検出されます。
Running \_WAK method
Hit Breakpoint 0.
!amli ln 拡張コマンドを使用して、現在のプログラム カウンターに最も近いメソッドを確認します。 次の例は、アドレスを 32 ビット形式で示しています。
kd> !amli ln
c29accf5: \_WAK
!amli lc 拡張コマンドには、すべてのアクティブなコンテキストが表示されます。
kd> !amli lc
Ctxt=c18b6000, ThID=00000000, Flgs=A-QC-W----, pbOp=c29bf8fe, Obj=\_SB.PCI0.ISA.EC0._Q09
*Ctxt=c18b4000, ThID=c15a6618, Flgs=----R-----, pbOp=c29accf5, Obj=\_WAK
これは、アクティブなコンテキストが _Q09 および _WAK メソッドに関連付けられていることを示しています。 現在のコンテキストは _WAK です。
これで、!amli r コマンドを使用して、現在のコンテキストに関する詳細を表示できます。 これにより、便利なスレッドとスタックの情報、および _WAK およびローカル データ オブジェクトに渡される引数を確認できます。
kd> !amli r
Context=c18b4000*, Queue=00000000, ResList=00000000
ThreadID=c15a6618, Flags=00000010
StackTop=c18b5eec, UsedStackSize=276 bytes, FreeStackSize=7636 bytes
LocalHeap=c18b40c0, CurrentHeap=c18b40c0, UsedHeapSize=88 bytes
Object=\_WAK, Scope=\_WAK, ObjectOwner=c18b4108, SyncLevel=0
AsyncCallBack=ff06b5d0, CallBackData=0, CallBackContext=c99efddc
MethodObject=\_WAK
c18b40e4: Arg0=Integer(:Value=0x00000001[1])
c18b5f3c: Local0=Unknown()
c18b5f54: Local1=Unknown()
c18b5f6c: Local2=Unknown()
c18b5f84: Local3=Unknown()
c18b5f9c: Local4=Unknown()
c18b5fb4: Local5=Unknown()
c18b5fcc: Local6=Unknown()
c18b5fe4: Local7=Unknown()
c18b4040: RetObj=Unknown()
AML コードのトレース、ステップ実行、実行
コードをトレースする場合は、次のように !amli set 拡張コマンドを使用して完全なトレース情報を有効にすることができます。
kd> !amli set spewon verboseon traceon
これで、AML コードをステップ実行し、コードが 1 行ずつ実行されるのを見ることができます。 p コマンドはすべての関数呼び出しをステップ実行します。 t コマンドは関数呼び出しにステップ インします。
AMLI(? for help)-> p
c29bfcb7: Store(\_SB_.PCI0.ISA_.ACAD.CHAC(SEL0=0x10e1)
c29c17b1: {
c29c17b1: | Store(LGreater(And(Arg0=0x10e1,0xf0,)=0xe0,0x80)=0xffffffff,Local0)=0xffffffff
AMLI(? for help)-> p
c29c17bb: | If(LNot(LEqual(Local0=0xffffffff,ACP_=0xffffffff)=0xffffffff)=0x0)
c29c17ce: | {
c29c17ce: | | Return(Zero)
c29c17d0: | }
c29c17d0: },Local1)=0x0
AMLI(? for help)-> t
c29bfcd4: Store(\_SB_.PCI0.ISA_.BAT1.CHBP(SEL0=0x10e1)
c29c293d: {
c29c293d: | Store("CMBatt - CHBP.BAT1",Debug)String(:Str="CMBatt - CHBP.BAT1")="CMBatt - CHBP.BAT1"
選択した場合は、AMLI デバッガー内からメソッドを実行することもできます。 たとえば、制御メソッド _STA を実行して LNKA デバイスの状態を評価できます。
AMLI(? for help)-> run \_sb.lnka._sta
PCI OpRegion Access on region c29b2268 device c29b2120
\_SB.LNKA._STA completed successfully with object data:
Integer(:Value=0x0000000b[11])