qemu-devel
[Top][All Lists]
Advanced

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

Re: [PATCH v3 2/5] hw/intc/loongarch_pch_pic: Fix bugs for update_irq fu


From: Richard Henderson
Subject: Re: [PATCH v3 2/5] hw/intc/loongarch_pch_pic: Fix bugs for update_irq function
Date: Tue, 19 Jul 2022 11:04:39 +0530
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.9.1

On 7/15/22 11:37, Xiaojuan Yang wrote:
Fix such errors:
1. We should not use 'unsigned long' type as argument when we use
find_first_bit(), and we use ctz64() to replace find_first_bit()
to fix this bug.
2. It is not standard to use '1ULL << irq' to generate a irq mask.
So, we replace it with 'MAKE_64BIT_MASK(irq, 1)'.

Fix coverity CID: 1489761 1489764 1489765

Signed-off-by: Xiaojuan Yang <yangxiaojuan@loongson.cn>
---
  hw/intc/loongarch_pch_pic.c | 18 +++++++++++-------
  1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/hw/intc/loongarch_pch_pic.c b/hw/intc/loongarch_pch_pic.c
index 3c9814a3b4..8fa64d2030 100644
--- a/hw/intc/loongarch_pch_pic.c
+++ b/hw/intc/loongarch_pch_pic.c
@@ -15,22 +15,26 @@
static void pch_pic_update_irq(LoongArchPCHPIC *s, uint64_t mask, int level)
  {
-    unsigned long val;
+    uint64_t val;
      int irq;
if (level) {
          val = mask & s->intirr & ~s->int_mask;
          if (val) {
-            irq = find_first_bit(&val, 64);
-            s->intisr |= 0x1ULL << irq;
-            qemu_set_irq(s->parent_irq[s->htmsi_vector[irq]], 1);
+            irq = ctz64(val);
+            if (irq < 64) {

This test is always true, provable by the val != 0 test just above.


r~

+                s->intisr |= MAKE_64BIT_MASK(irq, 1);
+                qemu_set_irq(s->parent_irq[s->htmsi_vector[irq]], 1);
+            }
          }
      } else {
          val = mask & s->intisr;
          if (val) {
-            irq = find_first_bit(&val, 64);
-            s->intisr &= ~(0x1ULL << irq);
-            qemu_set_irq(s->parent_irq[s->htmsi_vector[irq]], 0);
+            irq = ctz64(val);
+            if (irq < 64) {
+                s->intisr &= ~(MAKE_64BIT_MASK(irq, 1));
+                qemu_set_irq(s->parent_irq[s->htmsi_vector[irq]], 0);
+            }
          }
      }
  }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]