Skip to content

Commit 4d617aa

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

File tree

2 files changed

+110
-369
lines changed

2 files changed

+110
-369
lines changed

arch/sparc/kernel/ptrace_32.c

Lines changed: 30 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -83,39 +83,25 @@ static int regwindow32_set(struct task_struct *target,
8383

8484
static int genregs32_get(struct task_struct *target,
8585
const struct user_regset *regset,
86-
unsigned int pos, unsigned int count,
87-
void *kbuf, void __user *ubuf)
86+
struct membuf to)
8887
{
8988
const struct pt_regs *regs = target->thread.kregs;
9089
u32 uregs[16];
91-
int ret;
9290

9391
if (target == current)
9492
flush_user_windows();
9593

96-
ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf,
97-
regs->u_regs,
98-
0, 16 * sizeof(u32));
99-
if (ret || !count)
100-
return ret;
101-
94+
membuf_write(&to, regs->u_regs, 16 * sizeof(u32));
95+
if (!to.left)
96+
return 0;
10297
if (regwindow32_get(target, regs, uregs))
10398
return -EFAULT;
104-
ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf,
105-
uregs,
106-
16 * sizeof(u32), 32 * sizeof(u32));
107-
if (ret)
108-
return ret;
109-
110-
uregs[0] = regs->psr;
111-
uregs[1] = regs->pc;
112-
uregs[2] = regs->npc;
113-
uregs[3] = regs->y;
114-
uregs[4] = 0; /* WIM */
115-
uregs[5] = 0; /* TBR */
116-
return user_regset_copyout(&pos, &count, &kbuf, &ubuf,
117-
uregs,
118-
32 * sizeof(u32), 38 * sizeof(u32));
99+
membuf_write(&to, uregs, 16 * sizeof(u32));
100+
membuf_store(&to, regs->psr);
101+
membuf_store(&to, regs->pc);
102+
membuf_store(&to, regs->npc);
103+
membuf_store(&to, regs->y);
104+
return membuf_zero(&to, 2 * sizeof(u32));
119105
}
120106

121107
static int genregs32_set(struct task_struct *target,
@@ -179,46 +165,18 @@ static int genregs32_set(struct task_struct *target,
179165

180166
static int fpregs32_get(struct task_struct *target,
181167
const struct user_regset *regset,
182-
unsigned int pos, unsigned int count,
183-
void *kbuf, void __user *ubuf)
168+
struct membuf to)
184169
{
185-
const unsigned long *fpregs = target->thread.float_regs;
186-
int ret = 0;
187-
188170
#if 0
189171
if (target == current)
190172
save_and_clear_fpu();
191173
#endif
192174

193-
ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf,
194-
fpregs,
195-
0, 32 * sizeof(u32));
196-
197-
if (!ret)
198-
ret = user_regset_copyout_zero(&pos, &count, &kbuf, &ubuf,
199-
32 * sizeof(u32),
200-
33 * sizeof(u32));
201-
if (!ret)
202-
ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf,
203-
&target->thread.fsr,
204-
33 * sizeof(u32),
205-
34 * sizeof(u32));
206-
207-
if (!ret) {
208-
unsigned long val;
209-
210-
val = (1 << 8) | (8 << 16);
211-
ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf,
212-
&val,
213-
34 * sizeof(u32),
214-
35 * sizeof(u32));
215-
}
216-
217-
if (!ret)
218-
ret = user_regset_copyout_zero(&pos, &count, &kbuf, &ubuf,
219-
35 * sizeof(u32), -1);
220-
221-
return ret;
175+
membuf_write(&to, target->thread.float_regs, 32 * sizeof(u32));
176+
membuf_zero(&to, sizeof(u32));
177+
membuf_write(&to, &target->thread.fsr, sizeof(u32));
178+
membuf_store(&to, (u32)((1 << 8) | (8 << 16)));
179+
return membuf_zero(&to, 64 * sizeof(u32));
222180
}
223181

