pmp.h is only needed and included for system mode, however relevant macros (MAX_RISCV_PMPS, OLD_MAX_RISCV_PMPS, MIN_RISCV_PMP_GRANULARITY) are required unconditionally by cpu.c, and so are defined in cpu.h. pmp.h then defines pmp_table_t depending on these macros and so requires cpu.h, and cpu.h in turn uses pmp_table_t resulting in circular inclusion.
Move PMP macros to pmp.h and only exose PMP properties in system mode. Signed-off-by: Anton Johansson <[email protected]> --- target/riscv/cpu.h | 4 ---- target/riscv/pmp.h | 4 +++- target/riscv/cpu.c | 6 ++++++ 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h index ad5d23ee6b..4bd24c15c5 100644 --- a/target/riscv/cpu.h +++ b/target/riscv/cpu.h @@ -180,10 +180,6 @@ extern RISCVCPUImpliedExtsRule *riscv_multi_ext_implied_rules[]; #define MMU_USER_IDX 3 -#define MAX_RISCV_PMPS (64) -#define OLD_MAX_RISCV_PMPS (16) -#define MIN_RISCV_PMP_GRANULARITY 4 - #if !defined(CONFIG_USER_ONLY) #include "pmp.h" #endif diff --git a/target/riscv/pmp.h b/target/riscv/pmp.h index eae305ac6f..4c95c2767a 100644 --- a/target/riscv/pmp.h +++ b/target/riscv/pmp.h @@ -22,7 +22,9 @@ #ifndef RISCV_PMP_H #define RISCV_PMP_H -#include "cpu.h" +#define MAX_RISCV_PMPS (64) +#define OLD_MAX_RISCV_PMPS (16) +#define MIN_RISCV_PMP_GRANULARITY 4 typedef enum { PMP_READ = 1 << 0, diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index 753f92307f..36f9570f2d 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -1127,7 +1127,9 @@ static void riscv_cpu_init(Object *obj) cpu->cfg.cbop_blocksize = 64; cpu->cfg.cboz_blocksize = 64; cpu->cfg.pmp_regions = 16; +#ifndef CONFIG_USER_ONLY cpu->cfg.pmp_granularity = MIN_RISCV_PMP_GRANULARITY; +#endif cpu->env.vext_ver = VEXT_VERSION_1_00_0; cpu->cfg.max_satp_mode = -1; @@ -1550,6 +1552,7 @@ static const PropertyInfo prop_mmu = { .set = prop_mmu_set, }; +#ifndef CONFIG_USER_ONLY static void prop_pmp_set(Object *obj, Visitor *v, const char *name, void *opaque, Error **errp) { @@ -1658,6 +1661,7 @@ static const PropertyInfo prop_pmp_granularity = { .get = prop_pmp_granularity_get, .set = prop_pmp_granularity_set, }; +#endif /* !CONFIG_USER_ONLY */ static int priv_spec_from_str(const char *priv_spec_str) { @@ -2666,9 +2670,11 @@ static const Property riscv_cpu_properties[] = { {.name = "pmu-num", .info = &prop_pmu_num}, /* Deprecated */ {.name = "mmu", .info = &prop_mmu}, +#ifndef CONFIG_USER_ONLY {.name = "pmp", .info = &prop_pmp}, {.name = "num-pmp-regions", .info = &prop_num_pmp_regions}, {.name = "pmp-granularity", .info = &prop_pmp_granularity}, +#endif {.name = "priv_spec", .info = &prop_priv_spec}, {.name = "vext_spec", .info = &prop_vext_spec}, -- 2.52.0
