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 7bb15fcca75e..e1335dc2b1b7 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) | |||
| 61 | return copied < 0 ? -EFAULT : 0; | 61 | return copied < 0 ? -EFAULT : 0; |
| 62 | } | 62 | } |
| 63 | 63 | ||
| 64 | /* | 64 | static int __memcpy_real(void *dest, void *src, size_t count) |
| 65 | * Copy memory in real mode (kernel to kernel) | ||
| 66 | */ | ||
| 67 | int memcpy_real(void *dest, void *src, size_t count) | ||
| 68 | { | 65 | { |
| 69 | register unsigned long _dest asm("2") = (unsigned long) dest; | 66 | register unsigned long _dest asm("2") = (unsigned long) dest; |
| 70 | register unsigned long _len1 asm("3") = (unsigned long) count; | 67 | register unsigned long _len1 asm("3") = (unsigned long) count; |
| 71 | register unsigned long _src asm("4") = (unsigned long) src; | 68 | register unsigned long _src asm("4") = (unsigned long) src; |
| 72 | register unsigned long _len2 asm("5") = (unsigned long) count; | 69 | register unsigned long _len2 asm("5") = (unsigned long) count; |
| 73 | unsigned long flags; | ||
| 74 | int rc = -EFAULT; | 70 | int rc = -EFAULT; |
| 75 | 71 | ||
| 76 | if (!count) | ||
| 77 | return 0; | ||
| 78 | flags = __arch_local_irq_stnsm(0xf8UL); | ||
| 79 | asm volatile ( | 72 | asm volatile ( |
| 80 | "0: mvcle %1,%2,0x0\n" | 73 | "0: mvcle %1,%2,0x0\n" |
| 81 | "1: jo 0b\n" | 74 | "1: jo 0b\n" |
| @@ -86,7 +79,23 @@ int memcpy_real(void *dest, void *src, size_t count) | |||
| 86 | "+d" (_len2), "=m" (*((long *) dest)) | 79 | "+d" (_len2), "=m" (*((long *) dest)) |
| 87 | : "m" (*((long *) src)) | 80 | : "m" (*((long *) src)) |
| 88 | : "cc", "memory"); | 81 | : "cc", "memory"); |
| 89 | arch_local_irq_restore(flags); | 82 | return rc; |
| 83 | } | ||
| 84 | |||
| 85 | /* | ||
| 86 | * Copy memory in real mode (kernel to kernel) | ||
| 87 | */ | ||
| 88 | int memcpy_real(void *dest, void *src, size_t count) | ||
| 89 | { | ||
| 90 | unsigned long flags; | ||
| 91 | int rc; | ||
| 92 | |||
| 93 | if (!count) | ||
| 94 | return 0; | ||
| 95 | local_irq_save(flags); | ||
| 96 | __arch_local_irq_stnsm(0xfbUL); | ||
| 97 | rc = __memcpy_real(dest, src, count); | ||
| 98 | local_irq_restore(flags); | ||
| 90 | return rc; | 99 | return rc; |
| 91 | } | 100 | } |
| 92 | 101 | ||
