From: Michael Clark <mjc@sifive.com>
To: qemu-devel@nongnu.org
Cc: patches@groups.riscv.org, Michael Clark <mjc@sifive.com>,
Sagar Karandikar <sagark@eecs.berkeley.edu>,
Bastian Koppelmann <kbastian@mail.uni-paderborn.de>,
Palmer Dabbelt <palmer@sifive.com>,
Alistair Francis <Alistair.Francis@wdc.com>
Subject: [Qemu-devel] [PULL 16/20] RISC-V: Use [ms]counteren CSRs when priv ISA >= v1.10
Date: Sun, 6 May 2018 11:35:21 +1200 [thread overview]
Message-ID: <1525563325-62963-17-git-send-email-mjc@sifive.com> (raw)
In-Reply-To: <1525563325-62963-1-git-send-email-mjc@sifive.com>
Privileged ISA v1.9.1 defines mscounteren and mucounteren:
* mscounteren contains a mask of counters available to S-mode
* mucounteren contains a mask of counters available to U-mode
Privileged ISA v1.10 defines mcounteren and scounteren:
* mcounteren contains a mask of counters available to S-mode
* scounteren contains a mask of counters available to U-mode
mcounteren and scounteren CSR registers were implemented
however they were not honoured for counter accesses when
the privilege ISA was >= v1.10. This fix solves the issue
by coalescing the counter enable registers. In addition
the code now generates illegal instruction exceptions
for accesses to the counter enabled registers depending
on the privileged ISA version.
- Coalesce mscounteren and mcounteren into one variable
- Coalesce mucounteren and scounteren into one variable
- Makes mcounteren and scounteren CSR accesses generate
illegal instructions when the privileged ISA <= v1.9.1
- Makes mscounteren and mucounteren CSR accesses generate
illegal instructions when the privileged ISA >= v1.10
Cc: Sagar Karandikar <sagark@eecs.berkeley.edu>
Cc: Bastian Koppelmann <kbastian@mail.uni-paderborn.de>
Cc: Palmer Dabbelt <palmer@sifive.com>
Cc: Alistair Francis <Alistair.Francis@wdc.com>
Signed-off-by: Michael Clark <mjc@sifive.com>
---
target/riscv/cpu.h | 6 ++---
target/riscv/op_helper.c | 62 +++++++++++++++++++++++++++++++++++++-----------
2 files changed, 50 insertions(+), 18 deletions(-)
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
index 1dcbdbe6f77d..34abc383e3d4 100644
--- a/target/riscv/cpu.h
+++ b/target/riscv/cpu.h
@@ -151,10 +151,8 @@ struct CPURISCVState {
target_ulong mcause;
target_ulong mtval; /* since: priv-1.10.0 */
- uint32_t mucounteren;
- uint32_t mscounteren;
- target_ulong scounteren; /* since: priv-1.10.0 */
- target_ulong mcounteren; /* since: priv-1.10.0 */
+ target_ulong scounteren;
+ target_ulong mcounteren;
target_ulong sscratch;
target_ulong mscratch;
diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c
index f45ac7306c38..7416412b187c 100644
--- a/target/riscv/op_helper.c
+++ b/target/riscv/op_helper.c
@@ -225,11 +225,19 @@ void csr_write_helper(CPURISCVState *env, target_ulong val_to_write,
qemu_log_mask(LOG_UNIMP, "CSR_MCYCLEH: write not implemented");
goto do_illegal;
case CSR_MUCOUNTEREN:
- env->mucounteren = val_to_write;
- break;
+ if (env->priv_ver <= PRIV_VERSION_1_09_1) {
+ env->scounteren = val_to_write;
+ break;
+ } else {
+ goto do_illegal;
+ }
case CSR_MSCOUNTEREN:
- env->mscounteren = val_to_write;
- break;
+ if (env->priv_ver <= PRIV_VERSION_1_09_1) {
+ env->mcounteren = val_to_write;
+ break;
+ } else {
+ goto do_illegal;
+ }
case CSR_SSTATUS: {
target_ulong ms = env->mstatus;
target_ulong mask = SSTATUS_SIE | SSTATUS_SPIE | SSTATUS_UIE
@@ -286,8 +294,12 @@ void csr_write_helper(CPURISCVState *env, target_ulong val_to_write,
env->stvec = val_to_write >> 2 << 2;
break;
case CSR_SCOUNTEREN:
- env->scounteren = val_to_write;
- break;
+ if (env->priv_ver >= PRIV_VERSION_1_10_0) {
+ env->scounteren = val_to_write;
+ break;
+ } else {
+ goto do_illegal;
+ }
case CSR_SSCRATCH:
env->sscratch = val_to_write;
break;
@@ -308,8 +320,12 @@ void csr_write_helper(CPURISCVState *env, target_ulong val_to_write,
env->mtvec = val_to_write >> 2 << 2;
break;
case CSR_MCOUNTEREN:
- env->mcounteren = val_to_write;
- break;
+ if (env->priv_ver >= PRIV_VERSION_1_10_0) {
+ env->mcounteren = val_to_write;
+ break;
+ } else {
+ goto do_illegal;
+ }
case CSR_MSCRATCH:
env->mscratch = val_to_write;
break;
@@ -347,6 +363,8 @@ void csr_write_helper(CPURISCVState *env, target_ulong val_to_write,
case CSR_PMPADDR15:
pmpaddr_csr_write(env, csrno - CSR_PMPADDR0, val_to_write);
break;
+#endif
+#if !defined(CONFIG_USER_ONLY)
do_illegal:
#endif
default:
@@ -362,8 +380,8 @@ void csr_write_helper(CPURISCVState *env, target_ulong val_to_write,
target_ulong csr_read_helper(CPURISCVState *env, target_ulong csrno)
{
#ifndef CONFIG_USER_ONLY
- target_ulong ctr_en = env->priv == PRV_U ? env->mucounteren :
- env->priv == PRV_S ? env->mscounteren : -1U;
+ target_ulong ctr_en = env->priv == PRV_U ? env->scounteren :
+ env->priv == PRV_S ? env->mcounteren : -1U;
#else
target_ulong ctr_en = -1;
#endif
@@ -438,9 +456,17 @@ target_ulong csr_read_helper(CPURISCVState *env, target_ulong csrno)
#endif
break;
case CSR_MUCOUNTEREN:
- return env->mucounteren;
+ if (env->priv_ver <= PRIV_VERSION_1_09_1) {
+ return env->scounteren;
+ } else {
+ break; /* illegal instruction */
+ }
case CSR_MSCOUNTEREN:
- return env->mscounteren;
+ if (env->priv_ver <= PRIV_VERSION_1_09_1) {
+ return env->mcounteren;
+ } else {
+ break; /* illegal instruction */
+ }
case CSR_SSTATUS: {
target_ulong mask = SSTATUS_SIE | SSTATUS_SPIE | SSTATUS_UIE
| SSTATUS_UPIE | SSTATUS_SPP | SSTATUS_FS | SSTATUS_XS
@@ -465,7 +491,11 @@ target_ulong csr_read_helper(CPURISCVState *env, target_ulong csrno)
case CSR_STVEC:
return env->stvec;
case CSR_SCOUNTEREN:
- return env->scounteren;
+ if (env->priv_ver >= PRIV_VERSION_1_10_0) {
+ return env->scounteren;
+ } else {
+ break; /* illegal instruction */
+ }
case CSR_SCAUSE:
return env->scause;
case CSR_SATP: /* CSR_SPTBR */
@@ -510,7 +540,11 @@ target_ulong csr_read_helper(CPURISCVState *env, target_ulong csrno)
case CSR_MTVEC:
return env->mtvec;
case CSR_MCOUNTEREN:
- return env->mcounteren;
+ if (env->priv_ver >= PRIV_VERSION_1_10_0) {
+ return env->mcounteren;
+ } else {
+ break; /* illegal instruction */
+ }
case CSR_MEDELEG:
return env->medeleg;
case CSR_MIDELEG:
--
2.7.0
next prev parent reply other threads:[~2018-05-05 23:37 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-05-05 23:35 [Qemu-devel] [PULL 00/20] RISC-V: QEMU 2.13 Privileged ISA emulation updates Michael Clark
2018-05-05 23:35 ` [Qemu-devel] [PULL 01/20] RISC-V: Replace hardcoded constants with enum values Michael Clark
2018-05-05 23:35 ` [Qemu-devel] [PULL 02/20] RISC-V: Make virt board description match spike Michael Clark
2018-05-05 23:35 ` [Qemu-devel] [PULL 03/20] RISC-V: Use ROM base address and size from memmap Michael Clark
2018-05-05 23:35 ` [Qemu-devel] [PULL 04/20] RISC-V: Remove identity_translate from load_elf Michael Clark
2018-05-05 23:35 ` [Qemu-devel] [PULL 05/20] RISC-V: Remove unused class definitions Michael Clark
2018-05-05 23:35 ` [Qemu-devel] [PULL 06/20] RISC-V: Include instruction hex in disassembly Michael Clark
2018-05-05 23:35 ` [Qemu-devel] [PULL 07/20] RISC-V: Fix missing break statement in disassembler Michael Clark
2018-05-05 23:35 ` [Qemu-devel] [PULL 08/20] RISC-V: Make some header guards more specific Michael Clark
2018-05-05 23:35 ` [Qemu-devel] [PULL 09/20] RISC-V: Make virt header comment title consistent Michael Clark
2018-05-05 23:35 ` [Qemu-devel] [PULL 10/20] RISC-V: Remove EM_RISCV ELF_MACHINE indirection Michael Clark
2018-05-05 23:35 ` [Qemu-devel] [PULL 11/20] RISC-V: Remove erroneous comment from translate.c Michael Clark
2018-05-05 23:35 ` [Qemu-devel] [PULL 12/20] RISC-V: Update E and I extension order Michael Clark
2018-05-05 23:35 ` [Qemu-devel] [PULL 13/20] RISC-V: Hardwire satp to 0 for no-mmu case Michael Clark
2018-05-05 23:35 ` [Qemu-devel] [PULL 14/20] RISC-V: Clear mtval/stval on exceptions without info Michael Clark
2018-05-05 23:35 ` [Qemu-devel] [PULL 15/20] RISC-V: Allow S-mode mxr access when priv ISA >= v1.10 Michael Clark
2018-05-05 23:35 ` Michael Clark [this message]
2018-05-05 23:35 ` [Qemu-devel] [PULL 17/20] RISC-V: Add mcycle/minstret support for -icount auto Michael Clark
2018-05-05 23:35 ` [Qemu-devel] [PULL 18/20] RISC-V: Make mtvec/stvec ignore vectored traps Michael Clark
2018-05-05 23:35 ` [Qemu-devel] [PULL 19/20] RISC-V: No traps on writes to misa, minstret, mcycle Michael Clark
2018-05-05 23:35 ` [Qemu-devel] [PULL 20/20] RISC-V: Mark ROM read-only after copying in code Michael Clark
2018-05-08 13:22 ` [Qemu-devel] [PULL 00/20] RISC-V: QEMU 2.13 Privileged ISA emulation updates Peter Maydell
2018-05-08 22:52 ` Michael Clark
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=1525563325-62963-17-git-send-email-mjc@sifive.com \
--to=mjc@sifive.com \
--cc=Alistair.Francis@wdc.com \
--cc=kbastian@mail.uni-paderborn.de \
--cc=palmer@sifive.com \
--cc=patches@groups.riscv.org \
--cc=qemu-devel@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).