sparc: Fix missed restoring of PSR in syscall_lazy_fp_switch

It is needed to restore PSR just before return because condition
codes are dirty after the CMP instructions and this may cause
undefined program behavior after returning from the switching
procedure (on following branch instruction, for example).

Close #3756.
This commit is contained in:
Maksim E. Kozlov
2019-06-05 22:22:36 +03:00
committed by Sebastian Huber
parent 7d7cbf3c51
commit a381870518

View File

@@ -241,12 +241,23 @@ SYM(syscall_lazy_fp_switch):
.Lfp_restore_done:
/*
* Restore condition codes. PSR[EF] is 1 here. Take PSR write delay
* into account (maximum is three instructions).
*/
mov %l0, %psr
nop
/* Now, retry the floating point instruction with PSR[EF] == 1 */
jmp %l1
rett %l2
.Lillegal_use_of_floating_point_unit:
/*
* There is no need to restore the condition codes here, since
* _Internal_error() does not return.
*/
sethi %hi(_Internal_error), %l1
or %l1, %lo(_Internal_error), %l1
mov 38, %i0