linux/arch/s390/kernel
Miroslav Benes aa137a6d30 s390/livepatch: Implement reliable stack tracing for the consistency model
The livepatch consistency model requires reliable stack tracing
architecture support in order to work properly. In order to achieve
this, two main issues have to be solved. First, reliable and consistent
call chain backtracing has to be ensured. Second, the unwinder needs to
be able to detect stack corruptions and return errors.

The "zSeries ELF Application Binary Interface Supplement" says:

  "The stack pointer points to the first word of the lowest allocated
  stack frame. If the "back chain" is implemented this word will point to
  the previously allocated stack frame (towards higher addresses), except
  for the first stack frame, which shall have a back chain of zero (NULL).
  The stack shall grow downwards, in other words towards lower addresses."

"back chain" is optional. GCC option -mbackchain enables it. Quoting
Martin Schwidefsky [1]:

  "The compiler is called with the -mbackchain option, all normal C
  function will store the backchain in the function prologue. All
  functions written in assembler code should do the same, if you find one
  that does not we should fix that. The end result is that a task that
  *voluntarily* called schedule() should have a proper backchain at all
  times.

  Dependent on the use case this may or may not be enough. Asynchronous
  interrupts may stop the CPU at the beginning of a function, if kernel
  preemption is enabled we can end up with a broken backchain.  The
  production kernels for IBM Z are all compiled *without* kernel
  preemption. So yes, we might get away without the objtool support.

  On a side-note, we do have a line item to implement the ORC unwinder for
  the kernel, that includes the objtool support. Once we have that we can
  drop the -mbackchain option for the kernel build. That gives us a nice
  little performance benefit. I hope that the change from backchain to the
  ORC unwinder will not be too hard to implement in the livepatch tools."

Since -mbackchain is enabled by default when the kernel is compiled, the
call chain backtracing should be currently ensured and objtool should
not be necessary for livepatch purposes.

Regarding the second issue, stack corruptions and non-reliable states
have to be recognized by the unwinder. Mainly it means to detect
preemption or page faults, the end of the task stack must be reached,
return addresses must be valid text addresses and hacks like function
graph tracing and kretprobes must be properly detected.

Unwinding a running task's stack is not a problem, because there is a
livepatch requirement that every checked task is blocked, except for the
current task. Due to that, the implementation can be much simpler
compared to the existing non-reliable infrastructure. We can consider a
task's kernel/thread stack only and skip the other stacks.

[1] 20180912121106.31ffa97c@mschwideX1 [not archived on lore.kernel.org]

