@@ -35,58 +35,38 @@ void user_disable_single_step(struct task_struct *child)
35
35
36
36
static int genregs_get (struct task_struct * target ,
37
37
const struct user_regset * regset ,
38
- unsigned int pos , unsigned int count ,
39
- void * kbuf , void __user * ubuf )
38
+ srtuct membuf to )
40
39
{
41
- int ret ;
42
- unsigned int dummy ;
43
40
struct pt_regs * regs = task_pt_regs (target );
44
41
45
-
46
- if (!regs )
47
- return - EIO ;
48
-
49
42
/* The general idea here is that the copyout must happen in
50
43
* exactly the same order in which the userspace expects these
51
44
* regs. Now, the sequence in userspace does not match the
52
45
* sequence in the kernel, so everything past the 32 gprs
53
46
* happens one at a time.
54
47
*/
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 ));
65
49
/* 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
80
63
#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 ));
83
69
#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 ;
90
70
}
91
71
92
72
static int genregs_set (struct task_struct * target ,
@@ -159,7 +139,7 @@ static const struct user_regset hexagon_regsets[] = {
159
139
.n = ELF_NGREG ,
160
140
.size = sizeof (unsigned long ),
161
141
.align = sizeof (unsigned long ),
162
- .get = genregs_get ,
142
+ .regset_get = genregs_get ,
163
143
.set = genregs_set ,
164
144
},
165
145
};
0 commit comments