Module Name: src
Committed By: skrll
Date: Sat Dec 16 18:02:02 UTC 2023
Modified Files:
src/sys/arch/riscv/dev: plic.c
Log Message:
Free memory on failure
To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/riscv/dev/plic.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/riscv/dev/plic.c
diff -u src/sys/arch/riscv/dev/plic.c:1.2 src/sys/arch/riscv/dev/plic.c:1.3
--- src/sys/arch/riscv/dev/plic.c:1.2 Sat Sep 2 09:58:15 2023
+++ src/sys/arch/riscv/dev/plic.c Sat Dec 16 18:02:02 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: plic.c,v 1.2 2023/09/02 09:58:15 skrll Exp $ */
+/* $NetBSD: plic.c,v 1.3 2023/12/16 18:02:02 skrll Exp $ */
/*-
* Copyright (c) 2022 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
#include "opt_multiprocessor.h"
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: plic.c,v 1.2 2023/09/02 09:58:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: plic.c,v 1.3 2023/12/16 18:02:02 skrll Exp $");
#include <sys/param.h>
@@ -190,17 +190,16 @@ plic_set_threshold(struct plic_softc *sc
int
plic_attach_common(struct plic_softc *sc, bus_addr_t addr, bus_size_t size)
{
- struct cpu_info *ci;
- CPU_INFO_ITERATOR cii;
- u_int irq;
+ const size_t szintrs = sizeof(*sc->sc_intr) * sc->sc_ndev;
+ const size_t szintrevs = sizeof(*sc->sc_intrevs) * sc->sc_ndev;
- sc->sc_intr = kmem_zalloc(sizeof(*sc->sc_intr) * sc->sc_ndev,
- KM_SLEEP);
- sc->sc_intrevs = kmem_zalloc(sizeof(*sc->sc_intrevs) * sc->sc_ndev,
- KM_SLEEP);
+ sc->sc_intr = kmem_zalloc(szintrs, KM_SLEEP);
+ sc->sc_intrevs = kmem_zalloc(szintrevs, KM_SLEEP);
if (bus_space_map(sc->sc_bst, addr, size, 0, &sc->sc_bsh) != 0) {
- aprint_error("couldn't map registers\n");
+ aprint_error_dev(sc->sc_dev, "couldn't map registers\n");
+ kmem_free(sc->sc_intr, szintrs);
+ kmem_free(sc->sc_intrevs, szintrevs);
return -1;
}
@@ -210,10 +209,13 @@ plic_attach_common(struct plic_softc *sc
plic_sc = sc;
/* Start with all interrupts disabled. */
+ u_int irq;
for (irq = PLIC_FIRST_IRQ; irq < sc->sc_ndev; irq++) {
plic_set_priority(sc, irq, 0);
}
+ struct cpu_info *ci;
+ CPU_INFO_ITERATOR cii;
/* Set priority thresholds for all interrupts to 0 (not masked). */
for (CPU_INFO_FOREACH(cii, ci)) {
plic_set_threshold(sc, ci->ci_cpuid, 0);