Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 14 additions & 11 deletions contrib/plugins/bap-tracing/frame_buffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -257,10 +257,10 @@ OperandInfo *frame_init_reg_operand_info(const char *name, const uint8_t *value,
return oi;
}

static OperandInfo *frame_init_mem_operand_info(uint64_t vaddr,
const uint8_t *mval,
size_t mval_bits,
bool is_store) {
static OperandInfo *frame_init_mem_operand_info_take(uint64_t vaddr,
uint8_t *mval,
size_t mval_bits,
bool is_store) {
MemOperand *ro = g_new(MemOperand, 1);
mem_operand__init(ro);
ro->address = vaddr;
Expand All @@ -280,17 +280,20 @@ static OperandInfo *frame_init_mem_operand_info(uint64_t vaddr,
oi->operand_info_specific = ois;
oi->operand_usage = ou;
oi->value.len = byte_width;
oi->value.data = g_malloc(oi->value.len);
memcpy(oi->value.data, mval, oi->value.len);
oi->value.data = mval;

return oi;
}

bool frame_buffer_append_mem_info(FrameBuffer *fbuf, uint64_t vaddr,
const uint8_t *mval, size_t mval_bits,
bool is_store) {
bool frame_buffer_append_mem_info_take(FrameBuffer *fbuf, uint64_t vaddr,
uint8_t *mval, size_t mval_bits,
bool is_store) {
OperandInfo *oi =
frame_init_mem_operand_info(vaddr, mval, mval_bits, is_store);
frame_init_mem_operand_info_take(vaddr, mval, mval_bits, is_store);
g_assert(oi);
return append_op_info(fbuf, oi);
if (!append_op_info(fbuf, oi)) {
free_operand(oi);
return false;
}
return true;
}
11 changes: 8 additions & 3 deletions contrib/plugins/bap-tracing/frame_buffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,14 @@ bool frame_buffer_new_frame_std(FrameBuffer *buf, unsigned int thread_id,
uint64_t vaddr, const char *mode_id,
uint8_t *bytes, size_t bytes_len);

bool frame_buffer_append_mem_info(FrameBuffer *fbuf, uint64_t vaddr,
const uint8_t *mval, size_t mval_bits,
bool is_store);
/**
* \brief Appends a memory operand to the open frame.
*
* Takes ownership of \p mval and frees it even if appending fails.
*/
bool frame_buffer_append_mem_info_take(FrameBuffer *fbuf, uint64_t vaddr,
uint8_t *mval, size_t mval_bits,
bool is_store);

/**
* \brief Appends the given operand info to the open frame.
Expand Down
14 changes: 7 additions & 7 deletions contrib/plugins/bap-tracing/tracing.c
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,8 @@ static void add_mem_op(VCPU *vcpu, unsigned int vcpu_index, FrameBuffer *fbuf,
size_t mval_bits = mval_type_to_int(mval->type);
uint8_t *buf = g_malloc(mval_bits / 8);
mval_to_buf(mval, buf);
if (!frame_buffer_append_mem_info(fbuf, vaddr, buf, mval_bits, is_store)) {
if (!frame_buffer_append_mem_info_take(fbuf, vaddr, buf, mval_bits,
is_store)) {
qemu_plugin_outs("Failed to append memory info\n");
}
return;
Expand Down Expand Up @@ -107,7 +108,7 @@ static void log_insn_mem_access(unsigned int vcpu_index,
static void add_post_reg_state(VCPU *vcpu, unsigned int vcpu_index,
GArray *current_regs, FrameBuffer *fbuf) {

GByteArray *rdata = g_byte_array_new();
g_autoptr(GByteArray) rdata = g_byte_array_new();
for (size_t i = 0; i < current_regs->len; ++i) {
Register *prev_reg = vcpu->registers->pdata[i];

Expand Down Expand Up @@ -135,7 +136,7 @@ static void add_post_reg_state(VCPU *vcpu, unsigned int vcpu_index,

static void add_pre_reg_state(VCPU *vcpu, unsigned int vcpu_index,
GArray *current_regs, FrameBuffer *fbuf) {
GByteArray *rdata = g_byte_array_new();
g_autoptr(GByteArray) rdata = g_byte_array_new();
for (size_t i = 0; i < current_regs->len; ++i) {
qemu_plugin_reg_descriptor *reg =
&g_array_index(current_regs, qemu_plugin_reg_descriptor, i);
Expand All @@ -153,10 +154,9 @@ static void add_pre_reg_state(VCPU *vcpu, unsigned int vcpu_index,
}

static GPtrArray *registers_init(void) {
GArray *reg_list = qemu_plugin_get_registers();
g_autoptr(GArray) reg_list = qemu_plugin_get_registers();

if (reg_list->len == 0) {
g_array_free(reg_list, false);
return NULL;
}
GPtrArray *registers = g_ptr_array_new();
Expand Down Expand Up @@ -202,7 +202,7 @@ static void flush_all_frame_bufs(void) {
FrameBuffer *fbuf = g_ptr_array_index(state.frame_buffer, i);
VCPU *vcpu = g_ptr_array_index(state.vcpus, i);
g_assert(vcpu);
GArray *current_regs = qemu_plugin_get_registers();
g_autoptr(GArray) current_regs = qemu_plugin_get_registers();
g_assert(current_regs->len == vcpu->registers->len);
add_post_reg_state(vcpu, i, current_regs, fbuf);
frame_buffer_close_frame(fbuf);
Expand Down Expand Up @@ -240,7 +240,7 @@ static void log_insn_reg_access(unsigned int vcpu_index, void *udata) {
FrameBuffer *fbuf = g_ptr_array_index(state.frame_buffer, vcpu_index);
VCPU *vcpu = g_ptr_array_index(state.vcpus, vcpu_index);
g_assert(vcpu);
GArray *current_regs = qemu_plugin_get_registers();
g_autoptr(GArray) current_regs = qemu_plugin_get_registers();
g_assert(current_regs->len == vcpu->registers->len);

if (!frame_buffer_is_empty(fbuf)) {
Expand Down
Loading