[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v3 08/23] xen/arm: vsmmuv3: Add support for registers emulation


  • To: Milan Djokic <milan_djokic@xxxxxxxx>
  • From: Luca Fancellu <Luca.Fancellu@xxxxxxx>
  • Date: Fri, 10 Apr 2026 15:27:34 +0000
  • Accept-language: en-GB, en-US
  • Arc-authentication-results: i=2; mx.microsoft.com 1; spf=pass (sender ip is 4.158.2.129) smtp.rcpttodomain=epam.com smtp.mailfrom=arm.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=arm.com; dkim=pass (signature was verified) header.d=arm.com; arc=pass (0 oda=1 ltdi=1 spf=[1,1,smtp.mailfrom=arm.com] dkim=[1,1,header.d=arm.com] dmarc=[1,1,header.from=arm.com])
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none
  • Arc-message-signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=QCzjePY665vJpJdboo78/mB7n80P6oKKVx0+9c96syo=; b=drljHgzOivVDRn56S2EjLMOU5zrBkwEWPa1qPCwZRziZTTIg5LsJX8GD69F7iwVRM1Q9EX/Fl+ZoJJH0XC8cALvrODi8GipFzkygTKCwiMxpMUPFtYo7Vnwtb1+odsohYoXITzk73nd5FSZEBxhd/+9sAAjNoDEO201g79gC9JVlJJUJD+Hi25gZxwUipw1QJ3nZDdRoZG+Ur1yXAGjCQx9svszrEaXzgucgLl14C9pnWT1sJvmh+co9hdxXCHuQL7eTmbMm1PoBckH+85gAKoRHkR7Sah2s5bhBjhRXvdQcob9dKvvW4GdifDn3yK8r8SthRRtUylGYF9LV3lXdZg==
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=QCzjePY665vJpJdboo78/mB7n80P6oKKVx0+9c96syo=; b=rTK+0yzjbKeE9vn2xeXphHUG/8rck9btUclzwrY3CPD4mlbMmEP+FEphlGov0yVN/VK3EEvymePMdzp9f3in+Zg9XNeyLEGZ8f2U8lqz+vRz2sENKSqrC+vEwWB66mnKvEFlVCaWVIrL1tDwSBMkgCW66Ir0KZvcyEoN8bn/8/f2NSqVZkaKqsFMR/yA/m2nHGJySkfxRHVDMX3JJ32NXqZW1noaXCDlD4oF6WXij3oIykzCrDzcZhQ6YfthNVS1b7TvOlj+m1RZBVCY1/nY4rpjFVDBSBNrl52bBf5wSDxEknriSTrM+oJvxvUqc7f8wmscMeJ2yXhnV2FD/GhgKQ==
  • Arc-seal: i=2; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=pass; b=Fuo1MWaYax9rthGSic3geME2MRYyhjby3nJSDKKSrkvlM4ueprZcVESF3CC6dDfR0e/5mAqjHotDYJVDOtjwJtUtDOefrRWzQaDqwNuzP0tjf8TMQPY0T91Ebfe5KdSwFV47yyAaZyUSVDhPlZsqdHGVgOgj4MxRJD9nL3Y4pqMmbQ4PhimpjlbyKy2Z2nccXbOCW3nPEBiBGQlFXwhCXHYI6oK45mC36DQYWA612z97ENVYHsothPKj57JzUBJ4oXu12v7F3m7rnTJMBmqsMSMyMn1iMI4L1kkbN0XFKXp/Jdjni74/7RunfU6xSFi47apS1xSnIieoL00pSSn7cQ==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=xWoC71R4xsYUGc67aTq5fiSqK/R0yhM7ZE9uUD9hXTNLqDUALwzNXvACVU9TMwjQCbRNup0eeLIcia5RqmUhd3z9N22CFTAShK2rgTuH/EDzd+WUSfcXBX4FoJ041zGNHLbdJnNQBzbyyPjY5zaQE/jx/91iUepkSzjXE7yPcUk6D/ufFd2HuwENl1KJ/ypy7OkFO/ovSiOy4Ru+eozJe1uK+rAcau20jezGFE/MId1vyxS6h+3B/LbJuz6G1D8zq0O8hqvIi4ShZnsEcTT357WGlkOYH08ipjOi5CK9teOfTxqUzmo0HTB21wBlKOr3Ux/zIcyydN/0TGNvhAOeJw==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=arm.com header.i="@arm.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck"; dkim=pass header.s=selector1 header.d=arm.com header.i="@arm.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck"
  • Authentication-results-original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com;
  • Cc: "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>, Rahul Singh <Rahul.Singh@xxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Julien Grall <julien@xxxxxxx>, Bertrand Marquis <Bertrand.Marquis@xxxxxxx>, Michal Orzel <michal.orzel@xxxxxxx>, Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx>
  • Delivery-date: Fri, 10 Apr 2026 15:28:49 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Nodisclaimer: true
  • Thread-index: AQHcyP6NKmaLb7Af3Um2I3EGy28uyQ==
  • Thread-topic: [PATCH v3 08/23] xen/arm: vsmmuv3: Add support for registers emulation

Hi Milan,

> diff --git a/xen/drivers/passthrough/arm/vsmmu-v3.c 
> b/xen/drivers/passthrough/arm/vsmmu-v3.c
> index e36f200ba5..3ae1e62a50 100644
> --- a/xen/drivers/passthrough/arm/vsmmu-v3.c
> +++ b/xen/drivers/passthrough/arm/vsmmu-v3.c
> 
[...]
> static int vsmmuv3_mmio_write(struct vcpu *v, mmio_info_t *info,
>                               register_t r, void *priv)
> {
> +    struct virt_smmu *smmu = priv;
> +    uint64_t reg;
> +    uint32_t reg32;
> +
> +    switch ( info->gpa & 0xffff )
> +    {
> +    case VREG32(ARM_SMMU_CR0):
> +        reg32 = smmu->cr[0];
> +        vreg_reg32_update(&reg32, r, info);
> +        smmu->cr[0] = reg32;
> +        smmu->cr0ack = reg32 & ~CR0_RESERVED;
> +        break;
> +
> +    case VREG32(ARM_SMMU_CR1):
> +        reg32 = smmu->cr[1];
> +        vreg_reg32_update(&reg32, r, info);
> +        smmu->cr[1] = reg32;
> +        break;
> +
> +    case VREG32(ARM_SMMU_CR2):
> +        reg32 = smmu->cr[2];
> +        vreg_reg32_update(&reg32, r, info);
> +        smmu->cr[2] = reg32;
> +        break;
> +
> +    case VREG64(ARM_SMMU_STRTAB_BASE):
> +        reg = smmu->strtab_base;
> +        vreg_reg64_update(&reg, r, info);
> +        smmu->strtab_base = reg;
> +        break;
> +
> +    case VREG32(ARM_SMMU_STRTAB_BASE_CFG):
> +        reg32 = smmu->strtab_base_cfg;
> +        vreg_reg32_update(&reg32, r, info);
> +        smmu->strtab_base_cfg = reg32;
> +
> +        smmu->sid_split = FIELD_GET(STRTAB_BASE_CFG_SPLIT, reg32);
> +        smmu->features |= STRTAB_BASE_CFG_FMT_2LVL;
> +        break;
> +
> +    case VREG32(ARM_SMMU_CMDQ_BASE):

I think this needs to be VREG64

> +        reg = smmu->cmdq.q_base;
> +        vreg_reg64_update(&reg, r, info);
> +        smmu->cmdq.q_base = reg;
> +        smmu->cmdq.max_n_shift = FIELD_GET(Q_BASE_LOG2SIZE, 
> smmu->cmdq.q_base);
> +        if ( smmu->cmdq.max_n_shift > SMMU_CMDQS )
> +            smmu->cmdq.max_n_shift = SMMU_CMDQS;
> +        break;
> +
> +    case VREG32(ARM_SMMU_CMDQ_PROD):
> +        reg32 = smmu->cmdq.prod;
> +        vreg_reg32_update(&reg32, r, info);
> +        smmu->cmdq.prod = reg32;
> +        break;
> +
> +    case VREG32(ARM_SMMU_CMDQ_CONS):
> +        reg32 = smmu->cmdq.cons;
> +        vreg_reg32_update(&reg32, r, info);
> +        smmu->cmdq.cons = reg32;
> +        break;
> +
> +    case VREG32(ARM_SMMU_EVTQ_BASE):

And also this one VREG64

> +        reg = smmu->evtq.q_base;
> +        vreg_reg64_update(&reg, r, info);
> +        smmu->evtq.q_base = reg;
> +        smmu->evtq.max_n_shift = FIELD_GET(Q_BASE_LOG2SIZE, 
> smmu->evtq.q_base);
> +        if ( smmu->cmdq.max_n_shift > SMMU_EVTQS )
> +            smmu->cmdq.max_n_shift = SMMU_EVTQS;

This seems a typo, I think here we want to modify the evtq, not the cmdq?
So in case both condition and assignment needs to change.

> +        break;
> +
> +    case VREG32(ARM_SMMU_EVTQ_PROD):
> +        reg32 = smmu->evtq.prod;
> +        vreg_reg32_update(&reg32, r, info);
> +        smmu->evtq.prod = reg32;
> +        break;
> +
> +    case VREG32(ARM_SMMU_EVTQ_CONS):
> +        reg32 = smmu->evtq.cons;
> +        vreg_reg32_update(&reg32, r, info);
> +        smmu->evtq.cons = reg32;
> +        break;
> +
> +    case VREG32(ARM_SMMU_IRQ_CTRL):
> +        reg32 = smmu->irq_ctrl;
> +        vreg_reg32_update(&reg32, r, info);
> +        smmu->irq_ctrl = reg32;
> +        break;
> +
> +    case VREG64(ARM_SMMU_GERROR_IRQ_CFG0):
> +        reg = smmu->gerror_irq_cfg0;
> +        vreg_reg64_update(&reg, r, info);
> +        smmu->gerror_irq_cfg0 = reg;
> +        break;
> +
> +    case VREG64(ARM_SMMU_EVTQ_IRQ_CFG0):
> +        reg = smmu->evtq_irq_cfg0;
> +        vreg_reg64_update(&reg, r, info);
> +        smmu->evtq_irq_cfg0 = reg;
> +        break;
> +
> +    case VREG32(ARM_SMMU_GERRORN):
> +        reg = smmu->gerrorn;
> +        vreg_reg64_update(&reg, r, info);

this should be vreg_reg32_update

> +        smmu->gerrorn = reg;
> +        break;
> +
> +    default:
> +        printk(XENLOG_G_ERR
> +               "%pv: vSMMUv3: unhandled write r%d offset %"PRIpaddr"\n",
> +               v, info->dabt.reg, (unsigned long)info->gpa & 0xffff);
> +        return IO_ABORT;
> +    }
> +
>     return IO_HANDLED;
> }
> 
> static int vsmmuv3_mmio_read(struct vcpu *v, mmio_info_t *info,
>                              register_t *r, void *priv)
> {
> +    struct virt_smmu *smmu = priv;
> +    uint64_t reg;
> +
> +    switch ( info->gpa & 0xffff )
> +    {
> +    case VREG32(ARM_SMMU_IDR0):
> +        reg  = FIELD_PREP(IDR0_S1P, 1) | FIELD_PREP(IDR0_TTF, 2) |
> +            FIELD_PREP(IDR0_COHACC, 0) | FIELD_PREP(IDR0_ASID16, 1) |
> +            FIELD_PREP(IDR0_TTENDIAN, 0) | FIELD_PREP(IDR0_STALL_MODEL, 1) |
> +            FIELD_PREP(IDR0_ST_LVL, 1) | FIELD_PREP(IDR0_TERM_MODEL, 1);
> +        *r = vreg_reg32_extract(reg, info);
> +        break;
> +
> +    case VREG32(ARM_SMMU_IDR1):
> +        reg  = FIELD_PREP(IDR1_SIDSIZE, SMMU_IDR1_SIDSIZE) |
> +            FIELD_PREP(IDR1_CMDQS, SMMU_CMDQS) |
> +            FIELD_PREP(IDR1_EVTQS, SMMU_EVTQS);
> +        *r = vreg_reg32_extract(reg, info);
> +        break;
> +
> +    case VREG32(ARM_SMMU_IDR2):
> +        goto read_reserved;
> +
> +    case VREG32(ARM_SMMU_IDR3):
> +        reg  = FIELD_PREP(IDR3_RIL, 0);
> +        *r = vreg_reg32_extract(reg, info);
> +        break;
> +
> +    case VREG32(ARM_SMMU_IDR4):
> +        goto read_impl_defined;
> +
> +    case VREG32(ARM_SMMU_IDR5):
> +        reg  = FIELD_PREP(IDR5_GRAN4K, 1) | FIELD_PREP(IDR5_GRAN16K, 1) |
> +            FIELD_PREP(IDR5_GRAN64K, 1) | FIELD_PREP(IDR5_OAS, 
> IDR5_OAS_48_BIT);
> +        *r = vreg_reg32_extract(reg, info);
> +        break;
> +
> +    case VREG32(ARM_SMMU_IIDR):
> +        *r = vreg_reg32_extract(ARM_SMMU_IIDR_VAL, info);
> +        break;
> +
> +    case VREG32(ARM_SMMU_CR0):
> +        *r = vreg_reg32_extract(smmu->cr[0], info);
> +        break;
> +
> +    case VREG32(ARM_SMMU_CR0ACK):
> +        *r = vreg_reg32_extract(smmu->cr0ack, info);
> +        break;
> +
> +    case VREG32(ARM_SMMU_CR1):
> +        *r = vreg_reg32_extract(smmu->cr[1], info);
> +        break;
> +
> +    case VREG32(ARM_SMMU_CR2):
> +        *r = vreg_reg32_extract(smmu->cr[2], info);
> +        break;
> +
> +    case VREG32(ARM_SMMU_STRTAB_BASE):

this needs to be VREG64 I think

> +        *r = vreg_reg64_extract(smmu->strtab_base, info);
> +        break;
> +
> +    case VREG32(ARM_SMMU_STRTAB_BASE_CFG):
> +        *r = vreg_reg32_extract(smmu->strtab_base_cfg, info);
> +        break;
> +
> +    case VREG32(ARM_SMMU_CMDQ_BASE):

VREG64

> +        *r = vreg_reg64_extract(smmu->cmdq.q_base, info);
> +        break;
> +
> +    case VREG32(ARM_SMMU_CMDQ_PROD):
> +        *r = vreg_reg32_extract(smmu->cmdq.prod, info);
> +        break;
> +
> +    case VREG32(ARM_SMMU_CMDQ_CONS):
> +        *r = vreg_reg32_extract(smmu->cmdq.cons, info);
> +        break;
> +
> +    case VREG32(ARM_SMMU_EVTQ_BASE):

VREG64

> +        *r = vreg_reg64_extract(smmu->evtq.q_base, info);
> +        break;
> +
> +    case VREG32(ARM_SMMU_EVTQ_PROD):
> +        *r = vreg_reg32_extract(smmu->evtq.prod, info);
> +        break;
> +
> +    case VREG32(ARM_SMMU_EVTQ_CONS):
> +        *r = vreg_reg32_extract(smmu->evtq.cons, info);
> +        break;
> +
> +    case VREG32(ARM_SMMU_IRQ_CTRL):
> +    case VREG32(ARM_SMMU_IRQ_CTRLACK):
> +        *r = vreg_reg32_extract(smmu->irq_ctrl, info);
> +        break;
> +
> +    case VREG64(ARM_SMMU_GERROR_IRQ_CFG0):
> +        *r = vreg_reg64_extract(smmu->gerror_irq_cfg0, info);
> +        break;
> +
> +    case VREG64(ARM_SMMU_EVTQ_IRQ_CFG0):
> +        *r = vreg_reg64_extract(smmu->evtq_irq_cfg0, info);
> +        break;
> +
> +    case VREG32(ARM_SMMU_GERROR):
> +        *r = vreg_reg64_extract(smmu->gerror, info);

vreg_reg32_extract

> +        break;
> +
> +    case VREG32(ARM_SMMU_GERRORN):
> +        *r = vreg_reg64_extract(smmu->gerrorn, info);

vreg_reg32_extract

> +        break;
> +
> +    default:
> +        printk(XENLOG_G_ERR
> +               "%pv: vSMMUv3: unhandled read r%d offset %"PRIpaddr"\n",
> +               v, info->dabt.reg, (unsigned long)info->gpa & 0xffff);
> +        return IO_ABORT;
> +    }
> +
> +    return IO_HANDLED;
> +
> + read_impl_defined:
> +    printk(XENLOG_G_DEBUG
> +           "%pv: vSMMUv3: RAZ on implementation defined register offset 
> %"PRIpaddr"\n",
> +           v, info->gpa & 0xffff);
> +    *r = 0;
> +    return IO_HANDLED;
> +
> + read_reserved:
> +    printk(XENLOG_G_DEBUG
> +           "%pv: vSMMUv3: RAZ on reserved register offset %"PRIpaddr"\n",
> +           v, info->gpa & 0xffff);
> +    *r = 0;
>     return IO_HANDLED;
> }

Cheers,
Luca




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.