Autor Thema: [PCI] Interrupts ändern  (Gelesen 8215 mal)

Ch40zz

  • Beiträge: 12
    • Profil anzeigen
Gespeichert
« am: 03. March 2016, 23:45 »
Hey Leute :D
Ich hab da mal wieder ein Problem :(
Da nun mehr als 2 devices von meinem OS unterstützt werden, hab ich mir gedacht, dass ich mal eine Netzwerkkarte ausprobiere.
Nun benutze ich die PCnet Fast III.

Das Problem:
Die Netzwerkkarte hat den selben IRQ wie die Soundkarte vom BIOS bekommen, soweit so gut.
Nun hab ich versucht diese IRQ zu ändern, nach dem schreiben lese ich das Register nochmal aus, um sicher zu gehen, dass es auch wirklich geändert wurde - was es auch tut.
Dennoch spammen die Karten weiterhin die alte IRQ als ob nichts geändert wurde.
Muss ich das Ändern der IRQ noch noch irgendwie dem PIC mitteilen?

Hier ein wenig code:
uint32_t data = pci_read_dword(pci_info.bus, pci_info.slot, pci_info.function, 60) & 0xFFFFFF00;
pci_write_dword(pci_info.bus, pci_info.slot, pci_info.function, 60, data | new_irq);
pci_info.irq = pci_read_word(pci_info.bus, pci_info.slot, pci_info.function, 60) & 0x00FF;

Danach hab ich IRQ Sharing versucht, es läuft in QEMU auch ganz gut, aber in VirtualBox ist das Bit einfach nie gesetzt und der handler returned direkt:
uint32_t dev_status = pci_read_word(pcnet_device.bus, pcnet_device.slot, pcnet_device.function, 6);
if(!(dev_status & 8))
return false;

Das 10. Bit wurde natürlich auch gecleared:
pci_write_word(pci_info->bus, pci_info->slot, pci_info->function, 4, 0x5);
Vielen Dank im Vorraus!
« Letzte Änderung: 04. March 2016, 02:59 von Ch40zz »

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 04. March 2016, 11:02 »
Der PCI-Configspace hilft dir da leider nicht weiter. Wenn ich es noch richtig weiß, wird das IRQ-Feld da nur beim Start vom BIOS reingeschrieben, damit das OS die Information hat. Wenn du das überschreibst, änderst du also nur die Information für dich und nicht wirklich die Konfiguration des Geräts.

Ich habe selber noch nie die Interruptnummern umkonfiguriert, aber du wirst auf jeden Fall den APIC dafür brauchen, der PIC kann das meines Wissens nicht.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Ch40zz

  • Beiträge: 12
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 04. March 2016, 11:13 »
Danke für die Antwort :)
Eigentlich hatte ich nicht vor das ganze AML zeugs jetzt schon zu verwenden :D
Was ich nicht verstehe ist, warum im Status Register der jeweiligen PCI Karte der Status in Virtualbox nicht gesetzt wird :(
Geht das denn nur wenn auch min. 2 Geräte die gleiche IRQ haben und vorher nicht? o.o

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 04. March 2016, 14:05 »
Eigentlich hatte ich nicht vor das ganze AML zeugs jetzt schon zu verwenden :D
APIC != ACPI ;)

Letzteres kann man wohl auch irgendwie benutzen, aber der APIC sollte genug können, um die Zuordnung zu machen. Im Netz habe ich auf die Schnelle das hier gefunden, vielleicht ist es nützlich: http://people.freebsd.org/~jhb/papers/bsdcan/2007/article/node5.html

Zitat
Was ich nicht verstehe ist, warum im Status Register der jeweiligen PCI Karte der Status in Virtualbox nicht gesetzt wird :(
Geht das denn nur wenn auch min. 2 Geräte die gleiche IRQ haben und vorher nicht? o.o
Entweder du machst was falsch oder VirtualBox ist buggy. Bei einem Feature, das wahrscheinlich nicht besonders oft benutzt wird, würde ich das nicht ausschließen, dass es nicht oder nicht richtig emuliert wird.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Ch40zz

  • Beiträge: 12
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 04. March 2016, 15:28 »
Hm danke :)
Ich glaub ich poste mal im Virtualbox Forum, da das ganze auf QEMU ja geht.
Und viel falsch machen beim Lesen kann man ja nicht xD (Grade weil der Rest ja perfekt funktioniert)
Mal sehen was die dazu meinen :P
Ich melde mich hier wieder, wenn ich eine Antwort bekommen habe

EDIT: Anscheinend wird das Status Register von Nichts und Niemandem benutzt...
Hab jetzt in den Interrupts einfach Device spezifischen Code der überprüft ob an den jeweiligen IO-Ports die IRQ Flags gesetzt sind.
« Letzte Änderung: 08. March 2016, 03:02 von Ch40zz »

 

Einloggen