[XEN PATCH v2] misra: address violation of MISRA C Rule 10.1

Dmytro Prokopchuk1 posted 1 patch 3 months, 3 weeks ago
Patches applied successfully (tree, apply log)
git fetch https://gitlab.com/xen-project/patchew/xen tags/patchew/41538b6b19811eb74c183051d3e7a4fd216404e6.1752232902.git.dmytro._5Fprokopchuk1@epam.com
There is a newer version of this series
xen/arch/arm/gic-vgic.c               | 2 +-
xen/common/memory.c                   | 2 +-
xen/common/page_alloc.c               | 6 +++---
xen/common/time.c                     | 2 +-
xen/drivers/passthrough/arm/smmu-v3.c | 2 +-
xen/lib/strtol.c                      | 2 +-
xen/lib/strtoll.c                     | 2 +-
7 files changed, 9 insertions(+), 9 deletions(-)
[XEN PATCH v2] misra: address violation of MISRA C Rule 10.1
Posted by Dmytro Prokopchuk1 3 months, 3 weeks ago
Rule 10.1: Operands shall not be of an
inappropriate essential type

The following are non-compliant:
- unary minus on unsigned type;
- boolean used as a numeric value.

Precede unary '-' operator with casting to signed type.
Replace numeric constant '-1UL' with '~0UL'.
Replace numeric constant '-1ULL' with '~0ULL'.
Replace boolean with numeric value.

Signed-off-by: Dmytro Prokopchuk <dmytro_prokopchuk1@epam.com>
---
Changes since v1:
- changed patch subject prefix
- multiplication replaced with cast
Link to v1: https://patchew.org/Xen/d92cf08a64d8197a1d1a45f901e59183105d3da5.1752183472.git.dmytro._5Fprokopchuk1@epam.com/
---
 xen/arch/arm/gic-vgic.c               | 2 +-
 xen/common/memory.c                   | 2 +-
 xen/common/page_alloc.c               | 6 +++---
 xen/common/time.c                     | 2 +-
 xen/drivers/passthrough/arm/smmu-v3.c | 2 +-
 xen/lib/strtol.c                      | 2 +-
 xen/lib/strtoll.c                     | 2 +-
 7 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/xen/arch/arm/gic-vgic.c b/xen/arch/arm/gic-vgic.c
index ea48c5375a..a35f33c5f2 100644
--- a/xen/arch/arm/gic-vgic.c
+++ b/xen/arch/arm/gic-vgic.c
@@ -17,7 +17,7 @@
 #include <asm/vgic.h>
 
 #define lr_all_full()                                           \
-    (this_cpu(lr_mask) == (-1ULL >> (64 - gic_get_nr_lrs())))
+    (this_cpu(lr_mask) == (~0ULL >> (64 - gic_get_nr_lrs())))
 
 #undef GIC_DEBUG
 
diff --git a/xen/common/memory.c b/xen/common/memory.c
index 46620ed825..0a5b3fab04 100644
--- a/xen/common/memory.c
+++ b/xen/common/memory.c
@@ -773,7 +773,7 @@ static long memory_exchange(XEN_GUEST_HANDLE_PARAM(xen_memory_exchange_t) arg)
 
                 nrspin_lock(&d->page_alloc_lock);
                 drop_dom_ref = (dec_count &&
-                                !domain_adjust_tot_pages(d, -dec_count));
+                                !domain_adjust_tot_pages(d, -(long)dec_count));
                 nrspin_unlock(&d->page_alloc_lock);
 
                 if ( drop_dom_ref )
diff --git a/xen/common/page_alloc.c b/xen/common/page_alloc.c
index 8f93a4c354..da8dddf934 100644
--- a/xen/common/page_alloc.c
+++ b/xen/common/page_alloc.c
@@ -691,7 +691,7 @@ size_param("low_mem_virq_limit", opt_low_mem_virq);
 /* Thresholds to control hysteresis. In pages */
 /* When memory grows above this threshold, reset hysteresis.
  * -1 initially to not reset until at least one virq issued. */
-static unsigned long low_mem_virq_high      = -1UL;
+static unsigned long low_mem_virq_high      = ~0UL;
 /* Threshold at which we issue virq */
 static unsigned long low_mem_virq_th        = 0;
 /* Original threshold after all checks completed */
