mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-07 14:32:23 +00:00
hexagon: switch to ->regset_get()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
4e5e7ea48e
commit
8320514c91
@ -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, ®s->r00, 32*sizeof(unsigned long));
|
||||||
®s->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(®s->sa0, sa0);
|
membuf_store(&to, regs->sa0);
|
||||||
ONEXT(®s->lc0, lc0);
|
membuf_store(&to, regs->lc0);
|
||||||
ONEXT(®s->sa1, sa1);
|
membuf_store(&to, regs->sa1);
|
||||||
ONEXT(®s->lc1, lc1);
|
membuf_store(&to, regs->lc1);
|
||||||
ONEXT(®s->m0, m0);
|
membuf_store(&to, regs->m0);
|
||||||
ONEXT(®s->m1, m1);
|
membuf_store(&to, regs->m1);
|
||||||
ONEXT(®s->usr, usr);
|
membuf_store(&to, regs->usr);
|
||||||
ONEXT(®s->preds, p3_0);
|
membuf_store(&to, regs->p3_0);
|
||||||
ONEXT(®s->gp, gp);
|
membuf_store(&to, regs->gp);
|
||||||
ONEXT(®s->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(®s->cs0, cs0);
|
membuf_store(&to, regs->cs0);
|
||||||
ONEXT(®s->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[] = {
|
|||||||
.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,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user