3
3
4
4
#include "frame_buffer.h"
5
5
6
+ #define WRITE (x ) \
7
+ do { \
8
+ if (fwrite(&(x), sizeof(x), 1, file) != 1) \
9
+ qemu_plugin_outs("fwrite failed"); \
10
+ } while (0)
11
+
12
+ #define WRITE_BUF (x , n ) \
13
+ do { \
14
+ if (fwrite((x), 1, (n), file) != n) \
15
+ qemu_plugin_outs("fwrite failed"); \
16
+ } while (0)
17
+
6
18
static Frame * frame_new_std (uint64_t addr , int vcpu_id ) {
7
19
Frame * frame = g_new (Frame , 1 );
8
20
frame__init (frame );
@@ -26,6 +38,47 @@ static Frame *frame_new_std(uint64_t addr, int vcpu_id) {
26
38
return frame ;
27
39
}
28
40
41
+ static inline void free_operand (OperandInfo * oi ) {
42
+ OperandInfoSpecific * ois = oi -> operand_info_specific ;
43
+
44
+ //Free reg-operand
45
+ RegOperand * ro = ois -> reg_operand ;
46
+ if (ro && ro -> name )
47
+ g_free (ro -> name );
48
+ g_free (ro );
49
+
50
+ //Free mem-operand
51
+ MemOperand * mo = ois -> mem_operand ;
52
+ g_free (mo );
53
+ g_free (oi -> value .data );
54
+ g_free (oi -> taint_info );
55
+ g_free (ois );
56
+ g_free (oi -> operand_usage );
57
+ g_free (oi );
58
+ }
59
+
60
+ static void frame_free (Frame * frame ) {
61
+ if (!frame ) {
62
+ return ;
63
+ }
64
+ StdFrame * sframe = frame -> std_frame ;
65
+ for (size_t i = 0 ; i < sframe -> operand_pre_list -> n_elem ; i ++ ) {
66
+ free_operand (sframe -> operand_pre_list -> elem [i ]);
67
+ }
68
+ g_free (sframe -> operand_pre_list -> elem );
69
+ g_free (sframe -> operand_pre_list );
70
+
71
+ for (size_t i = 0 ; i < sframe -> operand_post_list -> n_elem ; i ++ ) {
72
+ free_operand (sframe -> operand_post_list -> elem [i ]);
73
+ }
74
+ g_free (sframe -> operand_post_list -> elem );
75
+ g_free (sframe -> operand_post_list );
76
+
77
+ g_free (sframe -> rawbytes .data );
78
+ g_free (sframe );
79
+ g_free (frame );
80
+ }
81
+
29
82
static bool frame_add_operand (Frame * frame , OperandInfo * oi ) {
30
83
if (!frame -> std_frame ) {
31
84
qemu_plugin_outs (
@@ -61,11 +114,25 @@ bool frame_buffer_is_full(const FrameBuffer *buf) {
61
114
return buf -> idx >= buf -> max_size ;
62
115
}
63
116
64
- void frame_buffer_flush_to_file (WLOCKED FrameBuffer * buf , WLOCKED FILE * file );
117
+ void frame_buffer_flush_to_file (FrameBuffer * buf , WLOCKED FILE * file ) {
118
+ for (size_t i = 0 ; i <= buf -> idx && i < buf -> max_size ; ++ i ) {
119
+ Frame * frame = buf -> fbuf [i ];
120
+ size_t msg_size = frame__get_packed_size (frame );
121
+ uint8_t * packed_buffer = g_alloca (msg_size );
122
+ uint64_t packed_size = frame__pack (frame , packed_buffer );
123
+ WRITE (packed_size );
124
+ WRITE_BUF (packed_buffer , packed_size );
125
+ buf -> frames_written ++ ;
126
+ frame_free (frame );
127
+ }
128
+ memset (buf -> fbuf , 0 , sizeof (Frame * ) * buf -> max_size );
129
+ buf -> idx = 0 ;
130
+ // toc_update(); ??
131
+ }
65
132
66
- bool frame_buffer_new_frame_std (WLOCKED FrameBuffer * buf ,
67
- unsigned int thread_id , uint64_t vaddr ,
68
- uint8_t * bytes , size_t bytes_len ) {
133
+ bool frame_buffer_new_frame_std (FrameBuffer * buf , unsigned int thread_id ,
134
+ uint64_t vaddr , uint8_t * bytes ,
135
+ size_t bytes_len ) {
69
136
if (frame_buffer_is_full (buf )) {
70
137
return false;
71
138
}
@@ -96,7 +163,7 @@ bool frame_buffer_new_frame_std(WLOCKED FrameBuffer *buf,
96
163
return true;
97
164
}
98
165
99
- bool frame_buffer_append_reg_info (WLOCKED FrameBuffer * buf , const char * name ,
166
+ bool frame_buffer_append_reg_info (FrameBuffer * buf , const char * name ,
100
167
const GByteArray * content ,
101
168
OperandAccess acc ) {
102
169
OperandInfo * rinfo =
0 commit comments