Bochs+VirtualBox connect all PCI devices to IRQ 11?
Posted: Mon Sep 28, 2015 4:34 pm
I have written the following function to detect PCI routing in my OS using ACPICA:
The Bochs debug log, while booting up, shows IRQ routing:
So we can see that INTA# and INTC# are connected to IRQ 11 and INTB# and INTD# are connected to IRQ 9. But my OS disagrees:
I get the same result in VirtualBox (all pins of all devices mapped to IRQ 11).
Is this some subtle bug I'm not noticing or does your OS show the same thing?
Thanks.
Code: Select all
static ACPI_STATUS pciWalkCallback(ACPI_HANDLE object, UINT32 nestingLevel, void *context, void **returnvalue)
{
ACPI_DEVICE_INFO *info;
ACPI_STATUS status = AcpiGetObjectInfo(object, &info);
if (status != AE_OK)
{
panic("AcpiGetObjectInfo failed");
};
if (info->Flags & ACPI_PCI_ROOT_BRIDGE)
{
foundRootBridge = 1;
ACPI_BUFFER prtbuf;
prtbuf.Length = ACPI_ALLOCATE_BUFFER;
prtbuf.Pointer = NULL;
status = AcpiGetIrqRoutingTable(object, &prtbuf);
if (status != AE_OK)
{
panic("AcpiGetIrqRoutingTable failed");
};
char *scan = (char*) prtbuf.Pointer;
while (1)
{
ACPI_PCI_ROUTING_TABLE *table = (ACPI_PCI_ROUTING_TABLE*) scan;
if (table->Length == 0)
{
break;
};
uint8_t slot = (uint8_t) (table->Address >> 16);
if (table->Source == 0)
{
// static assignment
pciMapInterruptFromGSI(0, slot, table->Pin+1, table->SourceIndex);
}
else
{
// get the PCI Link Object
ACPI_HANDLE linkObject;
status = AcpiGetHandle(object, table->Source, &linkObject);
if (status != AE_OK)
{
panic("AcpiGetHandle failed for '%s'", table->Source);
};
// get the IRQ it is using
ACPI_BUFFER resbuf;
resbuf.Length = ACPI_ALLOCATE_BUFFER;
resbuf.Pointer = NULL;
status = AcpiGetCurrentResources(linkObject, &resbuf);
if (status != AE_OK)
{
panic("AcpiGetCurrentResources failed for '%s'", table->Source);
};
char *rscan = (char*) resbuf.Pointer;
int devIRQ = -1;
while (1)
{
ACPI_RESOURCE *res = (ACPI_RESOURCE*) rscan;
if (res->Type == ACPI_RESOURCE_TYPE_END_TAG)
{
break;
};
if (res->Type == ACPI_RESOURCE_TYPE_IRQ)
{
devIRQ = res->Data.Irq.Interrupts[table->SourceIndex];
break;
};
rscan += res->Length;
};
kfree(resbuf.Pointer);
if (devIRQ == -1)
{
panic("failed to derive IRQ for device %d from '%s'", (int)slot, table->Source);
};
kprintf("DEVICE %d intpin INT%c# -> IRQ %d (from '%s')\n", (int) slot, 'A'+table->Pin, devIRQ, table->Source);
};
scan += table->Length;
};
kfree(prtbuf.Pointer);
panic("end of tables");
};
ACPI_FREE(info);
return AE_OK;
};
Code: Select all
00001032696i[P2ISA ] PCI IRQ routing: PIRQA# set to 0x0b
00001032715i[P2ISA ] PCI IRQ routing: PIRQB# set to 0x09
00001032734i[P2ISA ] PCI IRQ routing: PIRQC# set to 0x0b
00001032753i[P2ISA ] PCI IRQ routing: PIRQD# set to 0x09
Code: Select all
DEVICE 0 intpin INTA# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 0 intpin INTB# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 0 intpin INTC# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 0 intpin INTD# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 1 intpin INTA# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 1 intpin INTB# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 1 intpin INTC# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 1 intpin INTD# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 2 intpin INTA# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 2 intpin INTB# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 2 intpin INTC# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 2 intpin INTD# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 3 intpin INTA# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 3 intpin INTB# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 3 intpin INTC# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 3 intpin INTD# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 4 intpin INTA# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 4 intpin INTB# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 4 intpin INTC# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 4 intpin INTD# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 5 intpin INTA# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 5 intpin INTB# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 5 intpin INTC# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 5 intpin INTD# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 6 intpin INTA# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 6 intpin INTB# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 6 intpin INTC# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 6 intpin INTD# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 7 intpin INTA# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 7 intpin INTB# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 7 intpin INTC# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 7 intpin INTD# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 8 intpin INTA# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 8 intpin INTB# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 8 intpin INTC# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 8 intpin INTD# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 9 intpin INTA# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 9 intpin INTB# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 9 intpin INTC# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 9 intpin INTD# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 10 intpin INTA# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 10 intpin INTB# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 10 intpin INTC# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 10 intpin INTD# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 11 intpin INTA# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 11 intpin INTB# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 11 intpin INTC# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 11 intpin INTD# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 12 intpin INTA# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 12 intpin INTB# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 12 intpin INTC# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 12 intpin INTD# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 13 intpin INTA# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 13 intpin INTB# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 13 intpin INTC# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 13 intpin INTD# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 14 intpin INTA# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 14 intpin INTB# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 14 intpin INTC# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 14 intpin INTD# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 15 intpin INTA# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 15 intpin INTB# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 15 intpin INTC# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 15 intpin INTD# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 16 intpin INTA# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 16 intpin INTB# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 16 intpin INTC# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 16 intpin INTD# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 17 intpin INTA# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 17 intpin INTB# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 17 intpin INTC# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 17 intpin INTD# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 18 intpin INTA# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 18 intpin INTB# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 18 intpin INTC# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 18 intpin INTD# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 19 intpin INTA# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 19 intpin INTB# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 19 intpin INTC# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 19 intpin INTD# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 20 intpin INTA# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 20 intpin INTB# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 20 intpin INTC# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 20 intpin INTD# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 21 intpin INTA# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 21 intpin INTB# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 21 intpin INTC# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 21 intpin INTD# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 22 intpin INTA# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 22 intpin INTB# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 22 intpin INTC# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 22 intpin INTD# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 23 intpin INTA# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 23 intpin INTB# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 23 intpin INTC# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 23 intpin INTD# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 24 intpin INTA# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 24 intpin INTB# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 24 intpin INTC# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 24 intpin INTD# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 25 intpin INTA# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 25 intpin INTB# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 25 intpin INTC# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 25 intpin INTD# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 26 intpin INTA# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 26 intpin INTB# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 26 intpin INTC# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 26 intpin INTD# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 27 intpin INTA# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 27 intpin INTB# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 27 intpin INTC# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 27 intpin INTD# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 28 intpin INTA# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 28 intpin INTB# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 28 intpin INTC# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 28 intpin INTD# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 29 intpin INTA# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 29 intpin INTB# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 29 intpin INTC# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 29 intpin INTD# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 30 intpin INTA# -> IRQ 11 (from '\_SB_.LNKB')
DEVICE 30 intpin INTB# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 30 intpin INTC# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 30 intpin INTD# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 31 intpin INTA# -> IRQ 11 (from '\_SB_.LNKC')
DEVICE 31 intpin INTB# -> IRQ 11 (from '\_SB_.LNKD')
DEVICE 31 intpin INTC# -> IRQ 11 (from '\_SB_.LNKA')
DEVICE 31 intpin INTD# -> IRQ 11 (from '\_SB_.LNKB')
Is this some subtle bug I'm not noticing or does your OS show the same thing?
Thanks.