qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] target/riscv: Restore the predicate() NULL check behavior


From: liweiwei
Subject: Re: [PATCH] target/riscv: Restore the predicate() NULL check behavior
Date: Wed, 12 Apr 2023 09:00:00 +0800
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.9.0


On 2023/4/11 17:02, Bin Meng wrote:
When reading a non-existent CSR QEMU should raise illegal instruction
exception, but currently it just exits due to the g_assert() check.

This actually reverts commit 0ee342256af9205e7388efdf193a6d8f1ba1a617,
Some comments are also added to indicate that predicate() must be
provided for an implemented CSR.

Reported-by: Fei Wu <fei2.wu@intel.com>
Signed-off-by: Bin Meng <bmeng@tinylab.org>
---

Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn>

Weiwei Li

  target/riscv/csr.c | 11 +++++++++--
  1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/target/riscv/csr.c b/target/riscv/csr.c
index d522efc0b6..736ab64275 100644
--- a/target/riscv/csr.c
+++ b/target/riscv/csr.c
@@ -3797,6 +3797,11 @@ static inline RISCVException 
riscv_csrrw_check(CPURISCVState *env,
          return RISCV_EXCP_ILLEGAL_INST;
      }
+ /* ensure CSR is implemented by checking predicate */
+    if (!csr_ops[csrno].predicate) {
+        return RISCV_EXCP_ILLEGAL_INST;
+    }
+
      /* privileged spec version check */
      if (env->priv_ver < csr_min_priv) {
          return RISCV_EXCP_ILLEGAL_INST;
@@ -3814,7 +3819,6 @@ static inline RISCVException 
riscv_csrrw_check(CPURISCVState *env,
       * illegal instruction exception should be triggered instead of virtual
       * instruction exception. Hence this comes after the read / write check.
       */
-    g_assert(csr_ops[csrno].predicate != NULL);
      RISCVException ret = csr_ops[csrno].predicate(env, csrno);
      if (ret != RISCV_EXCP_NONE) {
          return ret;
@@ -3991,7 +3995,10 @@ RISCVException riscv_csrrw_debug(CPURISCVState *env, int 
csrno,
      return ret;
  }
-/* Control and Status Register function table */
+/*
+ * Control and Status Register function table
+ * riscv_csr_operations::predicate() must be provided for an implemented CSR
+ */
  riscv_csr_operations csr_ops[CSR_TABLE_SIZE] = {
      /* User Floating-Point CSRs */
      [CSR_FFLAGS]   = { "fflags",   fs,     read_fflags,  write_fflags },




reply via email to

[Prev in Thread] Current Thread [Next in Thread]