pci_configuration_space
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| pci_configuration_space [2026/02/28 15:22] – msvoelker | pci_configuration_space [2026/02/28 16:47] (current) – [VirtIO: DeviceCfg] msvoelker | ||
|---|---|---|---|
| Line 29: | Line 29: | ||
| </ | </ | ||
| - | Mit dem Parameter r kann pciconf den PCI Configuration Space direkt ausgeben. Der Parameter b gibt an, dass der Configuration Space Byteweise ausgelesen werden soll und 0x0:0x3f gibt den Bereich | + | ===== Standardisierter |
| - | < | + | In der einfachen Variante zeigt pciconf |
| - | % sudo pciconf | + | |
| - | f4 1a 00 10 17 00 10 00 00 00 00 02 00 00 00 00 | + | |
| - | 01 00 00 00 00 00 00 00 00 60 85 e1 00 00 00 00 | + | |
| - | 00 00 00 00 00 00 00 00 00 00 00 00 f4 1a 01 00 | + | |
| - | 00 00 00 00 40 00 00 00 00 00 00 00 0c 01 00 00 | + | |
| - | </ | + | |
| - | + | ||
| - | Der PCI Configuration Space enthält mehr, als pciconf bisher ausgegeben hat. Es nutzt das folgende Format. | + | |
| < | < | ||
| Line 77: | Line 69: | ||
| 60 |Interrupt Line | Interrupt Pin | Min Gnt. | 60 |Interrupt Line | Interrupt Pin | Min Gnt. | ||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
| + | </ | ||
| + | |||
| + | Mit dem Parameter r kann pciconf den PCI Configuration Space direkt ausgeben. Der Parameter b dahinter gibt an, dass der Configuration Space Byteweise ausgelesen werden soll und 0x0:0x3f gibt den Bereich an, der ausgelesen werden soll (also die kompletten ersten 64 Byte). | ||
| + | |||
| + | < | ||
| + | % sudo pciconf -rb virtio_pci0@pci0: | ||
| + | f4 1a 00 10 17 00 10 00 00 00 00 02 00 00 00 00 | ||
| + | 01 00 00 00 00 00 00 00 00 60 85 e1 00 00 00 00 | ||
| + | 00 00 00 00 00 00 00 00 00 00 00 00 f4 1a 01 00 | ||
| + | 00 00 00 00 40 00 00 00 00 00 00 00 0c 01 00 00 | ||
| </ | </ | ||
| Die Bytes sind in Little Endian. Die ersten zwei Bytes sind also 0x1af4, die die Vendor ID angeben. | Die Bytes sind in Little Endian. Die ersten zwei Bytes sind also 0x1af4, die die Vendor ID angeben. | ||
| - | Interessant sind die Base Address Registers (BARs), über die weitere Informationen zum PCI-Gerät angegeben werden können. Das BAR selbst ist hauptsächlich die Base Adress, das ist die Adresse unter der sich die BAR Region im Speicher befindet. Darin kodiert ist z. B. der Typ des BAR. Es gibt Memory (0) und I/O (1). | ||
| - | Bei dem PCI-Gerät gibt es zwei BARs. Hier Configuration Space von eben der Teil zu den BARs. | + | ===== Base Address Register (BAR) ===== |
| + | |||
| + | In einer Base Address Register (BAR) Region, kann das PCI-Gerät weitere Informationen schreiben und auch der Treiber kann darin schreiben, um z. B. Informationen zurück zu geben. Das BAR in dem standardisierten Bereich ist hauptsächlich die Base Address, das ist die Adresse unter der sich die BAR Region im Speicher befindet. Darin kodiert ist z. B. der Typ des BAR. Es gibt Memory (0) und I/O (1). | ||
| + | |||
| + | Bei dem PCI-Gerät gibt es zwei BARs. Hier der Abschnitt vom Configuration Space zu den BARs. | ||
| < | < | ||
| - | | BAR 1 | + | | BAR 1 |
| - | 01 00 00 00 00 00 00 00 00 60 85 e1 00 00 00 00 | + | 01 00 00 00 00 00 00 00 00 60 85 e1 00 00 00 00 |
| - | 00 00 00 00 00 00 00 00 | + | 00 00 00 00 00 00 00 00 |
| </ | </ | ||
| - | BAR 1 hat Typ 1 (I/O) und Base Address 0. BAR 2 hat Typ 0 (Memory) und Base Address 0xe1856000. Die BARs lassen sich mit pciconf | + | BAR 1 hat Typ 1 (I/O) und Base Address 0. BAR 2 hat Typ 0 (Memory) und Base Address 0xe1856000. Die BARs lassen sich mit pciconf |
| < | < | ||
| Line 100: | Line 105: | ||
| </ | </ | ||
| - | Die Zahl in eckigen Klammern gibt über ein Byte-Offset hexadezimal an wo im Configuration Space der BAR angegeben ist. | + | Die Zahl in eckigen Klammern gibt über ein Byte-Offset hexadezimal an, wo im Configuration Space der BAR angegeben ist. |
| + | |||
| + | VirtIO nutzt im Legacy Modus den BAR vom Typ I/O und im Modern Modus den BAR vom Typ Memory. Das PCI-Gerät, was VirtualBox bereistellt ist ein Transitional Device. Das heißt, es unterstützt beide Modi. FreeBSD hat einen Treiber pro Modus (src/ | ||
| + | |||
| + | Mit pciconf kann über den Parameter D eine BAR Region ausgelesen werden. | ||
| + | |||
| + | < | ||
| + | % sudo pciconf -D pci0:0:10:0 0x18 | hexdump -C | ||
| + | 00000000 | ||
| + | 00000010 | ||
| + | 00000020 | ||
| + | 00000030 | ||
| + | 00000040 | ||
| + | * | ||
| + | 00000060 | ||
| + | 00000070 | ||
| + | 00000080 | ||
| + | * | ||
| + | 00002000 | ||
| + | </ | ||
| + | |||
| + | Im Modern Mode zeigen die PCI Capabilities auf, wo sich in der BAR Region welche Informationen finden. | ||
| - | VirtIO nutzt im legacy mode den BAR vom Typ I/O und im modern mode den BAR vom Typ Memory. Das PCI-Gerät, was VirtualBox bereistellt ist ein Transitional Device. Das heißt, der unterstützt beide Modi. FreeBSD hat einen Treiber pro Modus (src/ | + | ===== Capabilities ===== |
| - | Im Modern Mode zeigen die PCI Capabilities | + | Zu einem PCI-Gerät können eine Reihe von Capabilities |
| < | < | ||
| Line 116: | Line 143: | ||
| </ | </ | ||
| - | Der erste Wert nach cap gibt die Capability ID an. Der Wert in eckigen Klammern gibt über ein Byte-Offset hexadezimal an wo im Configuration Space die Capability beschrieben steht. Die erste Capability ist also 0x40 = 64 Byte hinter dem Start des Configuration Space zu finden, also direkt hinter dem eben angegebenen Format. Die Bytes lassen sich ebenfalls mit pciconf -rb auslesen. | + | Der erste Wert nach cap gibt die Capability ID an. Der Wert in eckigen Klammern gibt über ein Byte-Offset hexadezimal an, wo im Configuration Space die Capability beschrieben steht. Die erste Capability ist also 0x40 = 64 Byte hinter dem Start des Configuration Space zu finden, also direkt hinter dem standardisierten Bereich. Die Bytes lassen sich ebenfalls mit pciconf -rb auslesen. |
| < | < | ||
| Line 161: | Line 188: | ||
| </ | </ | ||
| - | Alle Capabilites | + | Alle Capabilities |
| - | Mit pciconf kann über den Parameter D eine BAR Region ausgelesen werden. | + | ==== VirtIO: CommonCfg ==== |
| - | < | + | Die erste Capability vom Typ VirtIO: CommonCfg enthält VirtIO-Gerätunabhängige Einstellungen. Sie startet in der BAR Region bei Byte 0 und ist 0x38 Byte groß. Es handelt sich um den Bereich vor den ganzen 0xffff, also |
| - | % sudo pciconf | + | |
| - | 0000000 0000 0000 dda3 002f 0000 0000 9823 000f | + | |
| - | 0000010 0000 0000 0000 0000 0000 0000 0000 0000 | + | |
| - | 0000020 9000 03fa 0001 0000 d000 03fa 0001 0000 | + | |
| - | 0000030 e000 03fa 0001 0000 ffff ffff ffff ffff | + | |
| - | 0000040 ffff ffff ffff ffff ffff ffff ffff ffff | + | |
| - | * | + | |
| - | 0000060 ffff ffff ffff ffff ffff ffff 0000 0000 | + | |
| - | 0000070 0008 5427 0000 0000 0001 0000 ffff ffff | + | |
| - | 0000080 ffff ffff ffff ffff ffff ffff ffff ffff | + | |
| - | * | + | |
| - | 0002000 | + | |
| - | % sudo pciconf -D pci0:0:10:0 0x18 | hexdump -C | + | < |
| - | 00000000 | + | 00000000 |
| - | 00000010 | + | 00000010 |
| - | 00000020 | + | 00000020 |
| - | 00000030 | + | 00000030 |
| - | 00000040 | + | |
| - | * | + | |
| - | 00000060 | + | |
| - | 00000070 | + | |
| - | 00000080 | + | |
| - | * | + | |
| - | 00002000 | + | |
| </ | </ | ||
| - | Die erste Capability vom Typ VirtIO: CommonCfg startet bei Byte 0 und ist 0x38 Byte groß, ist also der Bereich vor den ganzen 0xffff. | + | Beschrieben ist das Format in der VirtIO Spezifikation |
| < | < | ||
| Line 225: | Line 233: | ||
| </ | </ | ||
| - | Das VirtualBox PCI-Gerät gibt darüber also z. B. an, welche Features es unterstützt. Für die Features gibt es insgesamt 64 Bit. In device_feature_select wird geschrieben, | + | Das VirtualBox PCI-Gerät gibt darüber also z. B. an, welche Features es unterstützt. Für die Features gibt es insgesamt 64 Bit. In device_feature_select wird geschrieben, |
| - | Mit device_feature_select=0 und driver_feature_select=0 sieht die erste Zeile der Ausgabe | + | Mit device_feature_select=0 und driver_feature_select=0 sieht die erste Zeile der Ausgabe so aus. |
| < | < | ||
| Line 233: | Line 241: | ||
| </ | </ | ||
| - | In Little Endian gelesen sind die Features | + | In Little Endian gelesen sind device_feature=0x1002fdda3, |
| - | 0x1002fdda3 <Version1, | + | Version1, |
| - | und die ausgehandelten | + | und driver_feature=0x1000f9823, |
| - | 0x1000f9823 <Version1, | + | Version1, |
| + | ==== VirtIO: DeviceCfg ==== | ||
| + | Die Capability VirtIO: DeviceCfg gibt VirtIO-Gerätspezifische Einstellungen an. In der BAR Region startet sie bei Byte-Offset 0x70 und ist 0xa = 10 Byte lang, was diesem Abschnitt entspricht: | ||
| + | < | ||
| + | 00000070 | ||
| + | </ | ||
| + | |||
| + | Beschrieben ist das Format in der VirtIO Spezifikation im Abschnitt [[https:// | ||
| + | |||
| + | < | ||
| + | struct virtio_net_config { | ||
| + | u8 mac[6]; | ||
| + | le16 status; | ||
| + | le16 max_virtqueue_pairs; | ||
| + | le16 mtu; | ||
| + | le32 speed; | ||
| + | u8 duplex; | ||
| + | u8 rss_max_key_size; | ||
| + | le16 rss_max_indirection_table_length; | ||
| + | le32 supported_hash_types; | ||
| + | le32 supported_tunnel_types; | ||
| + | }; | ||
| + | </ | ||
| + | Es sind jedoch nicht immer alle Werte angegeben. Welche Werte angegeben sind, hängt von den ausgehandelten Features ab. Hier sind lediglich die MAC-Adresse=08: | ||
pci_configuration_space.1772292124.txt.gz · Last modified: by msvoelker
