Поделиться через


Примеры отладки AML

Ниже приведены примеры, иллюстрирующие начало работы с отладкой AML.

Исследование замороженного компьютера

Если целевой компьютер завис и вы подозреваете, что это может быть проблема ACPI, начните с расширения !amli lc для отображения всех активных контекстов:

kd> !amli lc
*Ctxt=ffffffff8128d000, ThID=ffffffff81277880, Flgs=----R----, pbOp=ffffffff8124206c, Obj=\_SB.PCI0.ISA0.FDC0._CRS

Если контексты не отображаются, скорее всего, ошибка не связана с ACPI.

Если отображаются контексты, найдите контекст, помеченный звездочкой. Это текущий контекст (тот, который выполняется интерпретатором в данный момент).

В этом примере целевой компьютер работает под управлением Windows на 32-разрядном процессоре. Поэтому все адреса приведены к 64 битам, создавая безвозмездный FFFFFFFF в высоких 32 бита. Аббревиатура pbOp обозначает указатель инструкции ("указатель на двоичные коды операций"). Поле 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 переходит в отладчик AMLI при следующем выполнении любого кода AML.

После появления запроса AMLI Debugger можно использовать любую из команд отладчика 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)

Использование точек останова

В следующем примере вы разбереете отладчик AMLI перед выполнением метода _BST.

Даже если вы нашли объект _BST, убедитесь, что он действительно является методом. Для этого можно использовать расширение DNS !amli .

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, наблюдая за выполнением кода построчно. Команда 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. Например, можно оценить состояние устройства LNKA, выполнив его метод управления _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])

См. также:

 Отладчик AMLI