@@ -710,7 +710,7 @@ static void __init setup_low_mem_virq(void)
      * to ever trigger. */
     if ( opt_low_mem_virq == 0 )
     {
-        low_mem_virq_th = -1UL;
+        low_mem_virq_th = ~0UL;
         return;
     }
 
@@ -778,7 +778,7 @@ static void check_low_mem_virq(void)
         low_mem_virq_th_order++;
         low_mem_virq_th = 1UL << low_mem_virq_th_order;
         if ( low_mem_virq_th == low_mem_virq_orig )
-            low_mem_virq_high = -1UL;
+            low_mem_virq_high = ~0UL;
         else
             low_mem_virq_high = 1UL << (low_mem_virq_th_order + 2);
     }
diff --git a/xen/common/time.c b/xen/common/time.c
index 92f7b72464..980dddee28 100644
--- a/xen/common/time.c
+++ b/xen/common/time.c
@@ -84,7 +84,7 @@ struct tm gmtime(unsigned long t)
     }
     tbuf.tm_year = y - 1900;
     tbuf.tm_yday = days;
-    ip = (const unsigned short int *)__mon_lengths[__isleap(y)];
+    ip = (const unsigned short int *)__mon_lengths[__isleap(y) ? 1 : 0];
     for ( y = 0; days >= ip[y]; ++y )
         days -= ip[y];
     tbuf.tm_mon = y;
diff --git a/xen/drivers/passthrough/arm/smmu-v3.c b/xen/drivers/passthrough/arm/smmu-v3.c
index df16235057..4058b18f2c 100644
--- a/xen/drivers/passthrough/arm/smmu-v3.c
+++ b/xen/drivers/passthrough/arm/smmu-v3.c
@@ -315,7 +315,7 @@ static int queue_poll_cons(struct arm_smmu_queue *q, bool sync, bool wfe)
 
 	while (queue_sync_cons_in(q),
 	      (sync ? !queue_empty(&q->llq) : queue_full(&q->llq))) {
-		if ((NOW() > timeout) > 0)
+		if (NOW() > timeout)
 			return -ETIMEDOUT;
 
 		if (wfe) {
diff --git a/xen/lib/strtol.c b/xen/lib/strtol.c
index 30dca779cf..c68d133657 100644
--- a/xen/lib/strtol.c
+++ b/xen/lib/strtol.c
@@ -13,7 +13,7 @@
 long simple_strtol(const char *cp, const char **endp, unsigned int base)
 {
     if ( *cp == '-' )
-        return -simple_strtoul(cp + 1, endp, base);
+        return -(long)simple_strtoul(cp + 1, endp, base);
     return simple_strtoul(cp, endp, base);
 }
 
diff --git a/xen/lib/strtoll.c b/xen/lib/strtoll.c
index 5d23fd80e8..6861d55929 100644
--- a/xen/lib/strtoll.c
+++ b/xen/lib/strtoll.c
@@ -13,7 +13,7 @@
 long long simple_strtoll(const char *cp, const char **endp, unsigned int base)
 {
     if ( *cp == '-' )
-        return -simple_strtoull(cp + 1, endp, base);
+        return -(long long)simple_strtoull(cp + 1, endp, base);
     return simple_strtoull(cp, endp, base);
 }
 
-- 
2.43.0
Re: [XEN PATCH v2] misra: address violation of MISRA C Rule 10.1
Posted by Jan Beulich 3 months, 3 weeks ago
On 11.07.2025 13:43, Dmytro Prokopchuk1 wrote:
> --- a/xen/common/memory.c
> +++ b/xen/common/memory.c
> @@ -773,7 +773,7 @@ static long memory_exchange(XEN_GUEST_HANDLE_PARAM(xen_memory_exchange_t) arg)
>  
>                  nrspin_lock(&d->page_alloc_lock);
>                  drop_dom_ref = (dec_count &&
> -                                !domain_adjust_tot_pages(d, -dec_count));
> +                                !domain_adjust_tot_pages(d, -(long)dec_count));

Here and elsewhere I continue to think that we would better avoid casts
in such cases as well, just like we try to minimize their use everywhere
else.

> --- a/xen/common/time.c
> +++ b/xen/common/time.c
> @@ -84,7 +84,7 @@ struct tm gmtime(unsigned long t)
>      }
>      tbuf.tm_year = y - 1900;
>      tbuf.tm_yday = days;
> -    ip = (const unsigned short int *)__mon_lengths[__isleap(y)];
> +    ip = (const unsigned short int *)__mon_lengths[__isleap(y) ? 1 : 0];

