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

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
Loading
Loading
Loading
Loading
+27 −8
Original line number Diff line number Diff line
@@ -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,15 +171,14 @@ 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;
			if (!ext_long) {
				this_hwcap |= isa2hwcap[(unsigned char)(*ext)];
				this_isa |= (1UL << (*ext - 'a'));
			}
		}

		/*
		 * All "okay" hart should have same isa. Set HWCAP based on