lkml.org 
[lkml]   [2022]   [Feb]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Date
    SubjectRe: [PATCH v5 3/6] RISC-V: Extract multi-letter extension names from "riscv, isa"
    On Wed, Feb 23, 2022 at 2:18 AM Atish Patra <atishp@rivosinc.com> wrote:
    >
    > From: Tsukasa OI <research_trasio@irq.a4lg.com>
    >
    > Currently, there is no usage for version numbers in extensions as
    > any ratified non base ISA extension will always at v1.0.
    >
    > Extract the extension names in place for future parsing.
    >
    > Tested-by: Heiko Stuebner <heiko@sntech.de>
    > Reviewed-by: Anup Patel <anup@brainfault.org>
    > Signed-off-by: Tsukasa OI <research_trasio@irq.a4lg.com>
    > [Improved commit text and comments]
    > Signed-off-by: Atish Patra <atishp@rivosinc.com>

    Looks good to me.

    Reviewed-by: Anup Patel <anup@brainfault.org>

    Regards,
    Anup

    > ---
    > arch/riscv/kernel/cpufeature.c | 35 ++++++++++++++++++++++++++--------
    > 1 file changed, 27 insertions(+), 8 deletions(-)
    >
    > diff --git a/arch/riscv/kernel/cpufeature.c b/arch/riscv/kernel/cpufeature.c
    > index 72c5f6ef56b5..b0df7eff47f7 100644
    > --- a/arch/riscv/kernel/cpufeature.c
    > +++ b/arch/riscv/kernel/cpufeature.c
    > @@ -124,8 +124,28 @@ void __init riscv_fill_hwcap(void)
    > ext_long = true;
    > /* Multi-letter extension must be delimited */
    > for (; *isa && *isa != '_'; ++isa)
    > - if (!islower(*isa) && !isdigit(*isa))
    > + if (unlikely(!islower(*isa)
    > + && !isdigit(*isa)))
    > ext_err = true;
    > + /* Parse backwards */
    > + ext_end = isa;
    > + if (unlikely(ext_err))
    > + break;
    > + if (!isdigit(ext_end[-1]))
    > + break;
    > + /* Skip the minor version */
    > + while (isdigit(*--ext_end))
    > + ;
    > + if (ext_end[0] != 'p'
    > + || !isdigit(ext_end[-1])) {
    > + /* Advance it to offset the pre-decrement */
    > + ++ext_end;
    > + break;
    > + }
    > + /* Skip the major version */
    > + while (isdigit(*--ext_end))
    > + ;
    > + ++ext_end;
    > break;
    > default:
    > if (unlikely(!islower(*ext))) {
    > @@ -151,14 +171,13 @@ void __init riscv_fill_hwcap(void)
    > }
    > if (*isa != '_')
    > --isa;
    > - /*
    > - * TODO: Full version-aware handling including
    > - * multi-letter extensions will be added in-future.
    > - */
    > - if (ext_err || ext_long)
    > +
    > + if (unlikely(ext_err))
    > continue;
    > - this_hwcap |= isa2hwcap[(unsigned char)(*ext)];
    > - this_isa |= (1UL << (*ext - 'a'));
    > + if (!ext_long) {
    > + this_hwcap |= isa2hwcap[(unsigned char)(*ext)];
    > + this_isa |= (1UL << (*ext - 'a'));
    > + }
    > }
    >
    > /*
    > --
    > 2.30.2
    >

    \
     
     \ /
      Last update: 2022-02-28 11:04    [W:4.135 / U:0.424 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site