|
@@ -152,10 +152,19 @@ static void do_final_fixups(void)
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|
|
|
|
|
|
-void apply_feature_fixups(void)
|
|
|
|
|
|
+static unsigned long __initdata saved_cpu_features;
|
|
|
|
+static unsigned int __initdata saved_mmu_features;
|
|
|
|
+#ifdef CONFIG_PPC64
|
|
|
|
+static unsigned long __initdata saved_firmware_features;
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+void __init apply_feature_fixups(void)
|
|
{
|
|
{
|
|
struct cpu_spec *spec = *PTRRELOC(&cur_cpu_spec);
|
|
struct cpu_spec *spec = *PTRRELOC(&cur_cpu_spec);
|
|
|
|
|
|
|
|
+ *PTRRELOC(&saved_cpu_features) = spec->cpu_features;
|
|
|
|
+ *PTRRELOC(&saved_mmu_features) = spec->mmu_features;
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* Apply the CPU-specific and firmware specific fixups to kernel text
|
|
* Apply the CPU-specific and firmware specific fixups to kernel text
|
|
* (nop out sections not relevant to this CPU or this firmware).
|
|
* (nop out sections not relevant to this CPU or this firmware).
|
|
@@ -173,12 +182,28 @@ void apply_feature_fixups(void)
|
|
PTRRELOC(&__stop___lwsync_fixup));
|
|
PTRRELOC(&__stop___lwsync_fixup));
|
|
|
|
|
|
#ifdef CONFIG_PPC64
|
|
#ifdef CONFIG_PPC64
|
|
|
|
+ saved_firmware_features = powerpc_firmware_features;
|
|
do_feature_fixups(powerpc_firmware_features,
|
|
do_feature_fixups(powerpc_firmware_features,
|
|
&__start___fw_ftr_fixup, &__stop___fw_ftr_fixup);
|
|
&__start___fw_ftr_fixup, &__stop___fw_ftr_fixup);
|
|
#endif
|
|
#endif
|
|
do_final_fixups();
|
|
do_final_fixups();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int __init check_features(void)
|
|
|
|
+{
|
|
|
|
+ WARN(saved_cpu_features != cur_cpu_spec->cpu_features,
|
|
|
|
+ "CPU features changed after feature patching!\n");
|
|
|
|
+ WARN(saved_mmu_features != cur_cpu_spec->mmu_features,
|
|
|
|
+ "MMU features changed after feature patching!\n");
|
|
|
|
+#ifdef CONFIG_PPC64
|
|
|
|
+ WARN(saved_firmware_features != powerpc_firmware_features,
|
|
|
|
+ "Firmware features changed after feature patching!\n");
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+late_initcall(check_features);
|
|
|
|
+
|
|
#ifdef CONFIG_FTR_FIXUP_SELFTEST
|
|
#ifdef CONFIG_FTR_FIXUP_SELFTEST
|
|
|
|
|
|
#define check(x) \
|
|
#define check(x) \
|