@@ -12,10 +12,14 @@ static void log_insn_mem_access(unsigned int vcpu_index,
12
12
void * userdata ) {}
13
13
14
14
static void log_insn_reg_access (unsigned int vcpu_index , void * udata ) {
15
+ Instruction * insn = udata ;
15
16
g_rw_lock_reader_lock (& state .vcpus_array_lock );
16
- // VCPU *c = &g_array_index(state.vcpus, VCPU, vcpu_index);
17
-
18
17
g_rw_lock_writer_lock (& state .frame_buffer_lock );
18
+
19
+ VCPU * vcpu = & g_array_index (state .vcpus , VCPU , vcpu_index );
20
+ GArray * current_regs = qemu_plugin_get_registers ();
21
+ g_assert (current_regs -> len == vcpu -> registers -> len );
22
+
19
23
// Add change to previous frame
20
24
// Finish previous frame
21
25
// Check if buffer should be dumped to file.
@@ -26,20 +30,19 @@ static void log_insn_reg_access(unsigned int vcpu_index, void *udata) {
26
30
return ;
27
31
}
28
32
29
- static Register * init_vcpu_register (qemu_plugin_reg_descriptor * desc )
30
- {
31
- Register * reg = g_new0 (Register , 1 );
32
- g_autofree gchar * lower = g_utf8_strdown (desc -> name , -1 );
33
- int r ;
33
+ Register * init_vcpu_register (qemu_plugin_reg_descriptor * desc ) {
34
+ Register * reg = g_new0 (Register , 1 );
35
+ g_autofree gchar * lower = g_utf8_strdown (desc -> name , -1 );
36
+ int r ;
34
37
35
- reg -> handle = desc -> handle ;
36
- reg -> name = g_intern_string (lower );
37
- reg -> content = g_byte_array_new ();
38
+ reg -> handle = desc -> handle ;
39
+ reg -> name = g_intern_string (lower );
40
+ reg -> content = g_byte_array_new ();
38
41
39
- /* read the initial value */
40
- r = qemu_plugin_read_register (reg -> handle , reg -> content );
41
- g_assert (r > 0 );
42
- return reg ;
42
+ /* read the initial value */
43
+ r = qemu_plugin_read_register (reg -> handle , reg -> content );
44
+ g_assert (r > 0 );
45
+ return reg ;
43
46
}
44
47
45
48
static GPtrArray * registers_init (int vcpu_index ) {
@@ -61,7 +64,7 @@ static GPtrArray *registers_init(int vcpu_index) {
61
64
62
65
static void vcpu_init (qemu_plugin_id_t id , unsigned int vcpu_index ) {
63
66
g_rw_lock_writer_lock (& state .vcpus_array_lock );
64
- VCPU * vcpu = calloc (sizeof (VCPU ), 1 );
67
+ VCPU * vcpu = g_malloc0 (sizeof (VCPU ));
65
68
vcpu -> registers = registers_init (vcpu_index );
66
69
g_array_insert_vals (state .vcpus , vcpu_index , & vcpu , 1 );
67
70
g_rw_lock_writer_unlock (& state .vcpus_array_lock );
@@ -71,15 +74,24 @@ static void plugin_exit(qemu_plugin_id_t id, void *udata) {
71
74
// Dump rest of frames to file.
72
75
}
73
76
77
+ Instruction * init_insn (struct qemu_plugin_insn * tb_insn ) {
78
+ Instruction * insn = g_malloc0 (sizeof (Instruction ));
79
+ qemu_plugin_insn_data (tb_insn , & insn -> bytes , sizeof (insn -> bytes ));
80
+ insn -> size = qemu_plugin_insn_size (tb_insn );
81
+ insn -> vaddr = qemu_plugin_insn_vaddr (tb_insn );
82
+ return insn ;
83
+ }
84
+
74
85
static void cb_trans (qemu_plugin_id_t id , struct qemu_plugin_tb * tb ) {
75
86
// Add a callback for each instruction in every translated block.
76
- struct qemu_plugin_insn * insn ;
87
+ struct qemu_plugin_insn * tb_insn ;
77
88
size_t n_insns = qemu_plugin_tb_n_insns (tb );
78
89
for (size_t i = 0 ; i < n_insns ; i ++ ) {
79
- insn = qemu_plugin_tb_get_insn (tb , i );
80
- qemu_plugin_register_vcpu_insn_exec_cb (insn , log_insn_reg_access ,
81
- QEMU_PLUGIN_CB_R_REGS , NULL );
82
- qemu_plugin_register_vcpu_mem_cb (insn , log_insn_mem_access ,
90
+ tb_insn = qemu_plugin_tb_get_insn (tb , i );
91
+ Instruction * insn_data = init_insn (tb_insn );
92
+ qemu_plugin_register_vcpu_insn_exec_cb (tb_insn , log_insn_reg_access ,
93
+ QEMU_PLUGIN_CB_R_REGS , insn_data );
94
+ qemu_plugin_register_vcpu_mem_cb (tb_insn , log_insn_mem_access ,
83
95
QEMU_PLUGIN_CB_R_REGS , QEMU_PLUGIN_MEM_R ,
84
96
NULL );
85
97
}
0 commit comments