s390/fpu: always enable the vector facility if it is available
If the kernel detects that the s390 hardware supports the vector facility, it is enabled by default at an early stage. To force it off, use the novx kernel parameter. Note that there is a small time window, where the vector facility is enabled before it is forced to be off. With enabling the vector facility by default, the FPU save and restore functions can be improved. They do not longer require to manage expensive control register updates to enable or disable the vector enablement control for particular processes. Signed-off-by: Hendrik Brueckner <brueckner@linux.vnet.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:

committed by
Martin Schwidefsky

parent
395e6aa1d0
commit
b5510d9b68
@@ -224,29 +224,6 @@ NOKPROBE_SYMBOL(illegal_op);
|
||||
DO_ERROR_INFO(specification_exception, SIGILL, ILL_ILLOPN,
|
||||
"specification exception");
|
||||
|
||||
int alloc_vector_registers(struct task_struct *tsk)
|
||||
{
|
||||
__vector128 *vxrs;
|
||||
freg_t *fprs;
|
||||
|
||||
/* Allocate vector register save area. */
|
||||
vxrs = kzalloc(sizeof(__vector128) * __NUM_VXRS,
|
||||
GFP_KERNEL|__GFP_REPEAT);
|
||||
if (!vxrs)
|
||||
return -ENOMEM;
|
||||
preempt_disable();
|
||||
if (tsk == current)
|
||||
save_fpu_regs();
|
||||
/* Copy the 16 floating point registers */
|
||||
convert_fp_to_vx(vxrs, tsk->thread.fpu.fprs);
|
||||
fprs = tsk->thread.fpu.fprs;
|
||||
tsk->thread.fpu.vxrs = vxrs;
|
||||
tsk->thread.fpu.flags |= FPU_USE_VX;
|
||||
kfree(fprs);
|
||||
preempt_enable();
|
||||
return 0;
|
||||
}
|
||||
|
||||
void vector_exception(struct pt_regs *regs)
|
||||
{
|
||||
int si_code, vic;
|
||||
@@ -281,13 +258,6 @@ void vector_exception(struct pt_regs *regs)
|
||||
do_trap(regs, SIGFPE, si_code, "vector exception");
|
||||
}
|
||||
|
||||
static int __init disable_vector_extension(char *str)
|
||||
{
|
||||
S390_lowcore.machine_flags &= ~MACHINE_FLAG_VX;
|
||||
return 1;
|
||||
}
|
||||
__setup("novx", disable_vector_extension);
|
||||
|
||||
void data_exception(struct pt_regs *regs)
|
||||
{
|
||||
__u16 __user *location;
|
||||
@@ -296,15 +266,6 @@ void data_exception(struct pt_regs *regs)
|
||||
location = get_trap_ip(regs);
|
||||
|
||||
save_fpu_regs();
|
||||
/* Check for vector register enablement */
|
||||
if (MACHINE_HAS_VX && !is_vx_task(current) &&
|
||||
(current->thread.fpu.fpc & FPC_DXC_MASK) == 0xfe00) {
|
||||
alloc_vector_registers(current);
|
||||
/* Vector data exception is suppressing, rewind psw. */
|
||||
regs->psw.addr = __rewind_psw(regs->psw, regs->int_code >> 16);
|
||||
clear_pt_regs_flag(regs, PIF_PER_TRAP);
|
||||
return;
|
||||
}
|
||||
if (current->thread.fpu.fpc & FPC_DXC_MASK)
|
||||
signal = SIGFPE;
|
||||
else
|
||||
|
Reference in New Issue
Block a user