[PATCH v2 3/3] RISC-V: Support new CSR macro DECLARE_CSR_REUSE to handle the reused CSR.

Nelson Chu nelson.chu@sifive.com
Thu Jun 25 03:37:56 GMT 2020


We now have three macros to define CSR in the include/opcode/riscv-opc.h,

* DECLARE_CSR: If the new CSR address has never been defined in the
supported specs, then you should use DECLARE_CSR to define it.  Since
gdb doesn't need to know which priv spec version is prefered to use, we
should try to support all CSR by the DECLARE_CSR, including the aborted
ones.

For example,
DECLARE_CSR(ustatus, CSR_USTATUS, CSR_CLASS_I, PRIV_SPEC_CLASS_1P9P1, PRIV_SPEC_CLASS_DRAFT)
DECLARE_CSR(hstatus, CSR_HSTATUS, CSR_CLASS_I, PRIV_SPEC_CLASS_1P9P1, PRIV_SPEC_CLASS_1P10)

See the last two arguments, defined version and aborted version.
For ustatus, it is first defined in the priv spec v1.9.1, and still
can be used in the newest supported spec, so it's aborted version
is PRIV_SPEC_CLASS_DRAFT.  For hstatus, it is aborted since priv spec
v1.10, but we still use DECLARE_CSR to define it.  Since no other CSR
is aliased to it.

* DECLARE_CSR_ALIAS: The CSR address was defined.  The CSR name is renamed
to another one, but keep the same semantic.

For example,
DECLARE_CSR_ALIAS(dscratch, CSR_DSCRATCH0, CSR_CLASS_DEBUG, PRIV_SPEC_CLASS_NONE, PRIV_SPEC_CLASS_NONE)
DECLARE_CSR_ALIAS(mcontrol, CSR_TDATA1, CSR_CLASS_DEBUG, PRIV_SPEC_CLASS_NONE, PRIV_SPEC_CLASS_NONE)

* DECLARE_CSR_REUSE: The CSR address was defined.  The old CSR is aborted,
but the CSR address is reused to define a new CSR with different semantic.

There are five reused CSR defined currently,
DECLARE_CSR_REUSE(ubadaddr, CSR_UTVAL, CSR_CLASS_I, PRIV_SPEC_CLASS_1P9P1, PRIV_SPEC_CLASS_1P10)
DECLARE_CSR_REUSE(sbadaddr, CSR_STVAL, CSR_CLASS_I, PRIV_SPEC_CLASS_1P9P1, PRIV_SPEC_CLASS_1P10)
DECLARE_CSR_REUSE(sptbr, CSR_SATP, CSR_CLASS_I, PRIV_SPEC_CLASS_1P9P1, PRIV_SPEC_CLASS_1P10)
DECLARE_CSR_REUSE(mbadaddr, CSR_MTVAL, CSR_CLASS_I, PRIV_SPEC_CLASS_1P9P1, PRIV_SPEC_CLASS_1P10)
DECLARE_CSR_REUSE(mucounteren, CSR_MCOUNTINHIBIT, CSR_CLASS_I, PRIV_SPEC_CLASS_1P9P1, PRIV_SPEC_CLASS_1P10)

gdb only handle the CSR which are defined by DECLARE_CSR, and the aliases CSR
which are defined by DECLARE_CSR_ALIAS.  Support the reused CSR in gdb is not
good enough and may cause problems so far, so just skip the DECLARE_CSR_REUSE.

Besides, consider the regname_internal_riscv in the binutils/dwarf.c.  Since
gdb doesn't need to know the priv spec versions, it should be enough to print
the CSR name according to DECLARE_CSR.  That is, always print the newest name.

	gas/
	* config/tc-riscv.c (md_begin): Add reused CSR into CSR hash table.

	include/
	* opcode/riscv-opc.h: Define the reused CSR by DECLARE_CSR_REUSE
	rather than DECLARE_CSR_ALIAS.

	opcodes/
	* riscv-dis.c (print_insn_args): Handle DECLARE_CSR_REUSE.
---
 gas/config/tc-riscv.c      |  4 ++++
 include/opcode/riscv-opc.h | 12 +++++++-----
 opcodes/riscv-dis.c        |  4 ++++
 3 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c