Link: https://lkml.kernel.org/r/20191106095601.29986-5-mbenes@suse.cz
Reviewed-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Tested-by: Miroslav Benes <mbenes@suse.cz>
Signed-off-by: Miroslav Benes <mbenes@suse.cz>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
2019-11-30 10:52:48 +01:00
..
syscalls s390: wire up clone3 system call 2019-07-23 10:45:53 +02:00
vdso32 s390/vdso: fix getcpu 2019-11-30 10:52:44 +01:00
vdso64 s390/vdso: fix getcpu 2019-11-30 10:52:44 +01:00
.gitignore
alternative.c
asm-offsets.c s390/vdso: fix getcpu 2019-11-30 10:52:44 +01:00
audit.c
audit.h
base.S s390/base: remove unused s390_base_mcck_handler 2019-09-03 13:53:56 +02:00
cache.c
compat_audit.c
compat_linux.c s390: use generic UID16 implementation 2019-01-18 09:33:18 +01:00
compat_linux.h
compat_ptrace.h
compat_signal.c signal: Remove task parameter from force_sig 2019-05-27 09:36:28 -05:00
cpcmd.c
crash_dump.c memblock: memblock_phys_alloc(): don't panic 2019-03-12 10:04:01 -07:00
debug.c docs: s390: unify and update s390dbf kdocs at debug.c 2019-07-05 13:42:22 +02:00
diag.c s390/kernel: introduce .dma sections 2019-04-29 10:47:10 +02:00
dis.c s390/disassembler: don't hide instruction addresses 2019-11-12 11:24:10 +01:00
dumpstack.c s390/unwind: add stack pointer alignment sanity checks 2019-11-30 10:52:48 +01:00
early_printk.c s390/sclp: avoid using strncmp with hardcoded length 2019-08-29 15:34:58 +02:00
early.c s390/early: move access registers setup in C code 2019-11-20 12:58:13 +01:00
ebcdic.c s390: ebcdic: convert comments to UTF-8 2018-08-23 18:48:43 -07:00
entry.h PM: hibernate: powerpc: Expose pfn_is_nosave() prototype 2019-06-14 10:48:56 +02:00
entry.S s390: enforce CONFIG_SMP 2019-06-07 10:09:37 +02:00
fpu.c s390: correct some inline assembly constraints 2019-04-17 10:40:57 +02:00
ftrace.c s390/ftrace: use HAVE_FUNCTION_GRAPH_RET_ADDR_PTR 2019-05-02 13:54:11 +02:00
guarded_storage.c
head64.S s390/head64: correct init_task stack setup 2019-11-30 10:52:45 +01:00
idle.c s390/idle: fix cpu idle time calculation 2019-10-31 17:26:48 +01:00
ima_arch.c s390/kexec_file: Disable kexec_load when IPLed secure 2019-04-29 10:44:03 +02:00
ipl_vmparm.c s390/ipl: provide uapi header for list directed IPL 2019-04-26 12:34:05 +02:00
ipl.c s390/protvirt: avoid memory sharing for diag 308 set/store 2019-08-06 13:58:34 +02:00
irq.c s390/unwind: introduce stack unwind API 2019-05-02 13:54:11 +02:00
jump_label.c s390/jump_label: remove unused structure definition 2019-06-07 10:10:10 +02:00
kdebugfs.c s390: no need to check return value of debugfs_create functions 2019-01-28 15:58:55 +01:00
kexec_elf.c kexec: Fix file verification on S390 2019-09-10 13:27:51 +01:00
kexec_image.c kexec_file: split KEXEC_VERIFY_SIG into KEXEC_SIG and KEXEC_SIG_FORCE 2019-08-19 21:54:15 -07:00
kprobes.c s390/kernel: introduce .dma sections 2019-04-29 10:47:10 +02:00
lgr.c
machine_kexec_file.c Merge branch 'next-lockdown' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security 2019-09-28 08:14:15 -07:00
machine_kexec_reloc.c s390/kaslr: add support for R_390_GLOB_DAT relocation type 2019-10-22 17:55:51 +02:00
machine_kexec.c s390/kaslr: store KASLR offset for early dumps 2019-11-30 10:52:45 +01:00
Makefile s390: clean .bss before running uncompressed kernel 2019-08-21 12:58:52 +02:00
mcount.S s390/ftrace: use HAVE_FUNCTION_GRAPH_RET_ADDR_PTR 2019-05-02 13:54:11 +02:00
module.c s390/module: avoid using strncmp with hardcoded length 2019-08-29 15:34:57 +02:00
nmi.c s390: simplify disabled_wait 2019-05-02 13:54:11 +02:00
nospec-branch.c s390 updates for the 5.2 merge window 2019-05-06 16:42:54 -07:00
nospec-sysfs.c s390: Convert IS_ENABLED uses to __is_defined 2019-04-11 13:36:53 +02:00
os_info.c
perf_cpum_cf_common.c s390/cpum_cf: move common functions into a separate file 2019-02-22 09:19:55 +01:00
perf_cpum_cf_diag.c s390/cpumf: Adjust registration of s390 PMU device drivers 2019-11-20 17:16:01 +01:00
perf_cpum_cf_events.c s390/cpumf: Add extended counter set definitions for model 8561 and 8562 2019-07-11 20:40:01 +02:00
perf_cpum_cf.c s390/cpumf: Adjust registration of s390 PMU device drivers 2019-11-20 17:16:01 +01:00
perf_cpum_sf.c s390/cpum_sf: Check for SDBT and SDB consistency 2019-11-30 10:52:46 +01:00
perf_event.c s390: add error handling to perf_callchain_kernel 2019-10-31 17:20:54 +01:00
perf_regs.c
pgm_check.S s390/kernel: convert SYSCALL and PGM_CHECK handlers to .quad 2019-04-29 10:47:10 +02:00
process.c s390/process: avoid custom stack unwinding in get_wchan 2019-10-31 17:20:53 +01:00
processor.c processor: get rid of cpu_relax_yield 2019-06-15 12:25:55 +02:00
ptrace.c arch: mostly remove <asm/segment.h> 2019-04-23 21:51:40 +02:00
reipl.S s390: add missing ENDPROC statements to assembler functions 2019-05-02 13:54:11 +02:00
relocate_kernel.S s390: add missing ENDPROC statements to assembler functions 2019-05-02 13:54:11 +02:00
runtime_instr.c
setup.c s390: avoid misusing CALL_ON_STACK for task stack setup 2019-11-30 10:52:45 +01:00
signal.c signal: Remove task parameter from force_sig 2019-05-27 09:36:28 -05:00
smp.c s390: avoid misusing CALL_ON_STACK for task stack setup 2019-11-30 10:52:45 +01:00
stacktrace.c s390/livepatch: Implement reliable stack tracing for the consistency model 2019-11-30 10:52:48 +01:00
sthyi.c s390/sthyi: Fix machine name validity indication 2018-10-15 12:17:00 +02:00
suspend.c
swsusp.S s390: enforce CONFIG_SMP 2019-06-07 10:09:37 +02:00
sys_s390.c s390: autogenerate compat syscall wrappers 2019-01-18 09:33:19 +01:00
sysinfo.c s390: no need to check return value of debugfs_create functions 2019-01-28 15:58:55 +01:00
time.c s390/time: remove monotonic_clock() 2019-10-31 17:20:52 +01:00
topology.c s390/topology: avoid firing events before kobjs are created 2019-09-23 23:27:52 +02:00
trace.c
traps.c Merge branch 'siginfo-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace 2019-07-08 21:48:15 -07:00
unwind_bc.c s390/unwind: add stack pointer alignment sanity checks 2019-11-30 10:52:48 +01:00
uprobes.c
vdso.c s390 updates for the 5.4 merge window 2019-09-17 14:04:43 -07:00
vmlinux.lds.S s390: put _stext and _etext into .text section 2019-08-06 13:58:35 +02:00
vtime.c s390: correct some inline assembly constraints 2019-04-17 10:40:57 +02:00