linux/arch/sparc/kernel
Rick Edgecombe a5f6c2ace9 x86/shstk: Add user control-protection fault handler
A control-protection fault is triggered when a control-flow transfer
attempt violates Shadow Stack or Indirect Branch Tracking constraints.
For example, the return address for a RET instruction differs from the copy
on the shadow stack.

There already exists a control-protection fault handler for handling kernel
IBT faults. Refactor this fault handler into separate user and kernel
handlers, like the page fault handler. Add a control-protection handler
for usermode. To avoid ifdeffery, put them both in a new file cet.c, which
is compiled in the case of either of the two CET features supported in the
kernel: kernel IBT or user mode shadow stack. Move some static inline
functions from traps.c into a header so they can be used in cet.c.

Opportunistically fix a comment in the kernel IBT part of the fault
handler that is on the end of the line instead of preceding it.

Keep the same behavior for the kernel side of the fault handler, except for
converting a BUG to a WARN in the case of a #CP happening when the feature
is missing. This unifies the behavior with the new shadow stack code, and
also prevents the kernel from crashing under this situation which is
potentially recoverable.

The control-protection fault handler works in a similar way as the general
protection fault handler. It provides the si_code SEGV_CPERR to the signal
handler.

Co-developed-by: Yu-cheng Yu <yu-cheng.yu@intel.com>
Signed-off-by: Yu-cheng Yu <yu-cheng.yu@intel.com>
Signed-off-by: Rick Edgecombe <rick.p.edgecombe@intel.com>
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Reviewed-by: Borislav Petkov (AMD) <bp@alien8.de>
Reviewed-by: Kees Cook <keescook@chromium.org>
Acked-by: Mike Rapoport (IBM) <rppt@kernel.org>
Tested-by: Pengfei Xu <pengfei.xu@intel.com>
Tested-by: John Allen <john.allen@amd.com>
Tested-by: Kees Cook <keescook@chromium.org>
Link: https://lore.kernel.org/all/20230613001108.3040476-28-rick.p.edgecombe%40intel.com
2023-08-02 15:01:50 -07:00
..
syscalls cachestat: wire up cachestat for other architectures 2023-06-09 16:25:16 -07:00
.gitignore .gitignore: add SPDX License Identifier 2020-03-25 11:50:48 +01:00
adi_64.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 482 2019-06-19 17:09:52 +02:00
apc.c
asm-offsets.c
audit.c audit: add support for the openat2 syscall 2021-10-01 16:52:48 -04:00
auxio_32.c
auxio_64.c treewide: Use fallthrough pseudo-keyword 2020-08-23 17:36:59 -05:00
btext.c treewide: Convert macro and uses of __section(foo) to __section("foo") 2020-10-25 14:51:49 -07:00
central.c treewide: Use fallthrough pseudo-keyword 2020-08-23 17:36:59 -05:00
cherrs.S
chmc.c treewide: Add SPDX license identifier for more missed files 2019-05-21 10:50:45 +02:00
compat_audit.c audit: add support for the openat2 syscall 2021-10-01 16:52:48 -04:00
cpu.c mm: reorder includes after introduction of linux/pgtable.h 2020-06-09 09:39:13 -07:00
cpumap.c sparc64: Replace zero-length array with flexible-array 2020-05-07 18:49:04 -07:00
cpumap.h
devices.c
ds.c sparc/vio: make remove callback return void 2021-05-14 13:45:58 +02:00
dtlb_miss.S
dtlb_prot.S
ebus.c
entry.h
entry.S Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc 2021-02-23 15:09:53 -08:00
etrap_32.S
etrap_64.S
fpu_traps.S
ftrace.c ftrace: Cleanup ftrace_dyn_arch_init() 2021-10-08 19:41:39 -04:00
getsetcc.S
head_32.S sparc32: get rid of fake_swapper_regs 2021-01-03 20:10:55 -05:00
head_64.S sparc64: get rid of fake_swapper_regs 2021-01-03 20:10:54 -05:00
helpers.S treewide: Add SPDX license identifier for missed files 2019-05-21 10:50:45 +02:00
hvapi.c
hvcalls.S
hvtramp.S
idprom.c
iommu-common.c dma-mapping: introduce dma_get_seg_boundary_nr_pages() 2020-09-03 18:12:15 +02:00
iommu.c sparc/iommu: don't set failed sg dma_address to DMA_MAPPING_ERROR 2021-08-09 17:13:06 +02:00
iommu_common.h
ioport.c sparc64: Replace all non-returning strlcpy with strscpy 2023-06-14 12:04:06 -07:00
irq.h
irq_32.c
irq_64.c asm-generic: Conditionally enable do_softirq_own_stack() via Kconfig. 2022-09-05 17:20:55 +02:00
itlb_miss.S
ivec.S
jump_label.c
kernel.h init: consolidate prototypes in linux/init.h 2023-06-09 17:44:16 -07:00
kgdb_32.c treewide: Use fallthrough pseudo-keyword 2020-08-23 17:36:59 -05:00
kgdb_64.c treewide: Use fallthrough pseudo-keyword 2020-08-23 17:36:59 -05:00
kprobes.c kprobes: treewide: Make it harder to refer kretprobe_trampoline directly 2021-09-30 21:24:06 -04:00
kstack.h
ktlb.S mm: reorder includes after introduction of linux/pgtable.h 2020-06-09 09:39:13 -07:00
ldc.c
led.c proc: make the proc_create[_data]() stubs static inlines 2022-01-20 08:52:52 +02:00
leon_kernel.c
leon_pci.c PCI: Introduce pci_dev_for_each_resource() 2023-04-04 10:43:52 -05:00
leon_pci_grpci1.c
leon_pci_grpci2.c
leon_pmc.c arch/idle: Change arch_cpu_idle() behavior: always exit with IRQs disabled 2023-01-13 11:48:15 +01:00
leon_smp.c sparc: Unbreak the build 2022-09-29 19:21:10 -07:00
Makefile Kbuild updates for v6.1 2022-10-10 12:00:45 -07:00
mdesc.c sparc: avoid stringop-overread errors 2021-09-15 13:42:33 -07:00
misctrap.S
module.c jump_label: mips: move module NOP patching into arch code 2022-06-24 09:48:55 +02:00
nmi.c watchdog/hardlockup: HAVE_NMI_WATCHDOG must implement watchdog_hardlockup_probe() 2023-06-19 16:25:26 -07:00
of_device_32.c sparc: Use of_property_present() for testing DT property presence 2023-04-18 11:23:21 -05:00
of_device_64.c sparc: Use of_property_present() for testing DT property presence 2023-04-18 11:23:21 -05:00
of_device_common.c sparc: Use of_property_present() for testing DT property presence 2023-04-18 11:23:21 -05:00
of_device_common.h
pci.c PCI: Introduce pci_dev_for_each_resource() 2023-04-04 10:43:52 -05:00
pci_common.c
pci_fire.c
pci_impl.h
pci_msi.c genirq/msi, treewide: Use a named struct for PCI/MSI attributes 2021-12-09 11:52:21 +01:00
pci_psycho.c
pci_sabre.c
pci_schizo.c sparc: Use of_property_read_bool() for boolean properties 2023-04-18 11:23:24 -05:00
pci_sun4v.c mm, treewide: redefine MAX_ORDER sanely 2023-04-05 19:42:46 -07:00
pci_sun4v.h
pci_sun4v_asm.S
pcic.c PCI: Introduce pci_dev_for_each_resource() 2023-04-04 10:43:52 -05:00
pcr.c treewide: Use fallthrough pseudo-keyword 2020-08-23 17:36:59 -05:00
perf_event.c sparc: perf: fix updated event period in response to PERF_EVENT_IOC_PERIOD 2019-06-02 22:16:33 -07:00
pmc.c
power.c sparc: Use of_property_read_bool() for boolean properties 2023-04-18 11:23:24 -05:00
process.c sparc: switch to kernel_clone() 2020-08-20 13:12:58 +02:00
process_32.c arch/idle: Change arch_cpu_idle() behavior: always exit with IRQs disabled 2023-01-13 11:48:15 +01:00
process_64.c sched/idle: Mark arch_cpu_idle_dead() __noreturn 2023-03-08 08:44:28 -08:00
prom.h
prom_32.c treewide: Use fallthrough pseudo-keyword 2020-08-23 17:36:59 -05:00
prom_64.c sparc: Use of_property_present() for testing DT property presence 2023-04-18 11:23:21 -05:00
prom_common.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
prom_irqtrans.c
psycho_common.c
psycho_common.h
ptrace_32.c sparc: ptrace: user_regset_copyin_ignore() always returns 0 2022-11-15 14:30:41 -08:00
ptrace_64.c sparc: ptrace: user_regset_copyin_ignore() always returns 0 2022-11-15 14:30:41 -08:00
reboot.c
rtrap_32.S sparc32: Preserve clone syscall flags argument for restarts due to signals 2021-02-18 16:15:11 -08:00
rtrap_64.S context_tracking: Split user tracking Kconfig 2022-06-29 17:04:09 -07:00
sbus.c
setup_32.c hardening updates for v6.5-rc1 2023-06-27 21:24:18 -07:00
setup_64.c sparc64: Replace all non-returning strlcpy with strscpy 2023-06-14 12:04:06 -07:00
signal32.c x86/shstk: Add user control-protection fault handler 2023-08-02 15:01:50 -07:00
signal_32.c ptrace: Cleanups for v5.18 2022-03-28 17:29:53 -07:00
signal_64.c x86/shstk: Add user control-protection fault handler 2023-08-02 15:01:50 -07:00
sigutil.h
sigutil_32.c
sigutil_64.c
smp_32.c treewide: Trace IPIs sent via smp_send_reschedule() 2023-03-24 11:01:28 +01:00
smp_64.c treewide: Trace IPIs sent via smp_send_reschedule() 2023-03-24 11:01:28 +01:00
sparc_ksyms.c
spiterrs.S
sstate.c kernel.h: split out panic and oops helpers 2021-07-01 11:06:04 -07:00
stacktrace.c treewide: Add SPDX license identifier for missed files 2019-05-21 10:50:45 +02:00
starfire.c
sun4d_irq.c
sun4d_smp.c sparc: Unbreak the build 2022-09-29 19:21:10 -07:00
sun4m_irq.c mm: remove unneeded includes of <asm/pgalloc.h> 2020-08-07 11:33:26 -07:00
sun4m_smp.c sparc: Unbreak the build 2022-09-29 19:21:10 -07:00
sun4v_ivec.S
sun4v_mcd.S treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 482 2019-06-19 17:09:52 +02:00
sun4v_tlb_miss.S
sys32.S net: remove compat_sys_{get,set}sockopt 2020-07-19 18:16:40 -07:00
sys_sparc32.c sparc: remove unused header file nfs_fs.h 2020-06-02 18:41:48 -07:00
sys_sparc_32.c signal/sparc: si_trapno is only used with SIGILL ILL_ILLTRP 2021-07-23 13:08:57 -05:00
sys_sparc_64.c signal/sparc: si_trapno is only used with SIGILL ILL_ILLTRP 2021-07-23 13:08:57 -05:00
syscalls.S sparc64: enable HAVE_COPY_THREAD_TLS 2020-06-23 10:49:54 +02:00
sysfs.c drivers/base/node: consolidate node device subsystem initialization in node_dev_init() 2022-03-22 15:57:10 -07:00
systbls.h
systbls_32.S sparc: syscalls: switch to generic syscalltbl.sh 2021-05-02 00:43:34 +09:00
systbls_64.S sparc: syscalls: switch to generic syscalltbl.sh 2021-05-02 00:43:34 +09:00
termios.c termios: start unifying non-UAPI parts of asm/termios.h 2022-09-09 10:44:34 +02:00
time_32.c sparc: Use of_property_present() for testing DT property presence 2023-04-18 11:23:21 -05:00
time_64.c cpufreq: Call transition notifier only once for each policy 2019-05-10 12:20:36 +02:00
trampoline_32.S
trampoline_64.S mm: reorder includes after introduction of linux/pgtable.h 2020-06-09 09:39:13 -07:00
traps_32.c exit: Add and use make_task_dead. 2021-12-13 12:04:45 -06:00
traps_64.c mm, treewide: redefine MAX_ORDER sanely 2023-04-05 19:42:46 -07:00
tsb.S
ttable_32.S
ttable_64.S
una_asm_32.S
una_asm_64.S
unaligned_32.c signal/sparc: si_trapno is only used with SIGILL ILL_ILLTRP 2021-07-23 13:08:57 -05:00
unaligned_64.c
uprobes.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 13 2019-05-21 11:28:45 +02:00
urtt_fill.S
utrap.S
vdso.c locking/seqlock, headers: Untangle the spaghetti monster 2020-08-06 16:13:13 +02:00
vio.c driver core: make struct bus_type.uevent() take a const * 2023-01-27 13:45:52 +01:00
viohs.c sparc64: viohs: Use struct_size() helper 2020-06-22 15:43:16 -07:00
visemul.c
vmlinux.lds.S objtool/idle: Validate __cpuidle code as noinstr 2023-01-13 11:48:15 +01:00
windows.c signal: Replace force_fatal_sig with force_exit_sig when in doubt 2021-11-19 09:15:58 -06:00
winfixup.S
wof.S
wuf.S