224182
static int fpregs32_set(struct task_struct *target,
@@ -263,7 +221,7 @@ static const struct user_regset sparc32_regsets[] = {
263221
.core_note_type = NT_PRSTATUS,
264222
.n = 38,
265223
.size = sizeof(u32), .align = sizeof(u32),
266-
.get = genregs32_get, .set = genregs32_set
224+
.regset_get = genregs32_get, .set = genregs32_set
267225
},
268226
/* Format is:
269227
* F0 --> F31
@@ -279,35 +237,24 @@ static const struct user_regset sparc32_regsets[] = {
279237
.core_note_type = NT_PRFPREG,
280238
.n = 99,
281239
.size = sizeof(u32), .align = sizeof(u32),
282-
.get = fpregs32_get, .set = fpregs32_set
240+
.regset_get = fpregs32_get, .set = fpregs32_set
283241
},
284242
};
285243

286244
static int getregs_get(struct task_struct *target,
287245
const struct user_regset *regset,
288-
unsigned int pos, unsigned int count,
289-
void *kbuf, void __user *ubuf)
246+
struct membuf to)
290247
{
291248
const struct pt_regs *regs = target->thread.kregs;
292-
u32 v[4];
293-
int ret;
294249

295250
if (target == current)
296251
flush_user_windows();
297252

298-
v[0] = regs->psr;
299-
v[1] = regs->pc;
300-
v[2] = regs->npc;
301-
v[3] = regs->y;
302-
ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf,
303-
v,
304-
0 * sizeof(u32), 4 * sizeof(u32));
305-
if (ret)
306-
return ret;
307-
308-
return user_regset_copyout(&pos, &count, &kbuf, &ubuf,
309-
regs->u_regs + 1,
310-
4 * sizeof(u32), 19 * sizeof(u32));
253+
membuf_store(&to, regs->psr);
254+
membuf_store(&to, regs->pc);
255+
membuf_store(&to, regs->npc);
256+
membuf_store(&to, regs->y);
257+
return membuf_write(&to, regs->u_regs + 1, 15 * sizeof(u32));
311258
}
312259

313260
static int setregs_set(struct task_struct *target,
@@ -339,29 +286,15 @@ static int setregs_set(struct task_struct *target,
339286

340287
static int getfpregs_get(struct task_struct *target,
341288
const struct user_regset *regset,
342-
unsigned int pos, unsigned int count,
343-
void *kbuf, void __user *ubuf)
289+
struct membuf to)
344290
{
345-
const unsigned long *fpregs = target->thread.float_regs;
346-
int ret = 0;
347-
348291
#if 0
349292
if (target == current)
350293
save_and_clear_fpu();
351294
#endif
352-
353-
ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf,
354-
fpregs,
355-
0, 32 * sizeof(u32));
356-
if (ret)
357-
return ret;
358-
ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf,
359-
&target->thread.fsr,
360-
32 * sizeof(u32), 33 * sizeof(u32));
361-
if (ret)
362-
return ret;
363-
return user_regset_copyout_zero(&pos, &count, &kbuf, &ubuf,
364-
33 * sizeof(u32), 68 * sizeof(u32));
295+
membuf_write(&to, &target->thread.float_regs, 32 * sizeof(u32));
296+
membuf_write(&to, &target->thread.fsr, sizeof(u32));
297+
return membuf_zero(&to, 35 * sizeof(u32));
365298
}
366299

367300
static int setfpregs_set(struct task_struct *target,
@@ -390,11 +323,11 @@ static int setfpregs_set(struct task_struct *target,
390323
static const struct user_regset ptrace32_regsets[] = {
391324
[REGSET_GENERAL] = {
392325
.n = 19, .size = sizeof(u32),
393-
.get = getregs_get, .set = setregs_set,
326+
.regset_get = getregs_get, .set = setregs_set,
394327
},
395328
[REGSET_FP] = {
396329
.n = 68, .size = sizeof(u32),
397-
.get = getfpregs_get, .set = setfpregs_set,
330+
.regset_get = getfpregs_get, .set = setfpregs_set,
398331
},
399332
};
400333

0 commit comments

Comments
 (0)