欢迎光临
我们一直在努力

ACPI!DisableLinkNodesAsyncWorker函数分析和节点的_DIS方法有关

ACPI!DisableLinkNodesAsyncWorker函数分析和节点的_DIS方法有关

第一部分:

d:\\srv03rtm\\base\\busdrv\\acpi\\driver\\nt\\irqarb.c

    This module implements an arbiter for IRQs.

    In a traditional machine, the BIOS sets up the
    mapping of PCI interrupt sources (i.e. Bus 0, slot 4,
    funtion 1, INT B maps to IRQ 10.)  This mapping is
    then forever fixed.  On the other hand, an ACPI
    machine can possibly change these mappings by
    manipulating the "link nodes" in the AML namespace.
    Since the ACPI driver is the agent of change, it is the
    place to implement an arbiter.

此模块实现了用于处理中断请求(IRQs)的仲裁器。
   
 在传统机器中,基本输入输出系统(BIOS)会设置PCI中断源的映射(即总线0,插槽4,功能1,INT B映射到IRQ 10)。
此映射随后将永久固定。另一方面,高级配置和电源接口(ACPI)机器可以通过操纵高级机器语言(AML)命名空间中的“链接节点”来更改这些映射。
    
由于ACPI驱动程序是变更的媒介,因此它是实现仲裁器的合适位置。

第二部分:

1: kd> kc
 #
00 ACPI!AMLIAsyncEvalObject
01 ACPI!ACPIGet
02 ACPI!DisableLinkNodesAsyncWorker
03 ACPI!DisableLinkNodesAsync
04 ACPI!DisableLinkNodesAsyncWorker
05 ACPI!DisableLinkNodesAsyncWorker
06 ACPI!AsyncCallBack
07 ACPI!RunContext
08 ACPI!DispatchCtxtQueue
09 ACPI!StartTimeSlicePassive
0a ACPI!ACPIWorker
0b nt!PspSystemThreadStartup
0c nt!KiThreadStartup
1: kd> kv
 # ChildEBP RetAddr  Args to Child              
00 f791abd8 f7407905 899b3738 8991180c 00000000 ACPI!AMLIAsyncEvalObject (FPO: [Non-Fpo]) (CONV: cdecl) [d:\\srv03rtm\\base\\busdrv\\acpi\\driver\\amlinew\\amliapi.c @ 821]
01 f791ac34 f740a570 899b3738 4449485f 58080206 ACPI!ACPIGet+0x24d (FPO: [Non-Fpo]) (CONV: stdcall) [d:\\srv03rtm\\base\\busdrv\\acpi\\driver\\nt\\get.c @ 275]
02 f791ac70 f740a4ca 899b36f4 00000000 00000000 ACPI!DisableLinkNodesAsyncWorker+0x5e (FPO: [Non-Fpo]) (CONV: cdecl) [d:\\srv03rtm\\base\\busdrv\\acpi\\driver\\nt\\irqarb.c @ 4943]
03 f791ac8c f740a650 899b36f4 f740a512 894611d8 ACPI!DisableLinkNodesAsync+0x4c (FPO: [Non-Fpo]) (CONV: stdcall) [d:\\srv03rtm\\base\\busdrv\\acpi\\driver\\nt\\irqarb.c @ 4900]
04 f791acb0 f740a674 899b3394 00000000 00000000 ACPI!DisableLinkNodesAsyncWorker+0x13e (FPO: [Non-Fpo]) (CONV: cdecl) [d:\\srv03rtm\\base\\busdrv\\acpi\\driver\\nt\\irqarb.c @ 5048]
05 f791acd8 f741f89b 899b3510 00000000 00000000 ACPI!DisableLinkNodesAsyncWorker+0x162 (FPO: [Non-Fpo]) (CONV: cdecl) [d:\\srv03rtm\\base\\busdrv\\acpi\\driver\\nt\\irqarb.c @ 5074]
06 f791ad10 f741d905 f740a512 00000000 f743a934 ACPI!AsyncCallBack+0xe7 (FPO: [Non-Fpo]) (CONV: cdecl) [d:\\srv03rtm\\base\\busdrv\\acpi\\driver\\amlinew\\sync.c @ 81]
07 f791ad34 f742042d 00000000 f7433d3c f743a928 ACPI!RunContext+0x1f5 (FPO: [Non-Fpo]) (CONV: cdecl) [d:\\srv03rtm\\base\\busdrv\\acpi\\driver\\amlinew\\ctxt.c @ 649]
08 f791ad4c f74204ec f743a950 f743b318 f743a9b8 ACPI!DispatchCtxtQueue+0xaf (FPO: [Non-Fpo]) (CONV: cdecl) [d:\\srv03rtm\\base\\busdrv\\acpi\\driver\\amlinew\\sched.c @ 150]
09 f791ad64 f74133c5 f743a928 00000000 89981ca0 ACPI!StartTimeSlicePassive+0x57 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\\srv03rtm\\base\\busdrv\\acpi\\driver\\amlinew\\sched.c @ 107]
0a f791adac 80d391f0 00000000 00000000 00000000 ACPI!ACPIWorker+0xbf (FPO: [Non-Fpo]) (CONV: stdcall) [d:\\srv03rtm\\base\\busdrv\\acpi\\driver\\nt\\worker.c @ 302]
0b f791addc 80b00d52 f7413306 00000000 00000000 nt!PspSystemThreadStartup+0x2e (FPO: [Non-Fpo]) (CONV: stdcall) [d:\\srv03rtm\\base\\ntos\\ps\\create.c @ 2213]
0c 00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16 [d:\\srv03rtm\\base\\ntos\\ke\\i386\\threadbg.asm @ 81]
windbg> .open -a fffffffff740a674
1: kd> db 899b3510
899b3510  cc 34 9b 89 7c 35 9b 89-94 33 9b 89 00 00 00 00  .4..|5…3……
899b3520  5f 44 49 53 30 f3 9a 89-cc 34 9b 89 00 00 08 00  _DIS0….4……
899b3530  00 00 00 00 00 00 00 00-1c 00 00 00 54 35 9b 89  …………T5..
899b3540  00 00 00 00 00 00 00 00-48 4d 45 54 28 00 00 00  ……..HMET(…
899b3550  00 f0 9a 89 00 00 00 00-00 00 00 00 00 00 00 00  …………….
899b3560  00 00 00 00 00 7d 50 49-52 43 0a 80 50 49 52 43  …..}PIRC..PIRC
899b3570  48 4e 53 4f 44 00 00 00-00 f0 9a 89 10 35 9b 89  HNSOD……..5..
899b3580  00 36 9b 89 94 33 9b 89-00 00 00 00 5f 43 52 53  .6…3……_CRS
1: kd> dt nsobj 899b3510
ACPI!NSOBJ
   +0x000 list             : _List
   +0x008 pnsParent        : 0x899b3394 _NSObj
   +0x00c pnsFirstChild    : (null)
   +0x010 dwNameSeg        : 0x5349445f
   +0x014 hOwner           : 0x899af330 Void
   +0x018 pnsOwnedNext     : 0x899b34cc _NSObj
   +0x01c ObjData          : _ObjData
   +0x030 Context          : (null)
   +0x034 dwRefCount       : 0
