linux_dsm_epyc7002/arch/s390
Christian Borntraeger ce6a04ac1b s390/kvm: Fix address space mixup
I was chasing down a bug of random validity intercepts on s390.
(guest prefix page not mapped in the host virtual aspace). Turns out
that the problem was a wrong address space control element. The
cause was quite complex:

During paging activity a DAT protection during SIE caused a program
interrupt. Normally, the sie retry loop tries to catch all
interrupts during and shortly before sie to rerun the setup. The
problem is now that protection causes a suppressing program interrupt,
causing the PSW to point to the instruction AFTER SIE in case of DAT
protection. This confused the logic of the retry loop to not trigger,
instead we jumped directly back to SIE after return from
the program  interrupt. (the protection fault handler itself did
a rewind of the psw). This usually works quite well, but:

If now the protection fault handler has to wait, another program
might be scheduled in. Later on the sie process will be schedules
in again. In that case the content of CR1 (primary address space)
will be wrong because switch_to will put the user space ASCE into CR1
and not the guest ASCE.

In addition the program parameter is also wrong for every protection
fault of a guest, since we dont issue the SPP instruction.

So lets also check for PSW == instruction after SIE in the program
check handler. Instead of expensively checking all program
interruption codes that might be suppressing we assume that a program
interrupt pointing after SIE was always a program interrupt in SIE.
(Otherwise we have a kernel bug anyway).

We also have to compensate the rewinding, since the C-level handlers
will do that. Therefore we need to add a nop with the same length
as SIE before the sie_loop.

Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
CC: stable@vger.kernel.org
CC: Heiko Carstens <heiko.carstens@de.ibm.com>
2012-11-23 11:14:34 +01:00
..
appldata s390/vtimer: rework virtual timer interface 2012-07-20 11:15:08 +02:00
boot s390: fix linker script for 31 bit builds 2012-10-18 17:50:10 +02:00
crypto s390/crypto: Don't panic after crypto instruction failures 2012-11-23 11:14:27 +01:00
hypfs Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs 2012-10-02 20:25:04 -07:00
include s390/topology: cleanup topology code 2012-11-23 11:14:31 +01:00
kernel s390/kvm: Fix address space mixup 2012-11-23 11:14:34 +01:00
kvm KVM updates for the 3.7 merge window 2012-10-04 09:30:33 -07:00
lib s390/mm: use pmd_large() instead of pmd_huge() 2012-10-26 16:44:23 +02:00
math-emu s390/comments: unify copyright messages and remove file names 2012-07-20 11:15:04 +02:00
mm s390/ptrace: race of single stepping vs signal delivery 2012-11-23 11:14:33 +01:00
net s390/bpf,jit: add support for BPF_S_ANC_ALU_XOR_X instruction 2012-09-26 15:45:28 +02:00
oprofile oprofile, s390: Fix uninitialized memory access when writing to oprofilefs 2012-08-27 14:49:23 +02:00
defconfig s390: update defconfig 2012-09-26 15:45:29 +02:00
Kbuild s390/bpf,jit: BPF Just In Time compiler for s390 2012-09-26 15:44:49 +02:00
Kconfig s390: add zEC12 code generation support 2012-11-23 11:14:31 +01:00
Kconfig.debug s390/mm: add page table dumper 2012-10-09 14:16:58 +02:00
Makefile s390: add zEC12 code generation support 2012-11-23 11:14:31 +01:00