User:Demindiro/AMD-Vi IOMMU article scratchpad
Jump to navigation
Jump to search
Tip for X11 users: xclip + middle mouse button :)
python3 amd-iommu-registers.py | xclip
Table script
amd-iommu-registers.txt
Format is offset size name*.
0x0030 8 IOMMU Extended Feature Register
0x0038 8 PPR Log Base Address Register
0x0040 8 IOMMU Hardware Event Upper Register
0x0048 8 IOMMU Hardware Event Lower Register
0x0050 8 Hardware Event Status Register
0x0058 8 (unmapped)
0x0060 8 SMI Filter Register 0
0x0068 8 SMI Filter Register 1
0x0070 8 SMI Filter Register 2
0x0078 8 SMI Filter Register 3
0x0080 8 SMI Filter Register 4
0x0088 8 SMI Filter Register 5
0x0090 8 SMI Filter Register 6
0x0098 8 SMI Filter Register 7
0x00A0 8 SMI Filter Register 8
0x00A8 8 SMI Filter Register 9
0x00B0 8 SMI Filter Register 10
0x00B8 8 SMI Filter Register 11
0x00C0 8 SMI Filter Register 12
0x00C8 8 SMI Filter Register 13
0x00D0 8 SMI Filter Register 14
0x00D8 8 SMI Filter Register 15
0x00E0 8 Guest Virtual APIC Log Base Address Register
0x00E8 8 Guest Virtual APIC Log Tail Address Register
0x00F0 8 PPR Log B Base Address Register
0x00F8 8 Event Log B Base Address Register
0x0100 8 Device Table Segment 1 Base Address Register
0x0108 8 Device Table Segment 2 Base Address Register
0x0110 8 Device Table Segment 3 Base Address Register
0x0118 8 Device Table Segment 4 Base Address Register
0x0120 8 Device Table Segment 5 Base Address Register
0x0128 8 Device Table Segment 6 Base Address Register
0x0130 8 Device Table Segment 7 Base Address Register
0x0138 8 Device-Specific Feature Extension (DSFX) Register
0x0140 8 Device-Specific Control Extension (DSCX) Register
0x0148 8 Device-Specific Status Extension (DSSX) Register
0x0150 4 MSI Vector Register 0
0x0154 4 MSI Vector Register 1
0x0158 4 MSI Capability Header Register
0x015C 4 MSI Address Low Register
0x0160 4 MSI Address High Register
0x0164 4 MSI Data Register
0x0168 4 MSI Mapping Capability Header Register
0x016C 4 IOMMU Performance Optimization Control Register
0x0170 8 XT IOMMU General Interrupt Control Register
0x0178 8 XT IOMMU PPR Interrupt Control Register
0x0180 8 XT IOMMU GA Log Interrupt Control Register
0x0188 8 (reserved)
0x0190 8 vIOMMU Status Register
0x0198 8 (reserved)
0x01A0 8 IOMMU Extended Feature 2 Register
0x0200 8 MARC Aperture 0 Base Register
0x0208 8 MARC Aperture 0 Relocation Register
0x0210 8 MARC Aperture 0 Length Register
0x0218 8 MARC Aperture 1 Base Register
0x0220 8 MARC Aperture 1 Relocation Register
0x0228 8 MARC Aperture 1 Length Register
0x0230 8 MARC Aperture 2 Base Register
0x0238 8 MARC Aperture 2 Relocation Register
0x0240 8 MARC Aperture 2 Length Register
0x0248 8 MARC Aperture 3 Base Register
0x0250 8 MARC Aperture 3 Relocation Register
0x0258 8 MARC Aperture 3 Length Register
0x0260 8 (reserved)
0x1000 8 (reserved)
0x1FF8 8 IOMMU Reserved Register
0x2000 8 Command Buffer Head Pointer Register
0x2008 8 Command Buffer Tail Pointer Register
0x2010 8 Event Log Head Pointer Register
0x2018 8 Event Log Tail Pointer Register
0x2020 8 IOMMU Status Register
0x2028 8 (reserved)
0x2030 8 IOMMU PPR Log Head Pointer Register
0x2038 8 IOMMU PPR Log Tail Pointer Register
0x2040 8 Guest Virtual APIC Log Head Pointer Register
0x2048 8 Guest Virtual APIC Log Tail Pointer Register
0x2050 8 PPR Log B Head Pointer Register
0x2058 8 PPR Log B Tail Pointer Register
0x2060 8 Event Log B Head Pointer Register
0x2068 8 Event Log B Tail Pointer Register
0x2070 8 Event Log B Head Pointer Register
0x2078 8 Event Log B Tail Pointer Register
0x2080 8 PPR Log Auto Response Register
0x2088 8 PPR Log Overflow Early Indicator Register
0x2090 8 PPR Log B Overflow Early Indicator Register
0x2098 8 (reserved)amd-iommu-registers.py
entries = []
with open('amd-iommu-registers.txt') as f:
for l in f:
l = l.strip()
offset, size, name = map(str.strip, filter(None, l.split(' ', 2)))
entries.append((int(offset, 0), int(size), name))
print('{| class="wikitable" style="table-layout:fixed"')
print('! Offset')
print('!style="width:50%"| Name (+4)')
print('!style="width:50%"| Name (+0)')
cur_page = -1
last_offset = 0
i = 0
while i < len(entries):
offset, size, name = entries[i]
if offset - last_offset > 8:
print('|-')
print('|colspan="3"| ...')
if cur_page & -0x1000 != offset & -0x1000:
cur_page = offset & -0x1000
print('|-')
print(f'!colspan="3"| 0x{cur_page:04X} to 0x{cur_page + 0x1000:04X}')
print('|-')
print(f'| 0x{offset:04X}')
if size == 8:
print('|colspan="2"|', name)
i += 1
elif size == 4:
n_offset, n_size, n_name = entries[i + 1]
assert offset + 4 == n_offset
assert size == n_size
print('|', n_name)
print('|', name)
i += 2
else:
assert 0, 'fix table pls'
last_offset = offset
print('|}')