1: kd> db 0x899b3394
899b3394  34 30 9b 89 f4 36 9b 89-78 22 9b 89 d8 33 9b 89  40…6..x"…3..
899b33a4  4c 4e 4b 43 30 f3 9a 89-20 33 9b 89 00 00 06 00  LNKC0… 3……
899b33b4  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  …………….
899b33c4  50 2a 98 89 00 00 00 00-48 4e 53 4f 44 00 00 00  P*……HNSOD…
899b33d4  00 f0 9a 89 80 36 9b 89-1c 34 9b 89 94 33 9b 89  …..6…4…3..
899b33e4  00 00 00 00 5f 48 49 44-30 f3 9a 89 94 33 9b 89  …._HID0….3..
899b33f4  00 00 01 00 00 00 00 00-41 d0 0c 0f 00 00 00 00  ……..A…….
899b3404  00 00 00 00 00 00 00 00-00 00 00 00 48 4e 53 4f  …………HNSO
1: kd> db 899b3738
899b3738  e0 39 9b 89 7c 37 9b 89-f4 36 9b 89 00 00 00 00  .9..|7…6……
899b3748  5f 48 49 44 30 f3 9a 89-f4 36 9b 89 00 00 01 00  _HID0….6……
899b3758  00 00 00 00 41 d0 0c 0f-00 00 00 00 00 00 00 00  ….A………..
899b3768  00 00 00 00 00 00 00 00-48 4e 53 4f 44 00 00 00  ……..HNSOD…
899b3778  00 f0 9a 89 38 37 9b 89-d4 37 9b 89 f4 36 9b 89  ….87…7…6..
899b3788  00 00 00 00 5f 55 49 44-30 f3 9a 89 38 37 9b 89  …._UID0…87..
899b3798  00 00 01 00 00 00 00 00-04 00 00 00 00 00 00 00  …………….
899b37a8  00 00 00 00 00 00 00 00-00 00 00 00 48 42 55 46  …………HBUF
1: kd> dt nsobj 899b3738
ACPI!NSOBJ
   +0x000 list             : _List
   +0x008 pnsParent        : 0x899b36f4 _NSObj
   +0x00c pnsFirstChild    : (null)
   +0x010 dwNameSeg        : 0x4449485f
   +0x014 hOwner           : 0x899af330 Void
   +0x018 pnsOwnedNext     : 0x899b36f4 _NSObj
   +0x01c ObjData          : _ObjData
   +0x030 Context          : (null)
   +0x034 dwRefCount       : 0
