forked from Imagelibrary/rtems
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:
committed by
Sebastian Huber
parent
7d7cbf3c51
commit
a381870518
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user