Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
[sfrench/cifs-2.6.git] / arch / arm64 / kernel / idreg-override.c
index 8439248c21d327d0f216a154ab59fa80715d9d77..2fe2491b692cd767f902f8f71d05fdcb751e68d2 100644 (file)
@@ -139,15 +139,22 @@ static const struct ftr_set_desc smfr0 __initconst = {
        },
 };
 
-extern struct arm64_ftr_override kaslr_feature_override;
+static bool __init hvhe_filter(u64 val)
+{
+       u64 mmfr1 = read_sysreg(id_aa64mmfr1_el1);
+
+       return (val == 1 &&
+               lower_32_bits(__boot_status) == BOOT_CPU_MODE_EL2 &&
+               cpuid_feature_extract_unsigned_field(mmfr1,
+                                                    ID_AA64MMFR1_EL1_VH_SHIFT));
+}
 
-static const struct ftr_set_desc kaslr __initconst = {
-       .name           = "kaslr",
-#ifdef CONFIG_RANDOMIZE_BASE
-       .override       = &kaslr_feature_override,
-#endif
+static const struct ftr_set_desc sw_features __initconst = {
+       .name           = "arm64_sw",
+       .override       = &arm64_sw_feature_override,
        .fields         = {
-               FIELD("disabled", 0, NULL),
+               FIELD("nokaslr", ARM64_SW_FEATURE_OVERRIDE_NOKASLR, NULL),
+               FIELD("hvhe", ARM64_SW_FEATURE_OVERRIDE_HVHE, hvhe_filter),
                {}
        },
 };
@@ -159,7 +166,7 @@ static const struct ftr_set_desc * const regs[] __initconst = {
        &isar1,
        &isar2,
        &smfr0,
-       &kaslr,
+       &sw_features,
 };
 
 static const struct {
@@ -177,7 +184,7 @@ static const struct {
          "id_aa64isar2.gpa3=0 id_aa64isar2.apa3=0"        },
        { "arm64.nomops",               "id_aa64isar2.mops=0" },
        { "arm64.nomte",                "id_aa64pfr1.mte=0" },
-       { "nokaslr",                    "kaslr.disabled=1" },
+       { "nokaslr",                    "arm64_sw.nokaslr=1" },
 };
 
 static int __init parse_nokaslr(char *unused)