On 3/6/26 11:44, Zhenzhong Duan wrote:
> Export some functions for accel code usages. Inline functions and MACROs
> are moved to internal header files. Then accel code in following patches
> could access them.
>
> Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
> Reviewed-by: Clement Mathieu--Drif <clement.mathieu--drif@eviden.com>
> ---
> hw/i386/intel_iommu_internal.h | 31 +++++++++++++++++++++++++
> hw/i386/intel_iommu.c | 42 ++++++++--------------------------
> 2 files changed, 40 insertions(+), 33 deletions(-)
Reviewed-by: Yi Liu <yi.l.liu@intel.com>
> diff --git a/hw/i386/intel_iommu_internal.h b/hw/i386/intel_iommu_internal.h
> index db4f186a3e..c7e107fe87 100644
> --- a/hw/i386/intel_iommu_internal.h
> +++ b/hw/i386/intel_iommu_internal.h
> @@ -620,6 +620,12 @@ typedef struct VTDRootEntry VTDRootEntry;
> #define VTD_SM_CONTEXT_ENTRY_RSVD_VAL1 0xffffffffffe00000ULL
> #define VTD_SM_CONTEXT_ENTRY_PRE 0x10ULL
>
> +/* context entry operations */
> +#define VTD_CE_GET_PASID_DIR_TABLE(ce) \
> + ((ce)->val[0] & VTD_PASID_DIR_BASE_ADDR_MASK)
> +#define VTD_CE_GET_PRE(ce) \
> + ((ce)->val[0] & VTD_SM_CONTEXT_ENTRY_PRE)
> +
> typedef struct VTDPASIDCacheInfo {
> uint8_t type;
> uint16_t did;
> @@ -746,4 +752,29 @@ static inline bool vtd_pe_pgtt_is_fst(VTDPASIDEntry *pe)
> {
> return (VTD_SM_PASID_ENTRY_PGTT(pe) == VTD_SM_PASID_ENTRY_FST);
> }
> +
> +static inline bool vtd_pdire_present(VTDPASIDDirEntry *pdire)
> +{
> + return pdire->val & 1;
> +}
> +
> +static inline bool vtd_pe_present(VTDPASIDEntry *pe)
> +{
> + return pe->val[0] & VTD_PASID_ENTRY_P;
> +}
> +
> +static inline int vtd_pasid_entry_compare(VTDPASIDEntry *p1, VTDPASIDEntry *p2)
> +{
> + return memcmp(p1, p2, sizeof(*p1));
> +}
> +
> +int vtd_get_pdire_from_pdir_table(dma_addr_t pasid_dir_base, uint32_t pasid,
> + VTDPASIDDirEntry *pdire);
> +int vtd_get_pe_in_pasid_leaf_table(IntelIOMMUState *s, uint32_t pasid,
> + dma_addr_t addr, VTDPASIDEntry *pe);
> +int vtd_dev_to_context_entry(IntelIOMMUState *s, uint8_t bus_num,
> + uint8_t devfn, VTDContextEntry *ce);
> +int vtd_ce_get_pasid_entry(IntelIOMMUState *s, VTDContextEntry *ce,
> + VTDPASIDEntry *pe, uint32_t pasid);
> +VTDAddressSpace *vtd_get_as_by_sid(IntelIOMMUState *s, uint16_t sid);
> #endif
> diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
> index e5b9689fae..744b5967b2 100644
> --- a/hw/i386/intel_iommu.c
> +++ b/hw/i386/intel_iommu.c
> @@ -42,12 +42,6 @@
> #include "migration/vmstate.h"
> #include "trace.h"
>
> -/* context entry operations */
> -#define VTD_CE_GET_PASID_DIR_TABLE(ce) \
> - ((ce)->val[0] & VTD_PASID_DIR_BASE_ADDR_MASK)
> -#define VTD_CE_GET_PRE(ce) \
> - ((ce)->val[0] & VTD_SM_CONTEXT_ENTRY_PRE)
> -
> /*
> * Paging mode for first-stage translation (VTD spec Figure 9-6)
> * 00: 4-level paging, 01: 5-level paging
> @@ -831,18 +825,12 @@ static inline bool vtd_pe_type_check(IntelIOMMUState *s, VTDPASIDEntry *pe)
> }
> }
>
> -static inline bool vtd_pdire_present(VTDPASIDDirEntry *pdire)
> -{
> - return pdire->val & 1;
> -}
> -
> /**
> * Caller of this function should check present bit if wants
> * to use pdir entry for further usage except for fpd bit check.
> */
> -static int vtd_get_pdire_from_pdir_table(dma_addr_t pasid_dir_base,
> - uint32_t pasid,
> - VTDPASIDDirEntry *pdire)
> +int vtd_get_pdire_from_pdir_table(dma_addr_t pasid_dir_base, uint32_t pasid,
> + VTDPASIDDirEntry *pdire)
> {
> uint32_t index;
> dma_addr_t addr, entry_size;
> @@ -860,15 +848,8 @@ static int vtd_get_pdire_from_pdir_table(dma_addr_t pasid_dir_base,
> return 0;
> }
>
> -static inline bool vtd_pe_present(VTDPASIDEntry *pe)
> -{
> - return pe->val[0] & VTD_PASID_ENTRY_P;
> -}
> -
> -static int vtd_get_pe_in_pasid_leaf_table(IntelIOMMUState *s,
> - uint32_t pasid,
> - dma_addr_t addr,
> - VTDPASIDEntry *pe)
> +int vtd_get_pe_in_pasid_leaf_table(IntelIOMMUState *s, uint32_t pasid,
> + dma_addr_t addr, VTDPASIDEntry *pe)
> {
> uint8_t pgtt;
> uint32_t index;
> @@ -954,8 +935,8 @@ static int vtd_get_pe_from_pasid_table(IntelIOMMUState *s,
> return 0;
> }
>
> -static int vtd_ce_get_pasid_entry(IntelIOMMUState *s, VTDContextEntry *ce,
> - VTDPASIDEntry *pe, uint32_t pasid)
> +int vtd_ce_get_pasid_entry(IntelIOMMUState *s, VTDContextEntry *ce,
> + VTDPASIDEntry *pe, uint32_t pasid)
> {
> dma_addr_t pasid_dir_base;
>
> @@ -1526,8 +1507,8 @@ static int vtd_ce_pasid_0_check(IntelIOMMUState *s, VTDContextEntry *ce)
> }
>
> /* Map a device to its corresponding domain (context-entry) */
> -static int vtd_dev_to_context_entry(IntelIOMMUState *s, uint8_t bus_num,
> - uint8_t devfn, VTDContextEntry *ce)
> +int vtd_dev_to_context_entry(IntelIOMMUState *s, uint8_t bus_num,
> + uint8_t devfn, VTDContextEntry *ce)
> {
> VTDRootEntry re;
> int ret_fr;
> @@ -1909,7 +1890,7 @@ static VTDAddressSpace *vtd_get_as_by_sid_and_pasid(IntelIOMMUState *s,
> vtd_find_as_by_sid_and_pasid, &key);
> }
>
> -static VTDAddressSpace *vtd_get_as_by_sid(IntelIOMMUState *s, uint16_t sid)
> +VTDAddressSpace *vtd_get_as_by_sid(IntelIOMMUState *s, uint16_t sid)
> {
> return vtd_get_as_by_sid_and_pasid(s, sid, PCI_NO_PASID);
> }
> @@ -3133,11 +3114,6 @@ static inline int vtd_dev_get_pe_from_pasid(VTDAddressSpace *vtd_as,
> return vtd_ce_get_pasid_entry(s, &ce, pe, vtd_as->pasid);
> }
>
> -static int vtd_pasid_entry_compare(VTDPASIDEntry *p1, VTDPASIDEntry *p2)
> -{
> - return memcmp(p1, p2, sizeof(*p1));
> -}
> -
> /* Update or invalidate pasid cache based on the pasid entry in guest memory. */
> static void vtd_pasid_cache_sync_locked(gpointer key, gpointer value,
> gpointer user_data)