Skip to content

Commit 8323fc7

Browse files
committed
Move and implement frame buffer functionality
1 parent 8b0ae27 commit 8323fc7

File tree

6 files changed

+117
-88
lines changed

6 files changed

+117
-88
lines changed

contrib/plugins/bap-tracing/frame.c

Lines changed: 0 additions & 42 deletions
This file was deleted.
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
// SPDX-FileCopyrightText: 2025 Rot127 <[email protected]>
2+
// SPDX-License-Identifier: GPL-2.0-only
3+
4+
#include "frame_buffer.h"
5+
6+
static Frame *frame_new_std(uint64_t addr, int vcpu_id) {
7+
Frame *frame = g_new(Frame, 1);
8+
frame__init(frame);
9+
10+
StdFrame *sframe = g_new(StdFrame, 1);
11+
std_frame__init(sframe);
12+
frame->std_frame = sframe;
13+
14+
sframe->address = addr;
15+
sframe->thread_id = vcpu_id;
16+
17+
OperandValueList *ol_in = g_new(OperandValueList, 1);
18+
operand_value_list__init(ol_in);
19+
ol_in->n_elem = 0;
20+
sframe->operand_pre_list = ol_in;
21+
22+
OperandValueList *ol_out = g_new(OperandValueList, 1);
23+
operand_value_list__init(ol_out);
24+
ol_out->n_elem = 0;
25+
sframe->operand_post_list = ol_out;
26+
return frame;
27+
}
28+
29+
static void frame_add_operand(Frame *frame, OperandInfo *oi) {
30+
OperandValueList *ol;
31+
if (oi->operand_usage->written) {
32+
ol = frame->std_frame->operand_post_list;
33+
} else {
34+
ol = frame->std_frame->operand_pre_list;
35+
}
36+
37+
oi->taint_info = g_new(TaintInfo, 1);
38+
taint_info__init(oi->taint_info);
39+
oi->taint_info->no_taint = 1;
40+
oi->taint_info->has_no_taint = 1;
41+
42+
ol->n_elem += 1;
43+
ol->elem = g_renew(OperandInfo *, ol->elem, ol->n_elem);
44+
ol->elem[ol->n_elem - 1] = oi;
45+
}
46+
47+
FrameBuffer *frame_buffer_new(size_t size) {
48+
FrameBuffer *fb = g_malloc0(sizeof(FrameBuffer));
49+
fb->fbuf = g_malloc0(sizeof(Frame *) * size);
50+
fb->max_size = size;
51+
return fb;
52+
}
53+
54+
bool frame_buffer_is_full(const FrameBuffer *buf) {
55+
return buf->idx >= buf->max_size;
56+
}
57+
58+
void frame_buffer_flush_to_file(FrameBuffer *buf, FILE *file);
59+
60+
StdFrame *frame_buffer_new_frame_std(FrameBuffer *buf) {
61+
if (frame_buffer_is_full(buf)) {
62+
return NULL;
63+
}
64+
Frame *frame = frame_new_std(0, -1);
65+
frame__init(frame);
66+
67+
StdFrame *sframe = g_new(StdFrame, 1);
68+
std_frame__init(sframe);
69+
frame->std_frame = sframe;
70+
buf->fbuf[buf->idx++] = frame;
71+
return sframe;
72+
}
73+
74+
void frame_buffer_append_op_info(FrameBuffer *buf, OperandInfo *oi);
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// SPDX-FileCopyrightText: 2025 Rot127 <[email protected]>
2+
// SPDX-License-Identifier: GPL-2.0-only
3+
4+
#ifndef BAP_FRAME_BUFFER_H
5+
#define BAP_FRAME_BUFFER_H
6+
7+
#include <qemu-plugin.h>
8+
#include <stdio.h>
9+
#include <glib.h>
10+
11+
#include "frame.piqi.pb-c-patched.h"
12+
13+
typedef struct {
14+
Frame **fbuf; ///< The frames buffered.
15+
size_t idx; ///< Points to currently open frame.
16+
size_t max_size; ///< Maximum number of elements fbuf can hold.
17+
} FrameBuffer;
18+
19+
/**
20+
* \brief Initializes a frame buffer with space for \p size frames.
21+
* Returns the buffer or NULL in case of failure.
22+
*/
23+
FrameBuffer *frame_buffer_new(size_t size);
24+
25+
void frame_buffer_flush_to_file(FrameBuffer *buf, FILE *file);
26+
bool frame_buffer_is_full(const FrameBuffer *buf);
27+
28+
StdFrame *frame_buffer_new_frame_std(FrameBuffer *buf);
29+
void frame_buffer_append_op_info(FrameBuffer *buf, OperandInfo *oi);
30+
31+
#endif

contrib/plugins/bap-tracing/meson.build

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ dep_libprotobuf = declare_dependency(
3434
)
3535

3636
bap_tracing_src = files(
37+
'frame_buffer.c',
3738
'tracing.c',
3839
'tracewrap.c',
3940
)

