From: Anup Patel <apatel@ventanamicro.com>
To: Peter Maydell <peter.maydell@linaro.org>,
Palmer Dabbelt <palmer@dabbelt.com>,
Alistair Francis <Alistair.Francis@wdc.com>,
Sagar Karandikar <sagark@eecs.berkeley.edu>
Cc: Atish Patra <atishp@atishpatra.org>,
Anup Patel <anup@brainfault.org>,
qemu-riscv@nongnu.org, qemu-devel@nongnu.org,
Anup Patel <apatel@ventanamicro.com>
Subject: [PATCH 1/2] target/riscv: Remove CSRs that set/clear an IMSIC interrupt file bits
Date: Thu, 16 Jun 2022 08:45:42 +0530 [thread overview]
Message-ID: <20220616031543.953776-2-apatel@ventanamicro.com> (raw)
In-Reply-To: <20220616031543.953776-1-apatel@ventanamicro.com>
Based on architecture review committee feedback, the [m|s|vs]seteienum,
[m|s|vs]clreienum, [m|s|vs]seteipnum, and [m|s|vs]clreipnum CSRs are
removed in the latest AIA draft v0.3.0 specification.
(Refer, https://github.com/riscv/riscv-aia/releases/tag/0.3.0-draft.31)
These CSRs were mostly for software convenience and software can always
use [m|s|vs]iselect and [m|s|vs]ireg CSRs to update the IMSIC interrupt
file bits.
We update the IMSIC CSR emulation as-per above to match the latest AIA
draft specification.
Signed-off-by: Anup Patel <apatel@ventanamicro.com>
---
target/riscv/cpu_bits.h | 24 +------
target/riscv/csr.c | 150 +---------------------------------------
2 files changed, 6 insertions(+), 168 deletions(-)
diff --git a/target/riscv/cpu_bits.h b/target/riscv/cpu_bits.h
index 4a55c6a709..01608f86e5 100644
--- a/target/riscv/cpu_bits.h
+++ b/target/riscv/cpu_bits.h
@@ -177,14 +177,8 @@
#define CSR_MIREG 0x351
/* Machine-Level Interrupts (AIA) */
-#define CSR_MTOPI 0xfb0
-
-/* Machine-Level IMSIC Interface (AIA) */
-#define CSR_MSETEIPNUM 0x358
-#define CSR_MCLREIPNUM 0x359
-#define CSR_MSETEIENUM 0x35a
-#define CSR_MCLREIENUM 0x35b
#define CSR_MTOPEI 0x35c
+#define CSR_MTOPI 0xfb0
/* Virtual Interrupts for Supervisor Level (AIA) */
#define CSR_MVIEN 0x308
@@ -224,14 +218,8 @@
#define CSR_SIREG 0x151
/* Supervisor-Level Interrupts (AIA) */
-#define CSR_STOPI 0xdb0
-
-/* Supervisor-Level IMSIC Interface (AIA) */
-#define CSR_SSETEIPNUM 0x158
-#define CSR_SCLREIPNUM 0x159
-#define CSR_SSETEIENUM 0x15a
-#define CSR_SCLREIENUM 0x15b
#define CSR_STOPEI 0x15c
+#define CSR_STOPI 0xdb0
/* Supervisor-Level High-Half CSRs (AIA) */
#define CSR_SIEH 0x114
@@ -282,14 +270,8 @@
#define CSR_VSIREG 0x251
/* VS-Level Interrupts (H-extension with AIA) */
-#define CSR_VSTOPI 0xeb0
-
-/* VS-Level IMSIC Interface (H-extension with AIA) */
-#define CSR_VSSETEIPNUM 0x258
-#define CSR_VSCLREIPNUM 0x259
-#define CSR_VSSETEIENUM 0x25a
-#define CSR_VSCLREIENUM 0x25b
#define CSR_VSTOPEI 0x25c
+#define CSR_VSTOPI 0xeb0
/* Hypervisor and VS-Level High-Half CSRs (H-extension with AIA) */
#define CSR_HIDELEGH 0x613
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
index 409a209f14..a4890ebc70 100644
--- a/target/riscv/csr.c
+++ b/target/riscv/csr.c
@@ -1040,14 +1040,6 @@ static int aia_xlate_vs_csrno(CPURISCVState *env, int csrno)
return CSR_VSISELECT;
case CSR_SIREG:
return CSR_VSIREG;
- case CSR_SSETEIPNUM:
- return CSR_VSSETEIPNUM;
- case CSR_SCLREIPNUM:
- return CSR_VSCLREIPNUM;
- case CSR_SSETEIENUM:
- return CSR_VSSETEIENUM;
- case CSR_SCLREIENUM:
- return CSR_VSCLREIENUM;
case CSR_STOPEI:
return CSR_VSTOPEI;
default:
@@ -1202,124 +1194,6 @@ done:
return RISCV_EXCP_NONE;
}
-static int rmw_xsetclreinum(CPURISCVState *env, int csrno, target_ulong *val,
- target_ulong new_val, target_ulong wr_mask)
-{
- int ret = -EINVAL;
- bool set, pend, virt;
- target_ulong priv, isel, vgein, xlen, nval, wmask;
-
- /* Translate CSR number for VS-mode */
- csrno = aia_xlate_vs_csrno(env, csrno);
-
- /* Decode register details from CSR number */
- virt = set = pend = false;
- switch (csrno) {
- case CSR_MSETEIPNUM:
- priv = PRV_M;
- set = true;
- pend = true;
- break;
- case CSR_MCLREIPNUM:
- priv = PRV_M;
- pend = true;
- break;
- case CSR_MSETEIENUM:
- priv = PRV_M;
- set = true;
- break;
- case CSR_MCLREIENUM:
- priv = PRV_M;
- break;
- case CSR_SSETEIPNUM:
- priv = PRV_S;
- set = true;
- pend = true;
- break;
- case CSR_SCLREIPNUM:
- priv = PRV_S;
- pend = true;
- break;
- case CSR_SSETEIENUM:
- priv = PRV_S;
- set = true;
- break;
- case CSR_SCLREIENUM:
- priv = PRV_S;
- break;
- case CSR_VSSETEIPNUM:
- priv = PRV_S;
- virt = true;
- set = true;
- pend = true;
- break;
- case CSR_VSCLREIPNUM:
- priv = PRV_S;
- virt = true;
- pend = true;
- break;
- case CSR_VSSETEIENUM:
- priv = PRV_S;
- virt = true;
- set = true;
- break;
- case CSR_VSCLREIENUM:
- priv = PRV_S;
- virt = true;
- break;
- default:
- goto done;
- };
-
- /* IMSIC CSRs only available when machine implements IMSIC. */
- if (!env->aia_ireg_rmw_fn[priv]) {
- goto done;
- }
-
- /* Find the selected guest interrupt file */
- vgein = (virt) ? get_field(env->hstatus, HSTATUS_VGEIN) : 0;
-
- /* Selected guest interrupt file should be valid */
- if (virt && (!vgein || env->geilen < vgein)) {
- goto done;
- }
-
- /* Set/Clear CSRs always read zero */
- if (val) {
- *val = 0;
- }
-
- if (wr_mask) {
- /* Get interrupt number */
- new_val &= wr_mask;
-
- /* Find target interrupt pending/enable register */
- xlen = riscv_cpu_mxl_bits(env);
- isel = (new_val / xlen);
- isel *= (xlen / IMSIC_EIPx_BITS);
- isel += (pend) ? ISELECT_IMSIC_EIP0 : ISELECT_IMSIC_EIE0;
-
- /* Find the interrupt bit to be set/clear */
- wmask = ((target_ulong)1) << (new_val % xlen);
- nval = (set) ? wmask : 0;
-
- /* Call machine specific IMSIC register emulation */
- ret = env->aia_ireg_rmw_fn[priv](env->aia_ireg_rmw_fn_arg[priv],
- AIA_MAKE_IREG(isel, priv, virt,
- vgein, xlen),
- NULL, nval, wmask);
- } else {
- ret = 0;
- }
-
-done:
- if (ret) {
- return (riscv_cpu_virt_enabled(env) && virt) ?
- RISCV_EXCP_VIRT_INSTRUCTION_FAULT : RISCV_EXCP_ILLEGAL_INST;
- }
- return RISCV_EXCP_NONE;
-}
-
static int rmw_xtopei(CPURISCVState *env, int csrno, target_ulong *val,
target_ulong new_val, target_ulong wr_mask)
{
@@ -3409,14 +3283,8 @@ riscv_csr_operations csr_ops[CSR_TABLE_SIZE] = {
[CSR_MIREG] = { "mireg", aia_any, NULL, NULL, rmw_xireg },
/* Machine-Level Interrupts (AIA) */
- [CSR_MTOPI] = { "mtopi", aia_any, read_mtopi },
-
- /* Machine-Level IMSIC Interface (AIA) */
- [CSR_MSETEIPNUM] = { "mseteipnum", aia_any, NULL, NULL, rmw_xsetclreinum },
- [CSR_MCLREIPNUM] = { "mclreipnum", aia_any, NULL, NULL, rmw_xsetclreinum },
- [CSR_MSETEIENUM] = { "mseteienum", aia_any, NULL, NULL, rmw_xsetclreinum },
- [CSR_MCLREIENUM] = { "mclreienum", aia_any, NULL, NULL, rmw_xsetclreinum },
[CSR_MTOPEI] = { "mtopei", aia_any, NULL, NULL, rmw_xtopei },
+ [CSR_MTOPI] = { "mtopi", aia_any, read_mtopi },
/* Virtual Interrupts for Supervisor Level (AIA) */
[CSR_MVIEN] = { "mvien", aia_any, read_zero, write_ignore },
@@ -3464,14 +3332,8 @@ riscv_csr_operations csr_ops[CSR_TABLE_SIZE] = {
[CSR_SIREG] = { "sireg", aia_smode, NULL, NULL, rmw_xireg },
/* Supervisor-Level Interrupts (AIA) */
- [CSR_STOPI] = { "stopi", aia_smode, read_stopi },
-
- /* Supervisor-Level IMSIC Interface (AIA) */
- [CSR_SSETEIPNUM] = { "sseteipnum", aia_smode, NULL, NULL, rmw_xsetclreinum },
- [CSR_SCLREIPNUM] = { "sclreipnum", aia_smode, NULL, NULL, rmw_xsetclreinum },
- [CSR_SSETEIENUM] = { "sseteienum", aia_smode, NULL, NULL, rmw_xsetclreinum },
- [CSR_SCLREIENUM] = { "sclreienum", aia_smode, NULL, NULL, rmw_xsetclreinum },
[CSR_STOPEI] = { "stopei", aia_smode, NULL, NULL, rmw_xtopei },
+ [CSR_STOPI] = { "stopi", aia_smode, read_stopi },
/* Supervisor-Level High-Half CSRs (AIA) */
[CSR_SIEH] = { "sieh", aia_smode32, NULL, NULL, rmw_sieh },
@@ -3543,14 +3405,8 @@ riscv_csr_operations csr_ops[CSR_TABLE_SIZE] = {
[CSR_VSIREG] = { "vsireg", aia_hmode, NULL, NULL, rmw_xireg },
/* VS-Level Interrupts (H-extension with AIA) */
- [CSR_VSTOPI] = { "vstopi", aia_hmode, read_vstopi },
-
- /* VS-Level IMSIC Interface (H-extension with AIA) */
- [CSR_VSSETEIPNUM] = { "vsseteipnum", aia_hmode, NULL, NULL, rmw_xsetclreinum },
- [CSR_VSCLREIPNUM] = { "vsclreipnum", aia_hmode, NULL, NULL, rmw_xsetclreinum },
- [CSR_VSSETEIENUM] = { "vsseteienum", aia_hmode, NULL, NULL, rmw_xsetclreinum },
- [CSR_VSCLREIENUM] = { "vsclreienum", aia_hmode, NULL, NULL, rmw_xsetclreinum },
[CSR_VSTOPEI] = { "vstopei", aia_hmode, NULL, NULL, rmw_xtopei },
+ [CSR_VSTOPI] = { "vstopi", aia_hmode, read_vstopi },
/* Hypervisor and VS-Level High-Half CSRs (H-extension with AIA) */
[CSR_HIDELEGH] = { "hidelegh", aia_hmode32, NULL, NULL, rmw_hidelegh },
--
2.34.1
next prev parent reply other threads:[~2022-06-16 3:17 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-16 3:15 [PATCH 0/2] AIA draft v0.3.0 support for QEMU RISC-V Anup Patel
2022-06-16 3:15 ` Anup Patel [this message]
2022-06-29 23:38 ` [PATCH 1/2] target/riscv: Remove CSRs that set/clear an IMSIC interrupt file bits Alistair Francis
2022-06-16 3:15 ` [PATCH 2/2] target/riscv: Update default priority table for local interrupts Anup Patel
2022-06-29 23:40 ` Alistair Francis
2022-06-30 0:46 ` [PATCH 0/2] AIA draft v0.3.0 support for QEMU RISC-V Alistair Francis
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220616031543.953776-2-apatel@ventanamicro.com \
--to=apatel@ventanamicro.com \
--cc=Alistair.Francis@wdc.com \
--cc=anup@brainfault.org \
--cc=atishp@atishpatra.org \
--cc=palmer@dabbelt.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-riscv@nongnu.org \
--cc=sagark@eecs.berkeley.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.