1: kd> db 0x899b36f4
899b36f4  94 33 9b 89 b0 3a 9b 89-78 22 9b 89 38 37 9b 89  .3…:..x"..87..
899b3704  4c 4e 4b 44 30 f3 9a 89-80 36 9b 89 00 00 06 00  LNKD0….6……

• 设备关闭或禁用时:当操作系统决定禁用某个设备(例如,在设备不再使用时)时,通常会调用 _DIS 来关闭设备并停止它的资源解码。
• 设备电源管理:当设备需要进入省电状态(如 D3 电源状态)时,操作系统会调用 _DIS 禁用设备。
• 驱动程序卸载时:当驱动程序卸载或设备被移除时,操作系统会调用 _DIS 方法来禁用设备。

第三部分:

NTSTATUS
EXPORT
DisableLinkNodesAsyncWorker(
    IN PNSOBJ               AcpiObject,
    IN NTSTATUS             Status,
    IN POBJDATA             Result,
    IN PVOID                Context
    )
{

            switch (NSGETOBJTYPE(sib)) {
            case OBJTYPE_DEVICE:

                //
                // This name child of Root is also a device.
                // Recurse.
                //

                status = DisableLinkNodesAsync(sib,
                                               DisableLinkNodesAsyncWorker,
                                               (PVOID)context);

第四部分:

typedef struct {
    DISABLE_LINK_NODES_STATE State;
    PNSOBJ  RootDevice;
    PUCHAR  Hid;
    PNSOBJ  Dis;
    PNSOBJ  Sibling;
    PNSOBJ  NextSibling;
    LONG    RunCompletionHandler;
    PFNACB  CompletionHandler;
    PVOID   CompletionContext;
} DISABLE_LINK_NODES_CONTEXT, *PDISABLE_LINK_NODES_CONTEXT;

NTSTATUS
DisableLinkNodesAsync(
    IN PNSOBJ    Root,
    IN PFNACB    CompletionHandler,
    IN PVOID     CompletionContext
    )
{
    PDISABLE_LINK_NODES_CONTEXT context;
    NTSTATUS status;

    context = ExAllocatePoolWithTag(NonPagedPool,
                                    sizeof(DISABLE_LINK_NODES_CONTEXT),
                                    ACPI_ARBITER_POOLTAG);

    if (!context) {
        return STATUS_INSUFFICIENT_RESOURCES;
    }

    RtlZeroMemory(context, sizeof(DISABLE_LINK_NODES_CONTEXT));

    context->State = DisableStateInitial;
    context->RootDevice = Root;
    context->CompletionHandler = CompletionHandler;
    context->CompletionContext = CompletionContext;
    context->RunCompletionHandler = INITIAL_RUN_COMPLETION;

    return DisableLinkNodesAsyncWorker(Root,
                                       STATUS_SUCCESS,
                                       NULL,
                                       (PVOID)context
                                       );
}

第五部分:

NTSTATUS
EXPORT
DisableLinkNodesAsyncWorker(
    IN PNSOBJ               AcpiObject,
    IN NTSTATUS             Status,
    IN POBJDATA             Result,
    IN PVOID                Context
    )
{

DisableLinkNodeStartState:

    switch (context->State) {
    case DisableStateInitial:

        //
        // Get the _HID of this device to see if
        // it is a link node.
        //

        context->State = DisableStateGotHid;
        status = ACPIGetNSPnpIDAsync(
            context->RootDevice,
            DisableLinkNodesAsyncWorker,
            context,
            &context->Hid,
            NULL);

第六部分:

                    Method (_DIS, 0, NotSerialized)  // _DIS: Disable Device
                    {
                        Or (PIRC, 0x80, PIRC)
                    }

                OperationRegion (PIRX, PCI_Config, 0x60, 0x04)
                Field (PIRX, DWordAcc, NoLock, Preserve)
                {
                    AccessAs (ByteAcc, 0x00),
                    PIRA,   8,
                    PIRB,   8,
                    PIRC,   8,
                    PIRD,   8
                }

第八部分:

            Device (ISA)
            {
                Name (_ADR, 0x00070000)  // _ADR: Address

                Device (LNKD)
                {
                    Name (_HID, EisaId ("PNP0C0F"))  // _HID: Hardware ID
                    Name (_UID, 0x04)  // _UID: Unique ID
                    Name (_PRS, ResourceTemplate ()  // _PRS: Possible Resource Settings
                    {
                        IRQ (Level, ActiveLow, Shared, )
                            {3,4,5,6,7,9,10,11,14,15}
                    })

                OperationRegion (PIRX, PCI_Config, 0x60, 0x04)
                Field (PIRX, DWordAcc, NoLock, Preserve)
                {
                    AccessAs (ByteAcc, 0x00),
                    PIRA,   8,
                    PIRB,   8,
                    PIRC,   8,
                    PIRD,   8
                }
            }

1: kd> g
Breakpoint 51 hit
eax=00000000 ebx=899117e0 ecx=00000100 edx=899b3ab0 esi=00000000 edi=00000000
eip=804f25ee esp=f791abdc ebp=f791ac48 iopl=0         nv up ei pl zr na pe nc
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00000246
hal!HalGetBusDataByOffset:
804f25ee 55              push    ebp
1: kd> dv
    BusDataType = PCIConfiguration (0n4)
      BusNumber = 0
     SlotNumber = 7                                0x70000
         Buffer = 0x897d7eac
         Offset = 0x63                               PIRD,   8         
         Length = 1
            bus = struct _BUS_HANDLER
1: kd> gu
eax=00000001 ebx=899117e0 ecx=00000000 edx=00000cf8 esi=00000000 edi=00000000
eip=f740d8c7 esp=f791abf8 ebp=f791ac48 iopl=0         nv up ei pl nz na po nc
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00000202
ACPI!PciConfigSpaceHandlerWorker+0x29b:
f740d8c7 8bf0            mov     esi,eax
1: kd> db 0x897d7eac
897d7eac  07 00 00 00 03 00 00 00-00 00 00 00 08 00 00 00  …………….
897d7ebc  01 00 00 00 41 43 46 55-18 00 00 00 03 00 01 00  ….ACFU……..
897d7ecc  71 9b 41 f7 20 3c 9b 89-fc 60 7d 89 54 45 52 4d  q.A. <…`}.TERM
897d7edc  34 00 00 00 01 00 00 00-34 7a 42 f7 c5 38 9b 89  4…….4zB..8..
897d7eec  00 00 00 00 d0 38 9b 89-70 94 43 f7 00 00 00 00  …..8..p.C…..
897d7efc  01 00 00 00 03 00 00 00-fc 60 7d 89 40 60 7d 89  ………`}.@`}.
897d7f0c  53 43 4f 50 28 00 00 00-01 00 00 00 fd 74 42 f7  SCOP(……..tB.
897d7f1c  d0 38 9b 89 00 00 00 00-70 38 9b 89 e0 60 7d 89  .8……p8…`}.
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

第九部分:

                    Method (_DIS, 0, NotSerialized)  // _DIS: Disable Device
                    {
                        Or (PIRD, 0x80, PIRD)        0x7|0x80=0x87        放到0x63位置处
                    }

1: kd> g
Breakpoint 47 hit
eax=00000000 ebx=89922590 ecx=00000001 edx=0000009d esi=00000000 edi=00000000
eip=804f2676 esp=f791abdc ebp=f791ac48 iopl=0         nv up ei pl zr na pe nc
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00000246
hal!HalSetBusDataByOffset:
804f2676 55              push    ebp
1: kd> dv
    BusDataType = PCIConfiguration (0n4)
      BusNumber = 0
     SlotNumber = 7
         Buffer = 0x897d7e44
         Offset = 0x63
         Length = 1

            bus = struct _BUS_HANDLER
1: kd> db 0x897d7e44
897d7e44  87 00 00 00 ff 00 00 00-00 00 00 00 00 00 00 00  …………….
897d7e54  41 43 46 4f 48 00 00 00-02 00 00 00 de 92 41 f7  ACFOH………A.
897d7e64  20 3c 9b 89 48 60 7d 89-49 60 7d 89 01 00 00 00   <..H`}.I`}…..
897d7e74  01 00 00 00 ff 00 00 00-08 00 00 00 00 00 00 00  …………….
897d7e84  00 00 00 00 87 00 00 00-03 00 00 00 00 00 00 00  …………….
897d7e94  08 00 00 00 01 00 00 00-57 52 46 4c 24 00 00 00  ……..WRFL$…
897d7ea4  00 00 00 00 9a 94 41 f7-20 3c 9b 89 48 3c 9b 89  ……A. <..H<..
897d7eb4  49 60 7d 89 00 00 00 00-01 00 00 00 41 43 46 55  I`}………ACFU
1: kd> kc
 #
00 hal!HalSetBusDataByOffset
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

赞(0)
未经允许不得转载:171主机测评 » ACPI!DisableLinkNodesAsyncWorker函数分析和节点的_DIS方法有关
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址