contrib/plugins/bap-tracing/tracing.c

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -49,28 +49,23 @@ static void add_pre_reg_state(VCPU *vcpu, unsigned int vcpu_index,
4949

5050
static void add_new_insn_frame(VCPU *vcpu, unsigned int vcpu_index,
5151
FrameBuffer *fbuf, Instruction *insn) {
52-
Frame *frame = frame_buffer_new_frame(fbuf);
53-
frame__init(frame);
52+
StdFrame *stdframe = frame_buffer_new_frame_std(fbuf);
5453

55-
StdFrame *sframe = g_new(StdFrame, 1);
56-
std_frame__init(sframe);
57-
frame->std_frame = sframe;
58-
59-
sframe->thread_id = vcpu_index;
60-
sframe->address = insn->vaddr;
61-
sframe->rawbytes.len = insn->size;
62-
sframe->rawbytes.data = g_malloc(insn->size);
63-
memcpy(sframe->rawbytes.data, insn->bytes, insn->size);
54+
stdframe->thread_id = vcpu_index;
55+
stdframe->address = insn->vaddr;
56+
stdframe->rawbytes.len = insn->size;
57+
stdframe->rawbytes.data = g_malloc(insn->size);
58+
memcpy(stdframe->rawbytes.data, insn->bytes, insn->size);
6459

6560
OperandValueList *ol_in = g_new(OperandValueList, 1);
6661
operand_value_list__init(ol_in);
6762
ol_in->n_elem = 0;
68-
sframe->operand_pre_list = ol_in;
63+
stdframe->operand_pre_list = ol_in;
6964

7065
OperandValueList *ol_out = g_new(OperandValueList, 1);
7166
operand_value_list__init(ol_out);
7267
ol_out->n_elem = 0;
73-
sframe->operand_post_list = ol_out;
68+
stdframe->operand_post_list = ol_out;
7469
}
7570

7671
static void log_insn_reg_access(unsigned int vcpu_index, void *udata) {
@@ -140,7 +135,7 @@ static void vcpu_init(qemu_plugin_id_t id, unsigned int vcpu_index) {
140135
VCPU *vcpu = g_malloc0(sizeof(VCPU));
141136
vcpu->registers = registers_init(vcpu_index);
142137
g_array_insert_vals(state.vcpus, vcpu_index, &vcpu, 1);
143-
FrameBuffer *vcpu_frame_buffer = frame_buffer_init(FRAME_BUFFER_SIZE_DEFAULT);
138+
FrameBuffer *vcpu_frame_buffer = frame_buffer_new(FRAME_BUFFER_SIZE_DEFAULT);
144139
g_ptr_array_insert(state.frame_buffer, vcpu_index, &vcpu_frame_buffer);
145140

146141
g_rw_lock_writer_unlock(&state.frame_buffer_lock);

contrib/plugins/bap-tracing/tracing.h

Lines changed: 2 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66

77
#include <qemu-plugin.h>
88
#include <stdio.h>
9+
#include <glib.h>
910

1011
#include "frame.piqi.pb-c-patched.h"
11-
#include "glib.h"
1212
#include "tracewrap.h"
13+
#include "frame_buffer.h"
1314

1415
QEMU_PLUGIN_EXPORT int qemu_plugin_version = QEMU_PLUGIN_VERSION;
1516

@@ -25,11 +26,6 @@ typedef enum {
2526
*/
2627
#define MAX_INSTRUCTION_SIZE 64
2728

28-
typedef struct {
29-
Frame **fbuf;
30-
size_t len;
31-
} FrameBuffer;
32-
3329
typedef struct {
3430
uint8_t bytes[MAX_INSTRUCTION_SIZE]; ///< Instruction bytes.
3531
size_t size; ///< Len of instruction in bytes.
@@ -58,32 +54,6 @@ typedef struct {
5854
} TraceState;
5955

6056
VCPU *vcpu_new(void);
61-
62-
/**
63-
* \brief Initializes a frame buffer with space for \p size frames.
64-
* Returns the buffer or NULL in case of failure.
65-
*/
66-
FrameBuffer *frame_buffer_init(size_t size);
67-
68-
/**
69-
* \brief Push a frame into the buffer.
70-
* Returns true on success. False otherwise.
71-
*/
72-
bool frame_buffer_push(FrameBuffer *buf, Frame *frame);
73-
74-
void frame_buffer_flush_to_file(FrameBuffer *buf, FILE *file);
75-
bool frame_buffer_is_full(const FrameBuffer *buf);
76-
77-
Frame *frame_buffer_new_frame(FrameBuffer *buf);
78-
void frame_buffer_append_op_info(FrameBuffer *buf, OperandInfo *oi);
79-
80-
/**
81-
* \brief Create new std frame
82-
*/
83-
Frame *frame_new_std(uint64_t addr, int vcpu_id);
84-
85-
void frame_add_operand(Frame *frame, OperandInfo *oi);
86-
8757
Register *init_vcpu_register(qemu_plugin_reg_descriptor *desc);
8858
Instruction *init_insn(struct qemu_plugin_insn *insn);
8959

0 commit comments

Comments
 (0)