kernel_samsung_a53x/arch/x86/xen
Andy Lutomirski e8ca71be6c x86/stackprotector/32: Make the canary into a regular percpu variable
[ Upstream commit 3fb0fdb3bbe7aed495109b3296b06c2409734023 ]

On 32-bit kernels, the stackprotector canary is quite nasty -- it is
stored at %gs:(20), which is nasty because 32-bit kernels use %fs for
percpu storage.  It's even nastier because it means that whether %gs
contains userspace state or kernel state while running kernel code
depends on whether stackprotector is enabled (this is
CONFIG_X86_32_LAZY_GS), and this setting radically changes the way
that segment selectors work.  Supporting both variants is a
maintenance and testing mess.

Merely rearranging so that percpu and the stack canary
share the same segment would be messy as the 32-bit percpu address
layout isn't currently compatible with putting a variable at a fixed
offset.

Fortunately, GCC 8.1 added options that allow the stack canary to be
accessed as %fs:__stack_chk_guard, effectively turning it into an ordinary
percpu variable.  This lets us get rid of all of the code to manage the
stack canary GDT descriptor and the CONFIG_X86_32_LAZY_GS mess.

(That name is special.  We could use any symbol we want for the
 %fs-relative mode, but for CONFIG_SMP=n, gcc refuses to let us use any
 name other than __stack_chk_guard.)

Forcibly disable stackprotector on older compilers that don't support
the new options and turn the stack canary into a percpu variable. The
"lazy GS" approach is now used for all 32-bit configurations.

Also makes load_gs_index() work on 32-bit kernels. On 64-bit kernels,
it loads the GS selector and updates the user GSBASE accordingly. (This
is unchanged.) On 32-bit kernels, it loads the GS selector and updates
GSBASE, which is now always the user base. This means that the overall
effect is the same on 32-bit and 64-bit, which avoids some ifdeffery.

 [ bp: Massage commit message. ]

Signed-off-by: Andy Lutomirski <luto@kernel.org>
Signed-off-by: Borislav Petkov <bp@suse.de>
Link: https://lkml.kernel.org/r/c0ff7dba14041c7e5d1cae5d4df052f03759bef3.1613243844.git.luto@kernel.org
Stable-dep-of: e3f269ed0acc ("x86/pm: Work around false positive kmemleak report in msr_build_context()")
Signed-off-by: Sasha Levin <sashal@kernel.org>
2024-11-19 09:22:37 +01:00
..
apic.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
debugfs.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
debugfs.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
efi.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
enlighten.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
enlighten_hvm.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
enlighten_pv.c x86/stackprotector/32: Make the canary into a regular percpu variable 2024-11-19 09:22:37 +01:00
enlighten_pvh.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
grant-table.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
irq.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
Kconfig Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
Makefile Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mmu.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mmu.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mmu_hvm.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mmu_pv.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
multicalls.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
multicalls.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
p2m.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
pci-swiotlb-xen.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
platform-pci-unplug.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
pmu.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
pmu.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
setup.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
smp.c x86/xen: Add some null pointer checking to smp.c 2024-11-19 08:44:35 +01:00
smp.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
smp_hvm.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
smp_pv.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
spinlock.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
suspend.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
suspend_hvm.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
suspend_pv.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
time.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
vga.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
xen-asm.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
xen-head.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
xen-ops.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00