Commit 40a4d0df authored by Tsukasa OI's avatar Tsukasa OI Committed by Palmer Dabbelt

RISC-V: Extract multi-letter extension names from "riscv, isa"

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: default avatarHeiko Stuebner <heiko@sntech.de>
Reviewed-by: default avatarAnup Patel <anup@brainfault.org>
Signed-off-by: default avatarTsukasa OI <research_trasio@irq.a4lg.com>
[Improved commit text and comments]
Signed-off-by: default avatarAtish Patra <atishp@rivosinc.com>
Signed-off-by: default avatarPalmer Dabbelt <palmer@rivosinc.com>
parent 2a31c54b
...@@ -124,8 +124,28 @@ void __init riscv_fill_hwcap(void) ...@@ -124,8 +124,28 @@ void __init riscv_fill_hwcap(void)
ext_long = true; ext_long = true;
/* Multi-letter extension must be delimited */ /* Multi-letter extension must be delimited */
for (; *isa && *isa != '_'; ++isa) for (; *isa && *isa != '_'; ++isa)
if (!islower(*isa) && !isdigit(*isa)) if (unlikely(!islower(*isa)
&& !isdigit(*isa)))
ext_err = true; 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; break;
default: default:
if (unlikely(!islower(*ext))) { if (unlikely(!islower(*ext))) {
...@@ -151,14 +171,13 @@ void __init riscv_fill_hwcap(void) ...@@ -151,14 +171,13 @@ void __init riscv_fill_hwcap(void)
} }
if (*isa != '_') if (*isa != '_')
--isa; --isa;
/*
* TODO: Full version-aware handling including if (unlikely(ext_err))
* multi-letter extensions will be added in-future.
*/
if (ext_err || ext_long)
continue; continue;
this_hwcap |= isa2hwcap[(unsigned char)(*ext)]; if (!ext_long) {
this_isa |= (1UL << (*ext - 'a')); this_hwcap |= isa2hwcap[(unsigned char)(*ext)];
this_isa |= (1UL << (*ext - 'a'));
}
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment