• Michael Neuling's avatar
    powerpc: Disable VSX or current process in giveup_fpu/altivec · 7e875e9d
    Michael Neuling authored
    When we call giveup_fpu, we need to need to turn off VSX for the
    current process.  If we don't, on return to userspace it may execute a
    VSX instruction before the next FP instruction, and not have its
    register state refreshed correctly from the thread_struct.  Ditto for
    altivec.
    
    This caused a bug where an unaligned lfs or stfs results in
    fix_alignment calling giveup_fpu so it can use the FPRs (in order to
    do a single <-> double conversion), and then returning to userspace
    with FP off but VSX on.  Then if a VSX instruction is executed, before
    another FP instruction, it will proceed without another exception and
    hence have the incorrect register state for VSX registers 0-31.
    
       lfs unaligned   <- alignment exception turns FP off but leaves VSX on
    
       VSX instruction <- no exception since VSX on, hence we get the
                          wrong VSX register values for VSX registers 0-31,
                          which overlap the FPRs.
    Signed-off-by: default avatarMichael Neuling <mikey@neuling.org>
    Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
    7e875e9d
misc_64.S 15.3 KB