33
44#include "frame_buffer.h"
55
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+
618static Frame * frame_new_std (uint64_t addr , int vcpu_id ) {
719 Frame * frame = g_new (Frame , 1 );
820 frame__init (frame );
@@ -26,6 +38,47 @@ static Frame *frame_new_std(uint64_t addr, int vcpu_id) {
2638 return frame ;
2739}
2840
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+
2982static bool frame_add_operand (Frame * frame , OperandInfo * oi ) {
3083 if (!frame -> std_frame ) {
3184 qemu_plugin_outs (
@@ -61,11 +114,25 @@ bool frame_buffer_is_full(const FrameBuffer *buf) {
61114 return buf -> idx >= buf -> max_size ;
62115}
63116
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+ }
65132
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 ) {
69136 if (frame_buffer_is_full (buf )) {
70137 return false;
71138 }
@@ -96,7 +163,7 @@ bool frame_buffer_new_frame_std(WLOCKED FrameBuffer *buf,
96163 return true;
97164}
98165
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 ,
100167 const GByteArray * content ,
101168 OperandAccess acc ) {
102169 OperandInfo * rinfo =
0 commit comments