19
19
*/
20
20
21
21
#include "qemu/plugin.h"
22
- #include "trace/mem.h"
23
22
24
23
#if DATA_SIZE == 16
25
24
# define SUFFIX o
72
71
73
72
ABI_TYPE ATOMIC_NAME (cmpxchg )(CPUArchState * env , target_ulong addr ,
74
73
ABI_TYPE cmpv , ABI_TYPE newv ,
75
- TCGMemOpIdx oi , uintptr_t retaddr )
74
+ MemOpIdx oi , uintptr_t retaddr )
76
75
{
77
76
DATA_TYPE * haddr = atomic_mmu_lookup (env , addr , oi , DATA_SIZE ,
78
77
PAGE_READ | PAGE_WRITE , retaddr );
79
78
DATA_TYPE ret ;
80
- uint16_t info = atomic_trace_rmw_pre (env , addr , oi );
81
79
80
+ atomic_trace_rmw_pre (env , addr , oi );
82
81
#if DATA_SIZE == 16
83
82
ret = atomic16_cmpxchg (haddr , cmpv , newv );
84
83
#else
85
84
ret = qatomic_cmpxchg__nocheck (haddr , cmpv , newv );
86
85
#endif
87
86
ATOMIC_MMU_CLEANUP ;
88
- atomic_trace_rmw_post (env , addr , info );
87
+ atomic_trace_rmw_post (env , addr , oi );
89
88
return ret ;
90
89
}
91
90
92
91
#if DATA_SIZE >= 16
93
92
#if HAVE_ATOMIC128
94
93
ABI_TYPE ATOMIC_NAME (ld )(CPUArchState * env , target_ulong addr ,
95
- TCGMemOpIdx oi , uintptr_t retaddr )
94
+ MemOpIdx oi , uintptr_t retaddr )
96
95
{
97
96
DATA_TYPE * haddr = atomic_mmu_lookup (env , addr , oi , DATA_SIZE ,
98
97
PAGE_READ , retaddr );
99
98
DATA_TYPE val ;
100
- uint16_t info = atomic_trace_ld_pre (env , addr , oi );
101
99
100
+ atomic_trace_ld_pre (env , addr , oi );
102
101
val = atomic16_read (haddr );
103
102
ATOMIC_MMU_CLEANUP ;
104
- atomic_trace_ld_post (env , addr , info );
103
+ atomic_trace_ld_post (env , addr , oi );
105
104
return val ;
106
105
}
107
106
108
107
void ATOMIC_NAME (st )(CPUArchState * env , target_ulong addr , ABI_TYPE val ,
109
- TCGMemOpIdx oi , uintptr_t retaddr )
108
+ MemOpIdx oi , uintptr_t retaddr )
110
109
{
111
110
DATA_TYPE * haddr = atomic_mmu_lookup (env , addr , oi , DATA_SIZE ,
112
111
PAGE_WRITE , retaddr );
113
- uint16_t info = atomic_trace_st_pre (env , addr , oi );
114
112
113
+ atomic_trace_st_pre (env , addr , oi );
115
114
atomic16_set (haddr , val );
116
115
ATOMIC_MMU_CLEANUP ;
117
- atomic_trace_st_post (env , addr , info );
116
+ atomic_trace_st_post (env , addr , oi );
118
117
}
119
118
#endif
120
119
#else
121
120
ABI_TYPE ATOMIC_NAME (xchg )(CPUArchState * env , target_ulong addr , ABI_TYPE val ,
122
- TCGMemOpIdx oi , uintptr_t retaddr )
121
+ MemOpIdx oi , uintptr_t retaddr )
123
122
{
124
123
DATA_TYPE * haddr = atomic_mmu_lookup (env , addr , oi , DATA_SIZE ,
125
124
PAGE_READ | PAGE_WRITE , retaddr );
126
125
DATA_TYPE ret ;
127
- uint16_t info = atomic_trace_rmw_pre (env , addr , oi );
128
126
127
+ atomic_trace_rmw_pre (env , addr , oi );
129
128
ret = qatomic_xchg__nocheck (haddr , val );
130
129
ATOMIC_MMU_CLEANUP ;
131
- atomic_trace_rmw_post (env , addr , info );
130
+ atomic_trace_rmw_post (env , addr , oi );
132
131
return ret ;
133
132
}
134
133
135
134
#define GEN_ATOMIC_HELPER (X ) \
136
135
ABI_TYPE ATOMIC_NAME(X)(CPUArchState *env, target_ulong addr, \
137
- ABI_TYPE val, TCGMemOpIdx oi, uintptr_t retaddr) \
136
+ ABI_TYPE val, MemOpIdx oi, uintptr_t retaddr) \
138
137
{ \
139
138
DATA_TYPE *haddr = atomic_mmu_lookup(env, addr, oi, DATA_SIZE, \
140
139
PAGE_READ | PAGE_WRITE, retaddr); \
141
140
DATA_TYPE ret; \
142
- uint16_t info = atomic_trace_rmw_pre(env, addr, oi); \
141
+ atomic_trace_rmw_pre(env, addr, oi); \
143
142
ret = qatomic_##X(haddr, val); \
144
143
ATOMIC_MMU_CLEANUP; \
145
- atomic_trace_rmw_post(env, addr, info); \
144
+ atomic_trace_rmw_post(env, addr, oi); \
146
145
return ret; \
147
146
}
148
147
@@ -167,20 +166,20 @@ GEN_ATOMIC_HELPER(xor_fetch)
167
166
*/
168
167
#define GEN_ATOMIC_HELPER_FN (X , FN , XDATA_TYPE , RET ) \
169
168
ABI_TYPE ATOMIC_NAME (X )(CPUArchState * env , target_ulong addr , \
170
- ABI_TYPE xval , TCGMemOpIdx oi , uintptr_t retaddr ) \
169
+ ABI_TYPE xval , MemOpIdx oi , uintptr_t retaddr ) \
171
170
{ \
172
171
XDATA_TYPE * haddr = atomic_mmu_lookup (env , addr , oi , DATA_SIZE , \
173
172
PAGE_READ | PAGE_WRITE , retaddr ); \
174
173
XDATA_TYPE cmp , old , new , val = xval ; \
175
- uint16_t info = atomic_trace_rmw_pre (env , addr , oi ); \
174
+ atomic_trace_rmw_pre (env , addr , oi ); \
176
175
smp_mb (); \
177
176
cmp = qatomic_read__nocheck (haddr ); \
178
177
do { \
179
178
old = cmp ; new = FN (old , val ); \
180
179
cmp = qatomic_cmpxchg__nocheck (haddr , old , new ); \
181
180
} while (cmp != old ); \
182
181
ATOMIC_MMU_CLEANUP ; \
183
- atomic_trace_rmw_post (env , addr , info ); \
182
+ atomic_trace_rmw_post (env , addr , oi ); \
184
183
return RET ; \
185
184
}
186
185
@@ -211,78 +210,78 @@ GEN_ATOMIC_HELPER_FN(umax_fetch, MAX, DATA_TYPE, new)
211
210
212
211
ABI_TYPE ATOMIC_NAME (cmpxchg )(CPUArchState * env , target_ulong addr ,
213
212
ABI_TYPE cmpv , ABI_TYPE newv ,
214
- TCGMemOpIdx oi , uintptr_t retaddr )
213
+ MemOpIdx oi , uintptr_t retaddr )
215
214
{
216
215
DATA_TYPE * haddr = atomic_mmu_lookup (env , addr , oi , DATA_SIZE ,
217
216
PAGE_READ | PAGE_WRITE , retaddr );
218
217
DATA_TYPE ret ;
219
- uint16_t info = atomic_trace_rmw_pre (env , addr , oi );
220
218
219
+ atomic_trace_rmw_pre (env , addr , oi );
221
220
#if DATA_SIZE == 16
222
221
ret = atomic16_cmpxchg (haddr , BSWAP (cmpv ), BSWAP (newv ));
223
222
#else
224
223
ret = qatomic_cmpxchg__nocheck (haddr , BSWAP (cmpv ), BSWAP (newv ));
225
224
#endif
226
225
ATOMIC_MMU_CLEANUP ;
227
- atomic_trace_rmw_post (env , addr , info );
226
+ atomic_trace_rmw_post (env , addr , oi );
228
227
return BSWAP (ret );
229
228
}
230
229
231
230
#if DATA_SIZE >= 16
232
231
#if HAVE_ATOMIC128
233
232
ABI_TYPE ATOMIC_NAME (ld )(CPUArchState * env , target_ulong addr ,
234
- TCGMemOpIdx oi , uintptr_t retaddr )
233
+ MemOpIdx oi , uintptr_t retaddr )
235
234
{
236
235
DATA_TYPE * haddr = atomic_mmu_lookup (env , addr , oi , DATA_SIZE ,
237
236
PAGE_READ , retaddr );
238
237
DATA_TYPE val ;
239
- uint16_t info = atomic_trace_ld_pre (env , addr , oi );
240
238
239
+ atomic_trace_ld_pre (env , addr , oi );
241
240
val = atomic16_read (haddr );
242
241
ATOMIC_MMU_CLEANUP ;
243
- atomic_trace_ld_post (env , addr , info );
242
+ atomic_trace_ld_post (env , addr , oi );
244
243
return BSWAP (val );
245
244
}
246
245
247
246
void ATOMIC_NAME (st )(CPUArchState * env , target_ulong addr , ABI_TYPE val ,
248
- TCGMemOpIdx oi , uintptr_t retaddr )
247
+ MemOpIdx oi , uintptr_t retaddr )
249
248
{
250
249
DATA_TYPE * haddr = atomic_mmu_lookup (env , addr , oi , DATA_SIZE ,
251
250
PAGE_WRITE , retaddr );
252
- uint16_t info = atomic_trace_st_pre (env , addr , oi );
253
251
252
+ atomic_trace_st_pre (env , addr , oi );
254
253
val = BSWAP (val );
255
254
atomic16_set (haddr , val );
256
255
ATOMIC_MMU_CLEANUP ;
257
- atomic_trace_st_post (env , addr , info );
256
+ atomic_trace_st_post (env , addr , oi );
258
257
}
259
258
#endif
260
259
#else
261
260
ABI_TYPE ATOMIC_NAME (xchg )(CPUArchState * env , target_ulong addr , ABI_TYPE val ,
262
- TCGMemOpIdx oi , uintptr_t retaddr )
261
+ MemOpIdx oi , uintptr_t retaddr )
263
262
{
264
263
DATA_TYPE * haddr = atomic_mmu_lookup (env , addr , oi , DATA_SIZE ,
265
264
PAGE_READ | PAGE_WRITE , retaddr );
266
265
ABI_TYPE ret ;
267
- uint16_t info = atomic_trace_rmw_pre (env , addr , oi );
268
266
267
+ atomic_trace_rmw_pre (env , addr , oi );
269
268
ret = qatomic_xchg__nocheck (haddr , BSWAP (val ));
270
269
ATOMIC_MMU_CLEANUP ;
271
- atomic_trace_rmw_post (env , addr , info );
270
+ atomic_trace_rmw_post (env , addr , oi );
272
271
return BSWAP (ret );
273
272
}
274
273
275
274
#define GEN_ATOMIC_HELPER (X ) \
276
275
ABI_TYPE ATOMIC_NAME(X)(CPUArchState *env, target_ulong addr, \
277
- ABI_TYPE val, TCGMemOpIdx oi, uintptr_t retaddr) \
276
+ ABI_TYPE val, MemOpIdx oi, uintptr_t retaddr) \
278
277
{ \
279
278
DATA_TYPE *haddr = atomic_mmu_lookup(env, addr, oi, DATA_SIZE, \
280
279
PAGE_READ | PAGE_WRITE, retaddr); \
281
280
DATA_TYPE ret; \
282
- uint16_t info = atomic_trace_rmw_pre(env, addr, oi); \
281
+ atomic_trace_rmw_pre(env, addr, oi); \
283
282
ret = qatomic_##X(haddr, BSWAP(val)); \
284
283
ATOMIC_MMU_CLEANUP; \
285
- atomic_trace_rmw_post(env, addr, info); \
284
+ atomic_trace_rmw_post(env, addr, oi); \
286
285
return BSWAP(ret); \
287
286
}
288
287
@@ -304,20 +303,20 @@ GEN_ATOMIC_HELPER(xor_fetch)
304
303
*/
305
304
#define GEN_ATOMIC_HELPER_FN (X , FN , XDATA_TYPE , RET ) \
306
305
ABI_TYPE ATOMIC_NAME (X )(CPUArchState * env , target_ulong addr , \
307
- ABI_TYPE xval , TCGMemOpIdx oi , uintptr_t retaddr ) \
306
+ ABI_TYPE xval , MemOpIdx oi , uintptr_t retaddr ) \
308
307
{ \
309
308
XDATA_TYPE * haddr = atomic_mmu_lookup (env , addr , oi , DATA_SIZE , \
310
309
PAGE_READ | PAGE_WRITE , retaddr ); \
311
310
XDATA_TYPE ldo , ldn , old , new , val = xval ; \
312
- uint16_t info = atomic_trace_rmw_pre (env , addr , oi ); \
311
+ atomic_trace_rmw_pre (env , addr , oi ); \
313
312
smp_mb (); \
314
313
ldn = qatomic_read__nocheck (haddr ); \
315
314
do { \
316
315
ldo = ldn ; old = BSWAP (ldo ); new = FN (old , val ); \
317
316
ldn = qatomic_cmpxchg__nocheck (haddr , ldo , BSWAP (new )); \
318
317
} while (ldo != ldn ); \
319
318
ATOMIC_MMU_CLEANUP ; \
320
- atomic_trace_rmw_post (env , addr , info ); \
319
+ atomic_trace_rmw_post (env , addr , oi ); \
321
320
return RET ; \
322
321
}
323
322
0 commit comments