• Martin Schwidefsky's avatar
    s390/fpu: improve kernel_fpu_[begin|end] · 7f79695c
    Martin Schwidefsky authored
    In case of nested user of the FPU or vector registers in the kernel
    the current code uses the mask of the FPU/vector registers of the
    previous contexts to decide which registers to save and restore.
    E.g. if the previous context used KERNEL_VXR_V0V7 and the next
    context wants to use KERNEL_VXR_V24V31 the first 8 vector registers
    are stored to the FPU state structure. But this is not necessary
    as the next context does not use these registers.
    Rework the FPU/vector register save and restore code. The new code
    does a few things differently:
    1) A lowcore field is used instead of a per-cpu variable.
    2) The kernel_fpu_end function now has two parameters just like
       kernel_fpu_begin. The register flags are required by both
       functions to save / restore the minimal register set.
    3) The inline functions kernel_fpu_begin/kernel_fpu_end now do the
       update of the register masks. If the user space FPU registers
       have already been stored neither save_fpu_regs nor the
       __kernel_fpu_begin/__kernel_fpu_end functions have to be called
       for the first context. In this case kernel_fpu_begin adds 7
       instructions and kernel_fpu_end adds 4 instructions.
    3) The inline assemblies in __kernel_fpu_begin / __kernel_fpu_end
       to save / restore the vector registers are simplified a bit.
    Signed-off-by: 's avatarMartin Schwidefsky <schwidefsky@de.ibm.com>