c988de4119
Coverity pointed out a memory leak in riscv_sifive_e_soc_realize(),
where a pair of recently added MemoryRegion instances would not be freed
if there were errors elsewhere in the function. The fix here is to
simply not use dynamic allocation for these instances: there's always
one of each in SiFiveESoCState, so instead we just include them within
the struct.
Fixes: 30efbf330a
("SiFive RISC-V GPIO Device")
Signed-off-by: Palmer Dabbelt <palmer@sifive.com>
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
93 lines
2.3 KiB
C
93 lines
2.3 KiB
C
/*
|
|
* SiFive E series machine interface
|
|
*
|
|
* Copyright (c) 2017 SiFive, Inc.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms and conditions of the GNU General Public License,
|
|
* version 2 or later, as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
* more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along with
|
|
* this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef HW_SIFIVE_E_H
|
|
#define HW_SIFIVE_E_H
|
|
|
|
#include "hw/riscv/sifive_gpio.h"
|
|
|
|
#define TYPE_RISCV_E_SOC "riscv.sifive.e.soc"
|
|
#define RISCV_E_SOC(obj) \
|
|
OBJECT_CHECK(SiFiveESoCState, (obj), TYPE_RISCV_E_SOC)
|
|
|
|
typedef struct SiFiveESoCState {
|
|
/*< private >*/
|
|
SysBusDevice parent_obj;
|
|
|
|
/*< public >*/
|
|
RISCVHartArrayState cpus;
|
|
DeviceState *plic;
|
|
SIFIVEGPIOState gpio;
|
|
MemoryRegion xip_mem;
|
|
MemoryRegion mask_rom;
|
|
} SiFiveESoCState;
|
|
|
|
typedef struct SiFiveEState {
|
|
/*< private >*/
|
|
SysBusDevice parent_obj;
|
|
|
|
/*< public >*/
|
|
SiFiveESoCState soc;
|
|
} SiFiveEState;
|
|
|
|
enum {
|
|
SIFIVE_E_DEBUG,
|
|
SIFIVE_E_MROM,
|
|
SIFIVE_E_OTP,
|
|
SIFIVE_E_CLINT,
|
|
SIFIVE_E_PLIC,
|
|
SIFIVE_E_AON,
|
|
SIFIVE_E_PRCI,
|
|
SIFIVE_E_OTP_CTRL,
|
|
SIFIVE_E_GPIO0,
|
|
SIFIVE_E_UART0,
|
|
SIFIVE_E_QSPI0,
|
|
SIFIVE_E_PWM0,
|
|
SIFIVE_E_UART1,
|
|
SIFIVE_E_QSPI1,
|
|
SIFIVE_E_PWM1,
|
|
SIFIVE_E_QSPI2,
|
|
SIFIVE_E_PWM2,
|
|
SIFIVE_E_XIP,
|
|
SIFIVE_E_DTIM
|
|
};
|
|
|
|
enum {
|
|
SIFIVE_E_UART0_IRQ = 3,
|
|
SIFIVE_E_UART1_IRQ = 4,
|
|
SIFIVE_E_GPIO0_IRQ0 = 8
|
|
};
|
|
|
|
#define SIFIVE_E_PLIC_HART_CONFIG "M"
|
|
#define SIFIVE_E_PLIC_NUM_SOURCES 127
|
|
#define SIFIVE_E_PLIC_NUM_PRIORITIES 7
|
|
#define SIFIVE_E_PLIC_PRIORITY_BASE 0x04
|
|
#define SIFIVE_E_PLIC_PENDING_BASE 0x1000
|
|
#define SIFIVE_E_PLIC_ENABLE_BASE 0x2000
|
|
#define SIFIVE_E_PLIC_ENABLE_STRIDE 0x80
|
|
#define SIFIVE_E_PLIC_CONTEXT_BASE 0x200000
|
|
#define SIFIVE_E_PLIC_CONTEXT_STRIDE 0x1000
|
|
|
|
#if defined(TARGET_RISCV32)
|
|
#define SIFIVE_E_CPU TYPE_RISCV_CPU_SIFIVE_E31
|
|
#elif defined(TARGET_RISCV64)
|
|
#define SIFIVE_E_CPU TYPE_RISCV_CPU_SIFIVE_E51
|
|
#endif
|
|
|
|
#endif
|