Hi Mostafa, On 2/5/23 10:44, Mostafa Saleh wrote: > Check if with the configured start level, ia_bits and granularity we > can have a valid page table as described in ARM ARM D8.2 Translation > process. > The idea is to see for the highest possible number of IPA bits, how > many concatenated tables we would need, if it is more than 16, then > this is not possible.
This rather checks the validity and consistency of the STE S2 fields. The patch title sounds a bit misleading to me. > > Signed-off-by: Mostafa Saleh <smost...@google.com> > --- > hw/arm/smmuv3.c | 29 +++++++++++++++++++++++++++++ > 1 file changed, 29 insertions(+) > > diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c > index 6633fe40fa..c49b341287 100644 > --- a/hw/arm/smmuv3.c > +++ b/hw/arm/smmuv3.c > @@ -341,6 +341,28 @@ static int smmu_get_cd(SMMUv3State *s, STE *ste, > uint32_t ssid, > return 0; > } > > +/* > + * Return true if s2 page table config is valid. > + * This checks with the configured start level, ia_bits and granularity we > can > + * have a valid page table as described in ARM ARM D8.2 Translation process. > + * The idea here is to see for the highest possible number of IPA bits, how > + * many concatenated tables we would need, if it is more than 16, then this > is > + * not possible. > + */ > +static bool s2_pgtable_config_valid(uint8_t sl0, uint8_t t0sz, uint8_t gran) > +{ > + int level = get_start_level(sl0, gran); > + uint64_t ia_bits = 64 - t0sz; s/ia/ipa > + uint64_t mx = (1ULL << ia_bits) - 1; s/mx/max_ipa > + int nr_concat = pgd_idx(level, gran, mx) + 1; > + > + if (nr_concat > SMMU_MAX_S2_CONCAT) { > + return false; > + } > + > + return true; > +} > + > /* Returns < 0 in case of invalid STE, 0 otherwise */ > static int decode_ste(SMMUv3State *s, SMMUTransCfg *cfg, > STE *ste, SMMUEventInfo *event) > @@ -407,6 +429,13 @@ static int decode_ste(SMMUv3State *s, SMMUTransCfg *cfg, > goto bad_ste; > } > > + if (!s2_pgtable_config_valid(cfg->s2cfg.sl0, cfg->s2cfg.tsz, > + cfg->s2cfg.granule_sz)) { > + qemu_log_mask(LOG_GUEST_ERROR, > + "SMMUv3 STE stage 2 config not valid!\n"); > + goto bad_ste; > + } > + To me this would need to be integrated into the STE decoding patch. This latter shall be self-contained if possible to ease the review Thanks Eric > /* This is still here as stage 2 has not been fully enabled yet. */ > qemu_log_mask(LOG_UNIMP, "SMMUv3 does not support stage 2 yet\n"); > goto bad_ste;