On Tue, Aug 20, 2024 at 2:11 AM Ian Brockbank <ian.brockb...@cirrus.com> wrote:
>
> From: Ian Brockbank <ian.brockb...@cirrus.com>
>
> The interrupt-level threshold (xintthresh) CSR holds an 8-bit field
> for the threshold level of the associated privilege mode.
>
> For horizontal interrupts, only the ones with higher interrupt levels
> than the threshold level are allowed to preempt.
>
> Signed-off-by: Ian Brockbank <ian.brockb...@cirrus.com>
> Signed-off-by: LIU Zhiwei <zhiwei_...@c-sky.com>
> ---
>  target/riscv/cpu.h      |  2 ++
>  target/riscv/cpu_bits.h |  2 ++
>  target/riscv/csr.c      | 28 ++++++++++++++++++++++++++++
>  3 files changed, 32 insertions(+)
>
> diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
> index 95303f50d3..9b5f36ad0a 100644
> --- a/target/riscv/cpu.h
> +++ b/target/riscv/cpu.h
> @@ -260,6 +260,7 @@ struct CPUArchState {
>
>      uint64_t miclaim;
>      uint64_t mintstatus; /* clic-spec */
> +    target_ulong mintthresh; /* clic-spec */
>
>      uint64_t mie;
>      uint64_t mideleg;
> @@ -283,6 +284,7 @@ struct CPUArchState {
>      target_ulong stvec;
>      target_ulong sepc;
>      target_ulong scause;
> +    target_ulong sintthresh; /* clic-spec */
>
>      target_ulong mtvec;
>      target_ulong mepc;
> diff --git a/target/riscv/cpu_bits.h b/target/riscv/cpu_bits.h
> index 2e65495b54..ad45402370 100644
> --- a/target/riscv/cpu_bits.h
> +++ b/target/riscv/cpu_bits.h
> @@ -166,6 +166,7 @@
>  #define CSR_MTVAL           0x343
>  #define CSR_MIP             0x344
>  #define CSR_MINTSTATUS      0xfb1 /* clic-spec-draft */
> +#define CSR_MINTTHRESH      0x347 /* clic-spec-draft */
>
>  /* Machine-Level Window to Indirectly Accessed Registers (AIA) */
>  #define CSR_MISELECT        0x350
> @@ -208,6 +209,7 @@
>  #define CSR_STVAL           0x143
>  #define CSR_SIP             0x144
>  #define CSR_SINTSTATUS      0xdb1 /* clic-spec-draft */
> +#define CSR_SINTTHRESH      0x147 /* clic-spec-draft */
>
>  /* Sstc supervisor CSRs */
>  #define CSR_STIMECMP        0x14D
> diff --git a/target/riscv/csr.c b/target/riscv/csr.c
> index f9ed7b9079..9c824c0d8f 100644
> --- a/target/riscv/csr.c
> +++ b/target/riscv/csr.c
> @@ -2903,6 +2903,18 @@ static int read_mintstatus(CPURISCVState *env, int 
> csrno, target_ulong *val)
>      return RISCV_EXCP_NONE;
>  }
>
> +static int read_mintthresh(CPURISCVState *env, int csrno, target_ulong *val)
> +{
> +    *val = env->mintthresh;
> +    return 0;
> +}
> +
> +static int write_mintthresh(CPURISCVState *env, int csrno, target_ulong val)
> +{
> +    env->mintthresh = val;

We should be clearing the upper bits on a write

Alistair

> +    return 0;
> +}
> +
>  /* Supervisor Trap Setup */
>  static RISCVException read_sstatus_i128(CPURISCVState *env, int csrno,
>                                          Int128 *val)
> @@ -3322,6 +3334,18 @@ static int read_sintstatus(CPURISCVState *env, int 
> csrno, target_ulong *val)
>      return RISCV_EXCP_NONE;
>  }
>
> +static int read_sintthresh(CPURISCVState *env, int csrno, target_ulong *val)
> +{
> +    *val = env->sintthresh;
> +    return 0;
> +}
> +
> +static int write_sintthresh(CPURISCVState *env, int csrno, target_ulong val)
> +{
> +    env->sintthresh = val;
> +    return 0;
> +}
> +
>  /* Supervisor Protection and Translation */
>  static RISCVException read_satp(CPURISCVState *env, int csrno,
>                                  target_ulong *val)
> @@ -5621,9 +5645,13 @@ riscv_csr_operations csr_ops[CSR_TABLE_SIZE] = {
>
>      /* Machine Mode Core Level Interrupt Controller */
>      [CSR_MINTSTATUS]     = { "mintstatus", clic,  read_mintstatus       },
> +    [CSR_MINTTHRESH]     = { "mintthresh", clic,  read_mintthresh,
> +                             write_mintthresh },
>
>      /* Supervisor Mode Core Level Interrupt Controller */
>      [CSR_SINTSTATUS]     = { "sintstatus", clic,  read_sintstatus       },
> +    [CSR_SINTTHRESH]     = { "sintthresh", clic,  read_sintthresh,
> +                             write_sintthresh },
>
>      [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
>

Reply via email to