]> www.infradead.org Git - users/dwmw2/qemu.git/commitdiff
hw/intc: Make zeroth priority register read-only
authorSergey Makarov <s.makarov@syntacore.com>
Wed, 18 Sep 2024 14:02:28 +0000 (17:02 +0300)
committerAlistair Francis <alistair.francis@wdc.com>
Wed, 30 Oct 2024 01:22:07 +0000 (11:22 +1000)
According to PLIC specification chapter 4, zeroth
priority register is reserved. Discard writes to
this register.

Signed-off-by: Sergey Makarov <s.makarov@syntacore.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Message-ID: <20240918140229.124329-2-s.makarov@syntacore.com>
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
hw/intc/sifive_plic.c

index 7f43e96310ac14b7c2927e9dfd4903b780c95fce..8de3a654bc0f22164f14775bfaf8f37fef7c16b7 100644 (file)
@@ -189,8 +189,13 @@ static void sifive_plic_write(void *opaque, hwaddr addr, uint64_t value,
 
     if (addr_between(addr, plic->priority_base, plic->num_sources << 2)) {
         uint32_t irq = (addr - plic->priority_base) >> 2;
-
-        if (((plic->num_priorities + 1) & plic->num_priorities) == 0) {
+        if (irq == 0) {
+            /* IRQ 0 source prioority is reserved */
+            qemu_log_mask(LOG_GUEST_ERROR,
+                          "%s: Invalid source priority write 0x%"
+                          HWADDR_PRIx "\n", __func__, addr);
+            return;
+        } else if (((plic->num_priorities + 1) & plic->num_priorities) == 0) {
             /*
              * if "num_priorities + 1" is power-of-2, make each register bit of
              * interrupt priority WARL (Write-Any-Read-Legal). Just filter