|
|
@@ -655,11 +655,16 @@ static int compat_gpr_get(struct task_struct *target,
|
|
|
reg = task_pt_regs(target)->regs[idx];
|
|
|
}
|
|
|
|
|
|
- ret = copy_to_user(ubuf, ®, sizeof(reg));
|
|
|
- if (ret)
|
|
|
- break;
|
|
|
-
|
|
|
- ubuf += sizeof(reg);
|
|
|
+ if (kbuf) {
|
|
|
+ memcpy(kbuf, ®, sizeof(reg));
|
|
|
+ kbuf += sizeof(reg);
|
|
|
+ } else {
|
|
|
+ ret = copy_to_user(ubuf, ®, sizeof(reg));
|
|
|
+ if (ret)
|
|
|
+ break;
|
|
|
+
|
|
|
+ ubuf += sizeof(reg);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
return ret;
|
|
|
@@ -689,11 +694,16 @@ static int compat_gpr_set(struct task_struct *target,
|
|
|
unsigned int idx = start + i;
|
|
|
compat_ulong_t reg;
|
|
|
|
|
|
- ret = copy_from_user(®, ubuf, sizeof(reg));
|
|
|
- if (ret)
|
|
|
- return ret;
|
|
|
+ if (kbuf) {
|
|
|
+ memcpy(®, kbuf, sizeof(reg));
|
|
|
+ kbuf += sizeof(reg);
|
|
|
+ } else {
|
|
|
+ ret = copy_from_user(®, ubuf, sizeof(reg));
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
|
|
|
- ubuf += sizeof(reg);
|
|
|
+ ubuf += sizeof(reg);
|
|
|
+ }
|
|
|
|
|
|
switch (idx) {
|
|
|
case 15:
|