If an expression is needed here, I'd suggest to use !!, as we have in
(luckily decreasing) number of places elsewhere. Personally I don't
understand though why a boolean cannot be used as an array index.

> --- a/xen/drivers/passthrough/arm/smmu-v3.c
> +++ b/xen/drivers/passthrough/arm/smmu-v3.c
> @@ -315,7 +315,7 @@ static int queue_poll_cons(struct arm_smmu_queue *q, bool sync, bool wfe)
>  
>  	while (queue_sync_cons_in(q),
>  	      (sync ? !queue_empty(&q->llq) : queue_full(&q->llq))) {
> -		if ((NOW() > timeout) > 0)
> +		if (NOW() > timeout)
>  			return -ETIMEDOUT;

How does this change fit here?

Jan
Re: [XEN PATCH v2] misra: address violation of MISRA C Rule 10.1
Posted by Dmytro Prokopchuk1 3 months, 3 weeks ago

On 7/11/25 15:03, Jan Beulich wrote:
> On 11.07.2025 13:43, Dmytro Prokopchuk1 wrote:
>> --- a/xen/common/memory.c
>> +++ b/xen/common/memory.c
>> @@ -773,7 +773,7 @@ static long memory_exchange(XEN_GUEST_HANDLE_PARAM(xen_memory_exchange_t) arg)
>>   
>>                   nrspin_lock(&d->page_alloc_lock);
>>                   drop_dom_ref = (dec_count &&
>> -                                !domain_adjust_tot_pages(d, -dec_count));
>> +                                !domain_adjust_tot_pages(d, -(long)dec_count));
> 
> Here and elsewhere I continue to think that we would better avoid casts
> in such cases as well, just like we try to minimize their use everywhere
> else.
Got it!