index 28be198..bad5a0e 100644
--- a/gas/config/tc-riscv.c
+++ b/gas/config/tc-riscv.c
@@ -1088,8 +1088,12 @@ md_begin (void)
   riscv_init_csr_hash (#name, num, class, define_version, abort_version);
 #define DECLARE_CSR_ALIAS(name, num, class, define_version, abort_version) \
   DECLARE_CSR(name, num, class, define_version, abort_version);
+#define DECLARE_CSR_REUSE(name, num, class, define_version, abort_version) \
+  DECLARE_CSR(name, num, class, define_version, abort_version);
 #include "opcode/riscv-opc.h"
 #undef DECLARE_CSR
+#undef DECLARE_CSR_ALIAS
+#undef DECLARE_CSR_REUSE
 
   opcode_names_hash = hash_new ();
   init_opcode_names_hash ();
diff --git a/include/opcode/riscv-opc.h b/include/opcode/riscv-opc.h
index 65d6d7e..a5b53c6 100644
--- a/include/opcode/riscv-opc.h
+++ b/include/opcode/riscv-opc.h
@@ -1379,11 +1379,6 @@ DECLARE_CSR(mcontext, CSR_MCONTEXT, CSR_CLASS_DEBUG, PRIV_SPEC_CLASS_NONE, PRIV_
 DECLARE_CSR(scontext, CSR_SCONTEXT, CSR_CLASS_DEBUG, PRIV_SPEC_CLASS_NONE, PRIV_SPEC_CLASS_NONE)
 #endif /* DECLARE_CSR */
 #ifdef DECLARE_CSR_ALIAS
-DECLARE_CSR_ALIAS(ubadaddr, CSR_UTVAL, CSR_CLASS_I, PRIV_SPEC_CLASS_1P9P1, PRIV_SPEC_CLASS_1P10)
-DECLARE_CSR_ALIAS(sbadaddr, CSR_STVAL, CSR_CLASS_I, PRIV_SPEC_CLASS_1P9P1, PRIV_SPEC_CLASS_1P10)
-DECLARE_CSR_ALIAS(sptbr, CSR_SATP, CSR_CLASS_I, PRIV_SPEC_CLASS_1P9P1, PRIV_SPEC_CLASS_1P10)
-DECLARE_CSR_ALIAS(mbadaddr, CSR_MTVAL, CSR_CLASS_I, PRIV_SPEC_CLASS_1P9P1, PRIV_SPEC_CLASS_1P10)
-DECLARE_CSR_ALIAS(mucounteren, CSR_MCOUNTINHIBIT, CSR_CLASS_I, PRIV_SPEC_CLASS_1P9P1, PRIV_SPEC_CLASS_1P10)
 DECLARE_CSR_ALIAS(dscratch, CSR_DSCRATCH0, CSR_CLASS_DEBUG, PRIV_SPEC_CLASS_NONE, PRIV_SPEC_CLASS_NONE)
 DECLARE_CSR_ALIAS(mcontrol, CSR_TDATA1, CSR_CLASS_DEBUG, PRIV_SPEC_CLASS_NONE, PRIV_SPEC_CLASS_NONE)
 DECLARE_CSR_ALIAS(icount, CSR_TDATA1, CSR_CLASS_DEBUG, PRIV_SPEC_CLASS_NONE, PRIV_SPEC_CLASS_NONE)
@@ -1392,3 +1387,10 @@ DECLARE_CSR_ALIAS(etrigger, CSR_TDATA1, CSR_CLASS_DEBUG, PRIV_SPEC_CLASS_NONE, P
 DECLARE_CSR_ALIAS(textra32, CSR_TDATA3, CSR_CLASS_DEBUG, PRIV_SPEC_CLASS_NONE, PRIV_SPEC_CLASS_NONE)
 DECLARE_CSR_ALIAS(textra64, CSR_TDATA3, CSR_CLASS_DEBUG, PRIV_SPEC_CLASS_NONE, PRIV_SPEC_CLASS_NONE)
 #endif /* DECLARE_CSR_ALIAS */
+#ifdef DECLARE_CSR_REUSE
+DECLARE_CSR_REUSE(ubadaddr, CSR_UTVAL, CSR_CLASS_I, PRIV_SPEC_CLASS_1P9P1, PRIV_SPEC_CLASS_1P10)
+DECLARE_CSR_REUSE(sbadaddr, CSR_STVAL, CSR_CLASS_I, PRIV_SPEC_CLASS_1P9P1, PRIV_SPEC_CLASS_1P10)
+DECLARE_CSR_REUSE(sptbr, CSR_SATP, CSR_CLASS_I, PRIV_SPEC_CLASS_1P9P1, PRIV_SPEC_CLASS_1P10)
+DECLARE_CSR_REUSE(mbadaddr, CSR_MTVAL, CSR_CLASS_I, PRIV_SPEC_CLASS_1P9P1, PRIV_SPEC_CLASS_1P10)
+DECLARE_CSR_REUSE(mucounteren, CSR_MCOUNTINHIBIT, CSR_CLASS_I, PRIV_SPEC_CLASS_1P9P1, PRIV_SPEC_CLASS_1P10)
+#endif /* DECLARE_CSR_REUSE */
diff --git a/opcodes/riscv-dis.c b/opcodes/riscv-dis.c
index 655ce4a..6782622 100644
--- a/opcodes/riscv-dis.c
+++ b/opcodes/riscv-dis.c
@@ -386,8 +386,12 @@ print_insn_args (const char *d, insn_t l, bfd_vma pc, disassemble_info *info)
 		  riscv_csr_hash[num] = #name;
 #define DECLARE_CSR_ALIAS(name, num, class, define_version, abort_version) \
 		DECLARE_CSR (name, num, class, define_version, abort_version)
+#define DECLARE_CSR_REUSE(name, num, class, define_version, abort_version) \
+		DECLARE_CSR (name, num, class, define_version, abort_version)
 #include "opcode/riscv-opc.h"
 #undef DECLARE_CSR
+#undef DECLARE_CSR_ALIAS
+#undef DECLARE_CSR_REUSE
 	      }
 
 	    if (riscv_csr_hash[csr] != NULL)
-- 
2.7.4



More information about the Binutils mailing list