Commit dc2bb15
committed
IOMMU: Add SDF Support
This commit adds iommu support to microkit sdfs.
Define a constant to represent the a tool enforced limitation on the
maximum virtual address suported for an IO address space. This is due to
current x86 IOMMU behaviour in the kernel which dynamically detects the
maximum virtual address for an IO address space. For more info read:
BOOT_CODE bool_t vtd_init_num_iopts(uint32_t num_drhu) in
seL4/src/plat/pc99/machine/intel-vtd.c.
Add PciDevice struct and PCIDeviceParseError enum. This types allow us
to implement the Display trait which gives a consistent way to output
PCI information. The FromStr trait implemented for PCIDevice avoid
duplicating logic required to parse the PCI identifier from the xml.
When combined with the display trait on the PCIDeviceParseError, we get
consistent error messages and avoid repeating code.
Add IOMMUDeviceIdentifier and IOMMUDeviceIdentifierParseError to support
parsing the sdf based on the current architecture. This allows the sdf
parsing to easily support ARM SMMU and RISCV IOMMU. The Display traits
again remove repeated code when outputting IOMMUDeviceIdentifer or
IOMMUDeviceIdentifierParseError, particularly useful for error messages.
Add SysIOMapPerms. Representing the perms in an enum completely removes
the existence of invalid IOMapPerms once we parse the sdf.
Add SysIOMap. The dual to SysMap, used to represent a mapping in a
devices IO virtual address space.
Replace ExecutionContext trait with a Map trait. The previous trait was
primarily used in the check_maps function to handle memory regions in
virtual machines and normal pds. This Map trait allowed the one
check_maps function to handle both SysIOMaps and SysMaps uniformly. The
additional information that was provided by the polymorhpic
ExecutionContext is just passed as a string to be used in the respective
error message. This is because outside of the check_maps function a
protection_domain and a virtual_machine are handled as distinct types.
Add error checking cases to check_maps. If the map_start + mr.size
overflows alot of the pre-exisiting logic breaks so check for it. Also
check that we don't overflow the top of user_virtual memory accouting
for the differences between protection_domains, virtual_machines and io
address spaces.
Add check_io_maps adapter. Required because check_maps is designed to
error check within one address space. Therefore we collect all the
mappings that have been made on a per IO address space basis.
capdl/irq.rs waas using the old pci_bus,pci_dev,pci_func form. Since we
have a real type now, we updated the expected match form.
Signed-off-by: Callum <c.berry@student.unsw.edu.au>1 parent b5cd889 commit dc2bb15
24 files changed
Lines changed: 1063 additions & 194 deletions
File tree
- example/x86_64_iommu_dma_test
- tool/microkit
- src
- capdl
- tests
- sdf
Lines changed: 20 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
86 | 86 | | |
87 | 87 | | |
88 | 88 | | |
89 | | - | |
90 | | - | |
91 | | - | |
92 | | - | |
93 | | - | |
| 89 | + | |
94 | 90 | | |
95 | 91 | | |
96 | 92 | | |
97 | 93 | | |
98 | | - | |
99 | | - | |
100 | | - | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
101 | 97 | | |
102 | 98 | | |
103 | 99 | | |
| |||
0 commit comments