@@ -127,7 +127,11 @@ char *frame_buffer_as_str(const FrameBuffer *buf) {
127
127
StdFrame * sframe = frame -> std_frame ;
128
128
for (size_t i = 0 ; i < sframe -> operand_pre_list -> n_elem ; i ++ ) {
129
129
OperandInfo * oi = sframe -> operand_pre_list -> elem [i ];
130
- APPEND ("r:%s=" , oi -> operand_info_specific -> reg_operand -> name );
130
+ if (oi -> operand_info_specific -> reg_operand ) {
131
+ APPEND ("r:%s=" , oi -> operand_info_specific -> reg_operand -> name );
132
+ } else {
133
+ APPEND ("m:0x%016lx=" , oi -> operand_info_specific -> mem_operand -> address );
134
+ }
131
135
132
136
for (size_t k = 0 ; k < oi -> value .len ; ++ k ) {
133
137
APPEND ("%02x" , oi -> value .data [k ]);
@@ -137,7 +141,11 @@ char *frame_buffer_as_str(const FrameBuffer *buf) {
137
141
APPEND (" ], post: [ " );
138
142
for (size_t i = 0 ; i < sframe -> operand_post_list -> n_elem ; i ++ ) {
139
143
OperandInfo * oi = sframe -> operand_post_list -> elem [i ];
140
- APPEND ("r:%s=" , oi -> operand_info_specific -> reg_operand -> name );
144
+ if (oi -> operand_info_specific -> reg_operand ) {
145
+ APPEND ("r:%s=" , oi -> operand_info_specific -> reg_operand -> name );
146
+ } else {
147
+ APPEND ("m:0x%016lx=" , oi -> operand_info_specific -> mem_operand -> address );
148
+ }
141
149
142
150
for (size_t k = 0 ; k < oi -> value .len ; ++ k ) {
143
151
APPEND ("%02x" , oi -> value .data [k ]);
@@ -202,12 +210,7 @@ bool frame_buffer_new_frame_std(FrameBuffer *buf, unsigned int thread_id,
202
210
return true;
203
211
}
204
212
205
- bool frame_buffer_append_reg_info (FrameBuffer * buf , const char * name ,
206
- const GByteArray * content , size_t reg_size ,
207
- OperandAccess acc ) {
208
- OperandInfo * oi = frame_init_reg_operand_info (
209
- name , content -> data + content -> len - reg_size , reg_size , acc );
210
- g_assert (oi );
213
+ static bool append_op_info (FrameBuffer * buf , OperandInfo * oi ) {
211
214
Frame * frame = buf -> fbuf [buf -> idx ];
212
215
if (!frame || !frame -> std_frame ) {
213
216
qemu_plugin_outs (
@@ -217,6 +220,15 @@ bool frame_buffer_append_reg_info(FrameBuffer *buf, const char *name,
217
220
return std_frame_add_operand (frame -> std_frame , oi );
218
221
}
219
222
223
+ bool frame_buffer_append_reg_info (FrameBuffer * buf , const char * name ,
224
+ const GByteArray * content , size_t reg_size ,
225
+ OperandAccess acc ) {
226
+ OperandInfo * oi = frame_init_reg_operand_info (
227
+ name , content -> data + content -> len - reg_size , reg_size , acc );
228
+ g_assert (oi );
229
+ return append_op_info (buf , oi );
230
+ }
231
+
220
232
OperandInfo * frame_init_reg_operand_info (const char * name , const uint8_t * value ,
221
233
size_t value_size ,
222
234
OperandAccess access ) {
@@ -243,3 +255,88 @@ OperandInfo *frame_init_reg_operand_info(const char *name, const uint8_t *value,
243
255
244
256
return oi ;
245
257
}
258
+
259
+ static size_t mval_type_to_int (enum qemu_plugin_mem_value_type type ) {
260
+ switch (type ) {
261
+ case QEMU_PLUGIN_MEM_VALUE_U8 :
262
+ return 8 ;
263
+ case QEMU_PLUGIN_MEM_VALUE_U16 :
264
+ return 16 ;
265
+ case QEMU_PLUGIN_MEM_VALUE_U32 :
266
+ return 32 ;
267
+ case QEMU_PLUGIN_MEM_VALUE_U64 :
268
+ return 64 ;
269
+ case QEMU_PLUGIN_MEM_VALUE_U128 :
270
+ return 128 ;
271
+ default :
272
+ g_assert (false);
273
+ }
274
+ }
275
+
276
+ static void mval_to_buf (qemu_plugin_mem_value * val , uint8_t * buf ) {
277
+ switch (val -> type ) {
278
+ case QEMU_PLUGIN_MEM_VALUE_U8 :
279
+ buf [0 ] = val -> data .u8 ;
280
+ return ;
281
+ case QEMU_PLUGIN_MEM_VALUE_U16 :
282
+ buf [0 ] = (uint8_t )val -> data .u16 ;
283
+ buf [1 ] = (uint8_t )(val -> data .u16 >> 8 );
284
+ return ;
285
+ case QEMU_PLUGIN_MEM_VALUE_U32 :
286
+ buf [0 ] = (uint8_t )val -> data .u32 ;
287
+ buf [1 ] = (uint8_t )(val -> data .u32 >> 8 );
288
+ buf [2 ] = (uint8_t )(val -> data .u32 >> 16 );
289
+ buf [3 ] = (uint8_t )(val -> data .u32 >> 24 );
290
+ return ;
291
+ case QEMU_PLUGIN_MEM_VALUE_U64 :
292
+ for (size_t i = 0 ; i < 8 ; ++ i ) {
293
+ buf [i ] = (uint8_t )(val -> data .u64 >> (i * 8 ));
294
+ }
295
+ return ;
296
+ case QEMU_PLUGIN_MEM_VALUE_U128 :
297
+ for (size_t i = 0 ; i < 8 ; ++ i ) {
298
+ buf [i ] = (uint8_t )(val -> data .u128 .low >> (i * 8 ));
299
+ }
300
+ for (size_t i = 0 ; i < 8 ; ++ i ) {
301
+ buf [i + 8 ] = (uint8_t )(val -> data .u128 .high >> (i * 8 ));
302
+ }
303
+ return ;
304
+ default :
305
+ g_assert (false);
306
+ }
307
+ }
308
+
309
+ static OperandInfo * frame_init_mem_operand_info (uint64_t vaddr ,
310
+ qemu_plugin_mem_value * mval ,
311
+ bool is_store ) {
312
+ MemOperand * ro = g_new (MemOperand , 1 );
313
+ mem_operand__init (ro );
314
+ ro -> address = vaddr ;
315
+
316
+ OperandInfoSpecific * ois = g_new (OperandInfoSpecific , 1 );
317
+ operand_info_specific__init (ois );
318
+ ois -> mem_operand = ro ;
319
+
320
+ size_t byte_width = mval_type_to_int (mval -> type ) / 8 ;
321
+ OperandUsage * ou = g_new (OperandUsage , 1 );
322
+ operand_usage__init (ou );
323
+ ou -> read = !is_store ;
324
+ ou -> written = is_store ;
325
+ OperandInfo * oi = g_new (OperandInfo , 1 );
326
+ operand_info__init (oi );
327
+ oi -> bit_length = mval_type_to_int (mval -> type );
328
+ oi -> operand_info_specific = ois ;
329
+ oi -> operand_usage = ou ;
330
+ oi -> value .len = byte_width ;
331
+ oi -> value .data = g_malloc (oi -> value .len );
332
+ mval_to_buf (mval , oi -> value .data );
333
+
334
+ return oi ;
335
+ }
336
+
337
+ bool frame_buffer_append_mem_info (FrameBuffer * fbuf , uint64_t vaddr ,
338
+ qemu_plugin_mem_value * mval , bool is_store ) {
339
+ OperandInfo * oi = frame_init_mem_operand_info (vaddr , mval , is_store );
340
+ g_assert (oi );
341
+ return append_op_info (fbuf , oi );
342
+ }
0 commit comments