From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm1-x334.google.com (mail-wm1-x334.google.com [IPv6:2a00:1450:4864:20::334]) by sourceware.org (Postfix) with ESMTPS id D158338930D5 for ; Fri, 24 Apr 2020 10:21:21 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org D158338930D5 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=embecosm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=andrew.burgess@embecosm.com Received: by mail-wm1-x334.google.com with SMTP id g12so10064398wmh.3 for ; Fri, 24 Apr 2020 03:21:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to; bh=DtAyDx3xNBhUPQLe8RlnDj7oDXwilQeeTywSCqIE+JQ=; b=XOXUuOFEch7nRypR7gdmcB3h3tmf0J3ycthesJ93AXan1L+rhwQ74WFNYM4LO724m7 et37v/twvI1A4DcMC9wavccwLUqeF4GkenwkrOM+BGQzJbxOB+xqhSIIfyXLAFZklXWC SbLgp4XbbPa7kxtcmQTgmPIAP+IuOOEIN4sTSECCQldqSIBVBKiAeZngUW9hkLll9OWR 4I7f6EyW9jG4rRsP0LCm7PXJDShFEjXiVREXDqCIR0pLN75AUXuTMCpgtyfmHbIAhh1C RjYSBUEuygnUS3cx0XZlHh/y8q2UT4Ai1/2Qimr2iJ1H5PH7pmUyoWR4fqORkdnDqrBC KmfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to; bh=DtAyDx3xNBhUPQLe8RlnDj7oDXwilQeeTywSCqIE+JQ=; b=AS9LwJS+FJeQCTC4pOJFfZwHPWEO2CYcsy4miUY8dyFPeqd05vycYnQp9LP1X4Z6It h30zjgCQ1gG6pu7Km/wswt+nrP+h/DS+4UM24QNAukjnTa1JK2UUjHnIsfyJTFr4cZsq cAU/25ZrZoO1vdASCsOWtEe0t5UeVHHPMTFnqUOl2zG4aROEgH144pTZkD+FkAwAcAj5 j0hpWf0zt75CEU5AeeZPljUJVIbcSNu5eowJbzeW0q5UhnxtnwXYxELVQBNuTaePgGka wZxTppH+2sAqaKMbWx/VcE8m6ux1Dh9r4w18Sf8pYCVVlpBlIIP+Qox1fhAA2hjUDdqQ d9kw== X-Gm-Message-State: AGi0PuZ7bWYcBFIQfC+XaMJ6xh+nOhfP/aAwlvyVXQVKEcghVCkAylc6 S0BcNXJqCvz83WEdxwf0/EwMhw== X-Google-Smtp-Source: APiQypLSz6Epwdu2owMwzbP61folZmz79y/TWATecbcixFhUi3Hs7BCKSKMFmuhAPMswDBEKvY30kQ== X-Received: by 2002:a7b:c147:: with SMTP id z7mr9946492wmi.52.1587723680138; Fri, 24 Apr 2020 03:21:20 -0700 (PDT) Received: from localhost (host81-151-181-184.range81-151.btcentralplus.com. [81.151.181.184]) by smtp.gmail.com with ESMTPSA id j13sm7888031wrq.24.2020.04.24.03.21.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Apr 2020 03:21:19 -0700 (PDT) Date: Fri, 24 Apr 2020 11:21:18 +0100 From: Andrew Burgess To: Nelson Chu Cc: binutils@sourceware.org, gdb-patches@sourceware.org, andrew@sifive.com, asb@lowrisc.org, kito.cheng@sifive.com, maxim.blinov@embecosm.com, jimw@sifive.com Subject: Re: [PATCH 4/7] RISC-V: Support version checking for CSR according to privilege version. Message-ID: <20200424102118.GC3522@embecosm.com> References: <1587208075-2462-1-git-send-email-nelson.chu@sifive.com> <1587208075-2462-5-git-send-email-nelson.chu@sifive.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable In-Reply-To: <1587208075-2462-5-git-send-email-nelson.chu@sifive.com> X-Operating-System: Linux/5.5.17-200.fc31.x86_64 (x86_64) X-Uptime: 11:20:48 up 3 days, 18:17, X-Editor: GNU Emacs [ http://www.gnu.org/software/emacs ] X-Spam-Status: No, score=-24.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 24 Apr 2020 10:21:29 -0000 The gdb/* parts of this patch are approved. I can't approve anything else. Thanks, Andrew * Nelson Chu [2020-04-18 04:07:52 -0700]: > Support new gas option -mpriv-spec and configure option --with-priv-spec.= You > can use these options to choose the privilege spec version, and then asse= mbler > will generates the correct CSR address. If the obselete CSR name is used= , then > report the warning message when the -mcsr-check is set, and use the latest > defined address for the CSR (Since we build hash table by the DECLARE_CSR= first, > and then use the DECLARE_CSR_ALIAS). Maybe we can insert the CSR hash en= tries > in version's order, then we probably don't need the DECLARE_CSR_ALIAS any= more. >=20 > New Assembler Options, >=20 > * -mpriv-spec=3D[1p9|1p9p1|1p10|1p11] > This is used to set the privileged spec=E2=80=99s version, and we can dec= ide whether > the CSR is valid or not. >=20 > New Default Configure Options, >=20 > * --with-priv-spec =3D [1p9|1p9p1|1p10|1p11] > The syntax is same as -mpriv-spec option. Assembler will check this sett= ing > if -mpriv-spec option isn=E2=80=99t set. >=20 > gas/ > * config/tc-riscv.c (DEFAULT_PRIV_SPEC): Default configure option. > You can set it by new configure option --with-priv-spec. > (enum riscv_csr_vclass default_priv_spec): You can set gas option > -mpriv-spec or --with-priv-spec, and then assembler will call > riscv_set_default_priv_version to set the default_priv_spec. > (riscv_set_default_priv_version): New function. Set the > default_priv_spec. Return 0 if the input privilege name isn't > supported. Otherwise, return 1. >=20 > (struct riscv_csr_extra): Add new fields to store more information about > the CSR. We use these information to find the suitable CSR address when > user choosing a specific privilege version. > (enum reg_class): We now get the CSR address from csr_extra_hash rather > than reg_names_hash. Therefore, move RCLASS_CSR behind RCLASS_MAX. > (riscv_init_csr_hashes): Only need to initialize one hash table > csr_extra_hash. > (riscv_csr_class_check): Change the return type to void. Don't check > the ISA dependency if -mcsr-check isn't set. > (riscv_csr_version_check): New function. Check and find the CSR address > from csr_extra_hash, according to default_priv_spec. Report warning > for the invalid CSR if -mcsr-check is set. > (reg_csr_lookup_internal): Updated. > (reg_lookup_internal): Likewise. > (md_begin): Updated since DECLARE_CSR and DECLARE_CSR_ALIAS are changed. >=20 > (enum options, struct option md_longopts): Add new gas option -mpriv-spe= c. > (md_parse_option): Call riscv_set_default_priv_version to set > default_priv_spec. > (riscv_after_parse_args): If -mpriv-spec isn't set, then call > riscv_set_default_priv_version with DEFAULT_PRIV_SPEC to set the default > privilege verison. >=20 > * testsuite/gas/riscv/priv-reg-fail-fext.d: This test case just want > to check the ISA dependency for CSR, so fix the version by adding > -mpriv-spec=3D1p11. > * testsuite/gas/riscv/priv-reg-fail-fext.l: Likewise. There are some > version warnings for the test case. > * gas/testsuite/gas/riscv/priv-reg-fail-read-only-01.d: Likewise. > * gas/testsuite/gas/riscv/priv-reg-fail-read-only-01.l: Likewise. > * gas/testsuite/gas/riscv/priv-reg-fail-rv32-only.d: Likewise. > * gas/testsuite/gas/riscv/priv-reg-fail-rv32-only.l: Likewise. > * gas/testsuite/gas/riscv/priv-reg-fail-version-1p9.d: New test case. > Check whether the CSR is valid when privilege version 1.9 is choosed. > * gas/testsuite/gas/riscv/priv-reg-fail-version-1p9.l: Likewise. > * gas/testsuite/gas/riscv/priv-reg-fail-version-1p9p1.d: New test case. > Check whether the CSR is valid when privilege version 1.9.1 is choosed. > * gas/testsuite/gas/riscv/priv-reg-fail-version-1p9p1.l: Likewise. > * gas/testsuite/gas/riscv/priv-reg-fail-version-1p10.d: New test case. > Check whether the CSR is valid when privilege version 1.10 is choosed. > * gas/testsuite/gas/riscv/priv-reg-fail-version-1p10.l: Likewise. > * gas/testsuite/gas/riscv/priv-reg-fail-version-1p11.d: New test case. > Check whether the CSR is valid when privilege version 1.11 is choosed. > * gas/testsuite/gas/riscv/priv-reg-fail-version-1p11.l: Likewise. >=20 > * configure.ac: Add new configure option --with-priv-spec. > * configure: Regenerated. > * config.in: Regenerated. >=20 > include/ > * opcode/riscv-opc.h (DECLARE_CSR): Store two version information, > define_version and abort_version for the CSR, which is valid in the > current privilege spec. The define_version means which privilege spec > started to define the CSR, and the abort_version means which privilege > spec started to abort the CSR. If the CSR is valid for the newest spec, > then the abort_version is set to CSR_CLASS_VDRAFT. > (DECLARE_CSR_ALIAS): Same as DECLARE_CSR, but only for the obselete CSR. > * opcode/riscv.h: Include "bfd.h" to define bfd_boolean type. > (enum riscv_csr_vclass): New enum classes. Define the current supported > privilege versions. >=20 > opcodes/ > * riscv-opc.c (struct priv_version_t): New structure. > (struct priv_version_t priv_versions): Store the supported privilege > versions' classes and their corresponding version string. > (riscv_get_priv_version_class): New function. Get the corresponding > CSR version class by giving a privilege version string. > (riscv_get_priv_version_name): New function. Get the corresponding > privilege version string by giving a CSR version class. >=20 > * riscv-dis.c: Updated since DECLARE_CSR is changed. >=20 > gdb/ > * riscv-tdep.c: Updated since DECLARE_CSR is changed. > * riscv-tdep.h: Likewise. >=20 > binutils/ > * dwarf.c: Updated since DECLARE_CSR is changed. > --- > binutils/dwarf.c | 3 +- > gas/config.in | 3 + > gas/config/tc-riscv.c | 213 +++++++-- > gas/configure | 13 + > gas/configure.ac | 8 + > gas/testsuite/gas/riscv/priv-reg-fail-fext.d | 2 +- > gas/testsuite/gas/riscv/priv-reg-fail-fext.l | 25 + > .../gas/riscv/priv-reg-fail-read-only-01.d | 2 +- > .../gas/riscv/priv-reg-fail-read-only-01.l | 25 + > gas/testsuite/gas/riscv/priv-reg-fail-rv32-only.d | 2 +- > gas/testsuite/gas/riscv/priv-reg-fail-rv32-only.l | 25 + > .../gas/riscv/priv-reg-fail-version-1p10.d | 3 + > .../gas/riscv/priv-reg-fail-version-1p10.l | 27 ++ > .../gas/riscv/priv-reg-fail-version-1p11.d | 3 + > .../gas/riscv/priv-reg-fail-version-1p11.l | 25 + > .../gas/riscv/priv-reg-fail-version-1p9.d | 3 + > .../gas/riscv/priv-reg-fail-version-1p9.l | 30 ++ > .../gas/riscv/priv-reg-fail-version-1p9p1.d | 3 + > .../gas/riscv/priv-reg-fail-version-1p9p1.l | 30 ++ > gdb/riscv-tdep.c | 6 +- > gdb/riscv-tdep.h | 2 +- > include/opcode/riscv-opc.h | 509 ++++++++++-----= ------ > include/opcode/riscv.h | 19 + > opcodes/riscv-dis.c | 3 +- > opcodes/riscv-opc.c | 55 +++ > 25 files changed, 728 insertions(+), 311 deletions(-) > create mode 100644 gas/testsuite/gas/riscv/priv-reg-fail-version-1p10.d > create mode 100644 gas/testsuite/gas/riscv/priv-reg-fail-version-1p10.l > create mode 100644 gas/testsuite/gas/riscv/priv-reg-fail-version-1p11.d > create mode 100644 gas/testsuite/gas/riscv/priv-reg-fail-version-1p11.l > create mode 100644 gas/testsuite/gas/riscv/priv-reg-fail-version-1p9.d > create mode 100644 gas/testsuite/gas/riscv/priv-reg-fail-version-1p9.l > create mode 100644 gas/testsuite/gas/riscv/priv-reg-fail-version-1p9p1.d > create mode 100644 gas/testsuite/gas/riscv/priv-reg-fail-version-1p9p1.l >=20 > diff --git a/binutils/dwarf.c b/binutils/dwarf.c > index c75059b..a972c60 100644 > --- a/binutils/dwarf.c > +++ b/binutils/dwarf.c > @@ -7378,7 +7378,8 @@ regname_internal_riscv (unsigned int regno) > document. */ > switch (regno) > { > -#define DECLARE_CSR(NAME,VALUE,CLASS) case VALUE + 4096: name =3D #NAME;= break; > +#define DECLARE_CSR(NAME,VALUE,CLASS,DEFINE_VER,ABORT_VER) \ > + case VALUE + 4096: name =3D #NAME; break; > #include "opcode/riscv-opc.h" > #undef DECLARE_CSR > =20 > diff --git a/gas/config.in b/gas/config.in > index 935bd9b..093f474 100644 > --- a/gas/config.in > +++ b/gas/config.in > @@ -59,6 +59,9 @@ > /* Define to 1 if you want to fix Loongson3 LLSC Errata by default. */ > #undef DEFAULT_MIPS_FIX_LOONGSON3_LLSC > =20 > +/* Define default value for -mpriv-spec */ > +#undef DEFAULT_PRIV_SPEC > + > /* Define to 1 if you want to generate RISC-V arch attribute by default.= */ > #undef DEFAULT_RISCV_ATTR > =20 > diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c > index bfcf2f0..6528a03 100644 > --- a/gas/config/tc-riscv.c > +++ b/gas/config/tc-riscv.c > @@ -75,10 +75,15 @@ struct riscv_cl_insn > #define DEFAULT_RISCV_ISA_VERSION NULL > #endif > =20 > +#ifndef DEFAULT_PRIV_SPEC > +#define DEFAULT_PRIV_SPEC "1p11" > +#endif > + > static const char default_arch[] =3D DEFAULT_ARCH; > static const char *default_arch_with_ext =3D DEFAULT_ARCH_WITH_EXT; > static const char *default_isa_spec =3D DEFAULT_ISA_SPEC; > static const char *default_riscv_isa_version =3D DEFAULT_RISCV_ISA_VERSI= ON; > +static enum riscv_csr_vclass default_priv_spec =3D CSR_CLASS_VNONE; > =20 > static unsigned xlen =3D 0; /* width of an x-register */ > static unsigned abi_xlen =3D 0; /* width of a pointer in the ABI */ > @@ -536,8 +541,9 @@ enum reg_class > { > RCLASS_GPR, > RCLASS_FPR, > - RCLASS_CSR, > - RCLASS_MAX > + RCLASS_MAX, > + > + RCLASS_CSR > }; > =20 > static struct hash_control *reg_names_hash =3D NULL; > @@ -585,84 +591,197 @@ struct riscv_csr_extra > /* Class to which this CSR belongs. Used to decide whether or > not this CSR is legal in the current -march context. */ > enum riscv_csr_class csr_class; > + > + /* CSR may have differnet numbers in the previous priv spec. */ > + unsigned address; > + > + /* Record the CSR is defined/valid in which versions. */ > + enum riscv_csr_vclass define_version; > + > + /* Record the CSR is aborted/invalid from which versions. If it isn't > + aborted in the current version, then it should be CSR_CLASS_VDRAFT.= */ > + enum riscv_csr_vclass abort_version; > + > + /* The CSR may have more than one setting. */ > + struct riscv_csr_extra *next; > }; > =20 > -/* Init two hashes, csr_extra_hash and reg_names_hash, for CSR. */ > +/* Set the default_priv_spec, assembler will find the suitable CSR addre= ss > + according to default_priv_spec. Return 0 if the input priv name isn't > + supported. Otherwise, return 1. */ > =20 > -static void > -riscv_init_csr_hashes (const char *name, > - unsigned address, > - enum riscv_csr_class class) > +static int > +riscv_set_default_priv_version (const char *s) > { > - struct riscv_csr_extra *entry =3D XNEW (struct riscv_csr_extra); > - entry->csr_class =3D class; > + enum riscv_csr_vclass class; > + if (!riscv_get_priv_version_class (s, &class)) > + { > + as_bad (_("Unsupported RISC-V privilege version set by " > + "-mpriv-spec=3D%s."), s); > + return 0; > + } > + else > + default_priv_spec =3D class; > + return 1; > +} > + > +/* Init hash table csr_extra_hash to handle CSR. */ > =20 > - const char *hash_error =3D > - hash_insert (csr_extra_hash, name, (void *) entry); > - if (hash_error !=3D NULL) > +static void > +riscv_init_csr_hash (const char *name, > + unsigned address, > + enum riscv_csr_class class, > + enum riscv_csr_vclass define_version, > + enum riscv_csr_vclass abort_version) > +{ > + struct riscv_csr_extra *entry, *pre_entry; > + const char *hash_error =3D NULL; > + bfd_boolean need_enrty =3D TRUE; > + > + pre_entry =3D NULL; > + entry =3D (struct riscv_csr_extra *) hash_find (csr_extra_hash, name); > + while (need_enrty && entry !=3D NULL) > { > - fprintf (stderr, _("internal error: can't hash `%s': %s\n"), > - name, hash_error); > - /* Probably a memory allocation problem? Give up now. */ > - as_fatal (_("Broken assembler. No assembly attempted.")); > + if (entry->csr_class =3D=3D class > + && entry->address =3D=3D address > + && entry->define_version =3D=3D define_version > + && entry->abort_version =3D=3D abort_version) > + need_enrty =3D FALSE; > + pre_entry =3D entry; > + entry =3D entry->next; > } > =20 > - hash_reg_name (RCLASS_CSR, name, address); > + /* Duplicate setting for the CSR, just return and do nothing. */ > + if (!need_enrty) > + return; > + > + entry =3D XNEW (struct riscv_csr_extra); > + entry->csr_class =3D class; > + entry->address =3D address; > + entry->define_version =3D define_version; > + entry->abort_version =3D abort_version; > + > + /* If the CSR hasn't been inserted in the hash table, then insert it. > + Otherwise, attach the extra information to the entry which is alrea= dy > + in the hash table. */ > + if (pre_entry =3D=3D NULL) > + { > + hash_error =3D hash_insert (csr_extra_hash, name, (void *) entry); > + if (hash_error !=3D NULL) > + { > + fprintf (stderr, _("internal error: can't hash `%s': %s\n"), > + name, hash_error); > + /* Probably a memory allocation problem? Give up now. */ > + as_fatal (_("Broken assembler. No assembly attempted.")); > + } > + } > + else > + pre_entry->next =3D entry; > } > =20 > /* Check wether the CSR is valid according to the ISA. */ > =20 > -static bfd_boolean > -riscv_csr_class_check (enum riscv_csr_class csr_class) > +static void > +riscv_csr_class_check (const char *s, > + enum riscv_csr_class csr_class) > { > + bfd_boolean result =3D TRUE; > + > + /* Don't check the ISA dependency when -mcsr-check isn't set. */ > + if (!riscv_opts.csr_check) > + return; > + > switch (csr_class) > { > - case CSR_CLASS_I: return riscv_subset_supports ("i"); > - case CSR_CLASS_F: return riscv_subset_supports ("f"); > + case CSR_CLASS_I: > + result =3D riscv_subset_supports ("i"); > + break; > + case CSR_CLASS_F: > + result =3D riscv_subset_supports ("f"); > + break; > case CSR_CLASS_I_32: > - return (xlen =3D=3D 32 && riscv_subset_supports ("i")); > - > + result =3D (xlen =3D=3D 32 && riscv_subset_supports ("i")); > + break; > default: > - return FALSE; > + as_bad (_("internal: bad RISC-V CSR class (0x%x)"), csr_class); > } > + if (!result) > + as_warn (_("Invalid CSR `%s' for the current ISA"), s); > } > =20 > -/* If the CSR is defined, then we call `riscv_csr_class_check` to do the > - further checking. Return FALSE if the CSR is not defined. Otherwise, > - return TRUE. */ > +/* Check and find the CSR address according to the privilege spec versio= n. */ > =20 > -static bfd_boolean > +static void > +riscv_csr_version_check (const char *csr_name, > + struct riscv_csr_extra **entryP) > +{ > + struct riscv_csr_extra *entry =3D *entryP; > + while (entry !=3D NULL) > + { > + if (default_priv_spec >=3D entry->define_version > + && default_priv_spec < entry->abort_version) > + { > + /* Find the suitable CSR according to the specific version. */ > + *entryP =3D entry; > + return; > + } > + entry =3D entry->next; > + } > + > + /* We can not find the suitable CSR address according to the privilege > + version. Therefore, we use the last defined value. Report the war= ning > + only when the -mcsr-check is set. Enable the -mcsr-check is recomm= ended, > + otherwise, you may get the unexpected CSR address. */ > + if (riscv_opts.csr_check) > + { > + const char *priv_name =3D riscv_get_priv_version_name (default_pri= v_spec); > + if (priv_name !=3D NULL) > + as_warn (_("Invalid CSR `%s' for the privilege version `%s'"), > + csr_name, priv_name); > + } > +} > + > +/* Once the CSR is defined, including the old privilege spec, then we ca= ll > + riscv_csr_class_check and riscv_csr_version_check to do the further > + checking and get the corresponding address. Return -1 if the CSR is = never > + been defined. Otherwise, return the address. */ > + > +static unsigned int > reg_csr_lookup_internal (const char *s) > { > struct riscv_csr_extra *r =3D > (struct riscv_csr_extra *) hash_find (csr_extra_hash, s); > =20 > if (r =3D=3D NULL) > - return FALSE; > + return -1; > =20 > - /* We just report the warning when the CSR is invalid. */ > - if (!riscv_csr_class_check (r->csr_class)) > - as_warn (_("Invalid CSR `%s' for the current ISA"), s); > + /* We just report the warning when the CSR is invalid. "Invalid CSR" = means > + the CSR was defined, but isn't allowed for the current ISA setting = or > + the privilege version. If the CSR is never been defined, then asse= mbler > + will regard it as a "Unknown CSR" and report error. If user use nu= mber > + to set the CSR, but over the range (> 0xfff), then assembler will r= eport > + "Improper CSR" error for it. */ > + riscv_csr_class_check (s, r->csr_class); > + riscv_csr_version_check (s, &r); > =20 > - return TRUE; > + return r->address; > } > =20 > static unsigned int > reg_lookup_internal (const char *s, enum reg_class class) > { > - void *r =3D hash_find (reg_names_hash, s); > + void *r; > + > + if (class =3D=3D RCLASS_CSR) > + return reg_csr_lookup_internal (s); > =20 > + r =3D hash_find (reg_names_hash, s); > if (r =3D=3D NULL || DECODE_REG_CLASS (r) !=3D class) > return -1; > =20 > if (riscv_opts.rve && class =3D=3D RCLASS_GPR && DECODE_REG_NUM (r) > = 15) > return -1; > =20 > - if (class =3D=3D RCLASS_CSR > - && riscv_opts.csr_check > - && !reg_csr_lookup_internal (s)) > - return -1; > - > return DECODE_REG_NUM (r); > } > =20 > @@ -946,8 +1065,10 @@ md_begin (void) > =20 > /* Create and insert CSR hash tables. */ > csr_extra_hash =3D hash_new (); > -#define DECLARE_CSR(name, num, class) riscv_init_csr_hashes (#name, num,= class); > -#define DECLARE_CSR_ALIAS(name, num, class) DECLARE_CSR(name, num, class= ); > +#define DECLARE_CSR(name, num, class, define_version, abort_version) \ > + riscv_init_csr_hash (#name, num, class, define_version, abort_version); > +#define DECLARE_CSR_ALIAS(name, num, class, define_version, abort_versio= n) \ > + DECLARE_CSR(name, num, class, define_version, abort_version); > #include "opcode/riscv-opc.h" > #undef DECLARE_CSR > =20 > @@ -2434,6 +2555,7 @@ enum options > OPTION_NO_CSR_CHECK, > OPTION_MISA_SPEC, > OPTION_MRISCV_ISA_VERSION, > + OPTION_MPRIV_SPEC, > OPTION_END_OF_ENUM > }; > =20 > @@ -2452,6 +2574,7 @@ struct option md_longopts[] =3D > {"mno-csr-check", no_argument, NULL, OPTION_NO_CSR_CHECK}, > {"misa-spec", required_argument, NULL, OPTION_MISA_SPEC}, > {"mriscv-isa-version", required_argument, NULL, OPTION_MRISCV_ISA_VERS= ION}, > + {"mpriv-spec", required_argument, NULL, OPTION_MPRIV_SPEC}, > =20 > {NULL, no_argument, NULL, 0} > }; > @@ -2548,6 +2671,9 @@ md_parse_option (int c, const char *arg) > default_riscv_isa_version =3D arg; > break; > =20 > + case OPTION_MPRIV_SPEC: > + return riscv_set_default_priv_version (arg); > + > default: > return 0; > } > @@ -2594,6 +2720,11 @@ riscv_after_parse_args (void) > if (riscv_subset_supports ("e")) > riscv_set_rve (TRUE); > =20 > + /* If the -mpriv-spec isn't set, then we set the default privilege ver= sion > + according to DEFAULT_PRIV_SPEC, */ > + if (default_priv_spec =3D=3D CSR_CLASS_VNONE) > + riscv_set_default_priv_version (DEFAULT_PRIV_SPEC); > + > /* Infer ABI from ISA if not specified on command line. */ > if (abi_xlen =3D=3D 0) > abi_xlen =3D xlen; > diff --git a/gas/configure b/gas/configure > index bce847a..0911152 100755 > --- a/gas/configure > +++ b/gas/configure > @@ -13068,6 +13068,19 @@ _ACEOF > fi > { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_riscv_isa_versio= n" >&5 > $as_echo "$with_riscv_isa_version" >&6; } > + > + # --with-priv-spec=3D[1p9p1|1p10|1p11]. > + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for default configura= tion of --with-priv-spec" >&5 > +$as_echo_n "checking for default configuration of --with-priv-spec... " = >&6; } > + if test "x${with_priv_spec}" !=3D x; then > + > +cat >>confdefs.h <<_ACEOF > +#define DEFAULT_PRIV_SPEC "$with_priv_spec" > +_ACEOF > + > + fi > + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_priv_spec" >&5 > +$as_echo "$with_priv_spec" >&6; } > ;; > =20 > rl78) > diff --git a/gas/configure.ac b/gas/configure.ac > index be4ba20..c3d3639 100644 > --- a/gas/configure.ac > +++ b/gas/configure.ac > @@ -606,6 +606,14 @@ changequote([,])dnl > covered by --with-isa-spec]) > fi > AC_MSG_RESULT($with_riscv_isa_version) > + > + # --with-priv-spec=3D[1p9p1|1p10|1p11]. > + AC_MSG_CHECKING(for default configuration of --with-priv-spec) > + if test "x${with_priv_spec}" !=3D x; then > + AC_DEFINE_UNQUOTED(DEFAULT_PRIV_SPEC, "$with_priv_spec", > + [Define default value for -mpriv-spec]) > + fi > + AC_MSG_RESULT($with_priv_spec) > ;; > =20 > rl78) > diff --git a/gas/testsuite/gas/riscv/priv-reg-fail-fext.d b/gas/testsuite= /gas/riscv/priv-reg-fail-fext.d > index da53566..0033e3c 100644 > --- a/gas/testsuite/gas/riscv/priv-reg-fail-fext.d > +++ b/gas/testsuite/gas/riscv/priv-reg-fail-fext.d > @@ -1,3 +1,3 @@ > -#as: -march=3Drv32i -mcsr-check > +#as: -march=3Drv32i -mcsr-check -mpriv-spec=3D1p11 > #source: priv-reg.s > #warning_output: priv-reg-fail-fext.l > diff --git a/gas/testsuite/gas/riscv/priv-reg-fail-fext.l b/gas/testsuite= /gas/riscv/priv-reg-fail-fext.l > index 76818c8..d3b1bad 100644 > --- a/gas/testsuite/gas/riscv/priv-reg-fail-fext.l > +++ b/gas/testsuite/gas/riscv/priv-reg-fail-fext.l > @@ -2,3 +2,28 @@ > .*Warning: Invalid CSR `fflags' for the current ISA > .*Warning: Invalid CSR `frm' for the current ISA > .*Warning: Invalid CSR `fcsr' for the current ISA > + > +.*Warning: Invalid CSR `ubadaddr' for the privilege version `1p11' > +.*Warning: Invalid CSR `sbadaddr' for the privilege version `1p11' > +.*Warning: Invalid CSR `sptbr' for the privilege version `1p11' > +.*Warning: Invalid CSR `mbadaddr' for the privilege version `1p11' > +.*Warning: Invalid CSR `mucounteren' for the privilege version `1p11' > +.*Warning: Invalid CSR `dscratch' for the privilege version `1p11' > +.*Warning: Invalid CSR `hstatus' for the privilege version `1p11' > +.*Warning: Invalid CSR `hedeleg' for the privilege version `1p11' > +.*Warning: Invalid CSR `hideleg' for the privilege version `1p11' > +.*Warning: Invalid CSR `hie' for the privilege version `1p11' > +.*Warning: Invalid CSR `htvec' for the privilege version `1p11' > +.*Warning: Invalid CSR `hscratch' for the privilege version `1p11' > +.*Warning: Invalid CSR `hepc' for the privilege version `1p11' > +.*Warning: Invalid CSR `hcause' for the privilege version `1p11' > +.*Warning: Invalid CSR `hbadaddr' for the privilege version `1p11' > +.*Warning: Invalid CSR `hip' for the privilege version `1p11' > +.*Warning: Invalid CSR `mbase' for the privilege version `1p11' > +.*Warning: Invalid CSR `mbound' for the privilege version `1p11' > +.*Warning: Invalid CSR `mibase' for the privilege version `1p11' > +.*Warning: Invalid CSR `mibound' for the privilege version `1p11' > +.*Warning: Invalid CSR `mdbase' for the privilege version `1p11' > +.*Warning: Invalid CSR `mdbound' for the privilege version `1p11' > +.*Warning: Invalid CSR `mscounteren' for the privilege version `1p11' > +.*Warning: Invalid CSR `mhcounteren' for the privilege version `1p11' > diff --git a/gas/testsuite/gas/riscv/priv-reg-fail-read-only-01.d b/gas/t= estsuite/gas/riscv/priv-reg-fail-read-only-01.d > index ae190c0..bbf83b5 100644 > --- a/gas/testsuite/gas/riscv/priv-reg-fail-read-only-01.d > +++ b/gas/testsuite/gas/riscv/priv-reg-fail-read-only-01.d > @@ -1,3 +1,3 @@ > -#as: -march=3Drv32if -mcsr-check > +#as: -march=3Drv32if -mcsr-check -mpriv-spec=3D1p11 > #source: priv-reg-fail-read-only-01.s > #warning_output: priv-reg-fail-read-only-01.l > diff --git a/gas/testsuite/gas/riscv/priv-reg-fail-read-only-01.l b/gas/t= estsuite/gas/riscv/priv-reg-fail-read-only-01.l > index 7e52bd7..e8355f1 100644 > --- a/gas/testsuite/gas/riscv/priv-reg-fail-read-only-01.l > +++ b/gas/testsuite/gas/riscv/priv-reg-fail-read-only-01.l > @@ -67,3 +67,28 @@ > .*Warning: Read-only CSR is written `csrw marchid,a1' > .*Warning: Read-only CSR is written `csrw mimpid,a1' > .*Warning: Read-only CSR is written `csrw mhartid,a1' > + > +.*Warning: Invalid CSR `ubadaddr' for the privilege version `1p11' > +.*Warning: Invalid CSR `sbadaddr' for the privilege version `1p11' > +.*Warning: Invalid CSR `sptbr' for the privilege version `1p11' > +.*Warning: Invalid CSR `mbadaddr' for the privilege version `1p11' > +.*Warning: Invalid CSR `mucounteren' for the privilege version `1p11' > +.*Warning: Invalid CSR `dscratch' for the privilege version `1p11' > +.*Warning: Invalid CSR `hstatus' for the privilege version `1p11' > +.*Warning: Invalid CSR `hedeleg' for the privilege version `1p11' > +.*Warning: Invalid CSR `hideleg' for the privilege version `1p11' > +.*Warning: Invalid CSR `hie' for the privilege version `1p11' > +.*Warning: Invalid CSR `htvec' for the privilege version `1p11' > +.*Warning: Invalid CSR `hscratch' for the privilege version `1p11' > +.*Warning: Invalid CSR `hepc' for the privilege version `1p11' > +.*Warning: Invalid CSR `hcause' for the privilege version `1p11' > +.*Warning: Invalid CSR `hbadaddr' for the privilege version `1p11' > +.*Warning: Invalid CSR `hip' for the privilege version `1p11' > +.*Warning: Invalid CSR `mbase' for the privilege version `1p11' > +.*Warning: Invalid CSR `mbound' for the privilege version `1p11' > +.*Warning: Invalid CSR `mibase' for the privilege version `1p11' > +.*Warning: Invalid CSR `mibound' for the privilege version `1p11' > +.*Warning: Invalid CSR `mdbase' for the privilege version `1p11' > +.*Warning: Invalid CSR `mdbound' for the privilege version `1p11' > +.*Warning: Invalid CSR `mscounteren' for the privilege version `1p11' > +.*Warning: Invalid CSR `mhcounteren' for the privilege version `1p11' > diff --git a/gas/testsuite/gas/riscv/priv-reg-fail-rv32-only.d b/gas/test= suite/gas/riscv/priv-reg-fail-rv32-only.d > index d71b261..a0b88cf 100644 > --- a/gas/testsuite/gas/riscv/priv-reg-fail-rv32-only.d > +++ b/gas/testsuite/gas/riscv/priv-reg-fail-rv32-only.d > @@ -1,3 +1,3 @@ > -#as: -march=3Drv64if -mcsr-check > +#as: -march=3Drv64if -mcsr-check -mpriv-spec=3D1p11 > #source: priv-reg.s > #warning_output: priv-reg-fail-rv32-only.l > diff --git a/gas/testsuite/gas/riscv/priv-reg-fail-rv32-only.l b/gas/test= suite/gas/riscv/priv-reg-fail-rv32-only.l > index fa5a1b4..5e96a85 100644 > --- a/gas/testsuite/gas/riscv/priv-reg-fail-rv32-only.l > +++ b/gas/testsuite/gas/riscv/priv-reg-fail-rv32-only.l > @@ -64,3 +64,28 @@ > .*Warning: Invalid CSR `mhpmcounter29h' for the current ISA > .*Warning: Invalid CSR `mhpmcounter30h' for the current ISA > .*Warning: Invalid CSR `mhpmcounter31h' for the current ISA > + > +.*Warning: Invalid CSR `ubadaddr' for the privilege version `1p11' > +.*Warning: Invalid CSR `sbadaddr' for the privilege version `1p11' > +.*Warning: Invalid CSR `sptbr' for the privilege version `1p11' > +.*Warning: Invalid CSR `mbadaddr' for the privilege version `1p11' > +.*Warning: Invalid CSR `mucounteren' for the privilege version `1p11' > +.*Warning: Invalid CSR `dscratch' for the privilege version `1p11' > +.*Warning: Invalid CSR `hstatus' for the privilege version `1p11' > +.*Warning: Invalid CSR `hedeleg' for the privilege version `1p11' > +.*Warning: Invalid CSR `hideleg' for the privilege version `1p11' > +.*Warning: Invalid CSR `hie' for the privilege version `1p11' > +.*Warning: Invalid CSR `htvec' for the privilege version `1p11' > +.*Warning: Invalid CSR `hscratch' for the privilege version `1p11' > +.*Warning: Invalid CSR `hepc' for the privilege version `1p11' > +.*Warning: Invalid CSR `hcause' for the privilege version `1p11' > +.*Warning: Invalid CSR `hbadaddr' for the privilege version `1p11' > +.*Warning: Invalid CSR `hip' for the privilege version `1p11' > +.*Warning: Invalid CSR `mbase' for the privilege version `1p11' > +.*Warning: Invalid CSR `mbound' for the privilege version `1p11' > +.*Warning: Invalid CSR `mibase' for the privilege version `1p11' > +.*Warning: Invalid CSR `mibound' for the privilege version `1p11' > +.*Warning: Invalid CSR `mdbase' for the privilege version `1p11' > +.*Warning: Invalid CSR `mdbound' for the privilege version `1p11' > +.*Warning: Invalid CSR `mscounteren' for the privilege version `1p11' > +.*Warning: Invalid CSR `mhcounteren' for the privilege version `1p11' > diff --git a/gas/testsuite/gas/riscv/priv-reg-fail-version-1p10.d b/gas/t= estsuite/gas/riscv/priv-reg-fail-version-1p10.d > new file mode 100644 > index 0000000..d7a788a > --- /dev/null > +++ b/gas/testsuite/gas/riscv/priv-reg-fail-version-1p10.d > @@ -0,0 +1,3 @@ > +#as: -march=3Drv32if -mcsr-check -mpriv-spec=3D1p10 > +#source: priv-reg.s > +#warning_output: priv-reg-fail-version-1p10.l > diff --git a/gas/testsuite/gas/riscv/priv-reg-fail-version-1p10.l b/gas/t= estsuite/gas/riscv/priv-reg-fail-version-1p10.l > new file mode 100644 > index 0000000..f532962 > --- /dev/null > +++ b/gas/testsuite/gas/riscv/priv-reg-fail-version-1p10.l > @@ -0,0 +1,27 @@ > +.*Assembler messages: > +.*Warning: Invalid CSR `mcountinhibit' for the privilege version `1p10' > +.*Warning: Invalid CSR `dscratch0' for the privilege version `1p10' > +.*Warning: Invalid CSR `dscratch1' for the privilege version `1p10' > +.*Warning: Invalid CSR `ubadaddr' for the privilege version `1p10' > +.*Warning: Invalid CSR `sbadaddr' for the privilege version `1p10' > +.*Warning: Invalid CSR `sptbr' for the privilege version `1p10' > +.*Warning: Invalid CSR `mbadaddr' for the privilege version `1p10' > +.*Warning: Invalid CSR `mucounteren' for the privilege version `1p10' > +.*Warning: Invalid CSR `hstatus' for the privilege version `1p10' > +.*Warning: Invalid CSR `hedeleg' for the privilege version `1p10' > +.*Warning: Invalid CSR `hideleg' for the privilege version `1p10' > +.*Warning: Invalid CSR `hie' for the privilege version `1p10' > +.*Warning: Invalid CSR `htvec' for the privilege version `1p10' > +.*Warning: Invalid CSR `hscratch' for the privilege version `1p10' > +.*Warning: Invalid CSR `hepc' for the privilege version `1p10' > +.*Warning: Invalid CSR `hcause' for the privilege version `1p10' > +.*Warning: Invalid CSR `hbadaddr' for the privilege version `1p10' > +.*Warning: Invalid CSR `hip' for the privilege version `1p10' > +.*Warning: Invalid CSR `mbase' for the privilege version `1p10' > +.*Warning: Invalid CSR `mbound' for the privilege version `1p10' > +.*Warning: Invalid CSR `mibase' for the privilege version `1p10' > +.*Warning: Invalid CSR `mibound' for the privilege version `1p10' > +.*Warning: Invalid CSR `mdbase' for the privilege version `1p10' > +.*Warning: Invalid CSR `mdbound' for the privilege version `1p10' > +.*Warning: Invalid CSR `mscounteren' for the privilege version `1p10' > +.*Warning: Invalid CSR `mhcounteren' for the privilege version `1p10' > diff --git a/gas/testsuite/gas/riscv/priv-reg-fail-version-1p11.d b/gas/t= estsuite/gas/riscv/priv-reg-fail-version-1p11.d > new file mode 100644 > index 0000000..2830c83 > --- /dev/null > +++ b/gas/testsuite/gas/riscv/priv-reg-fail-version-1p11.d > @@ -0,0 +1,3 @@ > +#as: -march=3Drv32if -mcsr-check -mpriv-spec=3D1p11 > +#source: priv-reg.s > +#warning_output: priv-reg-fail-version-1p11.l > diff --git a/gas/testsuite/gas/riscv/priv-reg-fail-version-1p11.l b/gas/t= estsuite/gas/riscv/priv-reg-fail-version-1p11.l > new file mode 100644 > index 0000000..252f96a > --- /dev/null > +++ b/gas/testsuite/gas/riscv/priv-reg-fail-version-1p11.l > @@ -0,0 +1,25 @@ > +.*Assembler messages: > +.*Warning: Invalid CSR `ubadaddr' for the privilege version `1p11' > +.*Warning: Invalid CSR `sbadaddr' for the privilege version `1p11' > +.*Warning: Invalid CSR `sptbr' for the privilege version `1p11' > +.*Warning: Invalid CSR `mbadaddr' for the privilege version `1p11' > +.*Warning: Invalid CSR `mucounteren' for the privilege version `1p11' > +.*Warning: Invalid CSR `dscratch' for the privilege version `1p11' > +.*Warning: Invalid CSR `hstatus' for the privilege version `1p11' > +.*Warning: Invalid CSR `hedeleg' for the privilege version `1p11' > +.*Warning: Invalid CSR `hideleg' for the privilege version `1p11' > +.*Warning: Invalid CSR `hie' for the privilege version `1p11' > +.*Warning: Invalid CSR `htvec' for the privilege version `1p11' > +.*Warning: Invalid CSR `hscratch' for the privilege version `1p11' > +.*Warning: Invalid CSR `hepc' for the privilege version `1p11' > +.*Warning: Invalid CSR `hcause' for the privilege version `1p11' > +.*Warning: Invalid CSR `hbadaddr' for the privilege version `1p11' > +.*Warning: Invalid CSR `hip' for the privilege version `1p11' > +.*Warning: Invalid CSR `mbase' for the privilege version `1p11' > +.*Warning: Invalid CSR `mbound' for the privilege version `1p11' > +.*Warning: Invalid CSR `mibase' for the privilege version `1p11' > +.*Warning: Invalid CSR `mibound' for the privilege version `1p11' > +.*Warning: Invalid CSR `mdbase' for the privilege version `1p11' > +.*Warning: Invalid CSR `mdbound' for the privilege version `1p11' > +.*Warning: Invalid CSR `mscounteren' for the privilege version `1p11' > +.*Warning: Invalid CSR `mhcounteren' for the privilege version `1p11' > diff --git a/gas/testsuite/gas/riscv/priv-reg-fail-version-1p9.d b/gas/te= stsuite/gas/riscv/priv-reg-fail-version-1p9.d > new file mode 100644 > index 0000000..70c405f > --- /dev/null > +++ b/gas/testsuite/gas/riscv/priv-reg-fail-version-1p9.d > @@ -0,0 +1,3 @@ > +#as: -march=3Drv32if -mcsr-check -mpriv-spec=3D1p9 > +#source: priv-reg.s > +#warning_output: priv-reg-fail-version-1p9.l > diff --git a/gas/testsuite/gas/riscv/priv-reg-fail-version-1p9.l b/gas/te= stsuite/gas/riscv/priv-reg-fail-version-1p9.l > new file mode 100644 > index 0000000..92e1463 > --- /dev/null > +++ b/gas/testsuite/gas/riscv/priv-reg-fail-version-1p9.l > @@ -0,0 +1,30 @@ > +.*Assembler messages: > +.*Warning: Invalid CSR `utval' for the privilege version `1p9' > +.*Warning: Invalid CSR `scounteren' for the privilege version `1p9' > +.*Warning: Invalid CSR `stval' for the privilege version `1p9' > +.*Warning: Invalid CSR `satp' for the privilege version `1p9' > +.*Warning: Invalid CSR `mcounteren' for the privilege version `1p9' > +.*Warning: Invalid CSR `mtval' for the privilege version `1p9' > +.*Warning: Invalid CSR `pmpcfg0' for the privilege version `1p9' > +.*Warning: Invalid CSR `pmpcfg1' for the privilege version `1p9' > +.*Warning: Invalid CSR `pmpcfg2' for the privilege version `1p9' > +.*Warning: Invalid CSR `pmpcfg3' for the privilege version `1p9' > +.*Warning: Invalid CSR `pmpaddr0' for the privilege version `1p9' > +.*Warning: Invalid CSR `pmpaddr1' for the privilege version `1p9' > +.*Warning: Invalid CSR `pmpaddr2' for the privilege version `1p9' > +.*Warning: Invalid CSR `pmpaddr3' for the privilege version `1p9' > +.*Warning: Invalid CSR `pmpaddr4' for the privilege version `1p9' > +.*Warning: Invalid CSR `pmpaddr5' for the privilege version `1p9' > +.*Warning: Invalid CSR `pmpaddr6' for the privilege version `1p9' > +.*Warning: Invalid CSR `pmpaddr7' for the privilege version `1p9' > +.*Warning: Invalid CSR `pmpaddr8' for the privilege version `1p9' > +.*Warning: Invalid CSR `pmpaddr9' for the privilege version `1p9' > +.*Warning: Invalid CSR `pmpaddr10' for the privilege version `1p9' > +.*Warning: Invalid CSR `pmpaddr11' for the privilege version `1p9' > +.*Warning: Invalid CSR `pmpaddr12' for the privilege version `1p9' > +.*Warning: Invalid CSR `pmpaddr13' for the privilege version `1p9' > +.*Warning: Invalid CSR `pmpaddr14' for the privilege version `1p9' > +.*Warning: Invalid CSR `pmpaddr15' for the privilege version `1p9' > +.*Warning: Invalid CSR `mcountinhibit' for the privilege version `1p9' > +.*Warning: Invalid CSR `dscratch0' for the privilege version `1p9' > +.*Warning: Invalid CSR `dscratch1' for the privilege version `1p9' > diff --git a/gas/testsuite/gas/riscv/priv-reg-fail-version-1p9p1.d b/gas/= testsuite/gas/riscv/priv-reg-fail-version-1p9p1.d > new file mode 100644 > index 0000000..2bd4bbf > --- /dev/null > +++ b/gas/testsuite/gas/riscv/priv-reg-fail-version-1p9p1.d > @@ -0,0 +1,3 @@ > +#as: -march=3Drv32if -mcsr-check -mpriv-spec=3D1p9p1 > +#source: priv-reg.s > +#warning_output: priv-reg-fail-version-1p9p1.l > diff --git a/gas/testsuite/gas/riscv/priv-reg-fail-version-1p9p1.l b/gas/= testsuite/gas/riscv/priv-reg-fail-version-1p9p1.l > new file mode 100644 > index 0000000..6cde0b3 > --- /dev/null > +++ b/gas/testsuite/gas/riscv/priv-reg-fail-version-1p9p1.l > @@ -0,0 +1,30 @@ > +.*Assembler messages: > +.*Warning: Invalid CSR `utval' for the privilege version `1p9p1' > +.*Warning: Invalid CSR `scounteren' for the privilege version `1p9p1' > +.*Warning: Invalid CSR `stval' for the privilege version `1p9p1' > +.*Warning: Invalid CSR `satp' for the privilege version `1p9p1' > +.*Warning: Invalid CSR `mcounteren' for the privilege version `1p9p1' > +.*Warning: Invalid CSR `mtval' for the privilege version `1p9p1' > +.*Warning: Invalid CSR `pmpcfg0' for the privilege version `1p9p1' > +.*Warning: Invalid CSR `pmpcfg1' for the privilege version `1p9p1' > +.*Warning: Invalid CSR `pmpcfg2' for the privilege version `1p9p1' > +.*Warning: Invalid CSR `pmpcfg3' for the privilege version `1p9p1' > +.*Warning: Invalid CSR `pmpaddr0' for the privilege version `1p9p1' > +.*Warning: Invalid CSR `pmpaddr1' for the privilege version `1p9p1' > +.*Warning: Invalid CSR `pmpaddr2' for the privilege version `1p9p1' > +.*Warning: Invalid CSR `pmpaddr3' for the privilege version `1p9p1' > +.*Warning: Invalid CSR `pmpaddr4' for the privilege version `1p9p1' > +.*Warning: Invalid CSR `pmpaddr5' for the privilege version `1p9p1' > +.*Warning: Invalid CSR `pmpaddr6' for the privilege version `1p9p1' > +.*Warning: Invalid CSR `pmpaddr7' for the privilege version `1p9p1' > +.*Warning: Invalid CSR `pmpaddr8' for the privilege version `1p9p1' > +.*Warning: Invalid CSR `pmpaddr9' for the privilege version `1p9p1' > +.*Warning: Invalid CSR `pmpaddr10' for the privilege version `1p9p1' > +.*Warning: Invalid CSR `pmpaddr11' for the privilege version `1p9p1' > +.*Warning: Invalid CSR `pmpaddr12' for the privilege version `1p9p1' > +.*Warning: Invalid CSR `pmpaddr13' for the privilege version `1p9p1' > +.*Warning: Invalid CSR `pmpaddr14' for the privilege version `1p9p1' > +.*Warning: Invalid CSR `pmpaddr15' for the privilege version `1p9p1' > +.*Warning: Invalid CSR `mcountinhibit' for the privilege version `1p9p1' > +.*Warning: Invalid CSR `dscratch0' for the privilege version `1p9p1' > +.*Warning: Invalid CSR `dscratch1' for the privilege version `1p9p1' > diff --git a/gdb/riscv-tdep.c b/gdb/riscv-tdep.c > index 1bb824e..e67f661 100644 > --- a/gdb/riscv-tdep.c > +++ b/gdb/riscv-tdep.c > @@ -240,7 +240,7 @@ static struct riscv_register_feature riscv_csr_featur= e =3D > { > "org.gnu.gdb.riscv.csr", > { > -#define DECLARE_CSR(NAME,VALUE,CLASS) \ > +#define DECLARE_CSR(NAME,VALUE,CLASS,DEFINE_VER,ABORT_VER) \ > { RISCV_ ## VALUE ## _REGNUM, { # NAME }, false }, > #include "opcode/riscv-opc.h" > #undef DECLARE_CSR > @@ -498,7 +498,7 @@ riscv_register_name (struct gdbarch *gdbarch, int reg= num) > =20 > if (regnum >=3D RISCV_FIRST_CSR_REGNUM && regnum <=3D RISCV_LAST_CSR_R= EGNUM) > { > -#define DECLARE_CSR(NAME,VALUE,CLASS) \ > +#define DECLARE_CSR(NAME,VALUE,CLASS,DEFINE_VER,ABORT_VER) \ > case RISCV_ ## VALUE ## _REGNUM: return # NAME; > =20 > switch (regnum) > @@ -828,7 +828,7 @@ riscv_is_regnum_a_named_csr (int regnum) > =20 > switch (regnum) > { > -#define DECLARE_CSR(name, num, class) case RISCV_ ## num ## _REGNUM: > +#define DECLARE_CSR(name, num, class, define_ver, abort_ver) case RISCV_= ## num ## _REGNUM: > #include "opcode/riscv-opc.h" > #undef DECLARE_CSR > return true; > diff --git a/gdb/riscv-tdep.h b/gdb/riscv-tdep.h > index 90bae08..e415fb4 100644 > --- a/gdb/riscv-tdep.h > +++ b/gdb/riscv-tdep.h > @@ -44,7 +44,7 @@ enum > RISCV_LAST_FP_REGNUM =3D 64, /* Last Floating Point Register */ > =20 > RISCV_FIRST_CSR_REGNUM =3D 65, /* First CSR */ > -#define DECLARE_CSR(name, num, class) \ > +#define DECLARE_CSR(name, num, class, define_version, abort_version) \ > RISCV_ ## num ## _REGNUM =3D RISCV_FIRST_CSR_REGNUM + num, > #include "opcode/riscv-opc.h" > #undef DECLARE_CSR > diff --git a/include/opcode/riscv-opc.h b/include/opcode/riscv-opc.h > index fe00bb6..ab11c31 100644 > --- a/include/opcode/riscv-opc.h > +++ b/include/opcode/riscv-opc.h > @@ -656,7 +656,6 @@ > #define CSR_SIDELEG 0x103 > #define CSR_SIE 0x104 > #define CSR_STVEC 0x105 > -/* scounteren is present int priv spec 1.10. */ > #define CSR_SCOUNTEREN 0x106 > #define CSR_SSCRATCH 0x140 > #define CSR_SEPC 0x141 > @@ -669,20 +668,17 @@ > #define CSR_MIMPID 0xf13 > #define CSR_MHARTID 0xf14 > #define CSR_MSTATUS 0x300 > -/* misa is 0xf10 in 1.9, but 0x301 in 1.9.1. */ > #define CSR_MISA 0x301 > #define CSR_MEDELEG 0x302 > #define CSR_MIDELEG 0x303 > #define CSR_MIE 0x304 > #define CSR_MTVEC 0x305 > -/* mcounteren is present in priv spec 1.10. */ > #define CSR_MCOUNTEREN 0x306 > #define CSR_MSCRATCH 0x340 > #define CSR_MEPC 0x341 > #define CSR_MCAUSE 0x342 > #define CSR_MTVAL 0x343 > #define CSR_MIP 0x344 > -/* pmpcfg0 to pmpcfg3, pmpaddr0 to pmpaddr15 are present in priv spec 1.= 10. */ > #define CSR_PMPCFG0 0x3a0 > #define CSR_PMPCFG1 0x3a1 > #define CSR_PMPCFG2 0x3a2 > @@ -765,7 +761,6 @@ > #define CSR_MHPMCOUNTER29H 0xb9d > #define CSR_MHPMCOUNTER30H 0xb9e > #define CSR_MHPMCOUNTER31H 0xb9f > -/* mcountinhibit is present in priv spec 1.11. */ > #define CSR_MCOUNTINHIBIT 0x320 > #define CSR_MHPMEVENT3 0x323 > #define CSR_MHPMEVENT4 0x324 > @@ -802,10 +797,8 @@ > #define CSR_TDATA3 0x7a3 > #define CSR_DCSR 0x7b0 > #define CSR_DPC 0x7b1 > -/* dscratch0 and dscratch1 are present in priv spec 1.11. */ > #define CSR_DSCRATCH0 0x7b2 > #define CSR_DSCRATCH1 0x7b3 > -/* These registers are present in priv spec 1.9.1, but are dropped in 1.= 10. */ > #define CSR_HSTATUS 0x200 > #define CSR_HEDELEG 0x202 > #define CSR_HIDELEG 0x203 > @@ -1124,262 +1117,256 @@ DECLARE_INSN(custom3_rd_rs1, MATCH_CUSTOM3_RD_R= S1, MASK_CUSTOM3_RD_RS1) > DECLARE_INSN(custom3_rd_rs1_rs2, MATCH_CUSTOM3_RD_RS1_RS2, MASK_CUSTOM3_= RD_RS1_RS2) > #endif > #ifdef DECLARE_CSR > -DECLARE_CSR(ustatus, CSR_USTATUS, CSR_CLASS_I) > -DECLARE_CSR(uie, CSR_UIE, CSR_CLASS_I) > -DECLARE_CSR(utvec, CSR_UTVEC, CSR_CLASS_I) > -DECLARE_CSR(uscratch, CSR_USCRATCH, CSR_CLASS_I) > -DECLARE_CSR(uepc, CSR_UEPC, CSR_CLASS_I) > -DECLARE_CSR(ucause, CSR_UCAUSE, CSR_CLASS_I) > -DECLARE_CSR(utval, CSR_UTVAL, CSR_CLASS_I) > -DECLARE_CSR(uip, CSR_UIP, CSR_CLASS_I) > -DECLARE_CSR(fflags, CSR_FFLAGS, CSR_CLASS_F) > -DECLARE_CSR(frm, CSR_FRM, CSR_CLASS_F) > -DECLARE_CSR(fcsr, CSR_FCSR, CSR_CLASS_F) > -DECLARE_CSR(cycle, CSR_CYCLE, CSR_CLASS_I) > -DECLARE_CSR(time, CSR_TIME, CSR_CLASS_I) > -DECLARE_CSR(instret, CSR_INSTRET, CSR_CLASS_I) > -DECLARE_CSR(hpmcounter3, CSR_HPMCOUNTER3, CSR_CLASS_I) > -DECLARE_CSR(hpmcounter4, CSR_HPMCOUNTER4, CSR_CLASS_I) > -DECLARE_CSR(hpmcounter5, CSR_HPMCOUNTER5, CSR_CLASS_I) > -DECLARE_CSR(hpmcounter6, CSR_HPMCOUNTER6, CSR_CLASS_I) > -DECLARE_CSR(hpmcounter7, CSR_HPMCOUNTER7, CSR_CLASS_I) > -DECLARE_CSR(hpmcounter8, CSR_HPMCOUNTER8, CSR_CLASS_I) > -DECLARE_CSR(hpmcounter9, CSR_HPMCOUNTER9, CSR_CLASS_I) > -DECLARE_CSR(hpmcounter10, CSR_HPMCOUNTER10, CSR_CLASS_I) > -DECLARE_CSR(hpmcounter11, CSR_HPMCOUNTER11, CSR_CLASS_I) > -DECLARE_CSR(hpmcounter12, CSR_HPMCOUNTER12, CSR_CLASS_I) > -DECLARE_CSR(hpmcounter13, CSR_HPMCOUNTER13, CSR_CLASS_I) > -DECLARE_CSR(hpmcounter14, CSR_HPMCOUNTER14, CSR_CLASS_I) > -DECLARE_CSR(hpmcounter15, CSR_HPMCOUNTER15, CSR_CLASS_I) > -DECLARE_CSR(hpmcounter16, CSR_HPMCOUNTER16, CSR_CLASS_I) > -DECLARE_CSR(hpmcounter17, CSR_HPMCOUNTER17, CSR_CLASS_I) > -DECLARE_CSR(hpmcounter18, CSR_HPMCOUNTER18, CSR_CLASS_I) > -DECLARE_CSR(hpmcounter19, CSR_HPMCOUNTER19, CSR_CLASS_I) > -DECLARE_CSR(hpmcounter20, CSR_HPMCOUNTER20, CSR_CLASS_I) > -DECLARE_CSR(hpmcounter21, CSR_HPMCOUNTER21, CSR_CLASS_I) > -DECLARE_CSR(hpmcounter22, CSR_HPMCOUNTER22, CSR_CLASS_I) > -DECLARE_CSR(hpmcounter23, CSR_HPMCOUNTER23, CSR_CLASS_I) > -DECLARE_CSR(hpmcounter24, CSR_HPMCOUNTER24, CSR_CLASS_I) > -DECLARE_CSR(hpmcounter25, CSR_HPMCOUNTER25, CSR_CLASS_I) > -DECLARE_CSR(hpmcounter26, CSR_HPMCOUNTER26, CSR_CLASS_I) > -DECLARE_CSR(hpmcounter27, CSR_HPMCOUNTER27, CSR_CLASS_I) > -DECLARE_CSR(hpmcounter28, CSR_HPMCOUNTER28, CSR_CLASS_I) > -DECLARE_CSR(hpmcounter29, CSR_HPMCOUNTER29, CSR_CLASS_I) > -DECLARE_CSR(hpmcounter30, CSR_HPMCOUNTER30, CSR_CLASS_I) > -DECLARE_CSR(hpmcounter31, CSR_HPMCOUNTER31, CSR_CLASS_I) > -DECLARE_CSR(cycleh, CSR_CYCLEH, CSR_CLASS_I_32) > -DECLARE_CSR(timeh, CSR_TIMEH, CSR_CLASS_I_32) > -DECLARE_CSR(instreth, CSR_INSTRETH, CSR_CLASS_I_32) > -DECLARE_CSR(hpmcounter3h, CSR_HPMCOUNTER3H, CSR_CLASS_I_32) > -DECLARE_CSR(hpmcounter4h, CSR_HPMCOUNTER4H, CSR_CLASS_I_32) > -DECLARE_CSR(hpmcounter5h, CSR_HPMCOUNTER5H, CSR_CLASS_I_32) > -DECLARE_CSR(hpmcounter6h, CSR_HPMCOUNTER6H, CSR_CLASS_I_32) > -DECLARE_CSR(hpmcounter7h, CSR_HPMCOUNTER7H, CSR_CLASS_I_32) > -DECLARE_CSR(hpmcounter8h, CSR_HPMCOUNTER8H, CSR_CLASS_I_32) > -DECLARE_CSR(hpmcounter9h, CSR_HPMCOUNTER9H, CSR_CLASS_I_32) > -DECLARE_CSR(hpmcounter10h, CSR_HPMCOUNTER10H, CSR_CLASS_I_32) > -DECLARE_CSR(hpmcounter11h, CSR_HPMCOUNTER11H, CSR_CLASS_I_32) > -DECLARE_CSR(hpmcounter12h, CSR_HPMCOUNTER12H, CSR_CLASS_I_32) > -DECLARE_CSR(hpmcounter13h, CSR_HPMCOUNTER13H, CSR_CLASS_I_32) > -DECLARE_CSR(hpmcounter14h, CSR_HPMCOUNTER14H, CSR_CLASS_I_32) > -DECLARE_CSR(hpmcounter15h, CSR_HPMCOUNTER15H, CSR_CLASS_I_32) > -DECLARE_CSR(hpmcounter16h, CSR_HPMCOUNTER16H, CSR_CLASS_I_32) > -DECLARE_CSR(hpmcounter17h, CSR_HPMCOUNTER17H, CSR_CLASS_I_32) > -DECLARE_CSR(hpmcounter18h, CSR_HPMCOUNTER18H, CSR_CLASS_I_32) > -DECLARE_CSR(hpmcounter19h, CSR_HPMCOUNTER19H, CSR_CLASS_I_32) > -DECLARE_CSR(hpmcounter20h, CSR_HPMCOUNTER20H, CSR_CLASS_I_32) > -DECLARE_CSR(hpmcounter21h, CSR_HPMCOUNTER21H, CSR_CLASS_I_32) > -DECLARE_CSR(hpmcounter22h, CSR_HPMCOUNTER22H, CSR_CLASS_I_32) > -DECLARE_CSR(hpmcounter23h, CSR_HPMCOUNTER23H, CSR_CLASS_I_32) > -DECLARE_CSR(hpmcounter24h, CSR_HPMCOUNTER24H, CSR_CLASS_I_32) > -DECLARE_CSR(hpmcounter25h, CSR_HPMCOUNTER25H, CSR_CLASS_I_32) > -DECLARE_CSR(hpmcounter26h, CSR_HPMCOUNTER26H, CSR_CLASS_I_32) > -DECLARE_CSR(hpmcounter27h, CSR_HPMCOUNTER27H, CSR_CLASS_I_32) > -DECLARE_CSR(hpmcounter28h, CSR_HPMCOUNTER28H, CSR_CLASS_I_32) > -DECLARE_CSR(hpmcounter29h, CSR_HPMCOUNTER29H, CSR_CLASS_I_32) > -DECLARE_CSR(hpmcounter30h, CSR_HPMCOUNTER30H, CSR_CLASS_I_32) > -DECLARE_CSR(hpmcounter31h, CSR_HPMCOUNTER31H, CSR_CLASS_I_32) > -DECLARE_CSR(sstatus, CSR_SSTATUS, CSR_CLASS_I) > -DECLARE_CSR(sedeleg, CSR_SEDELEG, CSR_CLASS_I) > -DECLARE_CSR(sideleg, CSR_SIDELEG, CSR_CLASS_I) > -DECLARE_CSR(sie, CSR_SIE, CSR_CLASS_I) > -DECLARE_CSR(stvec, CSR_STVEC, CSR_CLASS_I) > -DECLARE_CSR(scounteren, CSR_SCOUNTEREN, CSR_CLASS_I) > -DECLARE_CSR(sscratch, CSR_SSCRATCH, CSR_CLASS_I) > -DECLARE_CSR(sepc, CSR_SEPC, CSR_CLASS_I) > -DECLARE_CSR(scause, CSR_SCAUSE, CSR_CLASS_I) > -DECLARE_CSR(stval, CSR_STVAL, CSR_CLASS_I) > -DECLARE_CSR(sip, CSR_SIP, CSR_CLASS_I) > -DECLARE_CSR(satp, CSR_SATP, CSR_CLASS_I) > -DECLARE_CSR(mvendorid, CSR_MVENDORID, CSR_CLASS_I) > -DECLARE_CSR(marchid, CSR_MARCHID, CSR_CLASS_I) > -DECLARE_CSR(mimpid, CSR_MIMPID, CSR_CLASS_I) > -DECLARE_CSR(mhartid, CSR_MHARTID, CSR_CLASS_I) > -DECLARE_CSR(mstatus, CSR_MSTATUS, CSR_CLASS_I) > -DECLARE_CSR(misa, CSR_MISA, CSR_CLASS_I) > -DECLARE_CSR(medeleg, CSR_MEDELEG, CSR_CLASS_I) > -DECLARE_CSR(mideleg, CSR_MIDELEG, CSR_CLASS_I) > -DECLARE_CSR(mie, CSR_MIE, CSR_CLASS_I) > -DECLARE_CSR(mtvec, CSR_MTVEC, CSR_CLASS_I) > -DECLARE_CSR(mcounteren, CSR_MCOUNTEREN, CSR_CLASS_I) > -DECLARE_CSR(mscratch, CSR_MSCRATCH, CSR_CLASS_I) > -DECLARE_CSR(mepc, CSR_MEPC, CSR_CLASS_I) > -DECLARE_CSR(mcause, CSR_MCAUSE, CSR_CLASS_I) > -DECLARE_CSR(mtval, CSR_MTVAL, CSR_CLASS_I) > -DECLARE_CSR(mip, CSR_MIP, CSR_CLASS_I) > -DECLARE_CSR(pmpcfg0, CSR_PMPCFG0, CSR_CLASS_I) > -DECLARE_CSR(pmpcfg1, CSR_PMPCFG1, CSR_CLASS_I_32) > -DECLARE_CSR(pmpcfg2, CSR_PMPCFG2, CSR_CLASS_I) > -DECLARE_CSR(pmpcfg3, CSR_PMPCFG3, CSR_CLASS_I_32) > -DECLARE_CSR(pmpaddr0, CSR_PMPADDR0, CSR_CLASS_I) > -DECLARE_CSR(pmpaddr1, CSR_PMPADDR1, CSR_CLASS_I) > -DECLARE_CSR(pmpaddr2, CSR_PMPADDR2, CSR_CLASS_I) > -DECLARE_CSR(pmpaddr3, CSR_PMPADDR3, CSR_CLASS_I) > -DECLARE_CSR(pmpaddr4, CSR_PMPADDR4, CSR_CLASS_I) > -DECLARE_CSR(pmpaddr5, CSR_PMPADDR5, CSR_CLASS_I) > -DECLARE_CSR(pmpaddr6, CSR_PMPADDR6, CSR_CLASS_I) > -DECLARE_CSR(pmpaddr7, CSR_PMPADDR7, CSR_CLASS_I) > -DECLARE_CSR(pmpaddr8, CSR_PMPADDR8, CSR_CLASS_I) > -DECLARE_CSR(pmpaddr9, CSR_PMPADDR9, CSR_CLASS_I) > -DECLARE_CSR(pmpaddr10, CSR_PMPADDR10, CSR_CLASS_I) > -DECLARE_CSR(pmpaddr11, CSR_PMPADDR11, CSR_CLASS_I) > -DECLARE_CSR(pmpaddr12, CSR_PMPADDR12, CSR_CLASS_I) > -DECLARE_CSR(pmpaddr13, CSR_PMPADDR13, CSR_CLASS_I) > -DECLARE_CSR(pmpaddr14, CSR_PMPADDR14, CSR_CLASS_I) > -DECLARE_CSR(pmpaddr15, CSR_PMPADDR15, CSR_CLASS_I) > -DECLARE_CSR(mcycle, CSR_MCYCLE, CSR_CLASS_I) > -DECLARE_CSR(minstret, CSR_MINSTRET, CSR_CLASS_I) > -DECLARE_CSR(mhpmcounter3, CSR_MHPMCOUNTER3, CSR_CLASS_I) > -DECLARE_CSR(mhpmcounter4, CSR_MHPMCOUNTER4, CSR_CLASS_I) > -DECLARE_CSR(mhpmcounter5, CSR_MHPMCOUNTER5, CSR_CLASS_I) > -DECLARE_CSR(mhpmcounter6, CSR_MHPMCOUNTER6, CSR_CLASS_I) > -DECLARE_CSR(mhpmcounter7, CSR_MHPMCOUNTER7, CSR_CLASS_I) > -DECLARE_CSR(mhpmcounter8, CSR_MHPMCOUNTER8, CSR_CLASS_I) > -DECLARE_CSR(mhpmcounter9, CSR_MHPMCOUNTER9, CSR_CLASS_I) > -DECLARE_CSR(mhpmcounter10, CSR_MHPMCOUNTER10, CSR_CLASS_I) > -DECLARE_CSR(mhpmcounter11, CSR_MHPMCOUNTER11, CSR_CLASS_I) > -DECLARE_CSR(mhpmcounter12, CSR_MHPMCOUNTER12, CSR_CLASS_I) > -DECLARE_CSR(mhpmcounter13, CSR_MHPMCOUNTER13, CSR_CLASS_I) > -DECLARE_CSR(mhpmcounter14, CSR_MHPMCOUNTER14, CSR_CLASS_I) > -DECLARE_CSR(mhpmcounter15, CSR_MHPMCOUNTER15, CSR_CLASS_I) > -DECLARE_CSR(mhpmcounter16, CSR_MHPMCOUNTER16, CSR_CLASS_I) > -DECLARE_CSR(mhpmcounter17, CSR_MHPMCOUNTER17, CSR_CLASS_I) > -DECLARE_CSR(mhpmcounter18, CSR_MHPMCOUNTER18, CSR_CLASS_I) > -DECLARE_CSR(mhpmcounter19, CSR_MHPMCOUNTER19, CSR_CLASS_I) > -DECLARE_CSR(mhpmcounter20, CSR_MHPMCOUNTER20, CSR_CLASS_I) > -DECLARE_CSR(mhpmcounter21, CSR_MHPMCOUNTER21, CSR_CLASS_I) > -DECLARE_CSR(mhpmcounter22, CSR_MHPMCOUNTER22, CSR_CLASS_I) > -DECLARE_CSR(mhpmcounter23, CSR_MHPMCOUNTER23, CSR_CLASS_I) > -DECLARE_CSR(mhpmcounter24, CSR_MHPMCOUNTER24, CSR_CLASS_I) > -DECLARE_CSR(mhpmcounter25, CSR_MHPMCOUNTER25, CSR_CLASS_I) > -DECLARE_CSR(mhpmcounter26, CSR_MHPMCOUNTER26, CSR_CLASS_I) > -DECLARE_CSR(mhpmcounter27, CSR_MHPMCOUNTER27, CSR_CLASS_I) > -DECLARE_CSR(mhpmcounter28, CSR_MHPMCOUNTER28, CSR_CLASS_I) > -DECLARE_CSR(mhpmcounter29, CSR_MHPMCOUNTER29, CSR_CLASS_I) > -DECLARE_CSR(mhpmcounter30, CSR_MHPMCOUNTER30, CSR_CLASS_I) > -DECLARE_CSR(mhpmcounter31, CSR_MHPMCOUNTER31, CSR_CLASS_I) > -DECLARE_CSR(mcycleh, CSR_MCYCLEH, CSR_CLASS_I_32) > -DECLARE_CSR(minstreth, CSR_MINSTRETH, CSR_CLASS_I_32) > -DECLARE_CSR(mhpmcounter3h, CSR_MHPMCOUNTER3H, CSR_CLASS_I_32) > -DECLARE_CSR(mhpmcounter4h, CSR_MHPMCOUNTER4H, CSR_CLASS_I_32) > -DECLARE_CSR(mhpmcounter5h, CSR_MHPMCOUNTER5H, CSR_CLASS_I_32) > -DECLARE_CSR(mhpmcounter6h, CSR_MHPMCOUNTER6H, CSR_CLASS_I_32) > -DECLARE_CSR(mhpmcounter7h, CSR_MHPMCOUNTER7H, CSR_CLASS_I_32) > -DECLARE_CSR(mhpmcounter8h, CSR_MHPMCOUNTER8H, CSR_CLASS_I_32) > -DECLARE_CSR(mhpmcounter9h, CSR_MHPMCOUNTER9H, CSR_CLASS_I_32) > -DECLARE_CSR(mhpmcounter10h, CSR_MHPMCOUNTER10H, CSR_CLASS_I_32) > -DECLARE_CSR(mhpmcounter11h, CSR_MHPMCOUNTER11H, CSR_CLASS_I_32) > -DECLARE_CSR(mhpmcounter12h, CSR_MHPMCOUNTER12H, CSR_CLASS_I_32) > -DECLARE_CSR(mhpmcounter13h, CSR_MHPMCOUNTER13H, CSR_CLASS_I_32) > -DECLARE_CSR(mhpmcounter14h, CSR_MHPMCOUNTER14H, CSR_CLASS_I_32) > -DECLARE_CSR(mhpmcounter15h, CSR_MHPMCOUNTER15H, CSR_CLASS_I_32) > -DECLARE_CSR(mhpmcounter16h, CSR_MHPMCOUNTER16H, CSR_CLASS_I_32) > -DECLARE_CSR(mhpmcounter17h, CSR_MHPMCOUNTER17H, CSR_CLASS_I_32) > -DECLARE_CSR(mhpmcounter18h, CSR_MHPMCOUNTER18H, CSR_CLASS_I_32) > -DECLARE_CSR(mhpmcounter19h, CSR_MHPMCOUNTER19H, CSR_CLASS_I_32) > -DECLARE_CSR(mhpmcounter20h, CSR_MHPMCOUNTER20H, CSR_CLASS_I_32) > -DECLARE_CSR(mhpmcounter21h, CSR_MHPMCOUNTER21H, CSR_CLASS_I_32) > -DECLARE_CSR(mhpmcounter22h, CSR_MHPMCOUNTER22H, CSR_CLASS_I_32) > -DECLARE_CSR(mhpmcounter23h, CSR_MHPMCOUNTER23H, CSR_CLASS_I_32) > -DECLARE_CSR(mhpmcounter24h, CSR_MHPMCOUNTER24H, CSR_CLASS_I_32) > -DECLARE_CSR(mhpmcounter25h, CSR_MHPMCOUNTER25H, CSR_CLASS_I_32) > -DECLARE_CSR(mhpmcounter26h, CSR_MHPMCOUNTER26H, CSR_CLASS_I_32) > -DECLARE_CSR(mhpmcounter27h, CSR_MHPMCOUNTER27H, CSR_CLASS_I_32) > -DECLARE_CSR(mhpmcounter28h, CSR_MHPMCOUNTER28H, CSR_CLASS_I_32) > -DECLARE_CSR(mhpmcounter29h, CSR_MHPMCOUNTER29H, CSR_CLASS_I_32) > -DECLARE_CSR(mhpmcounter30h, CSR_MHPMCOUNTER30H, CSR_CLASS_I_32) > -DECLARE_CSR(mhpmcounter31h, CSR_MHPMCOUNTER31H, CSR_CLASS_I_32) > -DECLARE_CSR(mcountinhibit, CSR_MCOUNTINHIBIT, CSR_CLASS_I) > -DECLARE_CSR(mhpmevent3, CSR_MHPMEVENT3, CSR_CLASS_I) > -DECLARE_CSR(mhpmevent4, CSR_MHPMEVENT4, CSR_CLASS_I) > -DECLARE_CSR(mhpmevent5, CSR_MHPMEVENT5, CSR_CLASS_I) > -DECLARE_CSR(mhpmevent6, CSR_MHPMEVENT6, CSR_CLASS_I) > -DECLARE_CSR(mhpmevent7, CSR_MHPMEVENT7, CSR_CLASS_I) > -DECLARE_CSR(mhpmevent8, CSR_MHPMEVENT8, CSR_CLASS_I) > -DECLARE_CSR(mhpmevent9, CSR_MHPMEVENT9, CSR_CLASS_I) > -DECLARE_CSR(mhpmevent10, CSR_MHPMEVENT10, CSR_CLASS_I) > -DECLARE_CSR(mhpmevent11, CSR_MHPMEVENT11, CSR_CLASS_I) > -DECLARE_CSR(mhpmevent12, CSR_MHPMEVENT12, CSR_CLASS_I) > -DECLARE_CSR(mhpmevent13, CSR_MHPMEVENT13, CSR_CLASS_I) > -DECLARE_CSR(mhpmevent14, CSR_MHPMEVENT14, CSR_CLASS_I) > -DECLARE_CSR(mhpmevent15, CSR_MHPMEVENT15, CSR_CLASS_I) > -DECLARE_CSR(mhpmevent16, CSR_MHPMEVENT16, CSR_CLASS_I) > -DECLARE_CSR(mhpmevent17, CSR_MHPMEVENT17, CSR_CLASS_I) > -DECLARE_CSR(mhpmevent18, CSR_MHPMEVENT18, CSR_CLASS_I) > -DECLARE_CSR(mhpmevent19, CSR_MHPMEVENT19, CSR_CLASS_I) > -DECLARE_CSR(mhpmevent20, CSR_MHPMEVENT20, CSR_CLASS_I) > -DECLARE_CSR(mhpmevent21, CSR_MHPMEVENT21, CSR_CLASS_I) > -DECLARE_CSR(mhpmevent22, CSR_MHPMEVENT22, CSR_CLASS_I) > -DECLARE_CSR(mhpmevent23, CSR_MHPMEVENT23, CSR_CLASS_I) > -DECLARE_CSR(mhpmevent24, CSR_MHPMEVENT24, CSR_CLASS_I) > -DECLARE_CSR(mhpmevent25, CSR_MHPMEVENT25, CSR_CLASS_I) > -DECLARE_CSR(mhpmevent26, CSR_MHPMEVENT26, CSR_CLASS_I) > -DECLARE_CSR(mhpmevent27, CSR_MHPMEVENT27, CSR_CLASS_I) > -DECLARE_CSR(mhpmevent28, CSR_MHPMEVENT28, CSR_CLASS_I) > -DECLARE_CSR(mhpmevent29, CSR_MHPMEVENT29, CSR_CLASS_I) > -DECLARE_CSR(mhpmevent30, CSR_MHPMEVENT30, CSR_CLASS_I) > -DECLARE_CSR(mhpmevent31, CSR_MHPMEVENT31, CSR_CLASS_I) > -DECLARE_CSR(tselect, CSR_TSELECT, CSR_CLASS_I) > -DECLARE_CSR(tdata1, CSR_TDATA1, CSR_CLASS_I) > -DECLARE_CSR(tdata2, CSR_TDATA2, CSR_CLASS_I) > -DECLARE_CSR(tdata3, CSR_TDATA3, CSR_CLASS_I) > -DECLARE_CSR(dcsr, CSR_DCSR, CSR_CLASS_I) > -DECLARE_CSR(dpc, CSR_DPC, CSR_CLASS_I) > -DECLARE_CSR(dscratch0, CSR_DSCRATCH0, CSR_CLASS_I) > -DECLARE_CSR(dscratch1, CSR_DSCRATCH1, CSR_CLASS_I) > -/* These registers are present in priv spec 1.9.1, dropped in 1.10. */ > -DECLARE_CSR(hstatus, CSR_HSTATUS, CSR_CLASS_I) > -DECLARE_CSR(hedeleg, CSR_HEDELEG, CSR_CLASS_I) > -DECLARE_CSR(hideleg, CSR_HIDELEG, CSR_CLASS_I) > -DECLARE_CSR(hie, CSR_HIE, CSR_CLASS_I) > -DECLARE_CSR(htvec, CSR_HTVEC, CSR_CLASS_I) > -DECLARE_CSR(hscratch, CSR_HSCRATCH, CSR_CLASS_I) > -DECLARE_CSR(hepc, CSR_HEPC, CSR_CLASS_I) > -DECLARE_CSR(hcause, CSR_HCAUSE, CSR_CLASS_I) > -DECLARE_CSR(hbadaddr, CSR_HBADADDR, CSR_CLASS_I) > -DECLARE_CSR(hip, CSR_HIP, CSR_CLASS_I) > -DECLARE_CSR(mbase, CSR_MBASE, CSR_CLASS_I) > -DECLARE_CSR(mbound, CSR_MBOUND, CSR_CLASS_I) > -DECLARE_CSR(mibase, CSR_MIBASE, CSR_CLASS_I) > -DECLARE_CSR(mibound, CSR_MIBOUND, CSR_CLASS_I) > -DECLARE_CSR(mdbase, CSR_MDBASE, CSR_CLASS_I) > -DECLARE_CSR(mdbound, CSR_MDBOUND, CSR_CLASS_I) > -DECLARE_CSR(mscounteren, CSR_MSCOUNTEREN, CSR_CLASS_I) > -DECLARE_CSR(mhcounteren, CSR_MHCOUNTEREN, CSR_CLASS_I) > +DECLARE_CSR(ustatus, CSR_USTATUS, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS= _VDRAFT) > +DECLARE_CSR(uie, CSR_UIE, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(utvec, CSR_UTVEC, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_VDR= AFT) > +DECLARE_CSR(uscratch, CSR_USCRATCH, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLA= SS_VDRAFT) > +DECLARE_CSR(uepc, CSR_UEPC, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_VDRAF= T) > +DECLARE_CSR(ucause, CSR_UCAUSE, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_V= DRAFT) > +DECLARE_CSR(utval, CSR_UTVAL, CSR_CLASS_I, CSR_CLASS_V1P10, CSR_CLASS_VD= RAFT) > +DECLARE_CSR(uip, CSR_UIP, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(fflags, CSR_FFLAGS, CSR_CLASS_F, CSR_CLASS_V1P9, CSR_CLASS_V= DRAFT) > +DECLARE_CSR(frm, CSR_FRM, CSR_CLASS_F, CSR_CLASS_V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(fcsr, CSR_FCSR, CSR_CLASS_F, CSR_CLASS_V1P9, CSR_CLASS_VDRAF= T) > +DECLARE_CSR(cycle, CSR_CYCLE, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_VDR= AFT) > +DECLARE_CSR(time, CSR_TIME, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_VDRAF= T) > +DECLARE_CSR(instret, CSR_INSTRET, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS= _VDRAFT) > +DECLARE_CSR(hpmcounter3, CSR_HPMCOUNTER3, CSR_CLASS_I, CSR_CLASS_V1P9, C= SR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter4, CSR_HPMCOUNTER4, CSR_CLASS_I, CSR_CLASS_V1P9, C= SR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter5, CSR_HPMCOUNTER5, CSR_CLASS_I, CSR_CLASS_V1P9, C= SR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter6, CSR_HPMCOUNTER6, CSR_CLASS_I, CSR_CLASS_V1P9, C= SR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter7, CSR_HPMCOUNTER7, CSR_CLASS_I, CSR_CLASS_V1P9, C= SR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter8, CSR_HPMCOUNTER8, CSR_CLASS_I, CSR_CLASS_V1P9, C= SR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter9, CSR_HPMCOUNTER9, CSR_CLASS_I, CSR_CLASS_V1P9, C= SR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter10, CSR_HPMCOUNTER10, CSR_CLASS_I, CSR_CLASS_V1P9,= CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter11, CSR_HPMCOUNTER11, CSR_CLASS_I, CSR_CLASS_V1P9,= CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter12, CSR_HPMCOUNTER12, CSR_CLASS_I, CSR_CLASS_V1P9,= CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter13, CSR_HPMCOUNTER13, CSR_CLASS_I, CSR_CLASS_V1P9,= CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter14, CSR_HPMCOUNTER14, CSR_CLASS_I, CSR_CLASS_V1P9,= CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter15, CSR_HPMCOUNTER15, CSR_CLASS_I, CSR_CLASS_V1P9,= CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter16, CSR_HPMCOUNTER16, CSR_CLASS_I, CSR_CLASS_V1P9,= CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter17, CSR_HPMCOUNTER17, CSR_CLASS_I, CSR_CLASS_V1P9,= CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter18, CSR_HPMCOUNTER18, CSR_CLASS_I, CSR_CLASS_V1P9,= CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter19, CSR_HPMCOUNTER19, CSR_CLASS_I, CSR_CLASS_V1P9,= CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter20, CSR_HPMCOUNTER20, CSR_CLASS_I, CSR_CLASS_V1P9,= CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter21, CSR_HPMCOUNTER21, CSR_CLASS_I, CSR_CLASS_V1P9,= CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter22, CSR_HPMCOUNTER22, CSR_CLASS_I, CSR_CLASS_V1P9,= CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter23, CSR_HPMCOUNTER23, CSR_CLASS_I, CSR_CLASS_V1P9,= CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter24, CSR_HPMCOUNTER24, CSR_CLASS_I, CSR_CLASS_V1P9,= CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter25, CSR_HPMCOUNTER25, CSR_CLASS_I, CSR_CLASS_V1P9,= CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter26, CSR_HPMCOUNTER26, CSR_CLASS_I, CSR_CLASS_V1P9,= CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter27, CSR_HPMCOUNTER27, CSR_CLASS_I, CSR_CLASS_V1P9,= CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter28, CSR_HPMCOUNTER28, CSR_CLASS_I, CSR_CLASS_V1P9,= CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter29, CSR_HPMCOUNTER29, CSR_CLASS_I, CSR_CLASS_V1P9,= CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter30, CSR_HPMCOUNTER30, CSR_CLASS_I, CSR_CLASS_V1P9,= CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter31, CSR_HPMCOUNTER31, CSR_CLASS_I, CSR_CLASS_V1P9,= CSR_CLASS_VDRAFT) > +DECLARE_CSR(cycleh, CSR_CYCLEH, CSR_CLASS_I_32, CSR_CLASS_V1P9, CSR_CLAS= S_VDRAFT) > +DECLARE_CSR(timeh, CSR_TIMEH, CSR_CLASS_I_32, CSR_CLASS_V1P9, CSR_CLASS_= VDRAFT) > +DECLARE_CSR(instreth, CSR_INSTRETH, CSR_CLASS_I_32, CSR_CLASS_V1P9, CSR_= CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter3h, CSR_HPMCOUNTER3H, CSR_CLASS_I_32, CSR_CLASS_V1= P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter4h, CSR_HPMCOUNTER4H, CSR_CLASS_I_32, CSR_CLASS_V1= P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter5h, CSR_HPMCOUNTER5H, CSR_CLASS_I_32, CSR_CLASS_V1= P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter6h, CSR_HPMCOUNTER6H, CSR_CLASS_I_32, CSR_CLASS_V1= P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter7h, CSR_HPMCOUNTER7H, CSR_CLASS_I_32, CSR_CLASS_V1= P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter8h, CSR_HPMCOUNTER8H, CSR_CLASS_I_32, CSR_CLASS_V1= P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter9h, CSR_HPMCOUNTER9H, CSR_CLASS_I_32, CSR_CLASS_V1= P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter10h, CSR_HPMCOUNTER10H, CSR_CLASS_I_32, CSR_CLASS_= V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter11h, CSR_HPMCOUNTER11H, CSR_CLASS_I_32, CSR_CLASS_= V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter12h, CSR_HPMCOUNTER12H, CSR_CLASS_I_32, CSR_CLASS_= V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter13h, CSR_HPMCOUNTER13H, CSR_CLASS_I_32, CSR_CLASS_= V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter14h, CSR_HPMCOUNTER14H, CSR_CLASS_I_32, CSR_CLASS_= V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter15h, CSR_HPMCOUNTER15H, CSR_CLASS_I_32, CSR_CLASS_= V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter16h, CSR_HPMCOUNTER16H, CSR_CLASS_I_32, CSR_CLASS_= V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter17h, CSR_HPMCOUNTER17H, CSR_CLASS_I_32, CSR_CLASS_= V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter18h, CSR_HPMCOUNTER18H, CSR_CLASS_I_32, CSR_CLASS_= V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter19h, CSR_HPMCOUNTER19H, CSR_CLASS_I_32, CSR_CLASS_= V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter20h, CSR_HPMCOUNTER20H, CSR_CLASS_I_32, CSR_CLASS_= V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter21h, CSR_HPMCOUNTER21H, CSR_CLASS_I_32, CSR_CLASS_= V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter22h, CSR_HPMCOUNTER22H, CSR_CLASS_I_32, CSR_CLASS_= V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter23h, CSR_HPMCOUNTER23H, CSR_CLASS_I_32, CSR_CLASS_= V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter24h, CSR_HPMCOUNTER24H, CSR_CLASS_I_32, CSR_CLASS_= V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter25h, CSR_HPMCOUNTER25H, CSR_CLASS_I_32, CSR_CLASS_= V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter26h, CSR_HPMCOUNTER26H, CSR_CLASS_I_32, CSR_CLASS_= V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter27h, CSR_HPMCOUNTER27H, CSR_CLASS_I_32, CSR_CLASS_= V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter28h, CSR_HPMCOUNTER28H, CSR_CLASS_I_32, CSR_CLASS_= V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter29h, CSR_HPMCOUNTER29H, CSR_CLASS_I_32, CSR_CLASS_= V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter30h, CSR_HPMCOUNTER30H, CSR_CLASS_I_32, CSR_CLASS_= V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(hpmcounter31h, CSR_HPMCOUNTER31H, CSR_CLASS_I_32, CSR_CLASS_= V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(sstatus, CSR_SSTATUS, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS= _VDRAFT) > +DECLARE_CSR(sedeleg, CSR_SEDELEG, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS= _VDRAFT) > +DECLARE_CSR(sideleg, CSR_SIDELEG, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS= _VDRAFT) > +DECLARE_CSR(sie, CSR_SIE, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(stvec, CSR_STVEC, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_VDR= AFT) > +DECLARE_CSR(scounteren, CSR_SCOUNTEREN, CSR_CLASS_I, CSR_CLASS_V1P10, CS= R_CLASS_VDRAFT) > +DECLARE_CSR(sscratch, CSR_SSCRATCH, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLA= SS_VDRAFT) > +DECLARE_CSR(sepc, CSR_SEPC, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_VDRAF= T) > +DECLARE_CSR(scause, CSR_SCAUSE, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_V= DRAFT) > +DECLARE_CSR(stval, CSR_STVAL, CSR_CLASS_I, CSR_CLASS_V1P10, CSR_CLASS_VD= RAFT) > +DECLARE_CSR(sip, CSR_SIP, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(satp, CSR_SATP, CSR_CLASS_I, CSR_CLASS_V1P10, CSR_CLASS_VDRA= FT) > +DECLARE_CSR(mvendorid, CSR_MVENDORID, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_C= LASS_VDRAFT) > +DECLARE_CSR(marchid, CSR_MARCHID, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS= _VDRAFT) > +DECLARE_CSR(mimpid, CSR_MIMPID, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_V= DRAFT) > +DECLARE_CSR(mhartid, CSR_MHARTID, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS= _VDRAFT) > +DECLARE_CSR(mstatus, CSR_MSTATUS, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS= _VDRAFT) > +DECLARE_CSR(misa, CSR_MISA, CSR_CLASS_I, CSR_CLASS_V1P9P1, CSR_CLASS_VDR= AFT) > +DECLARE_CSR(medeleg, CSR_MEDELEG, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS= _VDRAFT) > +DECLARE_CSR(mideleg, CSR_MIDELEG, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS= _VDRAFT) > +DECLARE_CSR(mie, CSR_MIE, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mtvec, CSR_MTVEC, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_VDR= AFT) > +DECLARE_CSR(mcounteren, CSR_MCOUNTEREN, CSR_CLASS_I, CSR_CLASS_V1P10, CS= R_CLASS_VDRAFT) > +DECLARE_CSR(mscratch, CSR_MSCRATCH, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLA= SS_VDRAFT) > +DECLARE_CSR(mepc, CSR_MEPC, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_VDRAF= T) > +DECLARE_CSR(mcause, CSR_MCAUSE, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_V= DRAFT) > +DECLARE_CSR(mtval, CSR_MTVAL, CSR_CLASS_I, CSR_CLASS_V1P10, CSR_CLASS_VD= RAFT) > +DECLARE_CSR(mip, CSR_MIP, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(pmpcfg0, CSR_PMPCFG0, CSR_CLASS_I, CSR_CLASS_V1P10, CSR_CLAS= S_VDRAFT) > +DECLARE_CSR(pmpcfg1, CSR_PMPCFG1, CSR_CLASS_I_32, CSR_CLASS_V1P10, CSR_C= LASS_VDRAFT) > +DECLARE_CSR(pmpcfg2, CSR_PMPCFG2, CSR_CLASS_I, CSR_CLASS_V1P10, CSR_CLAS= S_VDRAFT) > +DECLARE_CSR(pmpcfg3, CSR_PMPCFG3, CSR_CLASS_I_32, CSR_CLASS_V1P10, CSR_C= LASS_VDRAFT) > +DECLARE_CSR(pmpaddr0, CSR_PMPADDR0, CSR_CLASS_I, CSR_CLASS_V1P10, CSR_CL= ASS_VDRAFT) > +DECLARE_CSR(pmpaddr1, CSR_PMPADDR1, CSR_CLASS_I, CSR_CLASS_V1P10, CSR_CL= ASS_VDRAFT) > +DECLARE_CSR(pmpaddr2, CSR_PMPADDR2, CSR_CLASS_I, CSR_CLASS_V1P10, CSR_CL= ASS_VDRAFT) > +DECLARE_CSR(pmpaddr3, CSR_PMPADDR3, CSR_CLASS_I, CSR_CLASS_V1P10, CSR_CL= ASS_VDRAFT) > +DECLARE_CSR(pmpaddr4, CSR_PMPADDR4, CSR_CLASS_I, CSR_CLASS_V1P10, CSR_CL= ASS_VDRAFT) > +DECLARE_CSR(pmpaddr5, CSR_PMPADDR5, CSR_CLASS_I, CSR_CLASS_V1P10, CSR_CL= ASS_VDRAFT) > +DECLARE_CSR(pmpaddr6, CSR_PMPADDR6, CSR_CLASS_I, CSR_CLASS_V1P10, CSR_CL= ASS_VDRAFT) > +DECLARE_CSR(pmpaddr7, CSR_PMPADDR7, CSR_CLASS_I, CSR_CLASS_V1P10, CSR_CL= ASS_VDRAFT) > +DECLARE_CSR(pmpaddr8, CSR_PMPADDR8, CSR_CLASS_I, CSR_CLASS_V1P10, CSR_CL= ASS_VDRAFT) > +DECLARE_CSR(pmpaddr9, CSR_PMPADDR9, CSR_CLASS_I, CSR_CLASS_V1P10, CSR_CL= ASS_VDRAFT) > +DECLARE_CSR(pmpaddr10, CSR_PMPADDR10, CSR_CLASS_I, CSR_CLASS_V1P10, CSR_= CLASS_VDRAFT) > +DECLARE_CSR(pmpaddr11, CSR_PMPADDR11, CSR_CLASS_I, CSR_CLASS_V1P10, CSR_= CLASS_VDRAFT) > +DECLARE_CSR(pmpaddr12, CSR_PMPADDR12, CSR_CLASS_I, CSR_CLASS_V1P10, CSR_= CLASS_VDRAFT) > +DECLARE_CSR(pmpaddr13, CSR_PMPADDR13, CSR_CLASS_I, CSR_CLASS_V1P10, CSR_= CLASS_VDRAFT) > +DECLARE_CSR(pmpaddr14, CSR_PMPADDR14, CSR_CLASS_I, CSR_CLASS_V1P10, CSR_= CLASS_VDRAFT) > +DECLARE_CSR(pmpaddr15, CSR_PMPADDR15, CSR_CLASS_I, CSR_CLASS_V1P10, CSR_= CLASS_VDRAFT) > +DECLARE_CSR(mcycle, CSR_MCYCLE, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_V= DRAFT) > +DECLARE_CSR(minstret, CSR_MINSTRET, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLA= SS_VDRAFT) > +DECLARE_CSR(mhpmcounter3, CSR_MHPMCOUNTER3, CSR_CLASS_I, CSR_CLASS_V1P9,= CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter4, CSR_MHPMCOUNTER4, CSR_CLASS_I, CSR_CLASS_V1P9,= CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter5, CSR_MHPMCOUNTER5, CSR_CLASS_I, CSR_CLASS_V1P9,= CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter6, CSR_MHPMCOUNTER6, CSR_CLASS_I, CSR_CLASS_V1P9,= CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter7, CSR_MHPMCOUNTER7, CSR_CLASS_I, CSR_CLASS_V1P9,= CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter8, CSR_MHPMCOUNTER8, CSR_CLASS_I, CSR_CLASS_V1P9,= CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter9, CSR_MHPMCOUNTER9, CSR_CLASS_I, CSR_CLASS_V1P9,= CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter10, CSR_MHPMCOUNTER10, CSR_CLASS_I, CSR_CLASS_V1P= 9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter11, CSR_MHPMCOUNTER11, CSR_CLASS_I, CSR_CLASS_V1P= 9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter12, CSR_MHPMCOUNTER12, CSR_CLASS_I, CSR_CLASS_V1P= 9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter13, CSR_MHPMCOUNTER13, CSR_CLASS_I, CSR_CLASS_V1P= 9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter14, CSR_MHPMCOUNTER14, CSR_CLASS_I, CSR_CLASS_V1P= 9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter15, CSR_MHPMCOUNTER15, CSR_CLASS_I, CSR_CLASS_V1P= 9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter16, CSR_MHPMCOUNTER16, CSR_CLASS_I, CSR_CLASS_V1P= 9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter17, CSR_MHPMCOUNTER17, CSR_CLASS_I, CSR_CLASS_V1P= 9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter18, CSR_MHPMCOUNTER18, CSR_CLASS_I, CSR_CLASS_V1P= 9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter19, CSR_MHPMCOUNTER19, CSR_CLASS_I, CSR_CLASS_V1P= 9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter20, CSR_MHPMCOUNTER20, CSR_CLASS_I, CSR_CLASS_V1P= 9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter21, CSR_MHPMCOUNTER21, CSR_CLASS_I, CSR_CLASS_V1P= 9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter22, CSR_MHPMCOUNTER22, CSR_CLASS_I, CSR_CLASS_V1P= 9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter23, CSR_MHPMCOUNTER23, CSR_CLASS_I, CSR_CLASS_V1P= 9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter24, CSR_MHPMCOUNTER24, CSR_CLASS_I, CSR_CLASS_V1P= 9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter25, CSR_MHPMCOUNTER25, CSR_CLASS_I, CSR_CLASS_V1P= 9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter26, CSR_MHPMCOUNTER26, CSR_CLASS_I, CSR_CLASS_V1P= 9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter27, CSR_MHPMCOUNTER27, CSR_CLASS_I, CSR_CLASS_V1P= 9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter28, CSR_MHPMCOUNTER28, CSR_CLASS_I, CSR_CLASS_V1P= 9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter29, CSR_MHPMCOUNTER29, CSR_CLASS_I, CSR_CLASS_V1P= 9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter30, CSR_MHPMCOUNTER30, CSR_CLASS_I, CSR_CLASS_V1P= 9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter31, CSR_MHPMCOUNTER31, CSR_CLASS_I, CSR_CLASS_V1P= 9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mcycleh, CSR_MCYCLEH, CSR_CLASS_I_32, CSR_CLASS_V1P9, CSR_CL= ASS_VDRAFT) > +DECLARE_CSR(minstreth, CSR_MINSTRETH, CSR_CLASS_I_32, CSR_CLASS_V1P9, CS= R_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter3h, CSR_MHPMCOUNTER3H, CSR_CLASS_I_32, CSR_CLASS_= V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter4h, CSR_MHPMCOUNTER4H, CSR_CLASS_I_32, CSR_CLASS_= V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter5h, CSR_MHPMCOUNTER5H, CSR_CLASS_I_32, CSR_CLASS_= V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter6h, CSR_MHPMCOUNTER6H, CSR_CLASS_I_32, CSR_CLASS_= V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter7h, CSR_MHPMCOUNTER7H, CSR_CLASS_I_32, CSR_CLASS_= V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter8h, CSR_MHPMCOUNTER8H, CSR_CLASS_I_32, CSR_CLASS_= V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter9h, CSR_MHPMCOUNTER9H, CSR_CLASS_I_32, CSR_CLASS_= V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter10h, CSR_MHPMCOUNTER10H, CSR_CLASS_I_32, CSR_CLAS= S_V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter11h, CSR_MHPMCOUNTER11H, CSR_CLASS_I_32, CSR_CLAS= S_V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter12h, CSR_MHPMCOUNTER12H, CSR_CLASS_I_32, CSR_CLAS= S_V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter13h, CSR_MHPMCOUNTER13H, CSR_CLASS_I_32, CSR_CLAS= S_V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter14h, CSR_MHPMCOUNTER14H, CSR_CLASS_I_32, CSR_CLAS= S_V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter15h, CSR_MHPMCOUNTER15H, CSR_CLASS_I_32, CSR_CLAS= S_V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter16h, CSR_MHPMCOUNTER16H, CSR_CLASS_I_32, CSR_CLAS= S_V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter17h, CSR_MHPMCOUNTER17H, CSR_CLASS_I_32, CSR_CLAS= S_V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter18h, CSR_MHPMCOUNTER18H, CSR_CLASS_I_32, CSR_CLAS= S_V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter19h, CSR_MHPMCOUNTER19H, CSR_CLASS_I_32, CSR_CLAS= S_V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter20h, CSR_MHPMCOUNTER20H, CSR_CLASS_I_32, CSR_CLAS= S_V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter21h, CSR_MHPMCOUNTER21H, CSR_CLASS_I_32, CSR_CLAS= S_V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter22h, CSR_MHPMCOUNTER22H, CSR_CLASS_I_32, CSR_CLAS= S_V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter23h, CSR_MHPMCOUNTER23H, CSR_CLASS_I_32, CSR_CLAS= S_V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter24h, CSR_MHPMCOUNTER24H, CSR_CLASS_I_32, CSR_CLAS= S_V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter25h, CSR_MHPMCOUNTER25H, CSR_CLASS_I_32, CSR_CLAS= S_V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter26h, CSR_MHPMCOUNTER26H, CSR_CLASS_I_32, CSR_CLAS= S_V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter27h, CSR_MHPMCOUNTER27H, CSR_CLASS_I_32, CSR_CLAS= S_V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter28h, CSR_MHPMCOUNTER28H, CSR_CLASS_I_32, CSR_CLAS= S_V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter29h, CSR_MHPMCOUNTER29H, CSR_CLASS_I_32, CSR_CLAS= S_V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter30h, CSR_MHPMCOUNTER30H, CSR_CLASS_I_32, CSR_CLAS= S_V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmcounter31h, CSR_MHPMCOUNTER31H, CSR_CLASS_I_32, CSR_CLAS= S_V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mcountinhibit, CSR_MCOUNTINHIBIT, CSR_CLASS_I, CSR_CLASS_V1P= 11, CSR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmevent3, CSR_MHPMEVENT3, CSR_CLASS_I, CSR_CLASS_V1P9, CSR= _CLASS_VDRAFT) > +DECLARE_CSR(mhpmevent4, CSR_MHPMEVENT4, CSR_CLASS_I, CSR_CLASS_V1P9, CSR= _CLASS_VDRAFT) > +DECLARE_CSR(mhpmevent5, CSR_MHPMEVENT5, CSR_CLASS_I, CSR_CLASS_V1P9, CSR= _CLASS_VDRAFT) > +DECLARE_CSR(mhpmevent6, CSR_MHPMEVENT6, CSR_CLASS_I, CSR_CLASS_V1P9, CSR= _CLASS_VDRAFT) > +DECLARE_CSR(mhpmevent7, CSR_MHPMEVENT7, CSR_CLASS_I, CSR_CLASS_V1P9, CSR= _CLASS_VDRAFT) > +DECLARE_CSR(mhpmevent8, CSR_MHPMEVENT8, CSR_CLASS_I, CSR_CLASS_V1P9, CSR= _CLASS_VDRAFT) > +DECLARE_CSR(mhpmevent9, CSR_MHPMEVENT9, CSR_CLASS_I, CSR_CLASS_V1P9, CSR= _CLASS_VDRAFT) > +DECLARE_CSR(mhpmevent10, CSR_MHPMEVENT10, CSR_CLASS_I, CSR_CLASS_V1P9, C= SR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmevent11, CSR_MHPMEVENT11, CSR_CLASS_I, CSR_CLASS_V1P9, C= SR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmevent12, CSR_MHPMEVENT12, CSR_CLASS_I, CSR_CLASS_V1P9, C= SR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmevent13, CSR_MHPMEVENT13, CSR_CLASS_I, CSR_CLASS_V1P9, C= SR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmevent14, CSR_MHPMEVENT14, CSR_CLASS_I, CSR_CLASS_V1P9, C= SR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmevent15, CSR_MHPMEVENT15, CSR_CLASS_I, CSR_CLASS_V1P9, C= SR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmevent16, CSR_MHPMEVENT16, CSR_CLASS_I, CSR_CLASS_V1P9, C= SR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmevent17, CSR_MHPMEVENT17, CSR_CLASS_I, CSR_CLASS_V1P9, C= SR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmevent18, CSR_MHPMEVENT18, CSR_CLASS_I, CSR_CLASS_V1P9, C= SR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmevent19, CSR_MHPMEVENT19, CSR_CLASS_I, CSR_CLASS_V1P9, C= SR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmevent20, CSR_MHPMEVENT20, CSR_CLASS_I, CSR_CLASS_V1P9, C= SR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmevent21, CSR_MHPMEVENT21, CSR_CLASS_I, CSR_CLASS_V1P9, C= SR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmevent22, CSR_MHPMEVENT22, CSR_CLASS_I, CSR_CLASS_V1P9, C= SR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmevent23, CSR_MHPMEVENT23, CSR_CLASS_I, CSR_CLASS_V1P9, C= SR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmevent24, CSR_MHPMEVENT24, CSR_CLASS_I, CSR_CLASS_V1P9, C= SR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmevent25, CSR_MHPMEVENT25, CSR_CLASS_I, CSR_CLASS_V1P9, C= SR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmevent26, CSR_MHPMEVENT26, CSR_CLASS_I, CSR_CLASS_V1P9, C= SR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmevent27, CSR_MHPMEVENT27, CSR_CLASS_I, CSR_CLASS_V1P9, C= SR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmevent28, CSR_MHPMEVENT28, CSR_CLASS_I, CSR_CLASS_V1P9, C= SR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmevent29, CSR_MHPMEVENT29, CSR_CLASS_I, CSR_CLASS_V1P9, C= SR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmevent30, CSR_MHPMEVENT30, CSR_CLASS_I, CSR_CLASS_V1P9, C= SR_CLASS_VDRAFT) > +DECLARE_CSR(mhpmevent31, CSR_MHPMEVENT31, CSR_CLASS_I, CSR_CLASS_V1P9, C= SR_CLASS_VDRAFT) > +DECLARE_CSR(tselect, CSR_TSELECT, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS= _VDRAFT) > +DECLARE_CSR(tdata1, CSR_TDATA1, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_V= DRAFT) > +DECLARE_CSR(tdata2, CSR_TDATA2, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_V= DRAFT) > +DECLARE_CSR(tdata3, CSR_TDATA3, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_V= DRAFT) > +DECLARE_CSR(dcsr, CSR_DCSR, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_VDRAF= T) > +DECLARE_CSR(dpc, CSR_DPC, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_VDRAFT) > +DECLARE_CSR(dscratch0, CSR_DSCRATCH0, CSR_CLASS_I, CSR_CLASS_V1P11, CSR_= CLASS_VDRAFT) > +DECLARE_CSR(dscratch1, CSR_DSCRATCH1, CSR_CLASS_I, CSR_CLASS_V1P11, CSR_= CLASS_VDRAFT) > +DECLARE_CSR(hstatus, CSR_HSTATUS, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS= _V1P10) > +DECLARE_CSR(hedeleg, CSR_HEDELEG, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS= _V1P10) > +DECLARE_CSR(hideleg, CSR_HIDELEG, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS= _V1P10) > +DECLARE_CSR(hie, CSR_HIE, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_V1P10) > +DECLARE_CSR(htvec, CSR_HTVEC, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_V1P= 10) > +DECLARE_CSR(hscratch, CSR_HSCRATCH, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLA= SS_V1P10) > +DECLARE_CSR(hepc, CSR_HEPC, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_V1P10) > +DECLARE_CSR(hcause, CSR_HCAUSE, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_V= 1P10) > +DECLARE_CSR(hbadaddr, CSR_HBADADDR, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLA= SS_V1P10) > +DECLARE_CSR(hip, CSR_HIP, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_V1P10) > +DECLARE_CSR(mbase, CSR_MBASE, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_V1P= 10) > +DECLARE_CSR(mbound, CSR_MBOUND, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_V= 1P10) > +DECLARE_CSR(mibase, CSR_MIBASE, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_V= 1P10) > +DECLARE_CSR(mibound, CSR_MIBOUND, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS= _V1P10) > +DECLARE_CSR(mdbase, CSR_MDBASE, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_V= 1P10) > +DECLARE_CSR(mdbound, CSR_MDBOUND, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS= _V1P10) > +DECLARE_CSR(mscounteren, CSR_MSCOUNTEREN, CSR_CLASS_I, CSR_CLASS_V1P9, C= SR_CLASS_V1P10) > +DECLARE_CSR(mhcounteren, CSR_MHCOUNTEREN, CSR_CLASS_I, CSR_CLASS_V1P9, C= SR_CLASS_V1P10) > #endif > #ifdef DECLARE_CSR_ALIAS > -/* Ubadaddr is 0x043 in 1.9.1, but 0x043 is utval in 1.10. */ > -DECLARE_CSR_ALIAS(ubadaddr, CSR_UTVAL, CSR_CLASS_I) > -/* Sbadaddr is 0x143 in 1.9.1, but 0x143 is stval in 1.10. */ > -DECLARE_CSR_ALIAS(sbadaddr, CSR_STVAL, CSR_CLASS_I) > -/* Sptbr is 0x180 in 1.9.1, but 0x180 is satp in 1.10. */ > -DECLARE_CSR_ALIAS(sptbr, CSR_SATP, CSR_CLASS_I) > -/* Mbadaddr is 0x343 in 1.9.1, but 0x343 is mtval in 1.10. */ > -DECLARE_CSR_ALIAS(mbadaddr, CSR_MTVAL, CSR_CLASS_I) > -/* Mucounteren is 0x320 in 1.10, but 0x320 is mcountinhibit in 1.11. */ > -DECLARE_CSR_ALIAS(mucounteren, CSR_MCOUNTINHIBIT, CSR_CLASS_I) > -/* Dscratch is 0x7b2 in 1.10, but 0x7b2 is dscratch0 in 1.11. */ > -DECLARE_CSR_ALIAS(dscratch, CSR_DSCRATCH0, CSR_CLASS_I) > +DECLARE_CSR_ALIAS(misa, 0xf10, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLASS_V1= P9P1) > +DECLARE_CSR_ALIAS(ubadaddr, CSR_UTVAL, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_= CLASS_V1P10) > +DECLARE_CSR_ALIAS(sbadaddr, CSR_STVAL, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_= CLASS_V1P10) > +DECLARE_CSR_ALIAS(sptbr, CSR_SATP, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_CLAS= S_V1P10) > +DECLARE_CSR_ALIAS(mbadaddr, CSR_MTVAL, CSR_CLASS_I, CSR_CLASS_V1P9, CSR_= CLASS_V1P10) > +DECLARE_CSR_ALIAS(mucounteren, CSR_MCOUNTINHIBIT, CSR_CLASS_I, CSR_CLASS= _V1P9, CSR_CLASS_V1P10) > +DECLARE_CSR_ALIAS(dscratch, CSR_DSCRATCH0, CSR_CLASS_I, CSR_CLASS_V1P9, = CSR_CLASS_V1P11) > #endif > #ifdef DECLARE_CAUSE > DECLARE_CAUSE("misaligned fetch", CAUSE_MISALIGNED_FETCH) > diff --git a/include/opcode/riscv.h b/include/opcode/riscv.h > index f8b0de3..c36bf69 100644 > --- a/include/opcode/riscv.h > +++ b/include/opcode/riscv.h > @@ -24,6 +24,7 @@ > #include "riscv-opc.h" > #include > #include > +#include "bfd.h" > =20 > typedef uint64_t insn_t; > =20 > @@ -353,6 +354,19 @@ struct riscv_ext_version > unsigned int minor_version; > }; > =20 > +/* The current supported privilege versions. */ > + > +enum riscv_csr_vclass > +{ > + CSR_CLASS_VNONE, /* Default value */ > + > + CSR_CLASS_V1P9, /* v1.9 */ > + CSR_CLASS_V1P9P1, /* v1.9.1 */ > + CSR_CLASS_V1P10, /* v1.10 */ > + CSR_CLASS_V1P11, /* v1.11 */ > + CSR_CLASS_VDRAFT > +}; > + > /* Instruction is a simple alias (e.g. "mv" for "addi"). */ > #define INSN_ALIAS 0x00000001 > =20 > @@ -432,4 +446,9 @@ extern const struct riscv_opcode riscv_opcodes[]; > extern const struct riscv_opcode riscv_insn_types[]; > extern const struct riscv_ext_version riscv_ext_version_table[]; > =20 > +extern bfd_boolean > +riscv_get_priv_version_class (const char *, enum riscv_csr_vclass *); > +extern const char * > +riscv_get_priv_version_name (enum riscv_csr_vclass); > + > #endif /* _RISCV_H_ */ > diff --git a/opcodes/riscv-dis.c b/opcodes/riscv-dis.c > index d7a184c..98302ff 100644 > --- a/opcodes/riscv-dis.c > +++ b/opcodes/riscv-dis.c > @@ -326,7 +326,8 @@ print_insn_args (const char *d, insn_t l, bfd_vma pc,= disassemble_info *info) > unsigned int csr =3D EXTRACT_OPERAND (CSR, l); > switch (csr) > { > -#define DECLARE_CSR(name, num, class) case num: csr_name =3D #name; brea= k; > +#define DECLARE_CSR(name, num, class, define_version, abort_version) \ > + case num: csr_name =3D #name; break; > #include "opcode/riscv-opc.h" > #undef DECLARE_CSR > } > diff --git a/opcodes/riscv-opc.c b/opcodes/riscv-opc.c > index 7b885bf..cfefd8e 100644 > --- a/opcodes/riscv-opc.c > +++ b/opcodes/riscv-opc.c > @@ -937,3 +937,58 @@ const struct riscv_ext_version riscv_ext_version_tab= le[] =3D > /* Terminate the list. */ > {NULL, NULL, 0, 0} > }; > + > +struct priv_version_t > +{ > + const char *name; > + enum riscv_csr_vclass vclass; > +}; > + > +/* List for all supported CSR versions. */ > +static const struct priv_version_t priv_versions[] =3D > +{ > + {"1p9", CSR_CLASS_V1P9}, > + {"1p9p1", CSR_CLASS_V1P9P1}, > + {"1p10", CSR_CLASS_V1P10}, > + {"1p11", CSR_CLASS_V1P11}, > + > +/* Terminate the list. */ > + {NULL, 0} > +}; > + > +/* Get the corresponding CSR version class by giving a privilege > + version string. */ > + > +bfd_boolean > +riscv_get_priv_version_class (const char *s, > + enum riscv_csr_vclass *class) > +{ > + const struct priv_version_t *version; > + > + if (s =3D=3D NULL) > + return FALSE; > + > + for (version =3D &priv_versions[0]; version->name !=3D NULL; ++version) > + if (strcmp (version->name, s) =3D=3D 0) > + { > + *class =3D version->vclass; > + return TRUE; > + } > + > + /* Can not find the supported privilege version. */ > + return FALSE; > +} > + > +/* Get the corresponding privilege version string by giving a CSR > + version class. */ > + > +const char * > +riscv_get_priv_version_name (enum riscv_csr_vclass class) > +{ > + const struct priv_version_t *version; > + for (version =3D &priv_versions[0]; version->name !=3D NULL; ++version) > + if (class =3D=3D version->vclass) > + return version->name; > + /* This shouldn't happen. */ > + return NULL; > +} > --=20 > 2.7.4 >=20