mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-04-03 12:05:13 +02:00
commitae02615b7fupstream. The fixup section was added again by mistake when test_fp_ctl() was removed. The reason for the removal of the fixup section is described in commit484a8ed8b7("s390/extable: add dedicated uaccess handler"). Remove it again for the same reason. Add an exception handler which handles exceptions when the floating point control register is attempted to be set to invalid values. The exception handler sets the floating point control register to zero and continues execution at the specified address. The new sfpc inline assembly is open-coded to make back porting a bit easier. Fixes:702644249d("s390/fpu: get rid of test_fp_ctl()") Cc: stable@vger.kernel.org Reviewed-by: Alexander Gordeev <agordeev@linux.ibm.com> Signed-off-by: Heiko Carstens <hca@linux.ibm.com> Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
92 lines
3.5 KiB
C
92 lines
3.5 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef __ASM_EXTABLE_H
|
|
#define __ASM_EXTABLE_H
|
|
|
|
#include <linux/stringify.h>
|
|
#include <linux/bits.h>
|
|
#include <asm/asm-const.h>
|
|
|
|
#define EX_TYPE_NONE 0
|
|
#define EX_TYPE_FIXUP 1
|
|
#define EX_TYPE_BPF 2
|
|
#define EX_TYPE_UA_STORE 3
|
|
#define EX_TYPE_UA_LOAD_MEM 4
|
|
#define EX_TYPE_UA_LOAD_REG 5
|
|
#define EX_TYPE_UA_LOAD_REGPAIR 6
|
|
#define EX_TYPE_ZEROPAD 7
|
|
#define EX_TYPE_FPC 8
|
|
|
|
#define EX_DATA_REG_ERR_SHIFT 0
|
|
#define EX_DATA_REG_ERR GENMASK(3, 0)
|
|
|
|
#define EX_DATA_REG_ADDR_SHIFT 4
|
|
#define EX_DATA_REG_ADDR GENMASK(7, 4)
|
|
|
|
#define EX_DATA_LEN_SHIFT 8
|
|
#define EX_DATA_LEN GENMASK(11, 8)
|
|
|
|
#define __EX_TABLE(_section, _fault, _target, _type, _regerr, _regaddr, _len) \
|
|
stringify_in_c(.section _section,"a";) \
|
|
stringify_in_c(.balign 4;) \
|
|
stringify_in_c(.long (_fault) - .;) \
|
|
stringify_in_c(.long (_target) - .;) \
|
|
stringify_in_c(.short (_type);) \
|
|
stringify_in_c(.macro extable_reg regerr, regaddr;) \
|
|
stringify_in_c(.set .Lfound, 0;) \
|
|
stringify_in_c(.set .Lcurr, 0;) \
|
|
stringify_in_c(.irp rs,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15;) \
|
|
stringify_in_c( .ifc "\regerr", "%%r\rs";) \
|
|
stringify_in_c( .set .Lfound, 1;) \
|
|
stringify_in_c( .set .Lregerr, .Lcurr;) \
|
|
stringify_in_c( .endif;) \
|
|
stringify_in_c( .set .Lcurr, .Lcurr+1;) \
|
|
stringify_in_c(.endr;) \
|
|
stringify_in_c(.ifne (.Lfound != 1);) \
|
|
stringify_in_c( .error "extable_reg: bad register argument1";) \
|
|
stringify_in_c(.endif;) \
|
|
stringify_in_c(.set .Lfound, 0;) \
|
|
stringify_in_c(.set .Lcurr, 0;) \
|
|
stringify_in_c(.irp rs,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15;) \
|
|
stringify_in_c( .ifc "\regaddr", "%%r\rs";) \
|
|
stringify_in_c( .set .Lfound, 1;) \
|
|
stringify_in_c( .set .Lregaddr, .Lcurr;) \
|
|
stringify_in_c( .endif;) \
|
|
stringify_in_c( .set .Lcurr, .Lcurr+1;) \
|
|
stringify_in_c(.endr;) \
|
|
stringify_in_c(.ifne (.Lfound != 1);) \
|
|
stringify_in_c( .error "extable_reg: bad register argument2";) \
|
|
stringify_in_c(.endif;) \
|
|
stringify_in_c(.short .Lregerr << EX_DATA_REG_ERR_SHIFT | \
|
|
.Lregaddr << EX_DATA_REG_ADDR_SHIFT | \
|
|
_len << EX_DATA_LEN_SHIFT;) \
|
|
stringify_in_c(.endm;) \
|
|
stringify_in_c(extable_reg _regerr,_regaddr;) \
|
|
stringify_in_c(.purgem extable_reg;) \
|
|
stringify_in_c(.previous)
|
|
|
|
#define EX_TABLE(_fault, _target) \
|
|
__EX_TABLE(__ex_table, _fault, _target, EX_TYPE_FIXUP, __stringify(%%r0), __stringify(%%r0), 0)
|
|
|
|
#define EX_TABLE_AMODE31(_fault, _target) \
|
|
__EX_TABLE(.amode31.ex_table, _fault, _target, EX_TYPE_FIXUP, __stringify(%%r0), __stringify(%%r0), 0)
|
|
|
|
#define EX_TABLE_UA_STORE(_fault, _target, _regerr) \
|
|
__EX_TABLE(__ex_table, _fault, _target, EX_TYPE_UA_STORE, _regerr, _regerr, 0)
|
|
|
|
#define EX_TABLE_UA_LOAD_MEM(_fault, _target, _regerr, _regmem, _len) \
|
|
__EX_TABLE(__ex_table, _fault, _target, EX_TYPE_UA_LOAD_MEM, _regerr, _regmem, _len)
|
|
|
|
#define EX_TABLE_UA_LOAD_REG(_fault, _target, _regerr, _regzero) \
|
|
__EX_TABLE(__ex_table, _fault, _target, EX_TYPE_UA_LOAD_REG, _regerr, _regzero, 0)
|
|
|
|
#define EX_TABLE_UA_LOAD_REGPAIR(_fault, _target, _regerr, _regzero) \
|
|
__EX_TABLE(__ex_table, _fault, _target, EX_TYPE_UA_LOAD_REGPAIR, _regerr, _regzero, 0)
|
|
|
|
#define EX_TABLE_ZEROPAD(_fault, _target, _regdata, _regaddr) \
|
|
__EX_TABLE(__ex_table, _fault, _target, EX_TYPE_ZEROPAD, _regdata, _regaddr, 0)
|
|
|
|
#define EX_TABLE_FPC(_fault, _target) \
|
|
__EX_TABLE(__ex_table, _fault, _target, EX_TYPE_FPC, __stringify(%%r0), __stringify(%%r0), 0)
|
|
|
|
#endif /* __ASM_EXTABLE_H */
|