Skip to content

Commit ff88570

Browse files
committed
Implement frame buffer flush
1 parent 451c231 commit ff88570

File tree

3 files changed

+76
-10
lines changed

3 files changed

+76
-10
lines changed

contrib/plugins/bap-tracing/frame_buffer.c

Lines changed: 72 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,18 @@
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+
618
static 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+
2982
static 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 =

contrib/plugins/bap-tracing/frame_buffer.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ typedef struct {
2525
Frame **fbuf; ///< The frames buffered.
2626
size_t idx; ///< Points to currently open frame.
2727
size_t max_size; ///< Maximum number of elements fbuf can hold.
28+
size_t frames_written; ///< Number of frames written from buffer to file.
2829
} FrameBuffer;
2930

3031
/**
@@ -33,17 +34,17 @@ typedef struct {
3334
*/
3435
FrameBuffer *frame_buffer_new(size_t size);
3536

36-
void frame_buffer_flush_to_file(WLOCKED FrameBuffer *buf, WLOCKED FILE *file);
37+
void frame_buffer_flush_to_file(FrameBuffer *buf, WLOCKED FILE *file);
3738
bool frame_buffer_is_full(const FrameBuffer *buf);
3839

39-
bool frame_buffer_new_frame_std(WLOCKED FrameBuffer *buf,
40+
bool frame_buffer_new_frame_std(FrameBuffer *buf,
4041
unsigned int thread_id, uint64_t vaddr,
4142
uint8_t *bytes, size_t bytes_len);
4243

4344
/**
4445
* \brief Appends the given operand info to the open frame.
4546
*/
46-
bool frame_buffer_append_reg_info(WLOCKED FrameBuffer *buf, const char *name,
47+
bool frame_buffer_append_reg_info(FrameBuffer *buf, const char *name,
4748
const GByteArray *content,
4849
OperandAccess acc);
4950

contrib/plugins/bap-tracing/tracing.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,6 @@ static void log_insn_reg_access(unsigned int vcpu_index, void *udata) {
7575

7676
g_rw_lock_reader_unlock(&state.frame_buffer_lock);
7777
g_rw_lock_reader_unlock(&state.vcpus_array_lock);
78-
79-
return;
8078
}
8179

8280
Register *init_vcpu_register(qemu_plugin_reg_descriptor *desc) {

0 commit comments

Comments
 (0)