Skip to content

Commit 8320514

Browse files
author
Al Viro
committed
hexagon: switch to ->regset_get()
Signed-off-by: Al Viro <[email protected]>
1 parent 4e5e7ea commit 8320514

File tree

1 file changed

+21
-41
lines changed

1 file changed

+21
-41
lines changed

arch/hexagon/kernel/ptrace.c

Lines changed: 21 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -35,58 +35,38 @@ void user_disable_single_step(struct task_struct *child)
3535

3636
static int genregs_get(struct task_struct *target,
3737
const struct user_regset *regset,
38-
unsigned int pos, unsigned int count,
39-
void *kbuf, void __user *ubuf)
38+
srtuct membuf to)
4039
{
41-
int ret;
42-
unsigned int dummy;
4340
struct pt_regs *regs = task_pt_regs(target);
4441

45-
46-
if (!regs)
47-
return -EIO;
48-
4942
/* The general idea here is that the copyout must happen in
5043
* exactly the same order in which the userspace expects these
5144
* regs. Now, the sequence in userspace does not match the
5245
* sequence in the kernel, so everything past the 32 gprs
5346
* happens one at a time.
5447
*/
55-
ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf,
56-
&regs->r00, 0, 32*sizeof(unsigned long));
57-
58-
#define ONEXT(KPT_REG, USR_REG) \
59-
if (!ret) \
60-
ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf, \
61-
KPT_REG, offsetof(struct user_regs_struct, USR_REG), \
62-
offsetof(struct user_regs_struct, USR_REG) + \
63-
sizeof(unsigned long));
64-
48+
membuf_write(&to, &regs->r00, 32*sizeof(unsigned long));
6549
/* Must be exactly same sequence as struct user_regs_struct */
66-
ONEXT(&regs->sa0, sa0);
67-
ONEXT(&regs->lc0, lc0);
68-
ONEXT(&regs->sa1, sa1);
69-
ONEXT(&regs->lc1, lc1);
70-
ONEXT(&regs->m0, m0);
71-
ONEXT(&regs->m1, m1);
72-
ONEXT(&regs->usr, usr);
73-
ONEXT(&regs->preds, p3_0);
74-
ONEXT(&regs->gp, gp);
75-
ONEXT(&regs->ugp, ugp);
76-
ONEXT(&pt_elr(regs), pc);
77-
dummy = pt_cause(regs);
78-
ONEXT(&dummy, cause);
79-
ONEXT(&pt_badva(regs), badva);
50+
membuf_store(&to, regs->sa0);
51+
membuf_store(&to, regs->lc0);
52+
membuf_store(&to, regs->sa1);
53+
membuf_store(&to, regs->lc1);
54+
membuf_store(&to, regs->m0);
55+
membuf_store(&to, regs->m1);
56+
membuf_store(&to, regs->usr);
57+
membuf_store(&to, regs->p3_0);
58+
membuf_store(&to, regs->gp);
59+
membuf_store(&to, regs->ugp);
60+
membuf_store(&to, pt_elr(regs)); // pc
61+
membuf_store(&to, (unsigned long)pt_cause(regs)); // cause
62+
membuf_store(&to, pt_badva(regs)); // badva
8063
#if CONFIG_HEXAGON_ARCH_VERSION >=4
81-
ONEXT(&regs->cs0, cs0);
82-
ONEXT(&regs->cs1, cs1);
64+
membuf_store(&to, regs->cs0);
65+
membuf_store(&to, regs->cs1);
66+
return membuf_zero(&to, sizeof(unsigned long));
67+
#else
68+
return membuf_zero(&to, 3 * sizeof(unsigned long));
8369
#endif
84-
85-
/* Pad the rest with zeros, if needed */
86-
if (!ret)
87-
ret = user_regset_copyout_zero(&pos, &count, &kbuf, &ubuf,
88-
offsetof(struct user_regs_struct, pad1), -1);
89-
return ret;
9070
}
9171

9272
static int genregs_set(struct task_struct *target,
@@ -159,7 +139,7 @@ static const struct user_regset hexagon_regsets[] = {
159139
.n = ELF_NGREG,
160140
.size = sizeof(unsigned long),
161141
.align = sizeof(unsigned long),
162-
.get = genregs_get,
142+
.regset_get = genregs_get,
163143
.set = genregs_set,
164144
},
165145
};

0 commit comments

Comments
 (0)