Exemplos de depuração de AML
Aqui estão exemplos que ilustram como começar a usar a depuração de AML.
Investigando um computador congelado
Se o computador de destino tiver congelado e você suspeitar que pode ser um problema de ACPI, comece usando a extensão !amli lc para exibir todos os contextos ativos:
kd> !amli lc
*Ctxt=ffffffff8128d000, ThID=ffffffff81277880, Flgs=----R----, pbOp=ffffffff8124206c, Obj=\_SB.PCI0.ISA0.FDC0._CRS
Se nenhum contexto for exibido, o erro provavelmente não estará relacionado à ACPI.
Se houver contextos mostrados, procure aquele marcado com um asterisco. Esse é o contexto atual (aquele que está sendo executado pelo interpretador no momento).
Neste exemplo, o computador de destino está executando o Windows em um processador de 32 bits. Portanto, todos os endereços são convertidos em 64 bits, produzindo um FFFFFFFFFF gratuito nos 32 bits altos. A abreviação pbOp indica o ponteiro de instrução ("ponteiro para códigos op binários"). O campo Obj fornece o caminho completo e o nome do método como ele aparece nas tabelas ACPI. Para obter uma descrição dos sinalizadores, consulte !amli lc.
Você pode usar o comando !amli u para desmontar o método _CRS da seguinte maneira:
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)
Invadindo o depurador AMLI
O comando !amli depurador faz com que o interpretador de AML interrompa o Depurador AMLI na próxima vez que qualquer código AML for executado.
Depois que o prompt do Depurador AMLI for exibido, você poderá usar qualquer um dos comandos do Depurador AMLI. Você também pode usar comandos de extensão !amli sem prefixá-los com "!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)
Usando pontos de interrupção
No exemplo a seguir, você invadirá o Depurador AMLI antes que o método _BST seja executado.
Mesmo que você tenha localizado um objeto _BST, verifique se ele é realmente um método. Você pode usar a extensão !amli dns para fazer isso.
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)
Agora você pode usar o comando !amli bp para colocar o ponto de interrupção:
kd> !amli bp \_sb.pci0.isa.bat1._bst
Talvez você também queira colocar pontos de interrupção dentro do método . Você pode usar o comando !amli u para desmontar _BST e, em seguida, colocar um ponto de interrupção em uma de suas etapas:
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
Respondendo a um ponto de interrupção disparado
No exemplo a seguir, o método _WAK está em execução e, em seguida, encontra um ponto de interrupção:
Running \_WAK method
Hit Breakpoint 0.
Use a extensão !amli ln para ver o método mais próximo do contador do programa atual. O exemplo a seguir mostra endereços em formato de 32 bits:
kd> !amli ln
c29accf5: \_WAK
A extensão !amli lc exibe todos os contextos ativos:
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
Isso mostra que os contextos ativos estão associados aos métodos _Q09 e _WAK. O contexto atual é _WAK.
Agora você pode usar o comando !amli r para exibir mais detalhes sobre o contexto atual. A partir disso, você pode ver informações úteis de thread e pilha, bem como argumentos passados para _WAK e os objetos de dados locais.
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()
Rastreamento, etapas e execução de código AML
Se você quiser rastrear por meio do código, poderá ativar as informações completas de rastreamento usando a extensão !amli set da seguinte maneira:
kd> !amli set spewon verboseon traceon
Agora você pode percorrer o código AML, observando o código executar linha por linha. O comando p percorre todas as chamadas de função. O comando t intervirá em chamadas de função.
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"
Você também pode executar métodos de dentro do Depurador AMLI, se desejar. Por exemplo, você pode avaliar a status do dispositivo LNKA executando seu método de controle _STA:
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])