Re: [PATCH v3 4/4] RISC-V: Use Zkr to seed KASLR base address

Conor Dooley
2024-07-02T14:08:28Z

[-- Attachment #1.1: Type: text/plain, Size: 2404 bytes --]

On Mon, Jul 01, 2024 at 02:51:32PM -0400, Jesse Taube wrote:

> +/**
> + * isa_string_contains - check if isa string contains an extension
> + *
> + * @isa_str: isa string to search
> + * @ext_name: the extension to search for
> + *
> + * Returns true if the extension is in the given isa string,
> + * false otherwise
> + */
> +static bool isa_string_contains(const char *isa_str, const char *ext_name)
> +{
> + size_t i, single_end, len = strlen(ext_name);
> + char ext_end;
> +
> + /* Error must contain rv32/64 */
> + if (strlen(isa_str) < 4)
> + return false;
> +
> + if (len == 1) {
> + single_end = strcspn(isa_str, "sSxXzZ");
> + /* Search for single chars between rv32/64 and multi-letter extensions */
> + for (i = 4; i < single_end; i++) {
> + if (tolower(isa_str[i]) == ext_name[0])
> + return true;
> + }
> + return false;
> + }
> +
> + /* Skip to start of multi-letter extensions */
> + isa_str = strpbrk(isa_str, "sSxXzZ");

Technically this could break with the old QEMUs that had "su" in the
single letter part, but at this point I think enough time has passed
that it does not matter.

> + while (isa_str) {
> + if (strncasecmp(isa_str, ext_name, len) == 0) {
> + ext_end = isa_str[len];
> + /* Check if matches the whole extension excluding version. */
> + if (ext_end == '\0' || ext_end == '_' || isdigit(ext_end))

I'm also not entirely sure about the final clause here. If you have an
extension "foo" and "foo32b", you'd match on the latter, right? I don't
think any extensions like that at the minute (foo32b type stuff does,
but the "root" alphabetical part for a foo32b doesn't), but I also don't
wanna have to chase down bugs in a parser this early in the future! The
devicetree binding doesn't actually allow anyone to put version
information in the isa string, so maybe the thing to do is just drop the
isdigit() check, given we only support devicetree right now for this early
probing?

> + return true;
> + }
> + /* Multi-letter extensions must be split from other multi-letter
> + * extensions with an "_", the end of a multi-letter extension will
> + * either be the null character or the "_" at the start of the next
> + * multi-letter extension.
> + */
> + isa_str = strchr(isa_str, '_');
> + if (isa_str)
> + isa_str++;
> + }
> +
> + return false;
> +}

Otherwise, I think this is fine now. Thanks for the updates.

Cheers,
Conor.

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

[-- Attachment #2: Type: text/plain, Size: 161 bytes --]