节点BAT2方法VMPS里面访问\_SB.PCI0.OEMR放到局部变量Local0中返回期间会调用acpi!GetPciAddress
每次访问\_SB.PCI0.OEMR就好调用acpi!GetPciAddress函数就会新建两个_CTXT。
可以用个全局变量把结果
&state->Bus,
&state->Slot
比如全局变量acpi!pci0_state_Bus和全局变量acpi!pci0_state_Slot。能提高一些速度。
if (!interface) {
if (!(state->Flags & PCISUPP_GOT_SLOT_INFO)) {
state->Flags |= PCISUPP_GOT_SLOT_INFO;
status = GetPciAddress(state->PciObj,
PciConfigSpaceHandlerWorker,
(PVOID)state,
&state->Bus,
&state->Slot);
Method (VMPS, 1, NotSerialized)
{
Acquire (OEML, 0xFFFF)
IVOC (0x81, Arg0)
Store (\_SB.PCI0.OEMR, Local0)
Release (OEML)
Return (Local0)
}
1: kd> x ACPI!AcpiGetListEntry
f743b940 ACPI!AcpiGetListEntry = struct _LIST_ENTRY [ 0x899c6328 - 0x899c6328 ]
1: kd> dx -r1 (*((ACPI!_LIST_ENTRY *)0xf743b940))
(*((ACPI!_LIST_ENTRY *)0xf743b940)) [Type: _LIST_ENTRY]
[+0x000] Flink : 0x899c6328 [Type: _LIST_ENTRY *]
[+0x004] Blink : 0x899c6328 [Type: _LIST_ENTRY *]
if (!interface) {
if (!(state->Flags & PCISUPP_GOT_SLOT_INFO)) {
state->Flags |= PCISUPP_GOT_SLOT_INFO;
status = GetPciAddress(state->PciObj,
PciConfigSpaceHandlerWorker,
(PVOID)state,
&state->Bus,
&state->Slot);
1: kd> kc
#
00 ACPI!GetPciAddress
01 ACPI!PciConfigSpaceHandlerWorker
02 ACPI!PciConfigSpaceHandler
03 ACPI!InternalOpRegionHandler
04 ACPI!AccessBaseField
05 ACPI!AccessFieldData
06 ACPI!ReadFieldObj
07 ACPI!RunContext
08 ACPI!DispatchCtxtQueue
09 ACPI!StartTimeSlicePassive
0a ACPI!ACPIWorker
0b nt!PspSystemThreadStartup
0c nt!KiThreadStartup
1: kd> dv
PciObj = 0x899affac
CompletionRoutine = 0xf740d62c
Context = 0x89987378
Bus = 0x899873b0 ""
Slot = 0x899873ac
#define INITIAL_RUN_COMPLETION -1
RtlZeroMemory(state, sizeof(GET_ADDRESS_CONTEXT));
state->PciObject = PciObj;
state->CompletionRoutine = CompletionRoutine;
state->CompletionContext = Context;
state->Bus = Bus;
state->Slot = Slot;
state->RunCompletion = INITIAL_RUN_COMPLETION;
return GetPciAddressWorker(PciObj,
STATUS_SUCCESS,
NULL,
(PVOID)state);
1: kd> kc
#
00 ACPI!GetPciAddressWorker
01 ACPI!GetPciAddress
02 ACPI!PciConfigSpaceHandlerWorker
03 ACPI!PciConfigSpaceHandler
04 ACPI!InternalOpRegionHandler
05 ACPI!AccessBaseField
06 ACPI!AccessFieldData
07 ACPI!ReadFieldObj
08 ACPI!RunContext
09 ACPI!DispatchCtxtQueue
0a ACPI!StartTimeSlicePassive
0b ACPI!ACPIWorker
0c nt!PspSystemThreadStartup
0d nt!KiThreadStartup
1: kd> dv
AcpiObject = 0x899affac
Status = 0n0
Result = 0x00000000
Context = 0x899bf408
buffer = unsigned char [64] ""
1: kd> dt GET_ADDRESS_CONTEXT 0x899bf408
ACPI!GET_ADDRESS_CONTEXT
+0x000 PciObject : 0x899affac _NSObj
+0x004 Bus : 0x899873b0 ""
+0x008 Slot : 0x899873ac _PCI_SLOT_NUMBER
+0x00c ParentBus : 0 ''
+0x010 ParentSlot : _PCI_SLOT_NUMBER
+0x014 Flags : 0
+0x018 Address : 0
+0x01c BaseBusNumber : 0
+0x020 RunCompletion : 0n-1 //#define INITIAL_RUN_COMPLETION -1
+0x024 CompletionRoutine : 0xf740d62c void ACPI!PciConfigSpaceHandlerWorker+0
+0x028 CompletionContext : 0x89987378 Void
//
// First, determine the slot number.
//
if (!(state->Flags & PCISUPP_CHECKED_ADR)) {
//
// Get the _ADR.
//
state->Flags |= PCISUPP_CHECKED_ADR;
status = ACPIGetNSAddressAsync(
state->PciObject,
GetPciAddressWorker,
(PVOID)state,
&(state->Address),
NULL
);
#define PCISUPP_CHECKED_HID 1
#define PCISUPP_CHECKED_PCI_DEVICE 2
#define PCISUPP_CHECKED_ADR 8
#define PCISUPP_IS_PCI_DEVICE 0x10
#define PCISUPP_CHECKED_PARENT 0x20
#define PCISUPP_CHECKED_PCI_BRIDGE 0x40
#define PCISUPP_CHECKED_CID 0x80
#define PCISUPP_GOT_SLOT_INFO 0x100
#define PCISUPP_GOT_BUS_INFO 0x200
#define PCISUPP_CHECKED_CRS 0x400
#define PCISUPP_COMPLETING_IS_PCI 0x800
#define PCISUPP_GOT_SCOPE 0x1000
#define PCISUPP_CHECKED_BBN 0x2000
#define PCISUPP_CHECKED_ADR 8
#define PCISUPP_CHECKED_BBN 0x2000
1: kd> kc
#
00 ACPI!ACPIGet
01 ACPI!GetPciAddressWorker
02 ACPI!GetPciAddress
03 ACPI!PciConfigSpaceHandlerWorker
04 ACPI!PciConfigSpaceHandler
05 ACPI!InternalOpRegionHandler
06 ACPI!AccessBaseField
07 ACPI!AccessFieldData
08 ACPI!ReadFieldObj
09 ACPI!RunContext
0a ACPI!DispatchCtxtQueue
0b ACPI!StartTimeSlicePassive
0c ACPI!ACPIWorker
0d nt!PspSystemThreadStartup
0e nt!KiThreadStartup
1: kd> dv
Target = 0x899affac
ObjectID = 0x5244415f
Flags = 0x48040402
SimpleArgument = 0x00000000
SimpleArgumentSize = 0
CallBackRoutine = 0xf740ceea
CallBackContext = 0x899bf408
1: kd> u f740ceea
ACPI!GetPciAddressWorker [d:\srv03rtm\base\busdrv\acpi\driver\nt\pciopregion.c @ 986]:
f740ceea 55 push ebp
f740ceeb 8bec mov ebp,esp
f740ceed 83ec44 sub esp,44h
f740cef0 a1a88c43f7 mov eax,dword ptr [ACPI!__security_cookie (f7438ca8)]
f740cef5 53 push ebx
f740cef6 56 push esi
f740cef7 8b7514 mov esi,dword ptr [ebp+14h]
f740cefa 85f6 test esi,esi
windbg> .open -a fffffffff740ceea
1: kd> dt GET_ADDRESS_CONTEXT 0x899bf408
ACPI!GET_ADDRESS_CONTEXT
+0x000 PciObject : 0x899affac _NSObj
+0x004 Bus : 0x899873b0 ""
+0x008 Slot : 0x899873ac _PCI_SLOT_NUMBER
+0x00c ParentBus : 0 ''
+0x010 ParentSlot : _PCI_SLOT_NUMBER
+0x014 Flags : 8
+0x018 Address : 0
+0x01c BaseBusNumber : 0
+0x020 RunCompletion : 0n0
+0x024 CompletionRoutine : 0xf740d62c void ACPI!PciConfigSpaceHandlerWorker+0
+0x028 CompletionContext : 0x89987378 Void
1: kd> u f740d62c
ACPI!PciConfigSpaceHandlerWorker [d:\srv03rtm\base\busdrv\acpi\driver\nt\pciopregion.c @ 544]:
f740d62c 55 push ebp
f740d62d 8bec mov ebp,esp
f740d62f 83ec44 sub esp,44h
f740d632 a1a88c43f7 mov eax,dword ptr [ACPI!__security_cookie (f7438ca8)]
f740d637 53 push ebx
f740d638 8b5d14 mov ebx,dword ptr [ebp+14h]
f740d63b 56 push esi
f740d63c 57 push edi
windbg> .open -a fffffffff740d62c
1: kd> dt PCI_CONFIG_STATE 0x89987378
ACPI!PCI_CONFIG_STATE
+0x000 AccessType : 0
+0x004 OpRegion : 0x899b0b50 _NSObj
+0x008 Address : 0xd8
+0x00c Size : 4
+0x010 Data : 0x8997dd84 -> 0
+0x014 Context : 0
+0x018 CompletionHandler : 0xf7420914 Void
+0x01c CompletionContext : 0x8997c0ac Void
+0x020 PciObj : 0x899affac _NSObj
+0x024 ParentObj : (null)
+0x028 CompletionHandlerType : 0
+0x02c Flags : 0x100
+0x030 RunCompletion : 0n0
+0x034 Slot : _PCI_SLOT_NUMBER
+0x038 Bus : 0 ''
+0x039 IsPciDeviceResult : 0 ''
1: kd> u 0xf7420914
ACPI!RestartCtxtCallback [d:\srv03rtm\base\busdrv\acpi\driver\amlinew\sched.c @ 401]:
f7420914 55 push ebp
f7420915 8bec mov ebp,esp
f7420917 56 push esi
f7420918 8b7508 mov esi,dword ptr [ebp+8]
f742091b 57 push edi
f742091c 6a01 push 1
f742091e bf603f43f7 mov edi,offset ACPI!`string' (f7433f60)
f7420923 57 push edi
1: kd> kc
#
00 ACPI!AMLIAsyncEvalObject
01 ACPI!ACPIGet
02 ACPI!GetPciAddressWorker
03 ACPI!GetPciAddress
04 ACPI!PciConfigSpaceHandlerWorker
05 ACPI!PciConfigSpaceHandler
06 ACPI!InternalOpRegionHandler
07 ACPI!AccessBaseField
08 ACPI!AccessFieldData
09 ACPI!ReadFieldObj
0a ACPI!RunContext
0b ACPI!DispatchCtxtQueue
0c ACPI!StartTimeSlicePassive
0d ACPI!ACPIWorker
0e nt!PspSystemThreadStartup
0f nt!KiThreadStartup
1: kd> g
Breakpoint 37 hit
eax=899b00f0 ebx=00000000 ecx=899b00f0 edx=00000000 esi=899b00f0 edi=899050e0
eip=f741f8c9 esp=f791aa94 ebp=f791aac4 iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000246
ACPI!AsyncEvalObject:
f741f8c9 55 push ebp
1: kd> kc
#
00 ACPI!AsyncEvalObject
01 ACPI!AMLIAsyncEvalObject
02 ACPI!ACPIGet
03 ACPI!GetPciAddressWorker
04 ACPI!GetPciAddress
05 ACPI!PciConfigSpaceHandlerWorker
06 ACPI!PciConfigSpaceHandler
07 ACPI!InternalOpRegionHandler
08 ACPI!AccessBaseField
09 ACPI!AccessFieldData
0a ACPI!ReadFieldObj
0b ACPI!RunContext
0c ACPI!DispatchCtxtQueue
0d ACPI!StartTimeSlicePassive
0e ACPI!ACPIWorker
0f nt!PspSystemThreadStartup
10 nt!KiThreadStartup
1: kd> g
Breakpoint 42 hit
eax=00000000 ebx=899b010c ecx=899b010c edx=89904fe4 esi=f7438ca8 edi=00000000
eip=f74207d4 esp=f791aa70 ebp=f791aa90 iopl=0 nv up ei ng nz ac pe cy
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000297
ACPI!RestartContext:
f74207d4 55 push ebp
1: kd> kc
#
00 ACPI!RestartContext
01 ACPI!AsyncEvalObject
02 ACPI!AMLIAsyncEvalObject
03 ACPI!ACPIGet
04 ACPI!GetPciAddressWorker
05 ACPI!GetPciAddress
06 ACPI!PciConfigSpaceHandlerWorker
07 ACPI!PciConfigSpaceHandler
08 ACPI!InternalOpRegionHandler
09 ACPI!AccessBaseField
0a ACPI!AccessFieldData
0b ACPI!ReadFieldObj
0c ACPI!RunContext
0d ACPI!DispatchCtxtQueue
0e ACPI!StartTimeSlicePassive
0f ACPI!ACPIWorker
10 nt!PspSystemThreadStartup
11 nt!KiThreadStartup
1: kd> dv
pctxt = 0x89903000
fDelayExecute = 0x00 ''
1: kd> x ACPI!gReadyQueue
f743a928 ACPI!gReadyQueue = struct _ctxtq
1: kd> dx -r1 (*((ACPI!_ctxtq *)0xf743a928))
(*((ACPI!_ctxtq *)0xf743a928)) [Type: _ctxtq]
[+0x000] dwfCtxtQ : 0x0 [Type: unsigned long]
[+0x004] pkthCurrent : 0x89981ca0 [Type: _KTHREAD *]
[+0x008] pctxtCurrent : 0x8997c000 [Type: _ctxt *]
[+0x00c] plistCtxtQ : 0x0 [Type: _List *]
[+0x010] dwmsTimeSliceLength : 0x64 [Type: unsigned long]
[+0x014] dwmsTimeSliceInterval : 0x64 [Type: unsigned long]
[+0x018] pfnPauseCallback : 0x0 [Type: void (__cdecl*)(void *)]
[+0x01c] PauseCBContext : 0x0 [Type: void *]
[+0x020] mutCtxtQ [Type: _mutex]
[+0x028] Timer [Type: _KTIMER]
[+0x050] DpcStartTimeSlice [Type: _KDPC]
[+0x070] DpcExpireTimeSlice [Type: _KDPC]
[+0x090] WorkItem [Type: _WORK_QUEUE_ITEM]
1: kd> kc
#
00 ACPI!RunContext
01 ACPI!DispatchCtxtQueue
02 ACPI!StartTimeSlicePassive
03 ACPI!ACPIWorker
04 nt!PspSystemThreadStartup
05 nt!KiThreadStartup
1: kd> kc
#
00 ACPI!RunContext
01 ACPI!DispatchCtxtQueue
02 ACPI!StartTimeSlicePassive
03 ACPI!ACPIWorker
04 nt!PspSystemThreadStartup
05 nt!KiThreadStartup
1: kd> dv
pctxt = 0x89903000 //新的pctxt = 0x89903000
pctxtSave = 0xf741d711
pkthSave = 0x00000008
rc = 0n-1987039232
1: kd> g
Breakpoint 45 hit
eax=00000000 ebx=f743a948 ecx=f743a948 edx=00002700 esi=89903000 edi=89904fe4
eip=f741d82f esp=f791ad14 ebp=f791ad34 iopl=0 nv up ei ng nz na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000286
ACPI!RunContext+0x11f:
f741d82f ff570c call dword ptr [edi+0Ch] ds:0023:89904ff0={ACPI!ProcessEvalObj (f741ef2b)}
1: kd> kc
#
00 ACPI!ACPIGet
01 ACPI!GetPciAddressWorker
02 ACPI!ACPIGetWorkerForInteger
03 ACPI!AsyncCallBack
04 ACPI!RunContext
05 ACPI!DispatchCtxtQueue
06 ACPI!StartTimeSlicePassive
07 ACPI!ACPIWorker
08 nt!PspSystemThreadStartup
09 nt!KiThreadStartup
//
// Is there a _BBN to run?
//
tempObj = ACPIAmliGetNamedChild(bus, PACKED_BBN);
if (tempObj) {
//
// This device must be the child of a root PCI bus.
//
if (!(state->Flags & PCISUPP_CHECKED_BBN)) {
state->Flags |= PCISUPP_CHECKED_BBN;
status = ACPIGetNSIntegerAsync(
bus,
PACKED_BBN,
GetPciAddressWorker,
(PVOID)state,
&(state->BaseBusNumber),
NULL
);
1: kd> kc
#
00 ACPI!AMLIAsyncEvalObject
01 ACPI!ACPIGet
02 ACPI!GetPciAddressWorker
03 ACPI!ACPIGetWorkerForInteger
04 ACPI!AsyncCallBack
05 ACPI!RunContext
06 ACPI!DispatchCtxtQueue
07 ACPI!StartTimeSlicePassive
08 ACPI!ACPIWorker
09 nt!PspSystemThreadStartup
0a nt!KiThreadStartup
1: kd> dv
pns = 0x899b00ac
pdataResult = 0x89985164
icArgs = 0n0
pdataArgs = 0x00000000
pfnAsyncCallBack = 0xf7407364
pvContext = 0x89985138
pHData = 0x00000008
1: kd> kc
#
00 ACPI!RestartContext
01 ACPI!AsyncEvalObject
02 ACPI!AMLIAsyncEvalObject
03 ACPI!ACPIGet
04 ACPI!GetPciAddressWorker
05 ACPI!ACPIGetWorkerForInteger
06 ACPI!AsyncCallBack
07 ACPI!RunContext
08 ACPI!DispatchCtxtQueue
09 ACPI!StartTimeSlicePassive
0a ACPI!ACPIWorker
0b nt!PspSystemThreadStartup
0c nt!KiThreadStartup
1: kd> dv
pctxt = 0x89901000 //新的pctxt = 0x89901000
fDelayExecute = 0x00 ''
1: kd> kc
#
00 ACPI!RunContext
01 ACPI!DispatchCtxtQueue
02 ACPI!StartTimeSlicePassive
03 ACPI!ACPIWorker
04 nt!PspSystemThreadStartup
05 nt!KiThreadStartup
1: kd> dv
pctxt = 0x89901000
pctxtSave = 0xf741d711
pkthSave = 0x00000008
rc = 0n-1987047424
1: kd> kc
#
00 ACPI!PciConfigSpaceHandlerWorker
01 ACPI!GetPciAddressWorker
02 ACPI!ACPIGetWorkerForInteger
03 ACPI!AsyncCallBack
04 ACPI!RunContext
05 ACPI!DispatchCtxtQueue
06 ACPI!StartTimeSlicePassive
07 ACPI!ACPIWorker
08 nt!PspSystemThreadStartup
09 nt!KiThreadStartup
1: kd> dv
AcpiObject = 0x899b00ac
CompletionStatus = 0n0
Result = 0x00000000
Context = 0x89987378
1: kd> dt PCI_CONFIG_STATE 0x89987378
ACPI!PCI_CONFIG_STATE
+0x000 AccessType : 0
+0x004 OpRegion : 0x899b0b50 _NSObj
+0x008 Address : 0xd8
+0x00c Size : 4
+0x010 Data : 0x8997dd84 -> 0
+0x014 Context : 0
+0x018 CompletionHandler : 0xf7420914 Void
+0x01c CompletionContext : 0x8997c0ac Void
+0x020 PciObj : 0x899affac _NSObj
+0x024 ParentObj : (null)
+0x028 CompletionHandlerType : 0
+0x02c Flags : 0x100 #define PCISUPP_GOT_SLOT_INFO 0x100
+0x030 RunCompletion : 0n0
+0x034 Slot : _PCI_SLOT_NUMBER
+0x038 Bus : 0 ''
+0x039 IsPciDeviceResult : 0 ''
switch (state->AccessType) {
case RSACCESS_READ:
} else {
//
// Do config space op through HAL
//
bytes = HalGetBusDataByOffset(PCIConfiguration,
state->Bus,
state->Slot.u.AsULONG,
state->Data,
state->Address,
state->Size);
1: kd> kc
#
00 hal!HalGetBusDataByOffset
01 ACPI!PciConfigSpaceHandlerWorker
02 ACPI!GetPciAddressWorker
03 ACPI!ACPIGetWorkerForInteger
04 ACPI!AsyncCallBack
05 ACPI!RunContext
06 ACPI!DispatchCtxtQueue
07 ACPI!StartTimeSlicePassive
08 ACPI!ACPIWorker
09 nt!PspSystemThreadStartup
0a nt!KiThreadStartup
1: kd> dv
BusDataType = PCIConfiguration (0n4)
BusNumber = 0
SlotNumber = 0
Buffer = 0x8997dd84
Offset = 0xd8
Length = 4
bus = struct _BUS_HANDLER
1: kd> db 0x8997dd84
8997dd84 00 00 00 00 00 00 00 00-00 00 00 00 20 00 00 00 ............ ...
8997dd94 03 00 00 00 41 43 46 55-18 00 00 00 03 00 01 00 ....ACFU........
1: kd> gu
Breakpoint 23 hit
eax=00000103 ebx=00000000 ecx=00000103 edx=000c0802 esi=89906cd0 edi=899aee58
eip=f73fbc48 esp=f789ef54 ebp=f789ef60 iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000246
ACPI!ACPIBuildProcessRunMethodPhaseCheckSta+0x4e:
f73fbc48 8bd8 mov ebx,eax
0: kd> db 0x8997dd84
8997dd84 00 00 00 00 00 00 00 00-00 00 00 00 20 00 00 00 ............ ...
8997dd94 03 00 00 00 41 43 46 55-18 00 00 00 03 00 01 00 ....ACFU........
8997dda4 71 9b 41 f7 f4 0b 9b 89-58 c1 97 89 54 45 52 4d q.A.....X...TERM
0: kd> db 0x8997dd84
8997dd84 00 00 00 00 说明不存在BAT2
Method (VMPS, 1, NotSerialized)
{
Acquire (OEML, 0xFFFF)
IVOC (0x81, Arg0)
Store (\_SB.PCI0.OEMR, Local0) //最后会运行ACPI!Store
Release (OEML)
Return (Local0)
}
Device (BAT2)
{
Name (_HID, EisaId ("PNP0C0A")) // _HID: Hardware ID
Name (_UID, 0x02) // _UID: Unique ID
Name (_PCL, Package (0x01) // _PCL: Power Consumer List
{
\_SB
})
Method (_STA, 0, NotSerialized) // _STA: Status
{
Return (VMPS (0x02))
}