Commit 8320514c authored by Al Viro's avatar Al Viro

hexagon: switch to ->regset_get()

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 4e5e7ea4
...@@ -35,58 +35,38 @@ void user_disable_single_step(struct task_struct *child) ...@@ -35,58 +35,38 @@ void user_disable_single_step(struct task_struct *child)
static int genregs_get(struct task_struct *target, static int genregs_get(struct task_struct *target,
const struct user_regset *regset, const struct user_regset *regset,
unsigned int pos, unsigned int count, srtuct membuf to)
void *kbuf, void __user *ubuf)
{ {
int ret;
unsigned int dummy;
struct pt_regs *regs = task_pt_regs(target); struct pt_regs *regs = task_pt_regs(target);
if (!regs)
return -EIO;
/* The general idea here is that the copyout must happen in /* The general idea here is that the copyout must happen in
* exactly the same order in which the userspace expects these * exactly the same order in which the userspace expects these
* regs. Now, the sequence in userspace does not match the * regs. Now, the sequence in userspace does not match the
* sequence in the kernel, so everything past the 32 gprs * sequence in the kernel, so everything past the 32 gprs
* happens one at a time. * happens one at a time.
*/ */
ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf, membuf_write(&to, &regs->r00, 32*sizeof(unsigned long));
&regs->r00, 0, 32*sizeof(unsigned long));
#define ONEXT(KPT_REG, USR_REG) \
if (!ret) \
ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf, \
KPT_REG, offsetof(struct user_regs_struct, USR_REG), \
offsetof(struct user_regs_struct, USR_REG) + \
sizeof(unsigned long));
/* Must be exactly same sequence as struct user_regs_struct */ /* Must be exactly same sequence as struct user_regs_struct */
ONEXT(&regs->sa0, sa0); membuf_store(&to, regs->sa0);
ONEXT(&regs->lc0, lc0); membuf_store(&to, regs->lc0);
ONEXT(&regs->sa1, sa1); membuf_store(&to, regs->sa1);
ONEXT(&regs->lc1, lc1); membuf_store(&to, regs->lc1);
ONEXT(&regs->m0, m0); membuf_store(&to, regs->m0);
ONEXT(&regs->m1, m1); membuf_store(&to, regs->m1);
ONEXT(&regs->usr, usr); membuf_store(&to, regs->usr);
ONEXT(&regs->preds, p3_0); membuf_store(&to, regs->p3_0);
ONEXT(&regs->gp, gp); membuf_store(&to, regs->gp);
ONEXT(&regs->ugp, ugp); membuf_store(&to, regs->ugp);
ONEXT(&pt_elr(regs), pc); membuf_store(&to, pt_elr(regs)); // pc
dummy = pt_cause(regs); membuf_store(&to, (unsigned long)pt_cause(regs)); // cause
ONEXT(&dummy, cause); membuf_store(&to, pt_badva(regs)); // badva
ONEXT(&pt_badva(regs), badva);
#if CONFIG_HEXAGON_ARCH_VERSION >=4 #if CONFIG_HEXAGON_ARCH_VERSION >=4
ONEXT(&regs->cs0, cs0); membuf_store(&to, regs->cs0);
ONEXT(&regs->cs1, cs1); membuf_store(&to, regs->cs1);
return membuf_zero(&to, sizeof(unsigned long));
#else
return membuf_zero(&to, 3 * sizeof(unsigned long));
#endif #endif
/* Pad the rest with zeros, if needed */
if (!ret)
ret = user_regset_copyout_zero(&pos, &count, &kbuf, &ubuf,
offsetof(struct user_regs_struct, pad1), -1);
return ret;
} }
static int genregs_set(struct task_struct *target, static int genregs_set(struct task_struct *target,
...@@ -159,7 +139,7 @@ static const struct user_regset hexagon_regsets[] = { ...@@ -159,7 +139,7 @@ static const struct user_regset hexagon_regsets[] = {
.n = ELF_NGREG, .n = ELF_NGREG,
.size = sizeof(unsigned long), .size = sizeof(unsigned long),
.align = sizeof(unsigned long), .align = sizeof(unsigned long),
.get = genregs_get, .regset_get = genregs_get,
.set = genregs_set, .set = genregs_set,
}, },
}; };
......
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