Commit a4e4b175 authored by Roland McGrath's avatar Roland McGrath Committed by Paul Mackerras

[POWERPC] Use user_regset accessors for SPE regs

This implements user_regset-style accessors for the powerpc SPE data,
and rewrites the existing ptrace code in terms of those calls.
Signed-off-by: default avatarRoland McGrath <roland@redhat.com>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent 3caf06c6
...@@ -272,55 +272,79 @@ static int set_vrregs(struct task_struct *task, unsigned long __user *data) ...@@ -272,55 +272,79 @@ static int set_vrregs(struct task_struct *task, unsigned long __user *data)
* } * }
*/ */
/* static int evr_active(struct task_struct *target,
* Get contents of SPE register state in task TASK. const struct user_regset *regset)
*/
static int get_evrregs(unsigned long *data, struct task_struct *task)
{ {
int i; flush_spe_to_thread(target);
return target->thread.used_spe ? regset->n : 0;
}
if (!access_ok(VERIFY_WRITE, data, 35 * sizeof(unsigned long))) static int evr_get(struct task_struct *target, const struct user_regset *regset,
return -EFAULT; unsigned int pos, unsigned int count,
void *kbuf, void __user *ubuf)
{
int ret;
/* copy SPEFSCR */ flush_spe_to_thread(target);
if (__put_user(task->thread.spefscr, &data[34]))
return -EFAULT;
/* copy SPE registers EVR[0] .. EVR[31] */ ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf,
for (i = 0; i < 32; i++, data++) &target->thread.evr,
if (__put_user(task->thread.evr[i], data)) 0, sizeof(target->thread.evr));
return -EFAULT;
/* copy ACC */ BUILD_BUG_ON(offsetof(struct thread_struct, acc) + sizeof(u64) !=
if (__put_user64(task->thread.acc, (unsigned long long *)data)) offsetof(struct thread_struct, spefscr));
return -EFAULT;
return 0; if (!ret)
ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf,
&target->thread.acc,
sizeof(target->thread.evr), -1);
return ret;
}
static int evr_set(struct task_struct *target, const struct user_regset *regset,
unsigned int pos, unsigned int count,
const void *kbuf, const void __user *ubuf)
{
int ret;
flush_spe_to_thread(target);
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
&target->thread.evr,
0, sizeof(target->thread.evr));
BUILD_BUG_ON(offsetof(struct thread_struct, acc) + sizeof(u64) !=
offsetof(struct thread_struct, spefscr));
if (!ret)
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
&target->thread.acc,
sizeof(target->thread.evr), -1);
return ret;
} }
/* /*
* Write contents of SPE register state into task TASK. * Get contents of SPE register state in task TASK.
*/ */
static int set_evrregs(struct task_struct *task, unsigned long *data) static int get_evrregs(unsigned long __user *data, struct task_struct *task)
{ {
int i; if (!access_ok(VERIFY_WRITE, data, 35 * sizeof(u32)))
if (!access_ok(VERIFY_READ, data, 35 * sizeof(unsigned long)))
return -EFAULT; return -EFAULT;
/* copy SPEFSCR */ return evr_get(task, NULL, 0, 35 * sizeof(u32), NULL, data);
if (__get_user(task->thread.spefscr, &data[34])) }
return -EFAULT;
/* copy SPE registers EVR[0] .. EVR[31] */ /*
for (i = 0; i < 32; i++, data++) * Write contents of SPE register state into task TASK.
if (__get_user(task->thread.evr[i], data)) */
return -EFAULT; static int set_evrregs(struct task_struct *task, unsigned long *data)
/* copy ACC */ {
if (__get_user64(task->thread.acc, (unsigned long long*)data)) if (!access_ok(VERIFY_READ, data, 35 * sizeof(u32)))
return -EFAULT; return -EFAULT;
return 0; return evr_set(task, NULL, 0, 35 * sizeof(u32), NULL, data);
} }
#endif /* CONFIG_SPE */ #endif /* CONFIG_SPE */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment