[PATCH v4 1/1] RISC-V: Add platform property/capability extensions

Tsukasa OI research_trasio@irq.a4lg.com
Wed Jul 3 14:03:53 GMT 2024


Hi,

Since I'm getting (a bit) better from sickness (and I've finished
writing my research paper in a completely different field last month),
I'm happy to work on this again (yes, seems tables need some change).

I'll submit v5 on this weekend.

Thanks,
Tsukasa

On 2024/07/03 17:05, Nelson Chu wrote:
> Okay, that needs some sorting out since the code changed.
> 
> On Wed, Jul 3, 2024 at 3:46 PM Kito Cheng <kito.cheng@gmail.com
> <mailto:kito.cheng@gmail.com>> wrote:
> 
>     Hi Nelson:
> 
>     I would like to support this patch into binutils since we have most
>     of them in GCC...but they aren't supported in binutils which is
>     causing problems here...:(
> 
>     https://gcc.gnu.org/onlinedocs/gcc-14.1.0/gcc/RISC-V-Options.html#index-march-14 <https://gcc.gnu.org/onlinedocs/gcc-14.1.0/gcc/RISC-V-Options.html#index-march-14>
> 
> 
>     On Mon, Jul 31, 2023 at 10:57 AM Tsukasa OI via Binutils
>     <binutils@sourceware.org <mailto:binutils@sourceware.org>> wrote:
> 
>         Again, I'm not strongly object this decision but I'll note a
>         background
>         before I forget again (and in July, before the thread tree in the
>         Binutils Archives website breaks).
> 
>         My initial patch set (in 2022-11)
>         <https://sourceware.org/pipermail/binutils/2022-November/124155.html <https://sourceware.org/pipermail/binutils/2022-November/124155.html>>
> 
>         is approved by Nelson once.
>         <https://sourceware.org/pipermail/binutils/2022-November/124158.html <https://sourceware.org/pipermail/binutils/2022-November/124158.html>>
> 
>         But I decided not to commit it because I felt something in the
>         RISC-V
>         Profiles specification will likely change (despite it being
>         frozen; and
>         it did, 'Ssptead' was renamed to 'Svade' and 'Sscounterenw' was
>         added).
> 
>         I'm **not** going through using this approval since it's too
>         old.  But I
>         will appreciate if you consider this a little.  As I replied
>         earlier, I
>         can wait until RISC-V Profiles through "-march" is supported.
> 
>         <https://github.com/riscv-non-isa/riscv-toolchain-conventions/pull/36 <https://github.com/riscv-non-isa/riscv-toolchain-conventions/pull/36>>
> 
>         Thanks,
>         Tsukasa
> 
> 
>         On 2023/07/26 9:47, Palmer Dabbelt wrote:
>         > On Tue, 25 Jul 2023 17:05:53 PDT (-0700),
>         research_trasio@irq.a4lg.com <mailto:research_trasio@irq.a4lg.com>
>         > wrote:
>         >> From: Tsukasa OI <research_trasio@irq.a4lg.com
>         <mailto:research_trasio@irq.a4lg.com>>
>         >>
>         >> RISC-V Profiles document defines number of "extensions" that
>         indicate
>         >> certain platform properties/capabilities just like 'Zkt'
>         extension
>         >> from the
>         >> RISC-V cryptography extensions.
>         >>
>         >> This commit defines 20 platform property/capability
>         extensions as defined
>         >> in the RISC-V Profiles documentation.
>         >>
>         >> The only exception: 'Ssstateen' extension is defined separately
>         >> because it
>         >> defines a subset (supervisor/hypervisor view) of the 'Smstateen'
>         >> extension.
>         >>
>         >> This is based on the ratified version of RISC-V Profiles:
>         >> <https://github.com/riscv/riscv-profiles/releases/tag/v1.0
>         <https://github.com/riscv/riscv-profiles/releases/tag/v1.0>>
>         >>
>         >> [Definition]
>         >>
>         >> "Main memory regions":
>         >>     Main memory regions (in contrast to I/O or vacant memory
>         regions)
>         >> with
>         >>     both the cacheability and coherence PMAs.
>         >>
>         >> [New Unprivileged Extensions]
>         >>
>         >> 1.  'Ziccif'
>         >>     "Main memory regions" support instruction fetch and any
>         instruction
>         >>     fetches of naturally aligned power-of-2 sizes up to
>         min(ILEN, XLEN)
>         >>     are atomic.
>         >> 2.  'Ziccrse'
>         >>     "Main memory regions" provide the eventual success
>         guarantee for
>         >>     LR/SC sequence (RsrvEventual).
>         >> 3.  'Ziccamoa'
>         >>     "Main memory regions" support all currently-defined AMO
>         operations
>         >>     including swap, logical and arithmetic operations
>         (AMOArithmetic).
>         >> 4.  'Za64rs'
>         >>     For LR/SC instructions, reservation sets are contiguous,
>         naturally
>         >>     aligned and at most 64-bytes in size.
>         >> 5.  'Za128rs'
>         >>     Likewise, but reservation sets are at most 128-bytes in size.
>         >> 6.  'Zicclsm'
>         >>     Misaligned loads / stores to "main memory regions" are
>         supported.
>         >>     Those include both regular scalar and vector accesses but
>         does not
>         >>     include AMOs and other specialized forms of memory accesses.
>         >> 7.  'Zic64b'
>         >>     Cache blocks are (exactly) 64-bytes in size and naturally
>         aligned.
>         >
>         > IMO we want to stay away from these extensions that are just
>         defined by
>         > a single phrase in the spec.  We're still digging out from the
>         first
>         > rounds of changed specs, trying to start supporting stuff
>         that's not
>         > even been defined is going to just make for another round of
>         headaches.
>         >
>         >> [New Privileged Extensions]
>         >>
>         >> 1.  'Svbare'
>         >>     "satp" mode Bare is supported.
>         >> 2.  'Svade'
>         >>     Page-fault exceptions are raised when a page is accessed
>         when A
>         >> bit is
>         >>     clear, or written when D bit is clear.
>         >> 3.  'Ssccptr'
>         >>     "Main memory regions" support hardware page-table reads.
>         >> 4.  'Sstvecd'
>         >>     "stvec" mode Direct is supported.  When "stvec" mode is
>         Direct,
>         >>     "stvec.BASE" is capable of holding any valid 4-byte
>         aligned address.
>         >> 5.  'Sstvala'
>         >>     "stval" is always written with a nonzero value whenever
>         possible as
>         >>     specified in the Privileged Architecture documentation
>         >>     (version 20211203: see section 4.1.9).
>         >> 6.  'Sscounterenw'
>         >>     For any "hpmcounter" that is not read-only zero, the
>         corresponding
>         >> bit
>         >>     in "scounteren" is writable.
>         >> 7.  'Ssu64xl'
>         >>     "sstatus.UXL" is capable of holding the value 0b10
>         >>     (UXLEN==64 is supported).
>         >> 8.  'Shcounterenw'
>         >>     Similar to 'Sscounterenw' but the same rule applies to
>         "hcounteren".
>         >> 9.  'Shvstvala'
>         >>     Similar to 'Sstvala' but the same rule applies to "vstval".
>         >> 10. 'Shtvala'
>         >>     "htval" is written with the faulting guest physical
>         address as
>         >> long as
>         >>     permitted by the ISA (a bit similar to 'Sstvala' and
>         'Shvstvala').
>         >> 11. 'Shvstvecd'
>         >>     Similar to 'Sstvecd' but the same rule applies to "vstvec".
>         >> 12. 'Shvsatpa'
>         >>     All translation modes supported in "satp" are also
>         supported in
>         >> "vsatp".
>         >> 13. 'Shgatpa'
>         >>     For each supported virtual memory scheme SvNN supported
>         in "satp",
>         >> the
>         >>     corresponding "hgatp" SvNNx4 mode is supported.  The
>         "hgatp" mode
>         >> Bare
>         >>     is also supported.
>         >>
>         >> [Implications]
>         >>
>         >> (Due to reservation set size constraints)
>         >> -   'Za64rs' -> 'Za128rs'
>         >>
>         >> (Due to the fact that a privileged "extension" directly
>         refers a CSR)
>         >> -   'Svbare'       -> 'Zicsr'
>         >> -   'Sstvecd'      -> 'Zicsr'
>         >> -   'Sstvala'      -> 'Zicsr'
>         >> -   'Sscounterenw' -> 'Zicsr'
>         >> -   'Ssu64xl'      -> 'Zicsr'
>         >>
>         >> (Due to the fact that a privileged "extension" indirectly
>         depends on
>         >> CSRs)
>         >> -   'Svade' -> 'Zicsr'
>         >>
>         >> (Due to the fact that a privileged "extension" is a
>         hypervisor property)
>         >> -   'Shcounterenw' -> 'H'
>         >> -   'Shvstvala'    -> 'H'
>         >> -   'Shtvala'      -> 'H'
>         >> -   'Shvstvecd'    -> 'H'
>         >> -   'Shvsatpa'     -> 'H'
>         >> -   'Shgatpa'      -> 'H'
>         >>
>         >> bfd/ChangeLog:
>         >>
>         >>     * elfxx-riscv.c
>         >>     (riscv_implicit_subsets): Add 13 implication rules.
>         >>     Reorder 'H' for new 'Sh*' extensions.
>         >>     (riscv_supported_std_z_ext) Add 7 property/capability
>         extensions.
>         >>     (riscv_supported_std_s_ext) Add 13 property/capability
>         extensions.
>         >> ---
>         >>  bfd/elfxx-riscv.c | 35 ++++++++++++++++++++++++++++++++++-
>         >>  1 file changed, 34 insertions(+), 1 deletion(-)
>         >>
>         >> diff --git a/bfd/elfxx-riscv.c b/bfd/elfxx-riscv.c
>         >> index b43d2cfa0fab..47dede91e064 100644
>         >> --- a/bfd/elfxx-riscv.c
>         >> +++ b/bfd/elfxx-riscv.c
>         >> @@ -1105,7 +1105,6 @@ static struct riscv_implicit_subset
>         >> riscv_implicit_subsets[] =
>         >>    {"g", "zicsr",    check_implicit_always},
>         >>    {"g", "zifencei",    check_implicit_always},
>         >>    {"m", "zmmul",    check_implicit_always},
>         >> -  {"h", "zicsr",    check_implicit_always},
>         >>    {"q", "d",        check_implicit_always},
>         >>    {"v", "d",        check_implicit_always},
>         >>    {"v", "zve64d",    check_implicit_always},
>         >> @@ -1144,6 +1143,7 @@ static struct riscv_implicit_subset
>         >> riscv_implicit_subsets[] =
>         >>    {"zhinx", "zhinxmin",    check_implicit_always},
>         >>    {"zhinxmin", "zfinx",    check_implicit_always},
>         >>    {"zfinx", "zicsr",    check_implicit_always},
>         >> +  {"za64rs", "za128rs",    check_implicit_always},
>         >>    {"zk", "zkn",        check_implicit_always},
>         >>    {"zk", "zkr",        check_implicit_always},
>         >>    {"zk", "zkt",        check_implicit_always},
>         >> @@ -1179,10 +1179,23 @@ static struct riscv_implicit_subset
>         >> riscv_implicit_subsets[] =
>         >>    {"smaia", "ssaia",        check_implicit_always},
>         >>    {"smstateen", "ssstateen",    check_implicit_always},
>         >>    {"smepmp", "zicsr",        check_implicit_always},
>         >> +  {"shcounterenw", "h",        check_implicit_always},
>         >> +  {"shgatpa", "h",        check_implicit_always},
>         >> +  {"shtvala", "h",        check_implicit_always},
>         >> +  {"shvsatpa", "h",        check_implicit_always},
>         >> +  {"shvstvala", "h",        check_implicit_always},
>         >> +  {"shvstvecd", "h",        check_implicit_always},
>         >> +  {"h", "zicsr",        check_implicit_always},
>         >>    {"ssaia", "zicsr",        check_implicit_always},
>         >>    {"sscofpmf", "zicsr",        check_implicit_always},
>         >> +  {"sscounterenw", "zicsr",    check_implicit_always},
>         >>    {"ssstateen", "zicsr",    check_implicit_always},
>         >>    {"sstc", "zicsr",        check_implicit_always},
>         >> +  {"sstvala", "zicsr",        check_implicit_always},
>         >> +  {"sstvecd", "zicsr",        check_implicit_always},
>         >> +  {"ssu64xl", "zicsr",        check_implicit_always},
>         >> +  {"svade", "zicsr",        check_implicit_always},
>         >> +  {"svbare", "zicsr",        check_implicit_always},
>         >>    {NULL, NULL, NULL}
>         >>  };
>         >>
>         >> @@ -1240,6 +1253,11 @@ static struct riscv_supported_ext
>         >> riscv_supported_std_ext[] =
>         >>
>         >>  static struct riscv_supported_ext riscv_supported_std_z_ext[] =
>         >>  {
>         >> +  {"zic64b",        ISA_SPEC_CLASS_DRAFT,        1, 0,  0 },
>         >> +  {"ziccamoa",        ISA_SPEC_CLASS_DRAFT,        1, 0,  0 },
>         >> +  {"ziccif",        ISA_SPEC_CLASS_DRAFT,        1, 0,  0 },
>         >> +  {"zicclsm",        ISA_SPEC_CLASS_DRAFT,        1, 0,  0 },
>         >> +  {"ziccrse",        ISA_SPEC_CLASS_DRAFT,        1, 0,  0 },
>         >>    {"zicbom",        ISA_SPEC_CLASS_DRAFT,        1, 0,  0 },
>         >>    {"zicbop",        ISA_SPEC_CLASS_DRAFT,        1, 0,  0 },
>         >>    {"zicboz",        ISA_SPEC_CLASS_DRAFT,        1, 0,  0 },
>         >> @@ -1250,6 +1268,8 @@ static struct riscv_supported_ext
>         >> riscv_supported_std_z_ext[] =
>         >>    {"zifencei",        ISA_SPEC_CLASS_20190608,    2, 0,  0 },
>         >>    {"zihintpause",    ISA_SPEC_CLASS_DRAFT,        2, 0,  0 },
>         >>    {"zmmul",        ISA_SPEC_CLASS_DRAFT,        1, 0,  0 },
>         >> +  {"za64rs",        ISA_SPEC_CLASS_DRAFT,        1, 0,  0 },
>         >> +  {"za128rs",        ISA_SPEC_CLASS_DRAFT,        1, 0,  0 },
>         >>    {"zawrs",        ISA_SPEC_CLASS_DRAFT,        1, 0,  0 },
>         >>    {"zfa",        ISA_SPEC_CLASS_DRAFT,        0, 1,  0 },
>         >>    {"zfh",        ISA_SPEC_CLASS_DRAFT,        1, 0,  0 },
>         >> @@ -1318,13 +1338,26 @@ static struct riscv_supported_ext
>         >> riscv_supported_std_z_ext[] =
>         >>
>         >>  static struct riscv_supported_ext riscv_supported_std_s_ext[] =
>         >>  {
>         >> +  {"shcounterenw",    ISA_SPEC_CLASS_DRAFT,        1, 0, 0 },
>         >> +  {"shgatpa",        ISA_SPEC_CLASS_DRAFT,        1, 0, 0 },
>         >> +  {"shtvala",        ISA_SPEC_CLASS_DRAFT,        1, 0, 0 },
>         >> +  {"shvsatpa",        ISA_SPEC_CLASS_DRAFT,        1, 0, 0 },
>         >> +  {"shvstvala",        ISA_SPEC_CLASS_DRAFT,        1, 0, 0 },
>         >> +  {"shvstvecd",        ISA_SPEC_CLASS_DRAFT,        1, 0, 0 },
>         >>    {"smaia",        ISA_SPEC_CLASS_DRAFT,        1, 0, 0 },
>         >>    {"smepmp",        ISA_SPEC_CLASS_DRAFT,        1, 0, 0 },
>         >>    {"smstateen",        ISA_SPEC_CLASS_DRAFT,        1, 0, 0 },
>         >>    {"ssaia",        ISA_SPEC_CLASS_DRAFT,        1, 0, 0 },
>         >> +  {"ssccptr",        ISA_SPEC_CLASS_DRAFT,        1, 0, 0 },
>         >>    {"sscofpmf",        ISA_SPEC_CLASS_DRAFT,        1, 0, 0 },
>         >> +  {"sscounterenw",    ISA_SPEC_CLASS_DRAFT,        1, 0, 0 },
>         >>    {"ssstateen",        ISA_SPEC_CLASS_DRAFT,        1, 0, 0 },
>         >>    {"sstc",        ISA_SPEC_CLASS_DRAFT,        1, 0, 0 },
>         >> +  {"sstvala",        ISA_SPEC_CLASS_DRAFT,        1, 0, 0 },
>         >> +  {"sstvecd",        ISA_SPEC_CLASS_DRAFT,        1, 0, 0 },
>         >> +  {"ssu64xl",        ISA_SPEC_CLASS_DRAFT,        1, 0, 0 },
>         >> +  {"svade",        ISA_SPEC_CLASS_DRAFT,        1, 0, 0 },
>         >> +  {"svbare",        ISA_SPEC_CLASS_DRAFT,        1, 0, 0 },
>         >>    {"svinval",        ISA_SPEC_CLASS_DRAFT,        1, 0, 0 },
>         >>    {"svnapot",        ISA_SPEC_CLASS_DRAFT,        1, 0, 0 },
>         >>    {"svpbmt",        ISA_SPEC_CLASS_DRAFT,        1, 0, 0 },
>         >
> 


More information about the Binutils mailing list