Re: [PATCH v5 1/5] target/riscv: Fix the predicate functions for mhpmeventhX CSRs
On 2024/2/29 2:51, Atish Patra wrote: mhpmeventhX CSRs are available for RV32. The predicate function should check that first before checking sscofpmf extension. Fixes: 14664483457b ("target/riscv: Add sscofpmf extension support") Reviewed-by: Daniel Henrique Barboza Reviewed-by: Alistair Francis Reviewed-by: LIU Zhiwei Zhiwei Signed-off-by: Atish Patra --- target/riscv/csr.c | 67 ++ 1 file changed, 38 insertions(+), 29 deletions(-) diff --git a/target/riscv/csr.c b/target/riscv/csr.c index d4e8ac13b90c..a3d979c4c72c 100644 --- a/target/riscv/csr.c +++ b/target/riscv/csr.c @@ -227,6 +227,15 @@ static RISCVException sscofpmf(CPURISCVState *env, int csrno) return RISCV_EXCP_NONE; } +static RISCVException sscofpmf_32(CPURISCVState *env, int csrno) +{ +if (riscv_cpu_mxl(env) != MXL_RV32) { +return RISCV_EXCP_ILLEGAL_INST; +} + +return sscofpmf(env, csrno); +} + static RISCVException any(CPURISCVState *env, int csrno) { return RISCV_EXCP_NONE; @@ -5035,91 +5044,91 @@ riscv_csr_operations csr_ops[CSR_TABLE_SIZE] = { [CSR_MHPMEVENT31]= { "mhpmevent31",any,read_mhpmevent, write_mhpmevent }, -[CSR_MHPMEVENT3H]= { "mhpmevent3h",sscofpmf, read_mhpmeventh, +[CSR_MHPMEVENT3H]= { "mhpmevent3h",sscofpmf_32, read_mhpmeventh, write_mhpmeventh, .min_priv_ver = PRIV_VERSION_1_12_0}, -[CSR_MHPMEVENT4H]= { "mhpmevent4h",sscofpmf, read_mhpmeventh, +[CSR_MHPMEVENT4H]= { "mhpmevent4h",sscofpmf_32, read_mhpmeventh, write_mhpmeventh, .min_priv_ver = PRIV_VERSION_1_12_0}, -[CSR_MHPMEVENT5H]= { "mhpmevent5h",sscofpmf, read_mhpmeventh, +[CSR_MHPMEVENT5H]= { "mhpmevent5h",sscofpmf_32, read_mhpmeventh, write_mhpmeventh, .min_priv_ver = PRIV_VERSION_1_12_0}, -[CSR_MHPMEVENT6H]= { "mhpmevent6h",sscofpmf, read_mhpmeventh, +[CSR_MHPMEVENT6H]= { "mhpmevent6h",sscofpmf_32, read_mhpmeventh, write_mhpmeventh, .min_priv_ver = PRIV_VERSION_1_12_0}, -[CSR_MHPMEVENT7H]= { "mhpmevent7h",sscofpmf, read_mhpmeventh, +[CSR_MHPMEVENT7H]= { "mhpmevent7h",sscofpmf_32, read_mhpmeventh, write_mhpmeventh, .min_priv_ver = PRIV_VERSION_1_12_0}, -[CSR_MHPMEVENT8H]= { "mhpmevent8h",sscofpmf, read_mhpmeventh, +[CSR_MHPMEVENT8H]= { "mhpmevent8h",sscofpmf_32, read_mhpmeventh, write_mhpmeventh, .min_priv_ver = PRIV_VERSION_1_12_0}, -[CSR_MHPMEVENT9H]= { "mhpmevent9h",sscofpmf, read_mhpmeventh, +[CSR_MHPMEVENT9H]= { "mhpmevent9h",sscofpmf_32, read_mhpmeventh, write_mhpmeventh, .min_priv_ver = PRIV_VERSION_1_12_0}, -[CSR_MHPMEVENT10H] = { "mhpmevent10h",sscofpmf, read_mhpmeventh, +[CSR_MHPMEVENT10H] = { "mhpmevent10h",sscofpmf_32, read_mhpmeventh, write_mhpmeventh, .min_priv_ver = PRIV_VERSION_1_12_0}, -[CSR_MHPMEVENT11H] = { "mhpmevent11h",sscofpmf, read_mhpmeventh, +[CSR_MHPMEVENT11H] = { "mhpmevent11h",sscofpmf_32, read_mhpmeventh, write_mhpmeventh, .min_priv_ver = PRIV_VERSION_1_12_0}, -[CSR_MHPMEVENT12H] = { "mhpmevent12h",sscofpmf, read_mhpmeventh, +[CSR_MHPMEVENT12H] = { "mhpmevent12h",sscofpmf_32, read_mhpmeventh, write_mhpmeventh, .min_priv_ver = PRIV_VERSION_1_12_0}, -[CSR_MHPMEVENT13H] = { "mhpmevent13h",sscofpmf, read_mhpmeventh, +[CSR_MHPMEVENT13H] = { "mhpmevent13h",sscofpmf_32, read_mhpmeventh, write_mhpmeventh, .min_priv_ver = PRIV_VERSION_1_12_0}, -[CSR_MHPMEVENT14H] = { "mhpmevent14h",sscofpmf, read_mhpmeventh, +[CSR_MHPMEVENT14H] = { "mhpmevent14h",sscofpmf_32, read_mhpmeventh, write_mhpmeventh, .min_priv_ver = PRIV_VERSION_1_12_0}, -[CSR_MHPMEVENT15H] = { "mhpmevent15h",sscofpmf, read_mhpmeventh, +[CSR_MHPMEVENT15H] = { "mhpmevent15h",sscofpmf_32, read_mhpmeventh, write_mhpmeventh, .min_priv_ver = PRIV_VERSION_1_12_0}, -[CSR_MHPMEVENT16H] = { "mhpmevent16h",
[PATCH v5 1/5] target/riscv: Fix the predicate functions for mhpmeventhX CSRs
mhpmeventhX CSRs are available for RV32. The predicate function should check that first before checking sscofpmf extension. Fixes: 14664483457b ("target/riscv: Add sscofpmf extension support") Reviewed-by: Daniel Henrique Barboza Reviewed-by: Alistair Francis Signed-off-by: Atish Patra --- target/riscv/csr.c | 67 ++ 1 file changed, 38 insertions(+), 29 deletions(-) diff --git a/target/riscv/csr.c b/target/riscv/csr.c index d4e8ac13b90c..a3d979c4c72c 100644 --- a/target/riscv/csr.c +++ b/target/riscv/csr.c @@ -227,6 +227,15 @@ static RISCVException sscofpmf(CPURISCVState *env, int csrno) return RISCV_EXCP_NONE; } +static RISCVException sscofpmf_32(CPURISCVState *env, int csrno) +{ +if (riscv_cpu_mxl(env) != MXL_RV32) { +return RISCV_EXCP_ILLEGAL_INST; +} + +return sscofpmf(env, csrno); +} + static RISCVException any(CPURISCVState *env, int csrno) { return RISCV_EXCP_NONE; @@ -5035,91 +5044,91 @@ riscv_csr_operations csr_ops[CSR_TABLE_SIZE] = { [CSR_MHPMEVENT31]= { "mhpmevent31",any,read_mhpmevent, write_mhpmevent }, -[CSR_MHPMEVENT3H]= { "mhpmevent3h",sscofpmf, read_mhpmeventh, +[CSR_MHPMEVENT3H]= { "mhpmevent3h",sscofpmf_32, read_mhpmeventh, write_mhpmeventh, .min_priv_ver = PRIV_VERSION_1_12_0}, -[CSR_MHPMEVENT4H]= { "mhpmevent4h",sscofpmf, read_mhpmeventh, +[CSR_MHPMEVENT4H]= { "mhpmevent4h",sscofpmf_32, read_mhpmeventh, write_mhpmeventh, .min_priv_ver = PRIV_VERSION_1_12_0}, -[CSR_MHPMEVENT5H]= { "mhpmevent5h",sscofpmf, read_mhpmeventh, +[CSR_MHPMEVENT5H]= { "mhpmevent5h",sscofpmf_32, read_mhpmeventh, write_mhpmeventh, .min_priv_ver = PRIV_VERSION_1_12_0}, -[CSR_MHPMEVENT6H]= { "mhpmevent6h",sscofpmf, read_mhpmeventh, +[CSR_MHPMEVENT6H]= { "mhpmevent6h",sscofpmf_32, read_mhpmeventh, write_mhpmeventh, .min_priv_ver = PRIV_VERSION_1_12_0}, -[CSR_MHPMEVENT7H]= { "mhpmevent7h",sscofpmf, read_mhpmeventh, +[CSR_MHPMEVENT7H]= { "mhpmevent7h",sscofpmf_32, read_mhpmeventh, write_mhpmeventh, .min_priv_ver = PRIV_VERSION_1_12_0}, -[CSR_MHPMEVENT8H]= { "mhpmevent8h",sscofpmf, read_mhpmeventh, +[CSR_MHPMEVENT8H]= { "mhpmevent8h",sscofpmf_32, read_mhpmeventh, write_mhpmeventh, .min_priv_ver = PRIV_VERSION_1_12_0}, -[CSR_MHPMEVENT9H]= { "mhpmevent9h",sscofpmf, read_mhpmeventh, +[CSR_MHPMEVENT9H]= { "mhpmevent9h",sscofpmf_32, read_mhpmeventh, write_mhpmeventh, .min_priv_ver = PRIV_VERSION_1_12_0}, -[CSR_MHPMEVENT10H] = { "mhpmevent10h",sscofpmf, read_mhpmeventh, +[CSR_MHPMEVENT10H] = { "mhpmevent10h",sscofpmf_32, read_mhpmeventh, write_mhpmeventh, .min_priv_ver = PRIV_VERSION_1_12_0}, -[CSR_MHPMEVENT11H] = { "mhpmevent11h",sscofpmf, read_mhpmeventh, +[CSR_MHPMEVENT11H] = { "mhpmevent11h",sscofpmf_32, read_mhpmeventh, write_mhpmeventh, .min_priv_ver = PRIV_VERSION_1_12_0}, -[CSR_MHPMEVENT12H] = { "mhpmevent12h",sscofpmf, read_mhpmeventh, +[CSR_MHPMEVENT12H] = { "mhpmevent12h",sscofpmf_32, read_mhpmeventh, write_mhpmeventh, .min_priv_ver = PRIV_VERSION_1_12_0}, -[CSR_MHPMEVENT13H] = { "mhpmevent13h",sscofpmf, read_mhpmeventh, +[CSR_MHPMEVENT13H] = { "mhpmevent13h",sscofpmf_32, read_mhpmeventh, write_mhpmeventh, .min_priv_ver = PRIV_VERSION_1_12_0}, -[CSR_MHPMEVENT14H] = { "mhpmevent14h",sscofpmf, read_mhpmeventh, +[CSR_MHPMEVENT14H] = { "mhpmevent14h",sscofpmf_32, read_mhpmeventh, write_mhpmeventh, .min_priv_ver = PRIV_VERSION_1_12_0}, -[CSR_MHPMEVENT15H] = { "mhpmevent15h",sscofpmf, read_mhpmeventh, +[CSR_MHPMEVENT15H] = { "mhpmevent15h",sscofpmf_32, read_mhpmeventh, write_mhpmeventh, .min_priv_ver = PRIV_VERSION_1_12_0}, -[CSR_MHPMEVENT16H] = { "mhpmevent16h",sscofpmf, read_mhpmeventh, +[CSR_MHPMEVENT16H] = { "mhpmevent16h",sscofpmf_32, read_mhpmeventh,