@@ -109,8 +109,7 @@ static void shadow_free(void *obj, unsigned long id, klp_shadow_dtor_t dtor)
109
109
static void shadow_free_all (unsigned long id , klp_shadow_dtor_t dtor )
110
110
{
111
111
klp_shadow_free_all (id , dtor );
112
- pr_info ("klp_%s(id=0x%lx, dtor=PTR%d)\n" ,
113
- __func__ , id , ptr_id (dtor ));
112
+ pr_info ("klp_%s(id=0x%lx, dtor=PTR%d)\n" , __func__ , id , ptr_id (dtor ));
114
113
}
115
114
116
115
@@ -124,8 +123,7 @@ static int shadow_ctor(void *obj, void *shadow_data, void *ctor_data)
124
123
return - EINVAL ;
125
124
126
125
* sv = * var ;
127
- pr_info ("%s: PTR%d -> PTR%d\n" ,
128
- __func__ , ptr_id (sv ), ptr_id (* var ));
126
+ pr_info ("%s: PTR%d -> PTR%d\n" , __func__ , ptr_id (sv ), ptr_id (* var ));
129
127
130
128
return 0 ;
131
129
}
@@ -138,125 +136,140 @@ static void shadow_dtor(void *obj, void *shadow_data)
138
136
__func__ , ptr_id (obj ), ptr_id (sv ));
139
137
}
140
138
141
- static int test_klp_shadow_vars_init (void )
142
- {
143
- void * obj = THIS_MODULE ;
144
- int id = 0x1234 ;
145
- gfp_t gfp_flags = GFP_KERNEL ;
139
+ /* dynamically created obj fields have the following shadow var id values */
140
+ #define SV_ID1 0x1234
141
+ #define SV_ID2 0x1235
146
142
147
- int var1 , var2 , var3 , var4 ;
148
- int * pv1 , * pv2 , * pv3 , * pv4 ;
149
- int * * sv1 , * * sv2 , * * sv3 , * * sv4 ;
143
+ /*
144
+ * The main test case adds/removes new fields (shadow var) to each of these
145
+ * test structure instances. The last group of fields in the struct represent
146
+ * the idea that shadow variables may be added and removed to and from the
147
+ * struct during execution.
148
+ */
149
+ struct test_object {
150
+ /* add anything here below and avoid to define an empty struct */
151
+ struct shadow_ptr sp ;
150
152
151
- int * * sv ;
153
+ /* these represent shadow vars added and removed with SV_ID{1,2} */
154
+ /* char nfield1; */
155
+ /* int nfield2; */
156
+ };
152
157
153
- pv1 = & var1 ;
154
- pv2 = & var2 ;
155
- pv3 = & var3 ;
156
- pv4 = & var4 ;
158
+ static int test_klp_shadow_vars_init (void )
159
+ {
160
+ struct test_object obj1 , obj2 , obj3 ;
161
+ char nfield1 , nfield2 , * pnfield1 , * pnfield2 , * * sv1 , * * sv2 ;
162
+ int nfield3 , nfield4 , * pnfield3 , * pnfield4 , * * sv3 , * * sv4 ;
163
+ void * * sv ;
164
+
165
+ pnfield1 = & nfield1 ;
166
+ pnfield2 = & nfield2 ;
167
+ pnfield3 = & nfield3 ;
168
+ pnfield4 = & nfield4 ;
157
169
158
170
ptr_id (NULL );
159
- ptr_id (pv1 );
160
- ptr_id (pv2 );
161
- ptr_id (pv3 );
162
- ptr_id (pv4 );
171
+ ptr_id (pnfield1 );
172
+ ptr_id (pnfield2 );
173
+ ptr_id (pnfield3 );
174
+ ptr_id (pnfield4 );
163
175
164
176
/*
165
177
* With an empty shadow variable hash table, expect not to find
166
178
* any matches.
167
179
*/
168
- sv = shadow_get (obj , id );
180
+ sv = shadow_get (& obj1 , SV_ID1 );
169
181
if (!sv )
170
182
pr_info (" got expected NULL result\n" );
171
183
172
184
/*
173
185
* Allocate a few shadow variables with different <obj> and <id>.
174
186
*/
175
- sv1 = shadow_alloc (obj , id , sizeof (pv1 ), gfp_flags , shadow_ctor , & pv1 );
187
+ sv1 = shadow_alloc (& obj1 , SV_ID1 , sizeof (pnfield1 ), GFP_KERNEL , shadow_ctor , & pnfield1 );
176
188
if (!sv1 )
177
189
return - ENOMEM ;
178
190
179
- sv2 = shadow_alloc (obj + 1 , id , sizeof (pv2 ), gfp_flags , shadow_ctor , & pv2 );
191
+ sv2 = shadow_alloc (& obj2 , SV_ID1 , sizeof (pnfield2 ), GFP_KERNEL , shadow_ctor , & pnfield2 );
180
192
if (!sv2 )
181
193
return - ENOMEM ;
182
194
183
- sv3 = shadow_alloc (obj , id + 1 , sizeof (pv3 ), gfp_flags , shadow_ctor , & pv3 );
195
+ sv3 = shadow_alloc (& obj1 , SV_ID2 , sizeof (pnfield3 ), GFP_KERNEL , shadow_ctor , & pnfield3 );
184
196
if (!sv3 )
185
197
return - ENOMEM ;
186
198
187
199
/*
188
200
* Verify we can find our new shadow variables and that they point
189
201
* to expected data.
190
202
*/
191
- sv = shadow_get (obj , id );
203
+ sv = shadow_get (& obj1 , SV_ID1 );
192
204
if (!sv )
193
205
return - EINVAL ;
194
- if (sv == sv1 && * sv1 == pv1 )
206
+ if (( char * * ) sv == sv1 && * sv1 == pnfield1 )
195
207
pr_info (" got expected PTR%d -> PTR%d result\n" ,
196
208
ptr_id (sv1 ), ptr_id (* sv1 ));
197
209
198
- sv = shadow_get (obj + 1 , id );
210
+ sv = shadow_get (& obj2 , SV_ID1 );
199
211
if (!sv )
200
212
return - EINVAL ;
201
- if (sv == sv2 && * sv2 == pv2 )
213
+ if (( char * * ) sv == sv2 && * sv2 == pnfield2 )
202
214
pr_info (" got expected PTR%d -> PTR%d result\n" ,
203
215
ptr_id (sv2 ), ptr_id (* sv2 ));
204
- sv = shadow_get (obj , id + 1 );
216
+
217
+ sv = shadow_get (& obj1 , SV_ID2 );
205
218
if (!sv )
206
219
return - EINVAL ;
207
- if (sv == sv3 && * sv3 == pv3 )
220
+ if (( int * * ) sv == sv3 && * sv3 == pnfield3 )
208
221
pr_info (" got expected PTR%d -> PTR%d result\n" ,
209
222
ptr_id (sv3 ), ptr_id (* sv3 ));
210
223
211
224
/*
212
225
* Allocate or get a few more, this time with the same <obj>, <id>.
213
226
* The second invocation should return the same shadow var.
214
227
*/
215
- sv4 = shadow_get_or_alloc (obj + 2 , id , sizeof (pv4 ), gfp_flags , shadow_ctor , & pv4 );
228
+ sv4 = shadow_get_or_alloc (& obj3 , SV_ID1 , sizeof (pnfield4 ), GFP_KERNEL , shadow_ctor , & pnfield4 );
216
229
if (!sv4 )
217
230
return - ENOMEM ;
218
231
219
- sv = shadow_get_or_alloc (obj + 2 , id , sizeof (pv4 ), gfp_flags , shadow_ctor , & pv4 );
232
+ sv = shadow_get_or_alloc (& obj3 , SV_ID1 , sizeof (pnfield4 ), GFP_KERNEL , shadow_ctor , & pnfield4 );
220
233
if (!sv )
221
234
return - EINVAL ;
222
- if (sv == sv4 && * sv4 == pv4 )
235
+ if (( int * * ) sv == sv4 && * sv4 == pnfield4 )
223
236
pr_info (" got expected PTR%d -> PTR%d result\n" ,
224
237
ptr_id (sv4 ), ptr_id (* sv4 ));
225
238
226
239
/*
227
240
* Free the <obj=*, id> shadow variables and check that we can no
228
241
* longer find them.
229
242
*/
230
- shadow_free (obj , id , shadow_dtor ); /* sv1 */
231
- sv = shadow_get (obj , id );
243
+ shadow_free (& obj1 , SV_ID1 , shadow_dtor ); /* sv1 */
244
+ sv = shadow_get (& obj1 , SV_ID1 );
232
245
if (!sv )
233
246
pr_info (" got expected NULL result\n" );
234
247
235
- shadow_free (obj + 1 , id , shadow_dtor ); /* sv2 */
236
- sv = shadow_get (obj + 1 , id );
248
+ shadow_free (& obj2 , SV_ID1 , shadow_dtor ); /* sv2 */
249
+ sv = shadow_get (& obj2 , SV_ID1 );
237
250
if (!sv )
238
251
pr_info (" got expected NULL result\n" );
239
252
240
- shadow_free (obj + 2 , id , shadow_dtor ); /* sv4 */
241
- sv = shadow_get (obj + 2 , id );
253
+ shadow_free (& obj3 , SV_ID1 , shadow_dtor ); /* sv4 */
254
+ sv = shadow_get (& obj3 , SV_ID1 );
242
255
if (!sv )
243
256
pr_info (" got expected NULL result\n" );
244
257
245
258
/*
246
259
* We should still find an <id+1> variable.
247
260
*/
248
- sv = shadow_get (obj , id + 1 );
261
+ sv = shadow_get (& obj1 , SV_ID2 );
249
262
if (!sv )
250
263
return - EINVAL ;
251
- if (sv == sv3 && * sv3 == pv3 )
264
+ if (( int * * ) sv == sv3 && * sv3 == pnfield3 )
252
265
pr_info (" got expected PTR%d -> PTR%d result\n" ,
253
266
ptr_id (sv3 ), ptr_id (* sv3 ));
254
267
255
268
/*
256
269
* Free all the <id+1> variables, too.
257
270
*/
258
- shadow_free_all (id + 1 , shadow_dtor ); /* sv3 */
259
- sv = shadow_get (obj , id );
271
+ shadow_free_all (SV_ID2 , shadow_dtor ); /* sv3 */
272
+ sv = shadow_get (& obj1 , SV_ID1 );
260
273
if (!sv )
261
274
pr_info (" shadow_get() got expected NULL result\n" );
262
275
0 commit comments