On Sat, May 16, 2026 at 4:02 AM Anton Johansson via qemu development
<[email protected]> wrote:
>
> 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]>

Reviewed-by: Alistair Francis <[email protected]>

Alistair

> ---
>  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
>
>

Reply via email to