powerpc/kasan: Disable address sanitization in kexec paths
The kexec code paths involve code that necessarily run in real mode, as CPUs are disabled and control is transferred to the new kernel. Disable address sanitization for the kexec code and the functions called in real mode on CPUs being disabled. [paulus@ozlabs.org: combined a few work-in-progress commits of Daniel's and wrote the commit message.] Signed-off-by: Daniel Axtens <dja@axtens.net> Signed-off-by: Paul Mackerras <paulus@ozlabs.org> [mpe: Move pseries_machine_kexec() into kexec.c so setup.c can be instrumented] Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/YoTFSQ2TUSEaDdVC@cleo
This commit is contained in:
parent
5352090a99
commit
2ab2d5794f
|
@ -13,3 +13,5 @@ obj-$(CONFIG_KEXEC_FILE) += file_load.o ranges.o file_load_$(BITS).o elf_$(BITS)
|
||||||
GCOV_PROFILE_core_$(BITS).o := n
|
GCOV_PROFILE_core_$(BITS).o := n
|
||||||
KCOV_INSTRUMENT_core_$(BITS).o := n
|
KCOV_INSTRUMENT_core_$(BITS).o := n
|
||||||
UBSAN_SANITIZE_core_$(BITS).o := n
|
UBSAN_SANITIZE_core_$(BITS).o := n
|
||||||
|
KASAN_SANITIZE_core.o := n
|
||||||
|
KASAN_SANITIZE_core_$(BITS) := n
|
||||||
|
|
|
@ -33,3 +33,5 @@ obj-$(CONFIG_SUSPEND) += suspend.o
|
||||||
obj-$(CONFIG_PPC_VAS) += vas.o vas-sysfs.o
|
obj-$(CONFIG_PPC_VAS) += vas.o vas-sysfs.o
|
||||||
|
|
||||||
obj-$(CONFIG_ARCH_HAS_CC_PLATFORM) += cc_platform.o
|
obj-$(CONFIG_ARCH_HAS_CC_PLATFORM) += cc_platform.o
|
||||||
|
|
||||||
|
KASAN_SANITIZE_kexec.o := n
|
||||||
|
|
|
@ -61,3 +61,11 @@ void pseries_kexec_cpu_down(int crash_shutdown, int secondary)
|
||||||
} else
|
} else
|
||||||
xics_kexec_teardown_cpu(secondary);
|
xics_kexec_teardown_cpu(secondary);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void pseries_machine_kexec(struct kimage *image)
|
||||||
|
{
|
||||||
|
if (firmware_has_feature(FW_FEATURE_SET_MODE))
|
||||||
|
pseries_disable_reloc_on_exc();
|
||||||
|
|
||||||
|
default_machine_kexec(image);
|
||||||
|
}
|
||||||
|
|
|
@ -38,6 +38,7 @@ static inline void smp_init_pseries(void) { }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern void pseries_kexec_cpu_down(int crash_shutdown, int secondary);
|
extern void pseries_kexec_cpu_down(int crash_shutdown, int secondary);
|
||||||
|
void pseries_machine_kexec(struct kimage *image);
|
||||||
|
|
||||||
extern void pSeries_final_fixup(void);
|
extern void pSeries_final_fixup(void);
|
||||||
|
|
||||||
|
|
|
@ -421,16 +421,6 @@ void pseries_disable_reloc_on_exc(void)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(pseries_disable_reloc_on_exc);
|
EXPORT_SYMBOL(pseries_disable_reloc_on_exc);
|
||||||
|
|
||||||
#ifdef CONFIG_KEXEC_CORE
|
|
||||||
static void pSeries_machine_kexec(struct kimage *image)
|
|
||||||
{
|
|
||||||
if (firmware_has_feature(FW_FEATURE_SET_MODE))
|
|
||||||
pseries_disable_reloc_on_exc();
|
|
||||||
|
|
||||||
default_machine_kexec(image);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __LITTLE_ENDIAN__
|
#ifdef __LITTLE_ENDIAN__
|
||||||
void pseries_big_endian_exceptions(void)
|
void pseries_big_endian_exceptions(void)
|
||||||
{
|
{
|
||||||
|
@ -1099,7 +1089,7 @@ define_machine(pseries) {
|
||||||
.machine_check_exception = pSeries_machine_check_exception,
|
.machine_check_exception = pSeries_machine_check_exception,
|
||||||
.machine_check_log_err = pSeries_machine_check_log_err,
|
.machine_check_log_err = pSeries_machine_check_log_err,
|
||||||
#ifdef CONFIG_KEXEC_CORE
|
#ifdef CONFIG_KEXEC_CORE
|
||||||
.machine_kexec = pSeries_machine_kexec,
|
.machine_kexec = pseries_machine_kexec,
|
||||||
.kexec_cpu_down = pseries_kexec_cpu_down,
|
.kexec_cpu_down = pseries_kexec_cpu_down,
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_MEMORY_HOTPLUG
|
#ifdef CONFIG_MEMORY_HOTPLUG
|
||||||
|
|
|
@ -146,7 +146,7 @@ void __init xics_smp_probe(void)
|
||||||
|
|
||||||
#endif /* CONFIG_SMP */
|
#endif /* CONFIG_SMP */
|
||||||
|
|
||||||
void xics_teardown_cpu(void)
|
noinstr void xics_teardown_cpu(void)
|
||||||
{
|
{
|
||||||
struct xics_cppr *os_cppr = this_cpu_ptr(&xics_cppr);
|
struct xics_cppr *os_cppr = this_cpu_ptr(&xics_cppr);
|
||||||
|
|
||||||
|
@ -159,7 +159,7 @@ void xics_teardown_cpu(void)
|
||||||
icp_ops->teardown_cpu();
|
icp_ops->teardown_cpu();
|
||||||
}
|
}
|
||||||
|
|
||||||
void xics_kexec_teardown_cpu(int secondary)
|
noinstr void xics_kexec_teardown_cpu(int secondary)
|
||||||
{
|
{
|
||||||
xics_teardown_cpu();
|
xics_teardown_cpu();
|
||||||
|
|
||||||
|
|
|
@ -1241,7 +1241,7 @@ static int xive_setup_cpu_ipi(unsigned int cpu)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void xive_cleanup_cpu_ipi(unsigned int cpu, struct xive_cpu *xc)
|
noinstr static void xive_cleanup_cpu_ipi(unsigned int cpu, struct xive_cpu *xc)
|
||||||
{
|
{
|
||||||
unsigned int xive_ipi_irq = xive_ipi_cpu_to_irq(cpu);
|
unsigned int xive_ipi_irq = xive_ipi_cpu_to_irq(cpu);
|
||||||
|
|
||||||
|
@ -1634,7 +1634,7 @@ void xive_flush_interrupt(void)
|
||||||
|
|
||||||
#endif /* CONFIG_SMP */
|
#endif /* CONFIG_SMP */
|
||||||
|
|
||||||
void xive_teardown_cpu(void)
|
noinstr void xive_teardown_cpu(void)
|
||||||
{
|
{
|
||||||
struct xive_cpu *xc = __this_cpu_read(xive_cpu);
|
struct xive_cpu *xc = __this_cpu_read(xive_cpu);
|
||||||
unsigned int cpu = smp_processor_id();
|
unsigned int cpu = smp_processor_id();
|
||||||
|
|
Loading…
Reference in New Issue