qemu-devel
[Top][All Lists]
Advanced

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

Re: [RFC PATCH v7 16/29] hw/loongarch: Add LoongArch ipi interrupt suppo


From: Richard Henderson
Subject: Re: [RFC PATCH v7 16/29] hw/loongarch: Add LoongArch ipi interrupt support(IPI)
Date: Mon, 28 Mar 2022 16:04:01 -0600
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.7.0

On 3/28/22 06:57, Xiaojuan Yang wrote:
+static void loongarch_ipi_writel(void *opaque, hwaddr addr, uint64_t val,
+                                 unsigned size)
+{
+    IPICore *s = opaque;
+    int index = 0;
+
+    addr &= 0xff;
+    trace_loongarch_ipi_write(size, (uint64_t)addr, val);
+    switch (addr) {
+    case CORE_STATUS_OFF:
+        qemu_log_mask(LOG_GUEST_ERROR, "can not be written");
+        break;
+    case CORE_EN_OFF:
+        s->en = val;
+        break;

Changes to s->en should affect irq.

+    case CORE_SET_OFF:
+        s->status |= val;
+        if (s->status != 0) {
+            qemu_irq_raise(s->irq);
+        }

I think s->en should be taken into account when raising irq.

+        break;
+    case CORE_CLEAR_OFF:
+        s->status ^= val;

Incorrect: status &= ~val.

+        if (s->status == 0) {
+            qemu_irq_lower(s->irq);
+        }

Likewise, s->en.

+        break;
+    case CORE_BUF_20 ... CORE_BUF_38 + 4:
+        index = (addr - CORE_BUF_20) >> 2;
+        s->buf[index] = val;
+        break;
+    case IOCSR_IPI_SEND:
+        s->status |= val;

I can't see where this comes from, but helper_iocsr_write is very confusing. It *appears* as if this is never invoked, because IPI_SEND is handled directly in helper_iocsr_write (which also seems wrong).


r~



reply via email to

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