staticbool __init mmfr1_vh_filter(u64 val)
{ /* * If we ever reach this point while running VHE, we're * guaranteed to be on one of these funky, VHE-stuck CPUs. If * the user was trying to force nVHE on us, proceed with * attitude adjustment.
*/ return !(__boot_status == (BOOT_CPU_FLAG_E2H | BOOT_CPU_MODE_EL2) &&
val == 0);
}
/* * Override PARange to 48 bits - the override will just be * ignored if the actual PARange is smaller, but this is * unlikely to be the case for LPA2 capable silicon.
*/
id_aa64mmfr0_override.val |=
ID_AA64MMFR0_EL1_PARANGE_48 << ID_AA64MMFR0_EL1_PARANGE_SHIFT;
id_aa64mmfr0_override.mask |= 0xfU << ID_AA64MMFR0_EL1_PARANGE_SHIFT;
} #endif returntrue;
}
staticbool __init pfr0_sve_filter(u64 val)
{ /* * Disabling SVE also means disabling all the features that * are associated with it. The easiest way to do it is just to * override id_aa64zfr0_el1 to be 0.
*/ if (!val) {
id_aa64zfr0_override.val = 0;
id_aa64zfr0_override.mask = GENMASK(63, 0);
}
staticbool __init pfr1_sme_filter(u64 val)
{ /* * Similarly to SVE, disabling SME also means disabling all * the features that are associated with it. Just set * id_aa64smfr0_el1 to 0 and don't look back.
*/ if (!val) {
id_aa64smfr0_override.val = 0;
id_aa64smfr0_override.mask = GENMASK(63, 0);
}
for (i = 0; i < ARRAY_SIZE(regs); i++) { conststruct ftr_set_desc *reg = prel64_pointer(regs[i].reg); struct arm64_ftr_override *override; int len = strlen(reg->name); int f;
override = prel64_pointer(reg->override);
// set opt[] to '<name>.'
memcpy(opt, reg->name, len);
opt[len++] = '.';
if (find_field(cmdline, opt, len, reg, f, &v)) continue;
/* * If an override gets filtered out, advertise * it by setting the value to the all-ones while * clearing the mask... Yes, this is fragile.
*/
filter = prel64_pointer(reg->fields[f].filter); if (filter && !filter(v)) {
override->val |= mask;
override->mask &= ~mask; continue;
}
static __init void __parse_cmdline(constchar *cmdline, bool parse_aliases)
{ do { char buf[256];
size_t len; int i;
cmdline = skip_spaces(cmdline);
/* terminate on "--" appearing on the command line by itself */ if (cmdline[0] == '-' && cmdline[1] == '-' && isspace(cmdline[2])) return;
for (len = 0; cmdline[len] && !isspace(cmdline[len]); len++) { if (len >= sizeof(buf) - 1) break; if (cmdline[len] == '-')
buf[len] = '_'; else
buf[len] = cmdline[len];
} if (!len) return;
buf[len] = 0;
cmdline += len;
match_options(buf);
for (i = 0; parse_aliases && i < ARRAY_SIZE(aliases); i++) if (!memcmp(buf, aliases[i].alias, len + 1))
__parse_cmdline(aliases[i].feature, false);
} while (1);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.