On Wed, Feb 19, 2025 at 2:59 AM Paolo Bonzini <pbonz...@redhat.com> wrote:
>
> "supported" can be computed on the fly based on the max_satp_mode.
>
> Signed-off-by: Paolo Bonzini <pbonz...@redhat.com>

Reviewed-by: Alistair Francis <alistair.fran...@wdc.com>

Alistair

> ---
>  target/riscv/cpu_cfg.h |  4 +---
>  target/riscv/cpu.c     | 34 ++++++++++++++++++++++++----------
>  2 files changed, 25 insertions(+), 13 deletions(-)
>
> diff --git a/target/riscv/cpu_cfg.h b/target/riscv/cpu_cfg.h
> index 28d8de978fa..1d7fff8decd 100644
> --- a/target/riscv/cpu_cfg.h
> +++ b/target/riscv/cpu_cfg.h
> @@ -29,11 +29,9 @@
>   *
>   * init is a 16-bit bitmap used to make sure the user selected a correct
>   * configuration as per the specification.
> - *
> - * supported is a 16-bit bitmap used to reflect the hw capabilities.
>   */
>  typedef struct {
> -    uint16_t map, init, supported;
> +    uint16_t map, init;
>  } RISCVSATPMap;
>
>  struct RISCVCPUConfig {
> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
> index ce71ee95a52..86a048b62c5 100644
> --- a/target/riscv/cpu.c
> +++ b/target/riscv/cpu.c
> @@ -437,14 +437,27 @@ static void set_satp_mode_max_supported(RISCVCPU *cpu,
>      bool rv32 = riscv_cpu_mxl(&cpu->env) == MXL_RV32;
>      const bool *valid_vm = rv32 ? valid_vm_1_10_32 : valid_vm_1_10_64;
>
> -    for (int i = 0; i <= satp_mode; ++i) {
> -        if (valid_vm[i]) {
> -            cpu->cfg.satp_mode.supported |= (1 << i);
> -        }
> +    assert(valid_vm[satp_mode]);
> +    cpu->cfg.max_satp_mode = satp_mode;
> +}
> +
> +static bool get_satp_mode_supported(RISCVCPU *cpu, uint16_t *supported)
> +{
> +    bool rv32 = riscv_cpu_is_32bit(cpu);
> +    const bool *valid_vm = rv32 ? valid_vm_1_10_32 : valid_vm_1_10_64;
> +    int satp_mode = cpu->cfg.max_satp_mode;
> +
> +    if (satp_mode == -1) {
> +        return false;
>      }
>
> -    assert(cpu->cfg.satp_mode.supported & (1 << satp_mode));
> -    cpu->cfg.max_satp_mode = satp_mode;
> +    *supported = 0;
> +    for (int i = 0; i <= satp_mode; ++i) {
> +        if (valid_vm[i]) {
> +            *supported |= (1 << i);
> +        }
> +    }
> +    return true;
>  }
>
>  /* Set the satp mode to the max supported */
> @@ -1176,9 +1189,10 @@ static void riscv_cpu_disas_set_info(CPUState *s, 
> disassemble_info *info)
>  static void riscv_cpu_satp_mode_finalize(RISCVCPU *cpu, Error **errp)
>  {
>      bool rv32 = riscv_cpu_is_32bit(cpu);
> +    uint16_t supported;
>      uint8_t satp_mode_map_max;
>
> -    if (cpu->cfg.max_satp_mode == -1) {
> +    if (!get_satp_mode_supported(cpu, &supported)) {
>          /* The CPU wants the hypervisor to decide which satp mode to allow */
>          return;
>      }
> @@ -1195,9 +1209,9 @@ static void riscv_cpu_satp_mode_finalize(RISCVCPU *cpu, 
> Error **errp)
>               */
>              for (int i = 1; i < 16; ++i) {
>                  if ((cpu->cfg.satp_mode.init & (1 << i)) &&
> -                    (cpu->cfg.satp_mode.supported & (1 << i))) {
> +                    supported & (1 << i)) {
>                      for (int j = i - 1; j >= 0; --j) {
> -                        if (cpu->cfg.satp_mode.supported & (1 << j)) {
> +                        if (supported & (1 << j)) {
>                              cpu->cfg.max_satp_mode = j;
>                              return;
>                          }
> @@ -1226,7 +1240,7 @@ static void riscv_cpu_satp_mode_finalize(RISCVCPU *cpu, 
> Error **errp)
>          for (int i = satp_mode_map_max - 1; i >= 0; --i) {
>              if (!(cpu->cfg.satp_mode.map & (1 << i)) &&
>                  (cpu->cfg.satp_mode.init & (1 << i)) &&
> -                (cpu->cfg.satp_mode.supported & (1 << i))) {
> +                (supported & (1 << i))) {
>                  error_setg(errp, "cannot disable %s satp mode if %s "
>                             "is enabled", satp_mode_str(i, false),
>                             satp_mode_str(satp_mode_map_max, false));
> --
> 2.48.1
>
>

Reply via email to