ACPI!AcpiInitIrqArbiter函数分析遍历总线检测PCI设备类型是否是PCI_CARDBUS_BRIDGE_TYPE--遍历总线模板程序
第一部分:
if (PCI_CONFIGURATION_TYPE(pciData) == PCI_CARDBUS_BRIDGE_TYPE) {
AcpiArbCardbusPresent = TRUE;
}
//
// Bit encodings for PCI_COMMON_CONFIG.HeaderType
//
#define PCI_MULTIFUNCTION 0x80
#define PCI_DEVICE_TYPE 0x00
#define PCI_BRIDGE_TYPE 0x01
#define PCI_CARDBUS_BRIDGE_TYPE 0x02
#define PCI_CONFIGURATION_TYPE(PciData) \
(((PPCI_COMMON_CONFIG)(PciData))->HeaderType & ~PCI_MULTIFUNCTION)
第二部分:
0: kd> kc
00 hal!HaliPciInterfaceReadConfig
01 ACPI!AcpiInitIrqArbiter
02 ACPI!ACPIInitStartACPI
03 ACPI!ACPIRootIrpStartDevice
04 ACPI!ACPIDispatchIrp
05 nt!IofCallDriver
06 nt!IopSynchronousCall
07 nt!IopStartDevice
08 nt!PipProcessStartPhase1
09 nt!PipProcessDevNodeTree
0a nt!PipDeviceActionWorker
0b nt!PipRequestDeviceAction
0c nt!IopInitializeBootDrivers
0d nt!IoInitSystem
0e nt!Phase1Initialization
0f nt!PspSystemThreadStartup
10 nt!KiThreadStartup
0: kd> dv
Context = 0x00000000
BusOffset = 0x00 ''
Slot = 0x36
Buffer = 0xf789a204
Offset = 0
Length = 0x40
busHand = struct _BUS_HANDLER
1: kd> g
Breakpoint 92 hit
eax=00000040 ebx=00000016 ecx=00000000 edx=00000cf8 esi=00000001 edi=00000000
eip=f744760d esp=f789a1c4 ebp=f789a248 iopl=0 nv up ei ng nz ac po cy
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000293
ACPI!AcpiInitIrqArbiter+0x297:
f744760d 66817dbcffff cmp word ptr [ebp-44h],0FFFFh ss:0010:f789a204=15ad
0: kd> dv
RootFdo = 0x0b000009
context = struct AMLISUPP_CONTEXT_PASSIVE
buffer = unsigned char [64] "???"
adjVector = 0xb000009
driverKeyHandle = 0x00000000
deviceNum = 0x16
lastBus = 0x0b ''
driverKey = ""
currentBus = 0x00 ''
pciSlot = struct _PCI_SLOT_NUMBER
regValue = 0x00000000
foundBootConfig = 0x01 ''
noBootConfigAgreement = 0x01 ''
flags = 0x36 '6'
0: kd> dt PCI_COMMON_CONFIG 0xf789a204 -r
hal!PCI_COMMON_CONFIG
+0x000 VendorID : 0x15ad
+0x002 DeviceID : 0x7a0
+0x004 Command : 7
+0x006 Status : 0x10
+0x008 RevisionID : 0x1 ''
+0x009 ProgIf : 0 ''
+0x00a SubClass : 0x4 ''
+0x00b BaseClass : 0x6 ''
+0x00c CacheLineSize : 0x8 ''
+0x00d LatencyTimer : 0 ''
+0x00e HeaderType : 0x81 ''
+0x00f BIST : 0 ''
+0x010 u : __unnamed
+0x000 type0 : _PCI_HEADER_TYPE_0
+0x000 BaseAddresses : [6] 0
+0x018 CIS : 0
+0x01c SubVendorID : 0
+0x01e SubSystemID : 0
+0x020 ROMBaseAddress : 0
+0x024 CapabilitiesPtr : 0x40 '@'
+0x025 Reserved1 : [3] ""
+0x028 Reserved2 : 0
+0x02c InterruptLine : 0xff ''
+0x02d InterruptPin : 0 ''
+0x02e MinimumGrant : 0x4 ''
+0x02f MaximumLatency : 0 ''
+0x000 type1 : _PCI_HEADER_TYPE_1
+0x000 BaseAddresses : [2] 0
+0x008 PrimaryBus : 0 ''
+0x009 SecondaryBus : 0xc ''
+0x00a SubordinateBus : 0xc ''
+0x00b SecondaryLatency : 0 ''
+0x00c IOBase : 0x90 ''
+0x00d IOLimit : 0x90 ''
+0x00e SecondaryStatus : 0
+0x010 MemoryBase : 0xfcf0
+0x012 MemoryLimit : 0xfcf0
+0x014 PrefetchBase : 0xe751
+0x016 PrefetchLimit : 0xe751
+0x018 PrefetchBaseUpper32 : 0
+0x01c PrefetchLimitUpper32 : 0
+0x020 IOBaseUpper16 : 0
+0x022 IOLimitUpper16 : 0
+0x024 CapabilitiesPtr : 0x40 '@'
+0x025 Reserved1 : [3] ""
+0x028 ROMBaseAddress : 0
+0x02c InterruptLine : 0xff ''
+0x02d InterruptPin : 0 ''
+0x02e BridgeControl : 4
1: kd> g
Breakpoint 91 hit
eax=804fb6c4 ebx=00000016 ecx=00000000 edx=00000c0c esi=00000002 edi=00000000
eip=804f2824 esp=f789a1a8 ebp=f789a248 iopl=0 nv up ei pl nz na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000206
hal!HaliPciInterfaceReadConfig:
804f2824 55 push ebp
0: kd> dv
Context = 0x00000000
BusOffset = 0x00 ''
Slot = 0x56
Buffer = 0xf789a204
Offset = 0
Length = 0x40
busHand = struct _BUS_HANDLER
0: kd> gu
Breakpoint 92 hit
eax=00000040 ebx=00000016 ecx=00000000 edx=00000cf8 esi=00000002 edi=00000000
eip=f744760d esp=f789a1c4 ebp=f789a248 iopl=0 nv up ei ng nz ac po cy
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000293
ACPI!AcpiInitIrqArbiter+0x297:
f744760d 66817dbcffff cmp word ptr [ebp-44h],0FFFFh ss:0010:f789a204=15ad
0: kd> dt PCI_COMMON_CONFIG 0xf789a204 -r
hal!PCI_COMMON_CONFIG
+0x000 VendorID : 0x15ad
+0x002 DeviceID : 0x7a0
+0x004 Command : 7
+0x006 Status : 0x10
+0x008 RevisionID : 0x1 ''
+0x009 ProgIf : 0 ''
+0x00a SubClass : 0x4 ''
+0x00b BaseClass : 0x6 ''
+0x00c CacheLineSize : 0x8 ''
+0x00d LatencyTimer : 0 ''
+0x00e HeaderType : 0x81 ''
+0x00f BIST : 0 ''
+0x010 u : __unnamed
+0x000 type0 : _PCI_HEADER_TYPE_0
+0x000 BaseAddresses : [6] 0
+0x018 CIS : 0
+0x01c SubVendorID : 0
+0x01e SubSystemID : 0
+0x020 ROMBaseAddress : 0
+0x024 CapabilitiesPtr : 0x40 '@'
+0x025 Reserved1 : [3] ""
+0x028 Reserved2 : 0
+0x02c InterruptLine : 0xff ''
+0x02d InterruptPin : 0 ''
+0x02e MinimumGrant : 0x4 ''
+0x02f MaximumLatency : 0 ''
+0x000 type1 : _PCI_HEADER_TYPE_1
+0x000 BaseAddresses : [2] 0
+0x008 PrimaryBus : 0 ''
+0x009 SecondaryBus : 0xd ''
+0x00a SubordinateBus : 0xd ''
+0x00b SecondaryLatency : 0 ''
+0x00c IOBase : 0xd0 ''
+0x00d IOLimit : 0xd0 ''
+0x00e SecondaryStatus : 0
+0x010 MemoryBase : 0xfcb0
+0x012 MemoryLimit : 0xfcb0
+0x014 PrefetchBase : 0xe711
+0x016 PrefetchLimit : 0xe711
+0x018 PrefetchBaseUpper32 : 0
+0x01c PrefetchLimitUpper32 : 0
+0x020 IOBaseUpper16 : 0
+0x022 IOLimitUpper16 : 0
+0x024 CapabilitiesPtr : 0x40 '@'
+0x025 Reserved1 : [3] ""
+0x028 ROMBaseAddress : 0
+0x02c InterruptLine : 0xff ''
+0x02d InterruptPin : 0 ''
+0x02e BridgeControl : 4
0: kd> g
Breakpoint 91 hit
eax=804fb6c4 ebx=00000016 ecx=00000000 edx=00000c0d esi=00000003 edi=00000000
eip=804f2824 esp=f789a1a8 ebp=f789a248 iopl=0 nv up ei pl nz na po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000202
hal!HaliPciInterfaceReadConfig:
804f2824 55 push ebp
0: kd> dv
Context = 0x00000000
BusOffset = 0x00 ''
Slot = 0x76
Buffer = 0xf789a204
Offset = 0
Length = 0x40
busHand = struct _BUS_HANDLER
0: kd> g
Breakpoint 92 hit
eax=00000040 ebx=00000016 ecx=00000000 edx=00000cf8 esi=00000003 edi=00000000
eip=f744760d esp=f789a1c4 ebp=f789a248 iopl=0 nv up ei ng nz ac po cy
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000293
ACPI!AcpiInitIrqArbiter+0x297:
f744760d 66817dbcffff cmp word ptr [ebp-44h],0FFFFh ss:0010:f789a204=15ad
0: kd> dt PCI_COMMON_CONFIG 0xf789a204 -r
hal!PCI_COMMON_CONFIG
+0x000 VendorID : 0x15ad
+0x002 DeviceID : 0x7a0
+0x004 Command : 7
+0x006 Status : 0x10
+0x008 RevisionID : 0x1 ''
+0x009 ProgIf : 0 ''
+0x00a SubClass : 0x4 ''
+0x00b BaseClass : 0x6 ''
+0x00c CacheLineSize : 0x8 ''
+0x00d LatencyTimer : 0 ''
+0x00e HeaderType : 0x81 ''
+0x00f BIST : 0 ''
+0x010 u : __unnamed
+0x000 type0 : _PCI_HEADER_TYPE_0
+0x000 BaseAddresses : [6] 0
+0x018 CIS : 0
+0x01c SubVendorID : 0
+0x01e SubSystemID : 0
+0x020 ROMBaseAddress : 0
+0x024 CapabilitiesPtr : 0x40 '@'
+0x025 Reserved1 : [3] ""
+0x028 Reserved2 : 0
+0x02c InterruptLine : 0xff ''
+0x02d InterruptPin : 0 ''
+0x02e MinimumGrant : 0x4 ''
+0x02f MaximumLatency : 0 ''
+0x000 type1 : _PCI_HEADER_TYPE_1
+0x000 BaseAddresses : [2] 0
+0x008 PrimaryBus : 0 ''
+0x009 SecondaryBus : 0xe ''
+0x00a SubordinateBus : 0xe ''
+0x00b SecondaryLatency : 0 ''
+0x00c IOBase : 0xf0 ''
+0x00d IOLimit : 0 ''
+0x00e SecondaryStatus : 0
+0x010 MemoryBase : 0xfc70
+0x012 MemoryLimit : 0xfc70
+0x014 PrefetchBase : 0xe6d1
+0x016 PrefetchLimit : 0xe6d1
+0x018 PrefetchBaseUpper32 : 0
+0x01c PrefetchLimitUpper32 : 0
+0x020 IOBaseUpper16 : 0
+0x022 IOLimitUpper16 : 0
+0x024 CapabilitiesPtr : 0x40 '@'
+0x025 Reserved1 : [3] ""
+0x028 ROMBaseAddress : 0
+0x02c InterruptLine : 0xff ''
+0x02d InterruptPin : 0 ''
+0x02e BridgeControl : 4
} else {
//
// This is a bridge. Update lastBus with the Subordinate
// bus if it is higher.
//
lastBus = lastBus > pciData->u.type1.SubordinateBus ?
lastBus : pciData->u.type1.SubordinateBus;
if (PCI_CONFIGURATION_TYPE(pciData) == PCI_CARDBUS_BRIDGE_TYPE) {
AcpiArbCardbusPresent = TRUE;
}
//
// Bit encodings for PCI_COMMON_CONFIG.HeaderType
//
#define PCI_MULTIFUNCTION 0x80
#define PCI_DEVICE_TYPE 0x00
#define PCI_BRIDGE_TYPE 0x01
#define PCI_CARDBUS_BRIDGE_TYPE 0x02
#define PCI_CONFIGURATION_TYPE(PciData) \
(((PPCI_COMMON_CONFIG)(PciData))->HeaderType & ~PCI_MULTIFUNCTION)
for (deviceNum = 0; deviceNum < PCI_MAX_DEVICES; deviceNum++) {
for (funcNum = 0; funcNum < PCI_MAX_FUNCTION; funcNum++) {
0: kd> p
eax=00000001 ebx=00000016 ecx=0000000d edx=00000c0e esi=00000003 edi=00000000
eip=f7447764 esp=f789a1c4 ebp=f789a248 iopl=0 nv up ei ng nz na po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000282
ACPI!AcpiInitIrqArbiter+0x3ee:
f7447764 46 inc esi
0: kd> p
eax=00000001 ebx=00000016 ecx=0000000d edx=00000c0e esi=00000004 edi=00000000
eip=f7447765 esp=f789a1c4 ebp=f789a248 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!AcpiInitIrqArbiter+0x3ef:
f7447765 83fe08 cmp esi,8
0: kd> g
Breakpoint 91 hit
eax=804fb6c4 ebx=00000016 ecx=00000000 edx=00000c0e esi=00000004 edi=00000000
eip=804f2824 esp=f789a1a8 ebp=f789a248 iopl=0 nv up ei pl nz na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000206
hal!HaliPciInterfaceReadConfig:
804f2824 55 push ebp
0: kd> dv
Context = 0x00000000
BusOffset = 0x00 ''
Slot = 0x96
Buffer = 0xf789a204
Offset = 0
Length = 0x40
busHand = struct _BUS_HANDLER
100 10110 0x16 160004
现在:
funcNum=4
deviceNum=6
下一个1:
funcNum=5
deviceNum=6
101 10110=0xb6
下一个2:
funcNum=6
deviceNum=6
110 10110=0xd6
下一个3:
funcNum=7
deviceNum=6
111 10110=0xf6
0: kd> dt PCI_SLOT_NUMBER -r
hal!PCI_SLOT_NUMBER
+0x000 u : __unnamed
+0x000 bits : __unnamed
+0x000 DeviceNumber : Pos 0, 5 Bits
+0x000 FunctionNumber : Pos 5, 3 Bits
+0x000 Reserved : Pos 8, 24 Bits
+0x000 AsULONG : Uint4B
0: kd> g
Breakpoint 92 hit
eax=00000040 ebx=00000016 ecx=00000000 edx=00000cf8 esi=00000004 edi=00000000
eip=f744760d esp=f789a1c4 ebp=f789a248 iopl=0 nv up ei ng nz ac po cy
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000293
ACPI!AcpiInitIrqArbiter+0x297:
f744760d 66817dbcffff cmp word ptr [ebp-44h],0FFFFh ss:0010:f789a204=15ad
0: kd> dt PCI_COMMON_CONFIG 0xf789a204 -r
hal!PCI_COMMON_CONFIG
+0x000 VendorID : 0x15ad
+0x002 DeviceID : 0x7a0
+0x004 Command : 7
+0x006 Status : 0x10
+0x008 RevisionID : 0x1 ''
+0x009 ProgIf : 0 ''
+0x00a SubClass : 0x4 ''
+0x00b BaseClass : 0x6 ''
+0x00c CacheLineSize : 0x8 ''
+0x00d LatencyTimer : 0 ''
+0x00e HeaderType : 0x81 ''
+0x00f BIST : 0 ''
+0x010 u : __unnamed
+0x000 type0 : _PCI_HEADER_TYPE_0
+0x000 BaseAddresses : [6] 0
+0x018 CIS : 0
+0x01c SubVendorID : 0
+0x01e SubSystemID : 0
+0x020 ROMBaseAddress : 0
+0x024 CapabilitiesPtr : 0x40 '@'
+0x025 Reserved1 : [3] ""
+0x028 Reserved2 : 0
+0x02c InterruptLine : 0xff ''
+0x02d InterruptPin : 0 ''
+0x02e MinimumGrant : 0x4 ''
+0x02f MaximumLatency : 0 ''
+0x000 type1 : _PCI_HEADER_TYPE_1
+0x000 BaseAddresses : [2] 0
+0x008 PrimaryBus : 0 ''
+0x009 SecondaryBus : 0xf ''
+0x00a SubordinateBus : 0xf ''
+0x00b SecondaryLatency : 0 ''
+0x00c IOBase : 0xf0 ''
+0x00d IOLimit : 0 ''
+0x00e SecondaryStatus : 0
+0x010 MemoryBase : 0xfc30
+0x012 MemoryLimit : 0xfc30
+0x014 PrefetchBase : 0xe691
+0x016 PrefetchLimit : 0xe691
+0x018 PrefetchBaseUpper32 : 0
+0x01c PrefetchLimitUpper32 : 0
+0x020 IOBaseUpper16 : 0
+0x022 IOLimitUpper16 : 0
+0x024 CapabilitiesPtr : 0x40 '@'
+0x025 Reserved1 : [3] ""
+0x028 ROMBaseAddress : 0
+0x02c InterruptLine : 0xff ''
+0x02d InterruptPin : 0 ''
+0x02e BridgeControl : 4
第四部分:
0: kd> g
Breakpoint 91 hit
eax=804fb6c4 ebx=00000016 ecx=00000000 edx=00000c0f esi=00000005 edi=00000000
eip=804f2824 esp=f789a1a8 ebp=f789a248 iopl=0 nv up ei pl nz na po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000202
hal!HaliPciInterfaceReadConfig:
804f2824 55 push ebp
0: kd> dv
Context = 0x00000000
BusOffset = 0x00 ''
Slot = 0xb6
Buffer = 0xf789a204
Offset = 0
Length = 0x40
busHand = struct _BUS_HANDLER
第五部分:
91 e Disable Clear 804f2824 0001 (0001) hal!HaliPciInterfaceReadConfig
92 e Disable Clear f744760d 0001 (0001) ACPI!AcpiInitIrqArbiter+0x297
93 e Disable Clear f744774a 0001 (0001) ACPI!AcpiInitIrqArbiter+0x3d4
第六部分:遍历总线模板代码
pciData = (PPCI_COMMON_CONFIG)buffer;
lastBus = 0;
currentBus = 0;
foundBootConfig = FALSE;
noBootConfigAgreement = FALSE;
while (TRUE) {
pciSlot.u.AsULONG = 0;
for (deviceNum = 0; deviceNum < PCI_MAX_DEVICES; deviceNum++) {
for (funcNum = 0; funcNum < PCI_MAX_FUNCTION; funcNum++) {
pciSlot.u.bits.DeviceNumber = deviceNum;
pciSlot.u.bits.FunctionNumber = funcNum;
HalPciInterfaceReadConfig(NULL,
currentBus,
pciSlot.u.AsULONG,
pciData,
0,
PCI_COMMON_HDR_LENGTH);
if (pciData->VendorID != PCI_INVALID_VENDORID) {
第七部分:
D:\>grep "HalPciInterfaceReadConfig" -nr D:\srv03rtm\base\busdrv |grep -v "inary"
D:\srv03rtm\base\busdrv/acpi/driver/nt/irqarb.c:616: HalPciInterfaceReadConfig(NULL,
D:\srv03rtm\base\busdrv/acpi/driver/nt/irqarb.c:3566: HalPciInterfaceReadConfig(NULL,
D:\srv03rtm\base\busdrv/acpi/driver/nt/pciinterface.c:84: ASSERT(HalPciInterfaceReadConfig);
D:\srv03rtm\base\busdrv/acpi/driver/nt/pciinterface.c:159: pciInterface->ReadConfig = HalPciInterfaceReadConfig;