public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
From: Tsukasa OI <research_trasio@irq.a4lg.com>
To: Nelson Chu <nelson@rivosinc.com>, Binutils <binutils@sourceware.org>
Subject: Re: [PING^1][RFC PATCH 0/2] RISC-V: Add 'Zicntr' and 'Zihpm' support with compatibility measures
Date: Fri, 20 Oct 2023 11:52:58 +0900	[thread overview]
Message-ID: <fe422535-a202-4354-ac16-0779919a7df4@irq.a4lg.com> (raw)
In-Reply-To: <CAPpQWtC8VozhMcsb4-a3ybxTcBPAJ70acbiXRxnt04gG1cBL=A@mail.gmail.com>

On 2023/10/19 17:33, Nelson Chu wrote:
> I hope we can remove the support of -misa-spec and -mpriv-spec from
> binutils, and then simply support the newest extension versions and CSRs
> by default.  These features are good until spec 20191213 and privileged
> spec 2.2, but they are harmful later, since spec no longer needs its own
> versions.  Continuing to build on all this mistake will make it all look
> worse, so I hope we can stop supporting -misa-spec/-mpriv-spec to take
> care of the compatibility issues.  Only in this way can we prevent us
> from wasting time on these faults caused by me many years ago.
> 
> Thanks
> Nelson

I could not be more appreciative of your input.

I mean, I must thank you because I can get rid of my garbage and make
another better one from scratch.  It's better if we don't have to depend
on -misa-spec and I think... softer approach works.

I'm making the new version based on the following concept:

1.  'I' does not imply 'Zicntr' and 'Zihpm' in any ISA spec.
2.  Using 'Zicntr' pseudoinstructions without the extension causes
    a warning (but not an error; this is new).  Using 'Zihpm' CSRs
    without the extension causes a warning when -mcsr-check is
    enabled (as usual).
3.  We have one extension version entry for each of them
    ('Zicntr' and 'Zihpm': ISA_SPEC_DRAFT, version 2.0)

So, my next approach will be, compliant as possible, except its
violation does not make a hard error (to avoid compatibility issues; I
don't want to repeat 'Zicsr' mess again).

Do this work for you?

Thanks,
Tsukasa

> 
> On Thu, Oct 19, 2023 at 3:58 PM Tsukasa OI <research_trasio@irq.a4lg.com
> <mailto:research_trasio@irq.a4lg.com>> wrote:
> 
>     Ping to all RISC-V folks,
> 
>     Though there are more possible ways than described in the original
>     e-mail, at least I would like to hear from you all what do you want when
>     we are going to support now ratified 'Zicntr' and 'Zihpm' extensions.
> 
> 
>     Additional Note 1. When "zicntr" and/or "zihpm" are explicitly stated?
> 
>     My initial RFC PATCH suppresses output of Zicntr and Zihpm extensions
>     unless the version number is specified explicitly (there's room to fix
>     this issue).
> 
>     Additional Note 2. Warn, instead of making errors?
> 
>     We have an option to make warnings when 'Zicntr' instructions are used
>     without the 'Zicntr' extension (when we are going to "compliant mode").
>     That will add a special code path but can be less breaking for users.
> 
> 
>     Sincerely,
>     Tsukasa
> 
>     On 2023/08/08 12:17, Tsukasa OI wrote:
>     > Hi,
>     >
>     > The role of this patch set is very simple: implement recently ratified
>     > 'Zicntr' (basic counters and timers) and 'Zihpm' (hardware performance
>     > counters) extensions, formerly a part of the 'I' extension,
>     version 2.0.
>     >
>     > Since some draft extensions depend on those extensions,
>     implementing counter
>     > extensions (as a part of data structure) is becoming mandatory.
>     >
>     > However, we need to be *very* careful to the implementation.  Because
>     > CSRs and pseudoinstructions for those extensions were a part of
>     'I' and
>     > more importantly, the first version which separated counters from
>     the 'I'
>     > extension, did not give counters extension names.  So, we needed to
>     > implement such CSRs and pseudoinstructions as a part of 'I'
>     (continuously).
>     >
>     >
>     > Not breaking the compatibility here is vital (the only exception
>     might be
>     > the new ratified ISA after version 20191213).  So, I implemented those
>     > extensions not to break anything as possible.
>     >
>     > The basic idea is, an extension (riscv_subset_t) with an unknown
>     version is
>     > not emitted to an object file (ELF attributes, mapping symbols
>     etc...).
>     >
>     > The default mode for existing ISAs is the compatibility mode
>     (Option 1).
>     >
>     >
>     > [Option 1: Compatibility Mode]
>     >
>     > In the compatibility mode (as default),
>     >
>     > 1.  'I' implies 'Zicntr' and 'Zihpm'.
>     > 2.  'Zicntr' and 'Zihpm' DO NOT imply 'Zicsr'.
>     > 3.  'Zicntr' and 'Zihpm' don't have version information.
>     >
>     > (2.) is the point.  The ratified document says 'Zicntr' and
>     'Zihpm' depend
>     > on the 'Zicsr' extension but if we do it unconditionally, that
>     would mean
>     > that the 'I' extension indirectly depends on 'Zicsr' (because of
>     1.), making
>     > a difference from the ratified 'I' extension version 2.1.  In
>     order to keep
>     > the compatibility, making 'Zicntr' and 'Zihpm' against the
>     documentation was
>     > (sadly) necessary.
>     >
>     > In the compatibility mode, code like:
>     >
>     >> riscv_subset_supports(&rps, "zicntr")
>     >
>     > will return true.  Because, even that the version information is
>     missing,
>     > the 'Zicntr' extension exists in the riscv_subset_list_t.  But an
>     extension
>     > with no version means, it will not be a part of the architectural
>     string
>     > emitted as a part of an object file.
>     >
>     >
>     > [Option 2: Compliant Mode]
>     >
>     > We can continue this forever but we have another option.  Break false
>     > dependency when a new ISA (with its version) is ratified and in
>     that time,
>     > require those extensions separately like -march=..._zicntr_zihpm.
>     >
>     > In the compliant mode:
>     >
>     > 1.  'I' DOES NOT imply 'Zicntr' and 'Zihpm'.
>     > 2.  'Zicntr' and 'Zihpm' DO imply 'Zicsr'.
>     > 3.  'Zicntr' and 'Zihpm' have its version information
>     >     (ratified version 2.0 or possibly a later version)
>     >
>     > Note that (1.) and (2.) are very opposite from the compatibility mode.
>     >
>     > In this mode, it is compliant to the specification completely.
>     >
>     >
>     >
>     >
>     > [Implementing an Option on future ISAs]
>     >
>     > Assume that we have a new ISA specification class,
>     ISA_SPEC_CLASS_2024XXXX.
>     > We can choose which option to implement as follows.
>     >
>     >
>     > [Option 1: Compatibility Mode]
>     >
>     > 1. Change the contents of check_implicit_compat_counter_from_i.
>     >
>     >>  /* Old.  */
>     >>  return *rps->isa_spec <= ISA_SPEC_CLASS_20191213;
>     >
>     >>  /* New.  */
>     >>  return *rps->isa_spec <= ISA_SPEC_CLASS_2024XXXX;
>     >
>     > Note that the reason we are looking for the ISA specification
>     (instead of
>     > the version of the 'I' extension) is, the 'I' extension version 2.1 is
>     > unlikely to change even when the new ISA specification is ratified.
>     > I assume that two behaviors (option 1 and 2) share the same 'I'
>     version 2.1.
>     >
>     > If the version of the 'I' extension changes (even if no *actual*
>     changes
>     > are made) in the new unprivileged ISA version, that would be a bit
>     simpler.
>     >
>     > 2. Add following entries to riscv_supported_std_z_ext.
>     >
>     > Make sure that they don't have the version number.
>     >
>     >>  /* ...  */
>     >>  {"zicntr",          ISA_SPEC_CLASS_2024XXXX,       
>     RISCV_UNKNOWN_VERSION, RISCV_UNKNOWN_VERSION,  0 }, /* Compat.  */
>     >>  /* ...  */
>     >>  {"zihpm",           ISA_SPEC_CLASS_2024XXXX,       
>     RISCV_UNKNOWN_VERSION, RISCV_UNKNOWN_VERSION,  0 }, /* Compat.  */
>     >
>     >
>     > [Option 2: Compliant Mode]
>     >
>     > 1. DO NOT change the contents of check_implicit_compat_counter_from_i.
>     > 2. Add following entries to riscv_supported_std_z_ext.
>     >
>     > Make sure that they DO have the version number.
>     >
>     >>  /* ...  */
>     >>  {"zicntr",          ISA_SPEC_CLASS_2024XXXX,        2, 0,  0 },
>     >>  /* ...  */
>     >>  {"zihpm",           ISA_SPEC_CLASS_2024XXXX,        2, 0,  0 },
>     >
>     > ...and for compatibility, we need to slightly modify riscv-dis.c.  The
>     > disassembler defaults to the latest non-draft ISA and there's
>     currently no
>     > ways to change it.  We need to make changes to riscv-dis.c by either:
>     >
>     > 1.  Entering special compatibility mode (even on the latest ISA,
>     enable
>     >     'Zicntr' extension ['Zihpm' is not necessary on the
>     disassembler]) or
>     > 2.  Enabling to change the ISA version from disassembler options.
>     >     Like my long proposed disassembler changes: adding overridable
>     "arch"
>     >     and "priv-spec" options, we have an option to change the ISA
>     using the
>     >     disassembler option.
>     >   
>      <https://github.com/a4lg/binutils-gdb/wiki/riscv_dis_arch_priv_spec
>     <https://github.com/a4lg/binutils-gdb/wiki/riscv_dis_arch_priv_spec>>
>     >
>     >
>     > In either case, this patch set leaves both options to implement yet
>     > supporting 'Zicntr' and 'Zihpm' extensions directly.
>     >
>     >
>     >
>     >
>     > Along with those changes (in PATCH 2), PATCH 1 makes possible to
>     consider
>     > implication by using *more* information than before.  This is
>     practically
>     > the same as:
>     > <https://sourceware.org/pipermail/binutils/2023-July/128715.html
>     <https://sourceware.org/pipermail/binutils/2023-July/128715.html>>,
>     > a patch to demonstrate how to implement the 'Zce' superset extension
>     > ('Zcf' must be implied by 'Zce' ONLY IF 'F' is ALSO enabled).
>     >
>     > The only difference is a minor type change as follows (to enable using
>     > the "riscv_subset_supports" function).
>     >
>     > *   Before: "const riscv_parse_subset_t *"
>     > *   After:  "      riscv_parse_subset_t *"
>     >
>     >
>     >
>     >
>     > Is there any other options?  Should I simplify the patch assuming
>     we choose
>     > the compatibility mode (Option 1) forever?
>     >
>     > In any case, I would like to hear your thoughts.
>     >
>     > Thanks,
>     > Tsukasa
>     >
>     >
>     >
>     >
>     > Tsukasa OI (2):
>     >   RISC-V: Base for complex extension implications
>     >   RISC-V: Add 'Zicntr' and 'Zihpm' support with compatibility measures
>     >
>     >  bfd/elfxx-riscv.c                       |  86 +++++--
>     >  gas/config/tc-riscv.c                   |  16 ++
>     >  gas/testsuite/gas/riscv/march-imply-i.s |   8 +
>     >  include/opcode/riscv-opc.h              | 310
>     ++++++++++++------------
>     >  include/opcode/riscv.h                  |   1 +
>     >  opcodes/riscv-opc.c                     |  12 +-
>     >  6 files changed, 256 insertions(+), 177 deletions(-)
>     >
>     >
>     > base-commit: d734d43a048b33ee12df2c06c2e782887e9715f6
> 

  reply	other threads:[~2023-10-20  2:53 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-08  3:17 [RFC " Tsukasa OI
2023-08-08  3:17 ` [RFC PATCH 1/2] RISC-V: Base for complex extension implications Tsukasa OI
2023-08-08  3:17 ` [RFC PATCH 2/2] RISC-V: Add 'Zicntr' and 'Zihpm' support with compatibility measures Tsukasa OI
2023-10-19  7:57 ` [PING^1][RFC PATCH 0/2] " Tsukasa OI
2023-10-19  8:33   ` Nelson Chu
2023-10-20  2:52     ` Tsukasa OI [this message]
2023-10-21  0:45 ` [PATCH 0/1] " Tsukasa OI
2023-10-21  0:45   ` [PATCH 1/1] " Tsukasa OI
2023-10-21  2:17   ` [PATCH v2 0/1] " Tsukasa OI
2023-10-21  2:17     ` [PATCH v2 1/1] " Tsukasa OI

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=fe422535-a202-4354-ac16-0779919a7df4@irq.a4lg.com \
    --to=research_trasio@irq.a4lg.com \
    --cc=binutils@sourceware.org \
    --cc=nelson@rivosinc.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).