@@ -44,12 +44,13 @@ GEN_FALSE_TRANS(idle)
44
44
45
45
typedef void (*GenCSRRead)(TCGv dest, TCGv_ptr env);
46
46
typedef void (*GenCSRWrite)(TCGv dest, TCGv_ptr env, TCGv src);
47
+ typedef void (*GenCSRFunc)(void );
47
48
48
49
typedef struct {
49
50
int offset;
50
51
int flags;
51
- GenCSRRead readfn;
52
- GenCSRWrite writefn;
52
+ GenCSRFunc readfn;
53
+ GenCSRFunc writefn;
53
54
} CSRInfo;
54
55
55
56
enum {
@@ -184,8 +185,8 @@ static bool set_csr_trans_func(unsigned int csr_num, GenCSRRead readfn,
184
185
return false ;
185
186
}
186
187
187
- csr->readfn = readfn;
188
- csr->writefn = writefn;
188
+ csr->readfn = (GenCSRFunc) readfn;
189
+ csr->writefn = (GenCSRFunc) writefn;
189
190
return true ;
190
191
}
191
192
@@ -222,6 +223,7 @@ static bool trans_csrrd(DisasContext *ctx, arg_csrrd *a)
222
223
{
223
224
TCGv dest;
224
225
const CSRInfo *csr;
226
+ GenCSRRead readfn;
225
227
226
228
if (check_plv (ctx)) {
227
229
return false ;
@@ -233,8 +235,9 @@ static bool trans_csrrd(DisasContext *ctx, arg_csrrd *a)
233
235
} else {
234
236
check_csr_flags (ctx, csr, false );
235
237
dest = gpr_dst (ctx, a->rd , EXT_NONE);
236
- if (csr->readfn ) {
237
- csr->readfn (dest, tcg_env);
238
+ readfn = (GenCSRRead)csr->readfn ;
239
+ if (readfn) {
240
+ readfn (dest, tcg_env);
238
241
} else {
239
242
tcg_gen_ld_tl (dest, tcg_env, csr->offset );
240
243
}
@@ -247,6 +250,7 @@ static bool trans_csrwr(DisasContext *ctx, arg_csrwr *a)
247
250
{
248
251
TCGv dest, src1;
249
252
const CSRInfo *csr;
253
+ GenCSRWrite writefn;
250
254
251
255
if (check_plv (ctx)) {
252
256
return false ;
@@ -262,9 +266,10 @@ static bool trans_csrwr(DisasContext *ctx, arg_csrwr *a)
262
266
return false ;
263
267
}
264
268
src1 = gpr_src (ctx, a->rd , EXT_NONE);
265
- if (csr->writefn ) {
269
+ writefn = (GenCSRWrite)csr->writefn ;
270
+ if (writefn) {
266
271
dest = gpr_dst (ctx, a->rd , EXT_NONE);
267
- csr-> writefn (dest, tcg_env, src1);
272
+ writefn (dest, tcg_env, src1);
268
273
} else {
269
274
dest = tcg_temp_new ();
270
275
tcg_gen_ld_tl (dest, tcg_env, csr->offset );
@@ -278,6 +283,7 @@ static bool trans_csrxchg(DisasContext *ctx, arg_csrxchg *a)
278
283
{
279
284
TCGv src1, mask, oldv, newv, temp;
280
285
const CSRInfo *csr;
286
+ GenCSRWrite writefn;
281
287
282
288
if (check_plv (ctx)) {
283
289
return false ;
@@ -308,8 +314,9 @@ static bool trans_csrxchg(DisasContext *ctx, arg_csrxchg *a)
308
314
tcg_gen_andc_tl (temp, oldv, mask);
309
315
tcg_gen_or_tl (newv, newv, temp);
310
316
311
- if (csr->writefn ) {
312
- csr->writefn (oldv, tcg_env, newv);
317
+ writefn = (GenCSRWrite)csr->writefn ;
318
+ if (writefn) {
319
+ writefn (oldv, tcg_env, newv);
313
320
} else {
314
321
tcg_gen_st_tl (newv, tcg_env, csr->offset );
315
322
}
0 commit comments