Skip to content

Commit f75e07b

Browse files
zampierilucasKAGA-KOKO
authored andcommitted
irqchip/sifive-plic: Avoid interrupt ID 0 handling during suspend/resume
According to the PLIC specification[1], global interrupt sources are assigned small unsigned integer identifiers beginning at the value 1. An interrupt ID of 0 is reserved to mean "no interrupt". The current plic_irq_resume() and plic_irq_suspend() functions incorrectly start the loop from index 0, which accesses the register space for the reserved interrupt ID 0. Change the loop to start from index 1, skipping the reserved interrupt ID 0 as per the PLIC specification. This prevents potential undefined behavior when accessing the reserved register space during suspend/resume cycles. Fixes: e80f0b6 ("irqchip/irq-sifive-plic: Add syscore callbacks for hibernation") Co-developed-by: Jia Wang <[email protected]> Signed-off-by: Jia Wang <[email protected]> Co-developed-by: Charles Mirabile <[email protected]> Signed-off-by: Charles Mirabile <[email protected]> Signed-off-by: Lucas Zampieri <[email protected]> Signed-off-by: Thomas Gleixner <[email protected]> Link: https://github.com/riscv/riscv-plic-spec/releases/tag/1.0.0
1 parent 196754c commit f75e07b

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

drivers/irqchip/irq-sifive-plic.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,8 @@ static int plic_irq_suspend(void)
254254

255255
priv = per_cpu_ptr(&plic_handlers, smp_processor_id())->priv;
256256

257-
for (i = 0; i < priv->nr_irqs; i++) {
257+
/* irq ID 0 is reserved */
258+
for (i = 1; i < priv->nr_irqs; i++) {
258259
__assign_bit(i, priv->prio_save,
259260
readl(priv->regs + PRIORITY_BASE + i * PRIORITY_PER_ID));
260261
}
@@ -285,7 +286,8 @@ static void plic_irq_resume(void)
285286

286287
priv = per_cpu_ptr(&plic_handlers, smp_processor_id())->priv;
287288

288-
for (i = 0; i < priv->nr_irqs; i++) {
289+
/* irq ID 0 is reserved */
290+
for (i = 1; i < priv->nr_irqs; i++) {
289291
index = BIT_WORD(i);
290292
writel((priv->prio_save[index] & BIT_MASK(i)) ? 1 : 0,
291293
priv->regs + PRIORITY_BASE + i * PRIORITY_PER_ID);

0 commit comments

Comments
 (0)