37e37c20ab
The stfle() function writes into lowcore memory when stfl_fac_list is initialized with "S390_lowcore.stfl_fac_list = 0". For older compilers this triggers a lowcore exception. With newer compilers and "-OXX" compile option the bug does not show up because the "S390_lowcore.stfl_fac_list" initialization is removed by the compiler. The reason for thatis the incorrect "=m" (S390_lowcore.stfl_fac_list) constraint in the stfl inline assembly. The following shows the disassembly of the stfle() optimized code that is inlined in the lgr_info_get() function: 000000000011325c <lgr_info_get>: 11325c: eb 9f f0 60 00 24 stmg %r9,%r15,96(%r15) 113262: c0 d0 00 29 0e 47 larl %r13,634ef0 <servi..> 113268: a7 f1 3f c0 tml %r15,16320 11326c: b9 04 00 ef lgr %r14,%r15 113270: a7 84 00 01 je 113272 <lgr_info_g..> 113274: a7 fb ff c0 aghi %r15,-64 113278: b9 04 00 c2 lgr %r12,%r2 11327c: a7 29 00 01 lghi %r2,1 113280: e3 e0 f0 98 00 24 stg %r14,152(%r15) 113286: d7 97 c0 00 c0 00 xc 0(152,%r12),0(%r12) 11328c: c0 e5 00 28 db 4c brasl %r14,62e924 <add_e..> 113292: b2 b1 00 00 stfl 0 To fix the problem we now clear the S390_lowcore.stfl_fac_list at startup in "head.S" for all machine types before lowcore protection is enabled. In addition to that the "=m" constraint is replaced by "+m". Signed-off-by: Michael Holzheu <holzheu@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com> |
||
---|---|---|
.. | ||
vdso32 | ||
vdso64 | ||
asm-offsets.c | ||
audit.c | ||
audit.h | ||
base.S | ||
bitmap.c | ||
compat_audit.c | ||
compat_exec_domain.c | ||
compat_linux.c | ||
compat_linux.h | ||
compat_ptrace.h | ||
compat_signal.c | ||
compat_wrapper.S | ||
cpcmd.c | ||
crash.c | ||
crash_dump.c | ||
debug.c | ||
diag.c | ||
dis.c | ||
early.c | ||
ebcdic.c | ||
entry.h | ||
entry.S | ||
entry64.S | ||
ftrace.c | ||
head.S | ||
head31.S | ||
head64.S | ||
head_kdump.S | ||
init_task.c | ||
ipl.c | ||
irq.c | ||
jump_label.c | ||
kprobes.c | ||
lgr.c | ||
machine_kexec.c | ||
Makefile | ||
mcount.S | ||
mcount64.S | ||
mem_detect.c | ||
module.c | ||
nmi.c | ||
os_info.c | ||
perf_cpum_cf.c | ||
perf_event.c | ||
process.c | ||
processor.c | ||
ptrace.c | ||
reipl.S | ||
reipl64.S | ||
relocate_kernel.S | ||
relocate_kernel64.S | ||
s390_ksyms.c | ||
sclp.S | ||
setup.c | ||
signal.c | ||
smp.c | ||
stacktrace.c | ||
suspend.c | ||
swsusp_asm64.S | ||
sys_s390.c | ||
syscalls.S | ||
sysinfo.c | ||
time.c | ||
topology.c | ||
traps.c | ||
vdso.c | ||
vmlinux.lds.S | ||
vtime.c |