Fixed PCI config base address error
This commit is contained in:
parent
65312af6dc
commit
9930a45163
2
Makefile
2
Makefile
|
@ -272,7 +272,7 @@ all :
|
||||||
|
|
||||||
test: all installonimage
|
test: all installonimage
|
||||||
@qemu-system-x86_64 -vga std -enable-kvm -machine type=q35 -soundhw pcspk -cpu host -s \
|
@qemu-system-x86_64 -vga std -enable-kvm -machine type=q35 -soundhw pcspk -cpu host -s \
|
||||||
-rtc base=localtime -m $(ram) -hda $(installdisk) \
|
-rtc base=localtime -m $(ram) -hda $(installdisk) -net nic,model=rtl8139 \
|
||||||
-d cpu_reset,guest_errors,pcall,int 2> $(BUILDDIR)/qemu.log &
|
-d cpu_reset,guest_errors,pcall,int 2> $(BUILDDIR)/qemu.log &
|
||||||
|
|
||||||
run: test
|
run: test
|
||||||
|
|
|
@ -196,7 +196,7 @@ struct FADT_t
|
||||||
|
|
||||||
//----------------------------------------------------------------------------//
|
//----------------------------------------------------------------------------//
|
||||||
|
|
||||||
struct SDT_MCFG_t {
|
struct MCFG_t {
|
||||||
char signature[4];
|
char signature[4];
|
||||||
uint length;
|
uint length;
|
||||||
uchar revision;
|
uchar revision;
|
||||||
|
@ -209,7 +209,7 @@ struct SDT_MCFG_t {
|
||||||
ulong reserved;
|
ulong reserved;
|
||||||
|
|
||||||
void* pciConfigBaseAddress;
|
void* pciConfigBaseAddress;
|
||||||
};
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
//----------------------------------------------------------------------------//
|
//----------------------------------------------------------------------------//
|
||||||
|
|
||||||
|
|
|
@ -44,25 +44,13 @@ static inline void* pciGetConfigAddr(uchar bus, uchar device, uchar function, us
|
||||||
KernLog("pciGetConfigAddr(): bad register offset\n");
|
KernLog("pciGetConfigAddr(): bad register offset\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
ulong addr = bus*32*8*4096 + device*8*4096 + function*4096 + offset + (ulong)pciConfigBaseAddress;
|
|
||||||
// DEBUG
|
return (void*)(bus*32*8*4096 + device*8*4096 + function*4096 + offset + (ulong)pciConfigBaseAddress);
|
||||||
KernLog("bus: %u\n", bus);
|
|
||||||
KernLog("device: %u\n", device);
|
|
||||||
KernLog("function: %u\n", function);
|
|
||||||
KernLog("offset: %u\n", offset);
|
|
||||||
KernLog("ADDR: %lx\n", addr);
|
|
||||||
KernLog("ADDR: %p\n", (void*)addr);
|
|
||||||
return (void*)addr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uchar pciReadConfigByte(uchar bus, uchar device, uchar function, ushort offset)
|
uchar pciReadConfigByte(uchar bus, uchar device, uchar function, ushort offset)
|
||||||
{
|
{
|
||||||
uchar *ptr = (uchar*)(pciGetConfigAddr(bus, device, function, offset));
|
return *((uchar*)(pciGetConfigAddr(bus, device, function, offset)));
|
||||||
KernLog("ADDR_uchar*: %p\n", ptr);
|
|
||||||
uchar value = *ptr;
|
|
||||||
//KernLog("VALUE: %u\n\n", value);
|
|
||||||
|
|
||||||
return *ptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ushort pciReadConfigWord(uchar bus, uchar device, uchar function, ushort offset)
|
ushort pciReadConfigWord(uchar bus, uchar device, uchar function, ushort offset)
|
||||||
|
@ -81,34 +69,28 @@ void pciScanAll()
|
||||||
KernLog("Unable to access PCI configuration : MCFG table not reachable\n");
|
KernLog("Unable to access PCI configuration : MCFG table not reachable\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//KernLog("%x", pciReadConfigByte(0, 0, 0, 0));
|
|
||||||
uchar byte = pciReadConfigByte(0, 0, 0, 0);
|
for(uchar bus = 0; bus < 255; bus++) {
|
||||||
|
|
||||||
/*
|
|
||||||
for(uchar bus = 0; bus < 256; bus++) {
|
|
||||||
for(uchar device = 0; device < 32; device++) {
|
for(uchar device = 0; device < 32; device++) {
|
||||||
for(uchar function = 0; function < 8; function++) {
|
for(uchar function = 0; function < 8; function++) {
|
||||||
ushort vendor = pciReadWord(bus, device, function, PCI_REG_VENDOR);
|
ushort vendor = pciReadConfigWord(bus, device, function, PCI_REG_VENDOR);
|
||||||
if(vendor == 0xffff) continue;
|
if(vendor == 0xffff) continue;
|
||||||
KernLog("PCI device found ! vendor: %x, device: %x\n", vendor, pciReadWord(bus, device, function, PCI_REG_DEVICE));
|
DebugLog("PCI device found ! vendor: %x, device: %x\n", vendor, pciReadConfigWord(bus, device, function, PCI_REG_DEVICE));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void IoInitPCI()
|
void IoInitPCI()
|
||||||
{
|
{
|
||||||
struct SDT_MCFG_t *MCFG_table = (struct SDT_MCFG_t*)IoGetAcpiTable(SDT_MCFG);
|
struct MCFG_t *MCFG_table = (struct MCFG_t*)IoGetAcpiTable(SDT_MCFG);
|
||||||
if(MCFG_table == NULL) {
|
if(MCFG_table == NULL) {
|
||||||
KernLog("Unable to access PCI configuration : MCFG table not reachable\n");
|
KernLog("Unable to access PCI configuration : MCFG table not reachable\n");
|
||||||
}
|
}
|
||||||
pciConfigBaseAddress = MCFG_table->pciConfigBaseAddress;
|
pciConfigBaseAddress = MCFG_table->pciConfigBaseAddress;
|
||||||
DebugLog("PCI Config Base address = 0x%p\n", pciConfigBaseAddress);
|
DebugLog("PCI Config Base address = 0x%p\n", pciConfigBaseAddress);
|
||||||
|
|
||||||
// 0x ff00 0000 0000 0000
|
|
||||||
MmMapPage(pciConfigBaseAddress, pciConfigBaseAddress + 256*1024*1024, PRESENT | READWRITE);
|
|
||||||
|
|
||||||
pciScanAll();
|
pciScanAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue