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

Re: [PATCH v2] arm/gicv3: Decode cacheability fields before comparing


  • To: Mykola Kvach <xakep.amatop@xxxxxxxxx>, <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: "Orzel, Michal" <michal.orzel@xxxxxxx>
  • Date: Mon, 13 Apr 2026 11:28:31 +0200
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=gmail.com smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0)
  • 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=oDc4jlx/byKWJZIdOHsPmUYlHd6aYeOMBI//7TUKHho=; b=Vdgg8neBD6ABxp2u703QMkl7iYDW280ZHxsNAbuXiI5QMkrOXL2rf83xX3CP6S2e2w63cP5bk4VN0Ui42IBpmhPW6asv5fMPI409Gdw+i/K2Qs6pNWr8+Lc8BT+a9fqT8XMYyAOJx9zeDQiISyeFgDYKFFTC/+F81eMHpexF9fzgwHrGoYlkZgpEzXg9CVUGnafO2BjhYsQSe1imTFGIXB/tIkCTgJyceoUC2GZ8v1breCnhxwCGMz5QEqIVLkdf4GRdUXgQD/p1D6kwVZYz/J0S58lnBqwudLEITq8nA2YRt1CAn/AC6oFYX5mqUgku+JIFR3O1Hg1vbIWIjWjHxQ==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=o33ikn9K0N++3sd/4gZcJlSG+FgIe+4grtWp3idkhgWNxVSvJVQU8Q9+t7eUf79y3BAYYvoQ74JEopMSK+eTqRj3NkLnNnfki5yGekOfMYxND3gJO4E92T76IywD31ehB8fgTNCT+k7JhY3xRSyWoSkdiGmjsFCXnw8g0RE4UZb5GS05YEUZhezy+gpYhxU44DlJGI9yAP89YK1n0gvx+Yyt7J/gx6YwWJfFT+MWeBmbhUfTlAlmc9Zj128LHSdEVz9KVH3mfs0kadZhzWnFdrqTmkFvNMYsRO2fFB2de/Qn/3zDYupEh4/yTQNXLcxJBAhMcFVWvmb0EPo6Jqzsug==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=amd.com header.i="@amd.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck"
  • Cc: Mykola Kvach <mykola_kvach@xxxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Julien Grall <julien@xxxxxxx>, Bertrand Marquis <bertrand.marquis@xxxxxxx>, Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx>, Mykyta Poturai <mykyta_poturai@xxxxxxxx>
  • Delivery-date: Mon, 13 Apr 2026 09:28:59 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>


On 10/04/2026 19:34, Mykola Kvach wrote:
> From: Mykola Kvach <mykola_kvach@xxxxxxxx>
> 
> GITS_BASER_INNER_CACHEABILITY_MASK and
> GICR_PROPBASER_INNER_CACHEABILITY_MASK are shifted masks. Comparing the
> masked but unshifted values against GIC_BASER_CACHE_nC, which is an
> unshifted enum value, leads to incorrect detection of non-cacheable
> GITS_CBASER command queue, GITS_BASER tables, and GICR_PROPBASER
> mappings.
> 
> Use MASK_EXTR() to decode these cacheability fields before comparing
> against GIC_BASER_CACHE_nC, so the backing memory is flushed when
> required.
> 
> Fixes: 8ed8d21373be ("ARM: GICv3 ITS: map ITS command buffer")
> Fixes: 05238012b86d ("ARM: GICv3 ITS: allocate device and collection table")
> Fixes: c9b939863c89 ("ARM: GICv3: allocate LPI pending and property table")
> Signed-off-by: Mykyta Poturai <mykyta_poturai@xxxxxxxx>
> Signed-off-by: Mykola Kvach <mykola_kvach@xxxxxxxx>
> ---
> Changes in v2:
> - use MASK_EXTR() instead of open-coding the BASER field shift
> - fix the analogous PROPBASER cacheability comparison in
>   gicv3_lpi_set_proptable()
> - fix the CBASER command queue cacheability check as well
> ---
>  xen/arch/arm/gic-v3-its.c | 6 ++++--
>  xen/arch/arm/gic-v3-lpi.c | 3 ++-
>  2 files changed, 6 insertions(+), 3 deletions(-)
> 
> diff --git a/xen/arch/arm/gic-v3-its.c b/xen/arch/arm/gic-v3-its.c
> index 9ba068c46f..e87465d2ff 100644
> --- a/xen/arch/arm/gic-v3-its.c
> +++ b/xen/arch/arm/gic-v3-its.c
> @@ -424,7 +424,8 @@ static void *its_map_cbaser(struct host_its *its)
>       * If the command queue memory is mapped as uncached, we need to flush
>       * it on every access.
>       */
> -    if ( !(reg & GITS_BASER_INNER_CACHEABILITY_MASK) )
You don't seem to mention this change. This one does not compare to
GIC_BASER_CACHE_nC and checks against 0, which means we are on the safe side. If
you still want to change it, then you should also look few lines above where we
have:
if ( (reg & GITS_BASER_SHAREABILITY_MASK) == 0 )

> +    if ( MASK_EXTR(reg, GITS_BASER_INNER_CACHEABILITY_MASK) <=
> +         GIC_BASER_CACHE_nC )
This is a functional change. Previously we where comparing against 0 and now you
compare against <= 1

~Michal

>      {
>          its->flags |= HOST_ITS_FLUSH_CMD_QUEUE;
>          printk(XENLOG_WARNING "using non-cacheable ITS command queue\n");
> @@ -496,7 +497,8 @@ retry:
>          }
>          attr = regc & BASER_ATTR_MASK;
>      }
> -    if ( (regc & GITS_BASER_INNER_CACHEABILITY_MASK) <= GIC_BASER_CACHE_nC )
> +    if ( MASK_EXTR(regc, GITS_BASER_INNER_CACHEABILITY_MASK) <=
> +         GIC_BASER_CACHE_nC )
>          clean_and_invalidate_dcache_va_range(buffer, table_size);
>  
>      /* If the host accepted our page size, we are done. */
> diff --git a/xen/arch/arm/gic-v3-lpi.c b/xen/arch/arm/gic-v3-lpi.c
> index de5052e5cf..9ee338edc2 100644
> --- a/xen/arch/arm/gic-v3-lpi.c
> +++ b/xen/arch/arm/gic-v3-lpi.c
> @@ -351,7 +351,8 @@ static int gicv3_lpi_set_proptable(void __iomem * 
> rdist_base)
>      }
>  
>      /* Remember that we have to flush the property table if non-cacheable. */
> -    if ( (reg & GICR_PROPBASER_INNER_CACHEABILITY_MASK) <= 
> GIC_BASER_CACHE_nC )
> +    if ( MASK_EXTR(reg, GICR_PROPBASER_INNER_CACHEABILITY_MASK) <=
> +         GIC_BASER_CACHE_nC )
>      {
>          lpi_data.flags |= LPI_PROPTABLE_NEEDS_FLUSHING;
>          /* Update the redistributors knowledge about the attributes. */




 


Rackspace

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