ACPI!AcpiInitIrqArbiter函数分析遍历总线检测PCI设备类型是否是PCI_CARDBUS_BRIDGE_TYPE--遍历总线模板程序

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;

相关推荐
sitelist17 小时前
ACPI!AcpiInitIrqArbiter函数分析中的HalPciInterfaceReadConfig
halpciinterface·initirqarbiter