M16: IOMMU detection (DMAR parsing)
Detect the IOMMU: discovery now parses the ACPI DMAR table, finds the first VT-d DMA-remapping unit (DRHD), maps its register block, and records its version and capabilities (iommu_present/base/version/capabilities in the platform info). On QEMU's emulated intel-iommu this reads back a real unit (base 0xfed90000, version 1.0). This is detection only, and deliberately so. A full VT-d bring-up — per-device translation domains that confine a driver's DMA to the buffers it dma_alloc'd — is the real device-side safety guarantee, but it cannot be verified without a DMA-capable device driver (none exist yet) and QEMU's intel-iommu to fault against. Writing that enforcement now would be a large body of unverifiable page-table code; it belongs with the first DMA driver, which is both the natural order and the only way to test it. Until then the caveat stands in full: device_claim on a DMA-capable device is still equivalent to granting ring 0. The docs say so plainly. New `iommu` test (harness boots it with -device intel-iommu via a new per-case qemu_extra hook) confirms the DMAR is parsed and the unit's registers read. Suite 40/40 plus host tests.
This commit is contained in:
@@ -140,6 +140,12 @@ CASES = [
|
||||
{"name": "msi",
|
||||
"expect": r"DANOS-TEST-RESULT: PASS",
|
||||
"fail": r"DANOS-TEST-RESULT: FAIL"},
|
||||
# IOMMU (M16): boot with an emulated VT-d unit and confirm danos parses the DMAR
|
||||
# table and reads the unit's registers. Detection only — enforcement is future.
|
||||
{"name": "iommu",
|
||||
"qemu_extra": ["-device", "intel-iommu,intremap=off"],
|
||||
"expect": r"DANOS-TEST-RESULT: PASS",
|
||||
"fail": r"DANOS-TEST-RESULT: FAIL"},
|
||||
# Parallelism: needs more than one core, so this case boots with -smp 4.
|
||||
{"name": "smp",
|
||||
"smp": 4,
|
||||
@@ -310,6 +316,8 @@ def run_case(arch, case):
|
||||
cmd = [arch["qemu"]] + arch["qemu_args"](arch, esp, vars_fd, serial)
|
||||
if case.get("smp"): # some cases need more than one core (e.g. parallelism)
|
||||
cmd += ["-smp", str(case["smp"])]
|
||||
if case.get("qemu_extra"): # extra qemu args, e.g. -device intel-iommu for the IOMMU case
|
||||
cmd += case["qemu_extra"]
|
||||
qemu = subprocess.Popen(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
||||
try:
|
||||
timeout = case.get("timeout", TIMEOUT)
|
||||
|
||||
Reference in New Issue
Block a user