Skip to content

Commit 615f9bc

Browse files
committed
MOre implementation of frame functions.
1 parent 8323fc7 commit 615f9bc

File tree

4 files changed

+104
-69
lines changed

4 files changed

+104
-69
lines changed

contrib/plugins/bap-tracing/frame_buffer.c

Lines changed: 68 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,12 @@ static Frame *frame_new_std(uint64_t addr, int vcpu_id) {
2626
return frame;
2727
}
2828

29-
static void frame_add_operand(Frame *frame, OperandInfo *oi) {
29+
static bool frame_add_operand(Frame *frame, OperandInfo *oi) {
30+
if (!frame->std_frame) {
31+
qemu_plugin_outs(
32+
"Append operand info to non-std frames is not implemented.");
33+
return false;
34+
}
3035
OperandValueList *ol;
3136
if (oi->operand_usage->written) {
3237
ol = frame->std_frame->operand_post_list;
@@ -42,6 +47,7 @@ static void frame_add_operand(Frame *frame, OperandInfo *oi) {
4247
ol->n_elem += 1;
4348
ol->elem = g_renew(OperandInfo *, ol->elem, ol->n_elem);
4449
ol->elem[ol->n_elem - 1] = oi;
50+
return true;
4551
}
4652

4753
FrameBuffer *frame_buffer_new(size_t size) {
@@ -55,20 +61,73 @@ bool frame_buffer_is_full(const FrameBuffer *buf) {
5561
return buf->idx >= buf->max_size;
5662
}
5763

58-
void frame_buffer_flush_to_file(FrameBuffer *buf, FILE *file);
64+
void frame_buffer_flush_to_file(WLOCKED FrameBuffer *buf, WLOCKED FILE *file);
5965

60-
StdFrame *frame_buffer_new_frame_std(FrameBuffer *buf) {
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) {
6169
if (frame_buffer_is_full(buf)) {
62-
return NULL;
70+
return false;
6371
}
6472
Frame *frame = frame_new_std(0, -1);
6573
frame__init(frame);
6674

67-
StdFrame *sframe = g_new(StdFrame, 1);
68-
std_frame__init(sframe);
69-
frame->std_frame = sframe;
75+
StdFrame *stdframe = g_new(StdFrame, 1);
76+
std_frame__init(stdframe);
77+
frame->std_frame = stdframe;
78+
79+
stdframe->thread_id = thread_id;
80+
stdframe->address = vaddr;
81+
stdframe->rawbytes.len = bytes_len;
82+
stdframe->rawbytes.data = g_malloc(bytes_len);
83+
memcpy(stdframe->rawbytes.data, bytes, bytes_len);
84+
85+
OperandValueList *ol_in = g_new(OperandValueList, 1);
86+
operand_value_list__init(ol_in);
87+
ol_in->n_elem = 0;
88+
stdframe->operand_pre_list = ol_in;
89+
90+
OperandValueList *ol_out = g_new(OperandValueList, 1);
91+
operand_value_list__init(ol_out);
92+
ol_out->n_elem = 0;
93+
stdframe->operand_post_list = ol_out;
94+
7095
buf->fbuf[buf->idx++] = frame;
71-
return sframe;
96+
return true;
97+
}
98+
99+
bool frame_buffer_append_op_info(WLOCKED FrameBuffer *buf, OperandInfo *oi) {
100+
Frame *frame = buf->fbuf[buf->idx];
101+
if (!frame) {
102+
qemu_plugin_outs(
103+
"Attempt to append operand info to a uninitialzied frame.");
104+
return false;
105+
}
106+
return frame_add_operand(frame, oi);
72107
}
73108

74-
void frame_buffer_append_op_info(FrameBuffer *buf, OperandInfo *oi);
109+
OperandInfo *frame_init_reg_operand_info(const char *name, const uint8_t *value,
110+
size_t value_size, OperandAccess access) {
111+
RegOperand *ro = g_new(RegOperand, 1);
112+
reg_operand__init(ro);
113+
ro->name = strdup(name);
114+
115+
OperandInfoSpecific *ois = g_new(OperandInfoSpecific, 1);
116+
operand_info_specific__init(ois);
117+
ois->reg_operand = ro;
118+
119+
OperandUsage *ou = g_new(OperandUsage, 1);
120+
operand_usage__init(ou);
121+
ou->read = access & OperandRead;
122+
ou->written = access & OperandWritten;
123+
OperandInfo *oi = g_new(OperandInfo, 1);
124+
operand_info__init(oi);
125+
oi->bit_length = value_size * 8;
126+
oi->operand_info_specific = ois;
127+
oi->operand_usage = ou;
128+
oi->value.len = value_size;
129+
oi->value.data = g_malloc(oi->value.len);
130+
memcpy(oi->value.data, value, value_size);
131+
132+
return oi;
133+
}

contrib/plugins/bap-tracing/frame_buffer.h

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,26 @@
44
#ifndef BAP_FRAME_BUFFER_H
55
#define BAP_FRAME_BUFFER_H
66

7+
#include <glib.h>
78
#include <qemu-plugin.h>
89
#include <stdio.h>
9-
#include <glib.h>
1010

1111
#include "frame.piqi.pb-c-patched.h"
1212

13+
/**
14+
* \brief Empty macros indicate the argument, variable etc.
15+
* must be locked for writing.
16+
*/
17+
#define WLOCKED
18+
19+
typedef enum {
20+
OperandRead = 1,
21+
OperandWritten = 2,
22+
} OperandAccess;
23+
1324
typedef struct {
14-
Frame **fbuf; ///< The frames buffered.
15-
size_t idx; ///< Points to currently open frame.
25+
Frame **fbuf; ///< The frames buffered.
26+
size_t idx; ///< Points to currently open frame.
1627
size_t max_size; ///< Maximum number of elements fbuf can hold.
1728
} FrameBuffer;
1829

@@ -22,10 +33,20 @@ typedef struct {
2233
*/
2334
FrameBuffer *frame_buffer_new(size_t size);
2435

25-
void frame_buffer_flush_to_file(FrameBuffer *buf, FILE *file);
36+
void frame_buffer_flush_to_file(WLOCKED FrameBuffer *buf, WLOCKED FILE *file);
2637
bool frame_buffer_is_full(const FrameBuffer *buf);
2738

28-
StdFrame *frame_buffer_new_frame_std(FrameBuffer *buf);
29-
void frame_buffer_append_op_info(FrameBuffer *buf, OperandInfo *oi);
39+
bool frame_buffer_new_frame_std(WLOCKED FrameBuffer *buf,
40+
unsigned int thread_id, uint64_t vaddr,
41+
uint8_t *bytes, size_t bytes_len);
42+
43+
/**
44+
* \brief Appends the given operand info to the open frame.
45+
*/
46+
bool frame_buffer_append_op_info(WLOCKED FrameBuffer *buf, OperandInfo *oi);
47+
48+
OperandInfo *frame_init_reg_operand_info(const char *name, const uint8_t *value,
49+
size_t value_size,
50+
OperandAccess access);
3051

3152
#endif

contrib/plugins/bap-tracing/tracing.c

Lines changed: 9 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#include <glib.h>
55

6+
#include "frame_buffer.h"
67
#include "tracing.h"
78

89
static TraceState state;
@@ -26,10 +27,13 @@ static void add_post_reg_state(VCPU *vcpu, unsigned int vcpu_index,
2627
continue;
2728
}
2829

29-
OperandInfo *rinfo = init_reg_operand_info(prev_reg->name, rtmp->data,
30+
OperandInfo *rinfo = frame_init_reg_operand_info(prev_reg->name, rtmp->data,
3031
rtmp->len, OperandWritten);
3132
g_assert(rinfo);
32-
frame_buffer_append_op_info(fbuf, rinfo);
33+
if (!frame_buffer_append_op_info(fbuf, rinfo)) {
34+
qemu_plugin_outs("Failed to append opinfo.\n");
35+
g_assert(false);
36+
}
3337
}
3438
}
3539

@@ -41,31 +45,16 @@ static void add_pre_reg_state(VCPU *vcpu, unsigned int vcpu_index,
4145
&g_array_index(current_regs, qemu_plugin_reg_descriptor, i);
4246
qemu_plugin_read_register(reg->handle, rtmp);
4347
OperandInfo *rinfo =
44-
init_reg_operand_info(reg->name, rtmp->data, rtmp->len, OperandRead);
48+
frame_init_reg_operand_info(reg->name, rtmp->data, rtmp->len, OperandRead);
4549
g_assert(rinfo);
4650
frame_buffer_append_op_info(fbuf, rinfo);
4751
}
4852
}
4953

5054
static void add_new_insn_frame(VCPU *vcpu, unsigned int vcpu_index,
5155
FrameBuffer *fbuf, Instruction *insn) {
52-
StdFrame *stdframe = frame_buffer_new_frame_std(fbuf);
53-
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);
59-
60-
OperandValueList *ol_in = g_new(OperandValueList, 1);
61-
operand_value_list__init(ol_in);
62-
ol_in->n_elem = 0;
63-
stdframe->operand_pre_list = ol_in;
64-
65-
OperandValueList *ol_out = g_new(OperandValueList, 1);
66-
operand_value_list__init(ol_out);
67-
ol_out->n_elem = 0;
68-
stdframe->operand_post_list = ol_out;
56+
frame_buffer_new_frame_std(fbuf, vcpu_index, insn->vaddr, insn->bytes,
57+
insn->size);
6958
}
7059

7160
static void log_insn_reg_access(unsigned int vcpu_index, void *udata) {
@@ -142,32 +131,6 @@ static void vcpu_init(qemu_plugin_id_t id, unsigned int vcpu_index) {
142131
g_rw_lock_writer_unlock(&state.vcpus_array_lock);
143132
}
144133

145-
OperandInfo *init_reg_operand_info(const char *name, const uint8_t *value,
146-
size_t value_size, OperandAccess access) {
147-
RegOperand *ro = g_new(RegOperand, 1);
148-
reg_operand__init(ro);
149-
ro->name = strdup(name);
150-
151-
OperandInfoSpecific *ois = g_new(OperandInfoSpecific, 1);
152-
operand_info_specific__init(ois);
153-
ois->reg_operand = ro;
154-
155-
OperandUsage *ou = g_new(OperandUsage, 1);
156-
operand_usage__init(ou);
157-
ou->read = access & OperandRead;
158-
ou->written = access & OperandWritten;
159-
OperandInfo *oi = g_new(OperandInfo, 1);
160-
operand_info__init(oi);
161-
oi->bit_length = value_size * 8;
162-
oi->operand_info_specific = ois;
163-
oi->operand_usage = ou;
164-
oi->value.len = value_size;
165-
oi->value.data = g_malloc(oi->value.len);
166-
memcpy(oi->value.data, value, value_size);
167-
168-
return oi;
169-
}
170-
171134
Instruction *init_insn(struct qemu_plugin_insn *tb_insn) {
172135
Instruction *insn = g_malloc0(sizeof(Instruction));
173136
qemu_plugin_insn_data(tb_insn, &insn->bytes, sizeof(insn->bytes));

contrib/plugins/bap-tracing/tracing.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,6 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_version = QEMU_PLUGIN_VERSION;
1616

1717
#define FRAME_BUFFER_SIZE_DEFAULT 1024
1818

19-
typedef enum {
20-
OperandRead = 1,
21-
OperandWritten = 2,
22-
} OperandAccess;
23-
2419
/**
2520
* \brief VLIW architecture have instructions longer than 4 or 8bytes.
2621
*/
@@ -57,7 +52,4 @@ VCPU *vcpu_new(void);
5752
Register *init_vcpu_register(qemu_plugin_reg_descriptor *desc);
5853
Instruction *init_insn(struct qemu_plugin_insn *insn);
5954

60-
OperandInfo *init_reg_operand_info(const char *name, const uint8_t *value,
61-
size_t value_size, OperandAccess access);
62-
6355
#endif

0 commit comments

Comments
 (0)