On 12/22/25 2:29 PM, Pierrick Bouvier wrote:
On 12/22/25 4:45 AM, Tao Tang wrote:
Introduce qos-smmuv3, a reusable library for SMMUv3-related qtest
operations. This module encapsulates common tasks like:

- SMMUv3 initialization (enabling, configuring command/event queues)
- Stream Table Entry (STE) and Context Descriptor (CD) setup
- Multi-level page table construction (L0-L3 for 4KB granules)
- Support for Stage 1, Stage 2, and nested translation modes
- Could be easily extended to support multi-space testing infrastructure
      (Non-Secure, Secure, Root, Realm)

The library provides high-level abstractions that allow test code to
focus on IOMMU behavior validation rather than low-level register
manipulation and page table encoding. Key features include:

- Provide memory allocation for translation structures with proper
      alignment
- Helper functions to build valid STEs/CDs for different translation
      scenarios
- Page table walkers that handle address offset calculations per
      security space

This infrastructure is designed to be used by iommu-testdev-based tests
and future SMMUv3 test suites, reducing code duplication and improving
test maintainability.

Signed-off-by: Tao Tang <[email protected]>
Reviewed-by: Pierrick Bouvier <[email protected]>
Reviewed-by: Fabiano Rosas <[email protected]>
---
   MAINTAINERS                     |   6 +
   tests/qtest/libqos/meson.build  |   3 +
   tests/qtest/libqos/qos-smmuv3.c | 632 ++++++++++++++++++++++++++++++++
   tests/qtest/libqos/qos-smmuv3.h | 256 +++++++++++++
   4 files changed, 897 insertions(+)
   create mode 100644 tests/qtest/libqos/qos-smmuv3.c
   create mode 100644 tests/qtest/libqos/qos-smmuv3.h


...

+void qsmmu_setup_translation_tables(QTestState *qts,
+                                    uint64_t iova,
+                                    QSMMUSpace space,
+                                    bool is_cd,
+                                    QSMMUTransMode mode)
+{
+    uint64_t all_s2_l0_pte_val, all_s2_l1_pte_val, all_s2_l2_pte_val;
+    uint64_t s1_vttb, s2_vttb, s1_leaf_pte_val;
+    uint64_t l0_addr, l1_addr, l2_addr, l3_addr;
+
+    g_test_message("Begin of construction: IOVA=0x%lx mode=%d 
is_building_CD=%s"
+                   " ===", iova, mode, is_cd ? "yes" : "no");
+

Format error when building on host where long != long long (32 bits and
windows).

../home/runner/work/qemu-ci/qemu-ci/tests/qtest/libqos/qos-smmuv3.c: In
function ‘qsmmu_setup_translation_tables’:
../home/runner/work/qemu-ci/qemu-ci/tests/qtest/libqos/qos-smmuv3.c:560:53:
error: format ‘%lx’ expects argument of type ‘long unsigned int’, but
argument 2 has type ‘uint64_t’ {aka ‘long long unsigned int’}
[-Werror=format=]
    560 |     g_test_message("Begin of construction: IOVA=0x%lx mode=%d
is_building_CD=%s"
        |                                                   ~~^
        |                                                     |
        |                                                     long
unsigned int
        |                                                   %llx
    561 |                    " ===", iova, mode, is_cd ? "yes" : "no");
        |                            ~~~~
        |                            |
        |                            uint64_t {aka long long unsigned int}

You can use PRIx64 which is portable.

See test pipeline here:
https://github.com/pbo-linaro/qemu-ci/actions/runs/20432605461

You can reproduce easily with:

podman run --pull newer --init --rm -it \
 -v $(pwd):$(pwd) -w $(pwd) \
 docker.io/pbolinaro/qemu-ci:debian-armhf-cross \
bash -cx './configure $QEMU_CONFIGURE_OPTS && ninja -C build install'

Reply via email to