9 #include <linux/errno.h>
11 #include <asm/uaccess.h>
12 #include <asm/futex.h>
29 static size_t copy_from_user_mvcos(
size_t size,
const void __user *
ptr,
void *
x)
31 register unsigned long reg0 asm(
"0") = 0x81UL;
32 unsigned long tmp1, tmp2;
36 "0: .insn ss,0xc80000000000,0(%0,%2),0(%1),0\n"
47 "3: .insn ss,0xc80000000000,0(%4,%2),0(%1),0\n"
54 "5: xc 0(256,%2),0(%2)\n"
63 :
"+a" (
size),
"+a" (ptr),
"+a" (
x),
"+a" (tmp1),
"=a" (tmp2)
64 :
"d" (
reg0) :
"cc",
"memory");
68 static size_t copy_from_user_mvcos_check(
size_t size,
const void __user *
ptr,
void *
x)
72 return copy_from_user_mvcos(size, ptr, x);
75 static size_t copy_to_user_mvcos(
size_t size,
void __user *ptr,
const void *x)
77 register unsigned long reg0 asm(
"0") = 0x810000UL;
78 unsigned long tmp1, tmp2;
82 "0: .insn ss,0xc80000000000,0(%0,%1),0(%2),0\n"
93 "3: .insn ss,0xc80000000000,0(%4,%1),0(%2),0\n"
99 : "+
a" (size), "+
a" (ptr), "+
a" (x), "+
a" (tmp1), "=
a" (tmp2)
104 static
size_t copy_to_user_mvcos_check(
size_t size,
void __user *ptr,
109 return copy_to_user_mvcos(size, ptr, x);
112 static size_t copy_in_user_mvcos(
size_t size,
void __user *to,
113 const void __user *
from)
115 register unsigned long reg0 asm(
"0") = 0x810081UL;
116 unsigned long tmp1, tmp2;
121 "0: .insn ss,0xc80000000000,0(%0,%1),0(%2),0\n"
130 :
"+a" (size),
"+a" (to),
"+a" (from),
"+a" (tmp1),
"=a" (tmp2)
131 :
"d" (
reg0) :
"cc",
"memory");
135 static size_t clear_user_mvcos(
size_t size,
void __user *to)
137 register unsigned long reg0 asm(
"0") = 0x810000UL;
138 unsigned long tmp1, tmp2;
142 "0: .insn ss,0xc80000000000,0(%0,%1),0(%4),0\n"
147 "2: la %3,4095(%1)\n"
152 "3: .insn ss,0xc80000000000,0(%3,%1),0(%4),0\n"
158 : "+
a" (size), "+
a" (to), "+
a" (tmp1), "=
a" (tmp2)
163 static
size_t strnlen_user_mvcos(
size_t count,
const char __user *
src)
171 len =
min(count - done, (
size_t) 256);
172 rc =
uaccess.copy_from_user(len, src + done, buf);
178 }
while ((len_str == len) && (done < count));
182 static size_t strncpy_from_user_mvcos(
size_t count,
const char __user *src,
186 size_t done, len, len_str;
190 len =
min(count - done, (
size_t) 4096);
191 rc =
uaccess.copy_from_user(len, src + done, dst);
197 }
while ((len_str == len) && (done < count));
202 .copy_from_user = copy_from_user_mvcos_check,
204 .copy_to_user = copy_to_user_mvcos_check,
206 .copy_in_user = copy_in_user_mvcos,
207 .clear_user = clear_user_mvcos,
215 .copy_from_user = copy_from_user_mvcos,
216 .copy_from_user_small = copy_from_user_mvcos,
217 .copy_to_user = copy_to_user_mvcos,
218 .copy_to_user_small = copy_to_user_mvcos,
219 .copy_in_user = copy_in_user_mvcos,
220 .clear_user = clear_user_mvcos,
221 .strnlen_user = strnlen_user_mvcos,
222 .strncpy_from_user = strncpy_from_user_mvcos,