STRUCT IOMMU_HWPT_ARM_SMMUV3(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

πŸ’… struct iommu_hwpt_arm_smmuv3 β€” Kernel API Manual ✨

okay so bestie, this is a kernel API manual page entry for struct iommu_hwpt_arm_smmuv3, and it's literally all about the ARM SMMUv3 nested STE. yes, that STE. come on now πŸŽ€


🌸 NAME 🌸

struct iommu_hwpt_arm_smmuv3 β€” the ARM SMMUv3 nested STE, aka IOMMU_HWPT_DATA_ARM_SMMUV3. that's the whole vibe. πŸ’…


✨ SYNOPSIS ✨

struct iommu_hwpt_arm_smmuv3 {
    __aligned_le64 ste[2];
 };

look at her. two double words, aligned, little-endian. iconic. πŸ‘‘


πŸ¦‹ Members πŸ¦‹

  • ste β€” this is the first two double words of the user space Stream Table Entry for the translation, and no cap, it must be little-endian. these are the only fields allowed (go peek at "5.2 Stream Table Entry" in the SMMUv3 HW Spec for the full lore, iykyk):
    • word-0: V, Cfg, S1Fmt, S1ContextPtr, S1CDMax
    • word-1: EATS, S1DSS, S1CIR, S1COR, S1CSH, S1STALLD

πŸ’– Description πŸ’–

so here's the tea: -EIO gets returned if ste is not legal, or if it contains literally any non-allowed field. rude but fair. 🫢

Cfg is the main character here β€” it can be used to select an S1, Bypass, or Abort configuration. a Bypass nested domain will translate the same as the nesting parent (fr fr, same energy). the S1 will install a Context Descriptor Table pointing at userspace memory translated by the nesting parent. slay. ✨

it's suggested (read: highly recommended, bestie) to allocate a vDEVICE object carrying vSID and then re-attach the nested domain, as soon as the vSID is available in the VMM level. and here's why:

  • when Cfg=translate, a vDEVICE must be allocated prior to attaching to the allocated nested domain, because CD/ATS invalidations and vevents need a vSID. no vSID, no service. πŸ’€
  • when Cfg=bypass/abort, a vDEVICE is not enforced during the nested domain attachment β€” this is to support a GBPA case where the VM sets CR0.SMMUEN=0. BUT 🚨 if the VM sets CR0.SMMUEN=1 while missing a vDEVICE object, the kernel would fail to report events to the VM. e.g. F_TRANSLATION when guest STE.Cfg=abort. so like… be aware. πŸ™ˆ

🌈 SEE ALSO 🌈

Kernel file ./include/uapi/linux/iommufd.h β€” plus literally the whole friend group:

  • General ioctl format(9)
  • struct iommu_destroy(9)
  • struct iommu_ioas_alloc(9)
  • struct iommu_iova_range(9)
  • struct iommu_ioas_iova_ranges(9)
  • struct iommu_ioas_allow_iovas(9)
  • enum iommufd_ioas_map_flags(9)
  • struct iommu_ioas_map(9)
  • struct iommu_ioas_noiommu_get_pa(9)
  • struct iommu_ioas_map_file(9)
  • struct iommu_ioas_copy(9)
  • struct iommu_ioas_unmap(9)
  • enum iommufd_option(9)
  • enum iommufd_option_ops(9)
  • struct iommu_option(9)
  • enum iommufd_vfio_ioas_op(9)
  • struct iommu_vfio_ioas(9)
  • enum iommufd_hwpt_alloc_flags(9)
  • enum iommu_hwpt_vtd_s1_flags(9)
  • struct iommu_hwpt_vtd_s1(9)
  • struct iommu_hwpt_amd_guest(9)
  • enum iommu_hwpt_data_type(9)
  • struct iommu_hwpt_alloc(9)
  • enum iommu_hw_info_vtd_flags(9)
  • struct iommu_hw_info_vtd(9)
  • enum iommu_hw_info_arm_smmuv3_flags(9)
  • struct iommu_hw_info_arm_smmuv3(9)
  • struct iommu_hw_info_tegra241_cmdqv(9)
  • struct iommu_hw_info_amd(9)
  • enum iommu_hw_info_type(9)
  • enum iommufd_hw_capabilities(9)
  • enum iommufd_hw_info_flags(9)
  • struct iommu_hw_info(9)
  • struct iommu_hwpt_set_dirty_tracking(9)
  • enum iommufd_hwpt_get_dirty_bitmap_flags(9)
  • struct iommu_hwpt_get_dirty_bitmap(9)
  • enum iommu_hwpt_invalidate_data_type(9)
  • enum iommu_hwpt_vtd_s1_invalidate_flags(9)
  • struct iommu_hwpt_vtd_s1_invalidate(9)
  • struct iommu_viommu_arm_smmuv3_invalidate(9)
  • struct iommu_hwpt_invalidate(9)
  • enum iommu_hwpt_pgfault_flags(9)
  • enum iommu_hwpt_pgfault_perm(9)
  • struct iommu_hwpt_pgfault(9)
  • enum iommufd_page_response_code(9)
  • struct iommu_hwpt_page_response(9)
  • struct iommu_fault_alloc(9)
  • enum iommu_viommu_type(9)
  • struct iommu_viommu_tegra241_cmdqv(9)
  • struct iommu_viommu_alloc(9)
  • struct iommu_vdevice_alloc(9)
  • struct iommu_ioas_change_process(9)
  • enum iommu_veventq_flag(9)
  • struct iommufd_vevent_header(9)
  • enum iommu_veventq_type(9)
  • struct iommu_vevent_arm_smmuv3(9)
  • struct iommu_vevent_tegra241_cmdqv(9)
  • struct iommu_veventq_alloc(9)
  • enum iommu_hw_queue_type(9)
  • struct iommu_hw_queue_alloc(9)

okay that's the whole page, bestie, you ate that πŸ’…βœ¨ β€” this one lives in ./include/uapi/linux and it's dated October 2026, so like… future iconic. go forth and nest those STEs, periodt. πŸŽ€πŸ«ΆπŸ’–

πŸ“¦ where this page comes from