diff options
Diffstat (limited to 'arch/s390/mm/maccess.c')
| -rw-r--r-- | arch/s390/mm/maccess.c | 27 | 
1 files changed, 18 insertions, 9 deletions
diff --git a/arch/s390/mm/maccess.c b/arch/s390/mm/maccess.c index 7bb15fcca75..e1335dc2b1b 100644 --- a/arch/s390/mm/maccess.c +++ b/arch/s390/mm/maccess.c @@ -61,21 +61,14 @@ long probe_kernel_write(void *dst, const void *src, size_t size)  	return copied < 0 ? -EFAULT : 0;  } -/* - * Copy memory in real mode (kernel to kernel) - */ -int memcpy_real(void *dest, void *src, size_t count) +static int __memcpy_real(void *dest, void *src, size_t count)  {  	register unsigned long _dest asm("2") = (unsigned long) dest;  	register unsigned long _len1 asm("3") = (unsigned long) count;  	register unsigned long _src  asm("4") = (unsigned long) src;  	register unsigned long _len2 asm("5") = (unsigned long) count; -	unsigned long flags;  	int rc = -EFAULT; -	if (!count) -		return 0; -	flags = __arch_local_irq_stnsm(0xf8UL);  	asm volatile (  		"0:	mvcle	%1,%2,0x0\n"  		"1:	jo	0b\n" @@ -86,7 +79,23 @@ int memcpy_real(void *dest, void *src, size_t count)  		  "+d" (_len2), "=m" (*((long *) dest))  		: "m" (*((long *) src))  		: "cc", "memory"); -	arch_local_irq_restore(flags); +	return rc; +} + +/* + * Copy memory in real mode (kernel to kernel) + */ +int memcpy_real(void *dest, void *src, size_t count) +{ +	unsigned long flags; +	int rc; + +	if (!count) +		return 0; +	local_irq_save(flags); +	__arch_local_irq_stnsm(0xfbUL); +	rc = __memcpy_real(dest, src, count); +	local_irq_restore(flags);  	return rc;  }  |