Commit 49ee001a5b for qemu.org

commit 49ee001a5b8378e9a9b3db8cbf61e7eda970ecd2
Author: Yao Zi <me@ziyao.cc>
Date:   Wed Jan 14 15:25:13 2026 +0800

    hw/loongarch/virt: Don't abort on access to unimplemented IOCSR

    Since commit f2e61edb2946 ("hw/loongarch/virt: Use MemTxAttrs interface
    for misc ops") which adds a call to g_assert_not_reached() in the path
    of handling unimplemented IOCSRs, QEMU would abort when the guest
    accesses unimplemented IOCSRs.

    This is too serious since there's nothing fatal happening in QEMU
    itself, and the guest could probably continue running if we give zero as
    result for these reads, which also matches the behavior observed on
    3A5000M real machine.

    Replace the assertion with qemu_log_mask(LOG_UNIMP, ...), it's still
    possible to examine unimplemented IOCSR access through "-d unimp"
    command line arguments.

    Fixes: f2e61edb2946 ("hw/loongarch/virt: Use MemTxAttrs interface for misc ops")
    Signed-off-by: Yao Zi <me@ziyao.cc>
    Signed-off-by: Bibo Mao <maobibo@loongson.cn>
    Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
    Reviewed-by: Bibo Mao <maobibo@loongson.cn>

diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
index 7c13881885..a75968e4c9 100644
--- a/hw/loongarch/virt.c
+++ b/hw/loongarch/virt.c
@@ -47,6 +47,7 @@
 #include "hw/block/flash.h"
 #include "hw/virtio/virtio-iommu.h"
 #include "qemu/error-report.h"
+#include "qemu/log.h"
 #include "kvm/kvm_loongarch.h"

 static void virt_get_dmsi(Object *obj, Visitor *v, const char *name,
@@ -754,8 +755,15 @@ static MemTxResult virt_iocsr_misc_write(void *opaque, hwaddr addr,
                              EXTIOI_VIRT_BASE + EXTIOI_VIRT_CONFIG,
                              features, attrs, NULL);
         break;
+    case VERSION_REG:
+    case FEATURE_REG:
+    case VENDOR_REG:
+    case CPUNAME_REG:
+        break;
     default:
-        g_assert_not_reached();
+        qemu_log_mask(LOG_UNIMP, "%s: Unimplemented IOCSR 0x%" HWADDR_PRIx "\n",
+                      __func__, addr);
+        break;
     }

     return MEMTX_OK;
@@ -813,7 +821,9 @@ static MemTxResult virt_iocsr_misc_read(void *opaque, hwaddr addr,
         }
         break;
     default:
-        g_assert_not_reached();
+        qemu_log_mask(LOG_UNIMP, "%s: Unimplemented IOCSR 0x%" HWADDR_PRIx "\n",
+                      __func__, addr);
+        break;
     }

     *data = ret;