kernel-fxtec-pro1x/arch/x86/xen
Borislav Petkov 15b4f26b75 x86: Fix early boot crash on gcc-10, third try
commit a9a3ed1eff3601b63aea4fb462d8b3b92c7c1e7e upstream.

... or the odyssey of trying to disable the stack protector for the
function which generates the stack canary value.

The whole story started with Sergei reporting a boot crash with a kernel
built with gcc-10:

  Kernel panic — not syncing: stack-protector: Kernel stack is corrupted in: start_secondary
  CPU: 1 PID: 0 Comm: swapper/1 Not tainted 5.6.0-rc5—00235—gfffb08b37df9 #139
  Hardware name: Gigabyte Technology Co., Ltd. To be filled by O.E.M./H77M—D3H, BIOS F12 11/14/2013
  Call Trace:
    dump_stack
    panic
    ? start_secondary
    __stack_chk_fail
    start_secondary
    secondary_startup_64
  -—-[ end Kernel panic — not syncing: stack—protector: Kernel stack is corrupted in: start_secondary

This happens because gcc-10 tail-call optimizes the last function call
in start_secondary() - cpu_startup_entry() - and thus emits a stack
canary check which fails because the canary value changes after the
boot_init_stack_canary() call.

To fix that, the initial attempt was to mark the one function which
generates the stack canary with:

  __attribute__((optimize("-fno-stack-protector"))) ... start_secondary(void *unused)

however, using the optimize attribute doesn't work cumulatively
as the attribute does not add to but rather replaces previously
supplied optimization options - roughly all -fxxx options.

The key one among them being -fno-omit-frame-pointer and thus leading to
not present frame pointer - frame pointer which the kernel needs.

The next attempt to prevent compilers from tail-call optimizing
the last function call cpu_startup_entry(), shy of carving out
start_secondary() into a separate compilation unit and building it with
-fno-stack-protector, was to add an empty asm("").

This current solution was short and sweet, and reportedly, is supported
by both compilers but we didn't get very far this time: future (LTO?)
optimization passes could potentially eliminate this, which leads us
to the third attempt: having an actual memory barrier there which the
compiler cannot ignore or move around etc.

That should hold for a long time, but hey we said that about the other
two solutions too so...

Reported-by: Sergei Trofimovich <slyfox@gentoo.org>
Signed-off-by: Borislav Petkov <bp@suse.de>
Tested-by: Kalle Valo <kvalo@codeaurora.org>
Cc: <stable@vger.kernel.org>
Link: https://lkml.kernel.org/r/20200314164451.346497-1-slyfox@gentoo.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2020-05-20 08:18:49 +02:00
..
apic.c Merge branch 'WIP.x86/asm' into x86/urgent, because the topic is ready 2018-04-12 09:42:34 +02:00
debugfs.c
debugfs.h
efi.c xen/efi: Set nonblocking callbacks 2019-10-29 09:19:33 +01:00
enlighten.c x86/xen: Return from panic notifier 2019-11-06 13:05:55 +01:00
enlighten_hvm.c x86/xen: Reset VCPU0 info pointer after shared_info remap 2018-05-07 15:03:43 -04:00
enlighten_pv.c x86/xen: Distribute switch variables for initialization 2020-03-11 14:14:55 +01:00
enlighten_pvh.c xen/pvh: set xen_domain_type to HVM in xen_pvh_init 2019-05-22 07:37:45 +02:00
grant-table.c
irq.c xen: setup pv irq ops vector earlier 2018-07-13 08:23:27 +02:00
Kconfig x86/xen: Allow XEN_PV and XEN_PVH to be enabled with X86_5LEVEL 2018-02-21 10:19:18 +01:00
Makefile
mmu.c xen: fixes and features for v4-18-rc1 2018-06-08 09:24:54 -07:00
mmu.h
mmu_hvm.c x86/gart: Exclude GART aperture from vmcore 2018-01-11 15:09:24 +01:00
mmu_pv.c xen: fix dom0 boot on huge systems 2019-03-23 20:09:57 +01:00
multicalls.c xen: don't use privcmd_call() from xen_mc_flush() 2018-08-07 11:37:01 -04:00
multicalls.h
p2m.c xen: Fix {set,clear}_foreign_p2m_mapping on autotranslating guests 2018-02-08 10:40:49 +01:00
pci-swiotlb-xen.c
platform-pci-unplug.c xen/pvh: don't try to unplug emulated devices 2018-11-13 11:08:40 -08:00
pmu.c xen/x86/vpmu: Zero struct pt_regs before calling into sample handling code 2018-09-19 11:26:53 -04:00
pmu.h
setup.c Revert "xen/balloon: Mark unallocated host memory as UNUSABLE" 2018-12-17 09:24:39 +01:00
smp.c x86/xen: Calculate __max_logical_packages on PV domains 2018-02-17 09:40:45 +01:00
smp.h
smp_hvm.c
smp_pv.c x86: Fix early boot crash on gcc-10, third try 2020-05-20 08:18:49 +02:00
spinlock.c xen: fix xen_qlock_wait() 2018-11-13 11:08:52 -08:00
suspend.c x86/xen: Zero MSR_IA32_SPEC_CTRL before suspend 2018-02-28 16:03:19 +01:00
suspend_hvm.c
suspend_pv.c x86/xen/time: Initialize pv xen time in init_hypervisor_platform() 2018-07-20 00:02:39 +02:00
time.c xen: Fix x86 sched_clock() interface for xen 2019-01-22 21:40:32 +01:00
trace.c
vdso.h
vga.c
xen-asm.S
xen-asm_32.S
xen-asm_64.S kprobes/x86/xen: blacklist non-attachable xen interrupt functions 2019-12-05 09:20:25 +01:00
xen-head.S xen/pvh: Indicate XENFEAT_linux_rsdp_unrestricted to Xen 2018-04-10 09:22:22 -04:00
xen-ops.h x86/xen: remove unused function xen_auto_xlated_memory_setup() 2018-08-20 14:46:18 -04:00
xen-pvh.S xen/pvh: increase early stack size 2018-11-13 11:08:40 -08:00