s390: fix save and restore of the floating-point-control register
The FPC_VALID_MASK has been used to check the validity of the value to be loaded into the floating-point-control register. With the introduction of the floating-point extension facility and the decimal-floating-point additional bits have been defined which need to be checked in a non straight forward way. So far these bits have been ignored which can cause an incorrect results for decimal- floating-point operations, e.g. an incorrect rounding mode to be set after signal return. The static check with the FPC_VALID_MASK is replaced with a trial load of the floating-point-control value, see test_fp_ctl. In addition an information leak with the padding word between the floating-point-control word and the floating-point registers in the s390_fp_regs is fixed. Reported-by: Heiko Carstens <heiko.carstens@de.ibm.com> Reviewed-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
@@ -199,6 +199,7 @@ typedef union
|
||||
typedef struct
|
||||
{
|
||||
__u32 fpc;
|
||||
__u32 pad;
|
||||
freg_t fprs[NUM_FPRS];
|
||||
} s390_fp_regs;
|
||||
|
||||
@@ -206,7 +207,6 @@ typedef struct
|
||||
#define FPC_FLAGS_MASK 0x00F80000
|
||||
#define FPC_DXC_MASK 0x0000FF00
|
||||
#define FPC_RM_MASK 0x00000003
|
||||
#define FPC_VALID_MASK 0xF8F8FF03
|
||||
|
||||
/* this typedef defines how a Program Status Word looks like */
|
||||
typedef struct
|
||||
|
@@ -49,6 +49,7 @@ typedef struct
|
||||
typedef struct
|
||||
{
|
||||
unsigned int fpc;
|
||||
unsigned int pad;
|
||||
double fprs[__NUM_FPRS];
|
||||
} _s390_fp_regs;
|
||||
|
||||
|
Reference in New Issue
Block a user