// check if the exit count has expired
if ((telemetry->exit_cnt % telemetry->vm_telem->granularity) == 0) {
-- v3_print_telemetry(info->vm_info);
++ v3_print_global_telemetry(info->vm_info);
++ v3_print_core_telemetry(info);
}
}
}
--void v3_print_telemetry(struct v3_vm_info * vm) {
++void v3_print_core_telemetry(struct guest_info * core ) {
++ struct exit_event * evt = NULL;
++ struct rb_node * node = v3_rb_first(&(core->core_telem.exit_root));
++
++ V3_Print("Exit information for Core %d\n", core->vcpu_id);
++
++ if (!node) {
++ V3_Print("No information yet for this core\n");
++ return;
++ }
++
++ do {
++ evt = rb_entry(node, struct exit_event, tree_node);
++ const char * code_str = vmexit_code_to_str(evt->exit_code);
++
++ V3_Print("%s:%sCnt=%u,%sAvg. Time=%u\n",
++ code_str,
++ (strlen(code_str) > 13) ? "\t" : "\t\t",
++ evt->cnt,
++ (evt->cnt >= 100) ? "\t" : "\t\t",
++ (uint32_t)(evt->handler_time / evt->cnt));
++ } while ((node = v3_rb_next(node)));
++ return;
++}
++
++void v3_print_global_telemetry(struct v3_vm_info * vm) {
struct v3_telemetry_state * telemetry = &(vm->telemetry);
uint64_t invoke_tsc = 0;
char hdr_buf[32];
-- int i;
rdtscll(invoke_tsc);
V3_Print("%stelemetry window tsc cnt: %d\n", hdr_buf, (uint32_t)(invoke_tsc - telemetry->prev_tsc));
--
-- // Exit Telemetry
-- for (i = 0; i < vm->num_cores; i++) {
-- struct guest_info * core = &(vm->cores[i]);
-- struct exit_event * evt = NULL;
-- struct rb_node * node = v3_rb_first(&(core->core_telem.exit_root));
--
-- V3_Print("Exit information for Core %d\n", core->vcpu_id);
--
-- if (!node) {
-- V3_Print("No information yet for this core\n");
-- continue;
-- }
--
-- do {
-- evt = rb_entry(node, struct exit_event, tree_node);
-- const char * code_str = vmexit_code_to_str(evt->exit_code);
--
-- V3_Print("%s%s:%sCnt=%u,%sAvg. Time=%u\n",
-- hdr_buf,
-- code_str,
-- (strlen(code_str) > 13) ? "\t" : "\t\t",
-- evt->cnt,
-- (evt->cnt >= 100) ? "\t" : "\t\t",
-- (uint32_t)(evt->handler_time / evt->cnt));
-- } while ((node = v3_rb_next(node)));
-- }
--
--
// Registered callbacks
{
struct telemetry_cb * cb = NULL;
telemetry->prev_tsc = invoke_tsc;
V3_Print("%s Telemetry done\n", hdr_buf);
--
}