• Heiko Carstens's avatar
    s390/nmi: fix vector register corruption · cad49cfc
    Heiko Carstens authored
    If a machine check happens, the machine has the vector facility installed
    and the extended save area exists, the cpu will save vector register
    contents into the extended save area. This is regardless of control
    register 0 contents, which enables and disables the vector facility during
    runtime.
    
    On each machine check we should validate the vector registers. The current
    code however tries to validate the registers only if the running task is
    using vector registers in user space.
    
    However even the current code is broken and causes vector register
    corruption on machine checks, if user space uses them:
    the prefix area contains a pointer (absolute address) to the machine check
    extended save area. In order to save some space the save area was put into
    an unused area of the second prefix page.
    When validating vector register contents the code uses the absolute address
    of the extended save area, which is wrong. Due to prefixing the vector
    instructions will then access contents using absolute addresses instead
    of real addresses, where the machine stored the contents.
    
    If the above would work there is still the problem that register validition
    would only happen if user space uses vector registers. If kernel space uses
    them also, this may also lead to vector register content corruption:
    if the kernel makes use of vector instructions, but the current running
    user space context does not, the machine check handler will validate
    floating point registers instead of vector registers.
    Given the fact that writing to a floating point register may change the
    upper halve of the corresponding vector register, we also experience vector
    register corruption in this case.
    
    Fix all of these issues, and always validate vector registers on each
    machine check, if the machine has the vector facility installed and the
    extended save area is defined.
    
    Cc: <stable@vger.kernel.org> # 4.1+
    Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
    Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
    cad49cfc
nmi.c 9.4 KB