> 
>> --- a/xen/common/time.c
>> +++ b/xen/common/time.c
>> @@ -84,7 +84,7 @@ struct tm gmtime(unsigned long t)
>>       }
>>       tbuf.tm_year = y - 1900;
>>       tbuf.tm_yday = days;
>> -    ip = (const unsigned short int *)__mon_lengths[__isleap(y)];
>> +    ip = (const unsigned short int *)__mon_lengths[__isleap(y) ? 1 : 0];
> 
> If an expression is needed here, I'd suggest to use !!, as we have in
> (luckily decreasing) number of places elsewhere. Personally I don't
> understand though why a boolean cannot be used as an array index.
> 
>> --- a/xen/drivers/passthrough/arm/smmu-v3.c
>> +++ b/xen/drivers/passthrough/arm/smmu-v3.c
>> @@ -315,7 +315,7 @@ static int queue_poll_cons(struct arm_smmu_queue *q, bool sync, bool wfe)
>>   
>>   	while (queue_sync_cons_in(q),
>>   	      (sync ? !queue_empty(&q->llq) : queue_full(&q->llq))) {
>> -		if ((NOW() > timeout) > 0)
>> +		if (NOW() > timeout)
>>   			return -ETIMEDOUT;
> 
> How does this change fit here?
> 
> Jan

if ((NOW() > timeout) > 0)
Result of "(NOW() > timeout)" is Boolean, so we have comparison Boolean 
with Numeric value.
Re: [XEN PATCH v2] misra: address violation of MISRA C Rule 10.1
Posted by Dmytro Prokopchuk1 3 months, 3 weeks ago
Hi All.

In this 2nd version I made changes according to the
https://patchew.org/Xen/d92cf08a64d8197a1d1a45f901e59183105d3da5.1752183472.git.dmytro._5Fprokopchuk1@epam.com/

There are 0 violations on the ARM64 as you can see in the report:
https://saas.eclairit.com:3787/fs/var/local/eclair/xen-project.ecdf/xen-project/people/dimaprkp4k/xen/ECLAIR_normal/fix_10.1_rule/ARM64/10650097988/PROJECT.ecd;/by_service.html#service&kind

Jan mentioned:
"As to the kind of change here - didn't we deviate applying unary minus
to unsigned types?"

Here is that deviation:
https://patchew.org/Xen/7c7b7a09e9d5ac1cc6f93fecacd8065fb6f25324.1745427770.git.victorm.lira@amd.com/
As you can see from report
https://saas.eclairit.com:3787/fs/var/local/eclair/xen-project.ecdf/xen-project/people/dimaprkp4k/xen/ECLAIR_normal/deviate_10.1_rule/ARM64/10648749555/PROJECT.ecd;/by_service.html#service&kind
there are still 2 violations.
And they can be easily fixed.

So, Jan and Stefano,
which approach should we select?

BR, Dmytro.

On 7/11/25 14:43, Dmytro Prokopchuk1 wrote:
> Rule 10.1: Operands shall not be of an
> inappropriate essential type
>
> The following are non-compliant:
> - unary minus on unsigned type;
> - boolean used as a numeric value.
>
> Precede unary '-' operator with casting to signed type.
> Replace numeric constant '-1UL' with '~0UL'.
> Replace numeric constant '-1ULL' with '~0ULL'.
> Replace boolean with numeric value.
>
> Signed-off-by: Dmytro Prokopchuk <dmytro_prokopchuk1@epam.com>
> ---
> Changes since v1:
> - changed patch subject prefix
> - multiplication replaced with cast
> Link to v1: https://patchew.org/Xen/d92cf08a64d8197a1d1a45f901e59183105d3da5.1752183472.git.dmytro._5Fprokopchuk1@epam.com/
> ---
>   xen/arch/arm/gic-vgic.c               | 2 +-
>   xen/common/memory.c                   | 2 +-
>   xen/common/page_alloc.c               | 6 +++---
>   xen/common/time.c                     | 2 +-
>   xen/drivers/passthrough/arm/smmu-v3.c | 2 +-
>   xen/lib/strtol.c                      | 2 +-
>   xen/lib/strtoll.c                     | 2 +-
>   7 files changed, 9 insertions(+), 9 deletions(-)
>
> diff --git a/xen/arch/arm/gic-vgic.c b/xen/arch/arm/gic-vgic.c
> index ea48c5375a..a35f33c5f2 100644
> --- a/xen/arch/arm/gic-vgic.c
> +++ b/xen/arch/arm/gic-vgic.c
> @@ -17,7 +17,7 @@
>   #include <asm/vgic.h>
>
>   #define lr_all_full()                                           \
> -    (this_cpu(lr_mask) == (-1ULL >> (64 - gic_get_nr_lrs())))
> +    (this_cpu(lr_mask) == (~0ULL >> (64 - gic_get_nr_lrs())))
>
>   #undef GIC_DEBUG
>
> diff --git a/xen/common/memory.c b/xen/common/memory.c
> index 46620ed825..0a5b3fab04 100644
> --- a/xen/common/memory.c
> +++ b/xen/common/memory.c
> @@ -773,7 +773,7 @@ static long memory_exchange(XEN_GUEST_HANDLE_PARAM(xen_memory_exchange_t) arg)
>
>                   nrspin_lock(&d->page_alloc_lock);
>                   drop_dom_ref = (dec_count &&
> -                                !domain_adjust_tot_pages(d, -dec_count));
> +                                !domain_adjust_tot_pages(d, -(long)dec_count));
>                   nrspin_unlock(&d->page_alloc_lock);
>
>                   if ( drop_dom_ref )
> diff --git a/xen/common/page_alloc.c b/xen/common/page_alloc.c
> index 8f93a4c354..da8dddf934 100644
> --- a/xen/common/page_alloc.c
> +++ b/xen/common/page_alloc.c
> @@ -691,7 +691,7 @@ size_param("low_mem_virq_limit", opt_low_mem_virq);
>   /* Thresholds to control hysteresis. In pages */
>   /* When memory grows above this threshold, reset hysteresis.
>    * -1 initially to not reset until at least one virq issued. */
> -static unsigned long low_mem_virq_high      = -1UL;
> +static unsigned long low_mem_virq_high      = ~0UL;
>   /* Threshold at which we issue virq */
>   static unsigned long low_mem_virq_th        = 0;
>   /* Original threshold after all checks completed */
> @@ -710,7 +710,7 @@ static void __init setup_low_mem_virq(void)
>        * to ever trigger. */
>       if ( opt_low_mem_virq == 0 )
>       {
> -        low_mem_virq_th = -1UL;
> +        low_mem_virq_th = ~0UL;
>           return;
>       }
>
> @@ -778,7 +778,7 @@ static void check_low_mem_virq(void)
>           low_mem_virq_th_order++;
>           low_mem_virq_th = 1UL << low_mem_virq_th_order;
>           if ( low_mem_virq_th == low_mem_virq_orig )
> -            low_mem_virq_high = -1UL;
> +            low_mem_virq_high = ~0UL;
>           else
>               low_mem_virq_high = 1UL << (low_mem_virq_th_order + 2);
>       }
> diff --git a/xen/common/time.c b/xen/common/time.c
> index 92f7b72464..980dddee28 100644
> --- a/xen/common/time.c
> +++ b/xen/common/time.c
> @@ -84,7 +84,7 @@ struct tm gmtime(unsigned long t)
>       }
>       tbuf.tm_year = y - 1900;
>       tbuf.tm_yday = days;
> -    ip = (const unsigned short int *)__mon_lengths[__isleap(y)];
> +    ip = (const unsigned short int *)__mon_lengths[__isleap(y) ? 1 : 0];
>       for ( y = 0; days >= ip[y]; ++y )
>           days -= ip[y];
>       tbuf.tm_mon = y;
> diff --git a/xen/drivers/passthrough/arm/smmu-v3.c b/xen/drivers/passthrough/arm/smmu-v3.c
> index df16235057..4058b18f2c 100644
> --- a/xen/drivers/passthrough/arm/smmu-v3.c
> +++ b/xen/drivers/passthrough/arm/smmu-v3.c
> @@ -315,7 +315,7 @@ static int queue_poll_cons(struct arm_smmu_queue *q, bool sync, bool wfe)
>
>       while (queue_sync_cons_in(q),
>             (sync ? !queue_empty(&q->llq) : queue_full(&q->llq))) {
> -             if ((NOW() > timeout) > 0)
> +             if (NOW() > timeout)
>                       return -ETIMEDOUT;
>
>               if (wfe) {
> diff --git a/xen/lib/strtol.c b/xen/lib/strtol.c
> index 30dca779cf..c68d133657 100644
> --- a/xen/lib/strtol.c
> +++ b/xen/lib/strtol.c
> @@ -13,7 +13,7 @@
>   long simple_strtol(const char *cp, const char **endp, unsigned int base)
>   {
>       if ( *cp == '-' )
> -        return -simple_strtoul(cp + 1, endp, base);
> +        return -(long)simple_strtoul(cp + 1, endp, base);
>       return simple_strtoul(cp, endp, base);
>   }
>
> diff --git a/xen/lib/strtoll.c b/xen/lib/strtoll.c
> index 5d23fd80e8..6861d55929 100644
> --- a/xen/lib/strtoll.c
> +++ b/xen/lib/strtoll.c
> @@ -13,7 +13,7 @@
>   long long simple_strtoll(const char *cp, const char **endp, unsigned int base)
>   {
>       if ( *cp == '-' )
> -        return -simple_strtoull(cp + 1, endp, base);
> +        return -(long long)simple_strtoull(cp + 1, endp, base);
>       return simple_strtoull(cp, endp, base);
>   }
>
Re: [XEN PATCH v2] misra: address violation of MISRA C Rule 10.1
Posted by Stefano Stabellini 3 months, 2 weeks ago
On Fri, 11 Jul 2025, Dmytro Prokopchuk1 wrote:
> Hi All.
> 
> In this 2nd version I made changes according to the
> https://patchew.org/Xen/d92cf08a64d8197a1d1a45f901e59183105d3da5.1752183472.git.dmytro._5Fprokopchuk1@epam.com/
> 
> There are 0 violations on the ARM64 as you can see in the report:
> https://saas.eclairit.com:3787/fs/var/local/eclair/xen-project.ecdf/xen-project/people/dimaprkp4k/xen/ECLAIR_normal/fix_10.1_rule/ARM64/10650097988/PROJECT.ecd;/by_service.html#service&kind
> 
> Jan mentioned:
> "As to the kind of change here - didn't we deviate applying unary minus
> to unsigned types?"
> 
> Here is that deviation:
> https://patchew.org/Xen/7c7b7a09e9d5ac1cc6f93fecacd8065fb6f25324.1745427770.git.victorm.lira@amd.com/
> As you can see from report
> https://saas.eclairit.com:3787/fs/var/local/eclair/xen-project.ecdf/xen-project/people/dimaprkp4k/xen/ECLAIR_normal/deviate_10.1_rule/ARM64/10648749555/PROJECT.ecd;/by_service.html#service&kind
> there are still 2 violations.
> And they can be easily fixed.
> 
> So, Jan and Stefano,
> which approach should we select?

I think we should go with the global deviation.

Jan, if you look at the code changes on this series, many of them are
undesirable. And the series is only addressing the ARM violations: it is
only going to get worse for x86.

I think we should commit:
https://patchew.org/Xen/7c7b7a09e9d5ac1cc6f93fecacd8065fb6f25324.1745427770.git.victorm.lira@amd.com/

Jan, are you OK with it?
Re: [XEN PATCH v2] misra: address violation of MISRA C Rule 10.1
Posted by Jan Beulich 3 months, 2 weeks ago
On 12.07.2025 00:00, Stefano Stabellini wrote:
> On Fri, 11 Jul 2025, Dmytro Prokopchuk1 wrote:
>> Hi All.
>>
>> In this 2nd version I made changes according to the
>> https://patchew.org/Xen/d92cf08a64d8197a1d1a45f901e59183105d3da5.1752183472.git.dmytro._5Fprokopchuk1@epam.com/
>>
>> There are 0 violations on the ARM64 as you can see in the report:
>> https://saas.eclairit.com:3787/fs/var/local/eclair/xen-project.ecdf/xen-project/people/dimaprkp4k/xen/ECLAIR_normal/fix_10.1_rule/ARM64/10650097988/PROJECT.ecd;/by_service.html#service&kind
>>
>> Jan mentioned:
>> "As to the kind of change here - didn't we deviate applying unary minus
>> to unsigned types?"
>>
>> Here is that deviation:
>> https://patchew.org/Xen/7c7b7a09e9d5ac1cc6f93fecacd8065fb6f25324.1745427770.git.victorm.lira@amd.com/
>> As you can see from report
>> https://saas.eclairit.com:3787/fs/var/local/eclair/xen-project.ecdf/xen-project/people/dimaprkp4k/xen/ECLAIR_normal/deviate_10.1_rule/ARM64/10648749555/PROJECT.ecd;/by_service.html#service&kind
>> there are still 2 violations.
>> And they can be easily fixed.
>>
>> So, Jan and Stefano,
>> which approach should we select?
> 
> I think we should go with the global deviation.
> 
> Jan, if you look at the code changes on this series, many of them are
> undesirable. And the series is only addressing the ARM violations: it is
> only going to get worse for x86.
> 
> I think we should commit:
> https://patchew.org/Xen/7c7b7a09e9d5ac1cc6f93fecacd8065fb6f25324.1745427770.git.victorm.lira@amd.com/
> 
> Jan, are you OK with it?

Well, I did comment on it, and I don't think I saw a re-submission addressing
those comments. But the way I commented I think it has become clear that I
don't object to the deviation, just that some adjustments are needed to the
wording.

Jan
Re: [XEN PATCH v2] misra: address violation of MISRA C Rule 10.1
Posted by Dmytro Prokopchuk1 3 months, 3 weeks ago

On 7/11/25 14:52, Dmytro Prokopchuk wrote:
> Hi All.
> 
> In this 2nd version I made changes according to the
> https://patchew.org/Xen/ 
> d92cf08a64d8197a1d1a45f901e59183105d3da5.1752183472.git.dmytro._5Fprokopchuk1@epam.com/
> 
> There are 0 violations on the ARM64 as you can see in the report:
> https://saas.eclairit.com:3787/fs/var/local/eclair/xen-project.ecdf/xen- 
> project/people/dimaprkp4k/xen/ECLAIR_normal/fix_10.1_rule/ 
> ARM64/10650097988/PROJECT.ecd;/by_service.html#service&kind
> 
> Jan mentioned:
> "As to the kind of change here - didn't we deviate applying unary minus 
> to unsigned types?"
> 
> Here is that deviation:
> https://patchew.org/ 
> Xen/7c7b7a09e9d5ac1cc6f93fecacd8065fb6f25324.1745427770.git.victorm.lira@amd.com/
> As you can see from report
> https://saas.eclairit.com:3787/fs/var/local/eclair/xen-project.ecdf/xen- 
> project/people/dimaprkp4k/xen/ECLAIR_normal/deviate_10.1_rule/ 
> ARM64/10648749555/PROJECT.ecd;/by_service.html#service&kind
> there are still 2 violations.
> And they can be easily fixed.
> 
> So, Jan and Stefano,
> which approach should we select?

 From the other hands deviation reduces number of violations on x86 from 
170 to 83.

https://saas.eclairit.com:3787/fs/var/local/eclair/xen-project.ecdf/xen-project/people/dimaprkp4k/xen/ECLAIR_normal/fix_10.1_rule/X86_64/10650119508/PROJECT.ecd;/by_service.html#service&kind

https://saas.eclairit.com:3787/fs/var/local/eclair/xen-project.ecdf/xen-project/people/dimaprkp4k/xen/ECLAIR_normal/deviate_10.1_rule/X86_64/10650467651/PROJECT.ecd;/by_service.html#service&kind

> 
> BR, Dmytro.
> 
> On 7/11/25 14:43, Dmytro Prokopchuk1 wrote:
>> Rule 10.1: Operands shall not be of an
>> inappropriate essential type
>>
>> The following are non-compliant:
>> - unary minus on unsigned type;
>> - boolean used as a numeric value.
>>
>> Precede unary '-' operator with casting to signed type.
>> Replace numeric constant '-1UL' with '~0UL'.
>> Replace numeric constant '-1ULL' with '~0ULL'.
>> Replace boolean with numeric value.
>>
>> Signed-off-by: Dmytro Prokopchuk <dmytro_prokopchuk1@epam.com>
>> ---
>> Changes since v1:
>> - changed patch subject prefix
>> - multiplication replaced with cast
>> Link to v1: https://eur01.safelinks.protection.outlook.com/? 
>> url=https%3A%2F%2Fpatchew.org%2FXen%2Fd92cf08a64d8197a1d1a45f901e59183105d3da5.1752183472.git.dmytro._5Fprokopchuk1%40epam.com%2F&data=05%7C02%7Cdmytro_prokopchuk1%40epam.com%7C42e7c8ad636c47fb5b6b08ddc0701e86%7Cb41b72d04e9f4c268a69f949f367c91d%7C1%7C0%7C638878309987993462%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&sdata=bOqJU%2BVjT4wsu4z20vlHIucpaLhYa4AIvQKNmGjRcXc%3D&reserved=0
>> ---
>>   xen/arch/arm/gic-vgic.c               | 2 +-
>>   xen/common/memory.c                   | 2 +-
>>   xen/common/page_alloc.c               | 6 +++---
>>   xen/common/time.c                     | 2 +-
>>   xen/drivers/passthrough/arm/smmu-v3.c | 2 +-
>>   xen/lib/strtol.c                      | 2 +-
>>   xen/lib/strtoll.c                     | 2 +-
>>   7 files changed, 9 insertions(+), 9 deletions(-)
>>
>> diff --git a/xen/arch/arm/gic-vgic.c b/xen/arch/arm/gic-vgic.c
>> index ea48c5375a..a35f33c5f2 100644
>> --- a/xen/arch/arm/gic-vgic.c
>> +++ b/xen/arch/arm/gic-vgic.c
>> @@ -17,7 +17,7 @@
>>   #include <asm/vgic.h>
>>   #define lr_all_full()                                           \
>> -    (this_cpu(lr_mask) == (-1ULL >> (64 - gic_get_nr_lrs())))
>> +    (this_cpu(lr_mask) == (~0ULL >> (64 - gic_get_nr_lrs())))
>>   #undef GIC_DEBUG
>> diff --git a/xen/common/memory.c b/xen/common/memory.c
>> index 46620ed825..0a5b3fab04 100644
>> --- a/xen/common/memory.c
>> +++ b/xen/common/memory.c
>> @@ -773,7 +773,7 @@ static long 
>> memory_exchange(XEN_GUEST_HANDLE_PARAM(xen_memory_exchange_t) arg)
>>                   nrspin_lock(&d->page_alloc_lock);
>>                   drop_dom_ref = (dec_count &&
>> -                                !domain_adjust_tot_pages(d, - 
>> dec_count));
>> +                                !domain_adjust_tot_pages(d, - 
>> (long)dec_count));
>>                   nrspin_unlock(&d->page_alloc_lock);
>>                   if ( drop_dom_ref )
>> diff --git a/xen/common/page_alloc.c b/xen/common/page_alloc.c
>> index 8f93a4c354..da8dddf934 100644
>> --- a/xen/common/page_alloc.c
>> +++ b/xen/common/page_alloc.c
>> @@ -691,7 +691,7 @@ size_param("low_mem_virq_limit", opt_low_mem_virq);
>>   /* Thresholds to control hysteresis. In pages */
>>   /* When memory grows above this threshold, reset hysteresis.
>>    * -1 initially to not reset until at least one virq issued. */
>> -static unsigned long low_mem_virq_high      = -1UL;
>> +static unsigned long low_mem_virq_high      = ~0UL;
>>   /* Threshold at which we issue virq */
>>   static unsigned long low_mem_virq_th        = 0;
>>   /* Original threshold after all checks completed */
>> @@ -710,7 +710,7 @@ static void __init setup_low_mem_virq(void)
>>        * to ever trigger. */
>>       if ( opt_low_mem_virq == 0 )
>>       {
>> -        low_mem_virq_th = -1UL;
>> +        low_mem_virq_th = ~0UL;
>>           return;
>>       }
>> @@ -778,7 +778,7 @@ static void check_low_mem_virq(void)
>>           low_mem_virq_th_order++;
>>           low_mem_virq_th = 1UL << low_mem_virq_th_order;
>>           if ( low_mem_virq_th == low_mem_virq_orig )
>> -            low_mem_virq_high = -1UL;
>> +            low_mem_virq_high = ~0UL;
>>           else
>>               low_mem_virq_high = 1UL << (low_mem_virq_th_order + 2);
>>       }
>> diff --git a/xen/common/time.c b/xen/common/time.c
>> index 92f7b72464..980dddee28 100644
>> --- a/xen/common/time.c
>> +++ b/xen/common/time.c
>> @@ -84,7 +84,7 @@ struct tm gmtime(unsigned long t)
>>       }
>>       tbuf.tm_year = y - 1900;
>>       tbuf.tm_yday = days;
>> -    ip = (const unsigned short int *)__mon_lengths[__isleap(y)];
>> +    ip = (const unsigned short int *)__mon_lengths[__isleap(y) ? 1 : 0];
>>       for ( y = 0; days >= ip[y]; ++y )
>>           days -= ip[y];
>>       tbuf.tm_mon = y;
>> diff --git a/xen/drivers/passthrough/arm/smmu-v3.c b/xen/drivers/ 
>> passthrough/arm/smmu-v3.c
>> index df16235057..4058b18f2c 100644
>> --- a/xen/drivers/passthrough/arm/smmu-v3.c
>> +++ b/xen/drivers/passthrough/arm/smmu-v3.c
>> @@ -315,7 +315,7 @@ static int queue_poll_cons(struct arm_smmu_queue 
>> *q, bool sync, bool wfe)
>>       while (queue_sync_cons_in(q),
>>             (sync ? !queue_empty(&q->llq) : queue_full(&q->llq))) {
>> -        if ((NOW() > timeout) > 0)
>> +        if (NOW() > timeout)
>>               return -ETIMEDOUT;
>>           if (wfe) {
>> diff --git a/xen/lib/strtol.c b/xen/lib/strtol.c
>> index 30dca779cf..c68d133657 100644
>> --- a/xen/lib/strtol.c
>> +++ b/xen/lib/strtol.c
>> @@ -13,7 +13,7 @@
>>   long simple_strtol(const char *cp, const char **endp, unsigned int 
>> base)
>>   {
>>       if ( *cp == '-' )
>> -        return -simple_strtoul(cp + 1, endp, base);
>> +        return -(long)simple_strtoul(cp + 1, endp, base);
>>       return simple_strtoul(cp, endp, base);
>>   }
>> diff --git a/xen/lib/strtoll.c b/xen/lib/strtoll.c
>> index 5d23fd80e8..6861d55929 100644
>> --- a/xen/lib/strtoll.c
>> +++ b/xen/lib/strtoll.c
>> @@ -13,7 +13,7 @@
>>   long long simple_strtoll(const char *cp, const char **endp, unsigned 
>> int base)
>>   {
>>       if ( *cp == '-' )
>> -        return -simple_strtoull(cp + 1, endp, base);
>> +        return -(long long)simple_strtoull(cp + 1, endp, base);
>>       return simple_strtoull(cp, endp, base);
>>   }