diff options
Diffstat (limited to 'arch/s390/lib')
| -rw-r--r-- | arch/s390/lib/test_unwind.c | 5 | ||||
| -rw-r--r-- | arch/s390/lib/uaccess.c | 24 | 
2 files changed, 21 insertions, 8 deletions
| diff --git a/arch/s390/lib/test_unwind.c b/arch/s390/lib/test_unwind.c index cfc5f5557c06..bc7973359ae2 100644 --- a/arch/s390/lib/test_unwind.c +++ b/arch/s390/lib/test_unwind.c @@ -173,10 +173,11 @@ static noinline int unwindme_func4(struct unwindme *u)  		}  		/* -		 * trigger specification exception +		 * Trigger operation exception; use insn notation to bypass +		 * llvm's integrated assembler sanity checks.  		 */  		asm volatile( -			"	mvcl	%%r1,%%r1\n" +			"	.insn	e,0x0000\n"	/* illegal opcode */  			"0:	nopr	%%r7\n"  			EX_TABLE(0b, 0b)  			:); diff --git a/arch/s390/lib/uaccess.c b/arch/s390/lib/uaccess.c index a596e69d3c47..8a5d21461889 100644 --- a/arch/s390/lib/uaccess.c +++ b/arch/s390/lib/uaccess.c @@ -62,10 +62,14 @@ static inline unsigned long copy_from_user_mvcos(void *x, const void __user *ptr  						 unsigned long size)  {  	unsigned long tmp1, tmp2; +	union oac spec = { +		.oac2.as = PSW_BITS_AS_SECONDARY, +		.oac2.a = 1, +	};  	tmp1 = -4096UL;  	asm volatile( -		"   lghi  0,%[spec]\n" +		"   lr	  0,%[spec]\n"  		"0: .insn ss,0xc80000000000,0(%0,%2),0(%1),0\n"  		"6: jz    4f\n"  		"1: algr  %0,%3\n" @@ -84,7 +88,7 @@ static inline unsigned long copy_from_user_mvcos(void *x, const void __user *ptr  		"5:\n"  		EX_TABLE(0b,2b) EX_TABLE(3b,5b) EX_TABLE(6b,2b) EX_TABLE(7b,5b)  		: "+a" (size), "+a" (ptr), "+a" (x), "+a" (tmp1), "=a" (tmp2) -		: [spec] "K" (0x81UL) +		: [spec] "d" (spec.val)  		: "cc", "memory", "0");  	return size;  } @@ -135,10 +139,14 @@ static inline unsigned long copy_to_user_mvcos(void __user *ptr, const void *x,  					       unsigned long size)  {  	unsigned long tmp1, tmp2; +	union oac spec = { +		.oac1.as = PSW_BITS_AS_SECONDARY, +		.oac1.a = 1, +	};  	tmp1 = -4096UL;  	asm volatile( -		"   llilh 0,%[spec]\n" +		"   lr	  0,%[spec]\n"  		"0: .insn ss,0xc80000000000,0(%0,%1),0(%2),0\n"  		"6: jz    4f\n"  		"1: algr  %0,%3\n" @@ -157,7 +165,7 @@ static inline unsigned long copy_to_user_mvcos(void __user *ptr, const void *x,  		"5:\n"  		EX_TABLE(0b,2b) EX_TABLE(3b,5b) EX_TABLE(6b,2b) EX_TABLE(7b,5b)  		: "+a" (size), "+a" (ptr), "+a" (x), "+a" (tmp1), "=a" (tmp2) -		: [spec] "K" (0x81UL) +		: [spec] "d" (spec.val)  		: "cc", "memory", "0");  	return size;  } @@ -207,10 +215,14 @@ EXPORT_SYMBOL(raw_copy_to_user);  static inline unsigned long clear_user_mvcos(void __user *to, unsigned long size)  {  	unsigned long tmp1, tmp2; +	union oac spec = { +		.oac1.as = PSW_BITS_AS_SECONDARY, +		.oac1.a = 1, +	};  	tmp1 = -4096UL;  	asm volatile( -		"   llilh 0,%[spec]\n" +		"   lr	  0,%[spec]\n"  		"0: .insn ss,0xc80000000000,0(%0,%1),0(%4),0\n"  		"   jz	  4f\n"  		"1: algr  %0,%2\n" @@ -228,7 +240,7 @@ static inline unsigned long clear_user_mvcos(void __user *to, unsigned long size  		"5:\n"  		EX_TABLE(0b,2b) EX_TABLE(3b,5b)  		: "+a" (size), "+a" (to), "+a" (tmp1), "=a" (tmp2) -		: "a" (empty_zero_page), [spec] "K" (0x81UL) +		: "a" (empty_zero_page), [spec] "d" (spec.val)  		: "cc", "memory", "0");  	return size;  } |