On Tue, Aug 20, 2024 at 2:11 AM Ian Brockbank <ian.brockb...@cirrus.com> wrote:
>
> From: Ian Brockbank <ian.brockb...@cirrus.com>
>
> CSR mintstatus holds the active interrupt level for each supported
> privilege mode. sintstatus, and user, uintstatus, provide restricted
> views of mintstatus.
>
> Signed-off-by: Ian Brockbank <ian.brockb...@cirrus.com>
> Signed-off-by: LIU Zhiwei <zhiwei_...@c-sky.com>

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

> ---
>  target/riscv/cpu.h      |  3 +++
>  target/riscv/cpu_bits.h | 11 +++++++++++
>  target/riscv/csr.c      | 31 +++++++++++++++++++++++++++++++
>  3 files changed, 45 insertions(+)
>
> diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
> index 1619c3acb6..95303f50d3 100644
> --- a/target/riscv/cpu.h
> +++ b/target/riscv/cpu.h
> @@ -259,6 +259,7 @@ struct CPUArchState {
>      bool software_seip;
>
>      uint64_t miclaim;
> +    uint64_t mintstatus; /* clic-spec */
>
>      uint64_t mie;
>      uint64_t mideleg;
> @@ -461,6 +462,8 @@ struct CPUArchState {
>      QEMUTimer *vstimer; /* Internal timer for VS-mode interrupt */
>      bool vstime_irq;
>
> +    void *clic;       /* clic interrupt controller */
> +
>      hwaddr kernel_addr;
>      hwaddr fdt_addr;
>
> diff --git a/target/riscv/cpu_bits.h b/target/riscv/cpu_bits.h
> index 32b068f18a..2e65495b54 100644
> --- a/target/riscv/cpu_bits.h
> +++ b/target/riscv/cpu_bits.h
> @@ -165,6 +165,7 @@
>  #define CSR_MCAUSE          0x342
>  #define CSR_MTVAL           0x343
>  #define CSR_MIP             0x344
> +#define CSR_MINTSTATUS      0xfb1 /* clic-spec-draft */
>
>  /* Machine-Level Window to Indirectly Accessed Registers (AIA) */
>  #define CSR_MISELECT        0x350
> @@ -206,6 +207,7 @@
>  #define CSR_SCAUSE          0x142
>  #define CSR_STVAL           0x143
>  #define CSR_SIP             0x144
> +#define CSR_SINTSTATUS      0xdb1 /* clic-spec-draft */
>
>  /* Sstc supervisor CSRs */
>  #define CSR_STIMECMP        0x14D
> @@ -733,6 +735,15 @@ typedef enum RISCVException {
>  #define SIP_SEIP                           MIP_SEIP
>  #define SIP_LCOFIP                         MIP_LCOFIP
>
> +/* mintstatus */
> +#define MINTSTATUS_MIL                     0xff000000 /* mil[31:24] */
> +#define MINTSTATUS_SIL                     0x0000ff00 /* sil[15:8] */
> +#define MINTSTATUS_UIL                     0x000000ff /* uil[7:0] */
> +
> +/* sintstatus */
> +#define SINTSTATUS_SIL                     0x0000ff00 /* sil[15:8] */
> +#define SINTSTATUS_UIL                     0x000000ff /* uil[7:0] */
> +
>  /* MIE masks */
>  #define MIE_SEIE                           (1 << IRQ_S_EXT)
>  #define MIE_UEIE                           (1 << IRQ_U_EXT)
> diff --git a/target/riscv/csr.c b/target/riscv/csr.c
> index ea3560342c..f9ed7b9079 100644
> --- a/target/riscv/csr.c
> +++ b/target/riscv/csr.c
> @@ -578,6 +578,16 @@ static RISCVException debug(CPURISCVState *env, int 
> csrno)
>
>      return RISCV_EXCP_ILLEGAL_INST;
>  }
> +
> +static int clic(CPURISCVState *env, int csrno)
> +{
> +    if (env->clic) {
> +        return RISCV_EXCP_NONE;
> +    }
> +
> +    return RISCV_EXCP_ILLEGAL_INST;
> +}
> +
>  #endif
>
>  static RISCVException seed(CPURISCVState *env, int csrno)
> @@ -2887,6 +2897,12 @@ static RISCVException rmw_mviph(CPURISCVState *env, 
> int csrno,
>      return ret;
>  }
>
> +static int read_mintstatus(CPURISCVState *env, int csrno, target_ulong *val)
> +{
> +    *val = env->mintstatus;
> +    return RISCV_EXCP_NONE;
> +}
> +
>  /* Supervisor Trap Setup */
>  static RISCVException read_sstatus_i128(CPURISCVState *env, int csrno,
>                                          Int128 *val)
> @@ -3298,6 +3314,14 @@ static RISCVException rmw_siph(CPURISCVState *env, int 
> csrno,
>      return ret;
>  }
>
> +static int read_sintstatus(CPURISCVState *env, int csrno, target_ulong *val)
> +{
> +    /* sintstatus is a filtered view of mintstatus with the PRV_M removed */
> +    target_ulong mask = SINTSTATUS_SIL | SINTSTATUS_UIL;
> +    *val = env->mintstatus & mask;
> +    return RISCV_EXCP_NONE;
> +}
> +
>  /* Supervisor Protection and Translation */
>  static RISCVException read_satp(CPURISCVState *env, int csrno,
>                                  target_ulong *val)
> @@ -5594,6 +5618,13 @@ riscv_csr_operations csr_ops[CSR_TABLE_SIZE] = {
>                               write_mhpmcounterh                         },
>      [CSR_MHPMCOUNTER31H] = { "mhpmcounter31h", mctr32,  read_hpmcounterh,
>                               write_mhpmcounterh                         },
> +
> +    /* Machine Mode Core Level Interrupt Controller */
> +    [CSR_MINTSTATUS]     = { "mintstatus", clic,  read_mintstatus       },
> +
> +    /* Supervisor Mode Core Level Interrupt Controller */
> +    [CSR_SINTSTATUS]     = { "sintstatus", clic,  read_sintstatus       },
> +
>      [CSR_SCOUNTOVF]      = { "scountovf", sscofpmf,  read_scountovf,
>                               .min_priv_ver = PRIV_VERSION_1_12_0 },
>
> --
> 2.46.0.windows.1
> This message and any attachments may contain privileged and confidential 
> information that is intended solely for the person(s) to whom it is 
> addressed. If you are not an intended recipient you must not: read; copy; 
> distribute; discuss; take any action in or make any reliance upon the 
> contents of this message; nor open or read any attachment. If you have 
> received this message in error, please notify us as soon as possible on the 
> following telephone number and destroy this message including any 
> attachments. Thank you. Cirrus Logic International (UK) Ltd and Cirrus Logic 
> International Semiconductor Ltd are companies registered in Scotland, with 
> registered numbers SC089839 and SC495735 respectively. Our registered office 
> is at 7B Nightingale Way, Quartermile, Edinburgh, EH3 9EG, UK. Tel: +44 
> (0)131 272 7000. www.cirrus.com
>

It looks like some patch mangling is going on here

Alistair

Reply via email to