X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_instrument.c;h=a2074555aca06c9833779140ce9152952f87ca71;hb=0e1c2f1eb7e964848d43824328205d5557bc7639;hp=e67f81877980cd1da9d50e3fb0c5cd6a8ce0a2b5;hpb=3496b5b5469fe691a6847eb76d973019bb769318;p=palacios.git diff --git a/palacios/src/palacios/vmm_instrument.c b/palacios/src/palacios/vmm_instrument.c index e67f818..a207455 100644 --- a/palacios/src/palacios/vmm_instrument.c +++ b/palacios/src/palacios/vmm_instrument.c @@ -17,77 +17,120 @@ * redistribute, and modify it as specified in the file "V3VEE_LICENSE". */ -#ifdef INSTRUMENT_VMM - +#ifdef INSTRUMENT_VMM + #include #include + +#define NO_INSTRUMENTATION #include - -void __attribute__((__no_instrument_function__)) v3_init_cyg_profiler (){ +#undef NO_INSTRUMENTATION + +#define RING_SIZE 2000 + +static ullong_t last = 0; +static struct v3_ringbuf * func_ring = NULL; + +struct instrumented_func { + ullong_t time; + uint_t exiting; + void * called_fn; + void * calling_fn; +} __attribute__((packed)); + + -// initialize +static void print_instrumentation() __attribute__((__no_instrument_function__)); - v3_Inst_RingBuff_init (&ring_buff, 2048); //dequeue at every 4095 - - instrument_start = 1; - +void __cyg_profile_func_enter(void * this, void * callsite) __attribute__((__no_instrument_function__)); +void __cyg_profile_func_exit(void * this, void * callsite) __attribute__((__no_instrument_function__)); + +void v3_init_instrumentation() { + PrintDebug("Creating Ring Buffer (unit size = %d)\n", (uint_t)sizeof(struct instrumented_func)); + // initialize + func_ring = v3_create_ringbuf(sizeof(struct instrumented_func) * RING_SIZE); //dequeue at every 4095 } -static void inline __attribute__((__no_instrument_function__)) read_cyg_profiler (){ - while( v3_Inst_RingBuff_data_size(ring_buff) > 0) { - v3_Inst_RingBuff_read (ring_buff, pack_data, 1); - PrintDebug("CYG_PROF: %d %8lu %08x %08x\n", pack_data->state, (unsigned long)pack_data->time, pack_data->cur_fn, pack_data->pre_fn); - - } + __attribute__((__no_instrument_function__)) +void __cyg_profile_func_enter(void * this, void * callsite) { + + if (func_ring != NULL) { + + struct instrumented_func tmp_fn; + ullong_t now = 0; + + rdtscll(now); + + //PrintDebug("Entering Function\n"); + + if (v3_ringbuf_avail_space(func_ring) < sizeof(struct instrumented_func)) { + print_instrumentation(); + } + + tmp_fn.time = now - last; // current tsc + tmp_fn.exiting = 0; //enter to be 0 + tmp_fn.called_fn = this; //this + tmp_fn.calling_fn = callsite; //callsite + + // PrintDebug("Writing Function: fn_data=%p, size=%d\n", + // (void *)&tmp_fn, (uint_t)sizeof(struct instrumented_func)); + v3_ringbuf_write(func_ring, (uchar_t *)&tmp_fn, sizeof(struct instrumented_func)); + + rdtscll(last); + } } -void __attribute__((__no_instrument_function__)) -__cyg_profile_func_enter( void *this, void *callsite ) -{ - - if(instrument_start > 0) { - - rdtscll(now); - - if((v3_Inst_RingBuff_data_size(ring_buff) % 500) == 0 || v3_Inst_RingBuff_data_size(ring_buff) == 4095) { - read_cyg_profiler(); - } - - - pack_data->time = now - last; //time spent previous - pack_data->state = 0; //enter to be 0 - pack_data->cur_fn = (unsigned int)this; //this - pack_data->pre_fn = (unsigned int)callsite; //callsite - - v3_Inst_RingBuff_write (ring_buff, pack_data, 1); - - rdtscll(now); - last = now; - } + + __attribute__((__no_instrument_function__)) +void __cyg_profile_func_exit(void * this, void * callsite){ + + if (func_ring != NULL) { + + struct instrumented_func tmp_fn; + ullong_t now = 0; + + rdtscll(now); + + // PrintDebug("Exiting Function\n"); + + if (v3_ringbuf_avail_space(func_ring) < sizeof(struct instrumented_func)) { + print_instrumentation(); + } + + tmp_fn.time = now - last; // current tsc + tmp_fn.exiting = 1; //exit to be 0 + tmp_fn.called_fn = this; //this + tmp_fn.calling_fn = callsite; //callsite + + // PrintDebug("Writing Function: fn_data=%p, size=%d\n", + // (void *)&tmp_fn, (uint_t)sizeof(struct instrumented_func)); + v3_ringbuf_write(func_ring, (uchar_t *)&tmp_fn, sizeof(struct instrumented_func)); + + rdtscll(last); + } } -void __attribute__((__no_instrument_function__)) -__cyg_profile_func_exit( void *this, void *callsite ) -{ - if(instrument_start > 0 ) { - rdtscll(now); - - if((v3_Inst_RingBuff_data_size(ring_buff) % 500) == 0 || v3_Inst_RingBuff_data_size(ring_buff) == 4095) { - read_cyg_profiler(); - } - - pack_data->time = now - last; //time spent previous - pack_data->state = 1; //exit to be 0 - pack_data->cur_fn = (unsigned int)this; //this - pack_data->pre_fn = (unsigned int)callsite; //callsite - - v3_Inst_RingBuff_write (ring_buff, pack_data, 1); - - rdtscll(now); - last = now; - } + + +static void print_instrumentation() { + + struct instrumented_func tmp_fn; + + // PrintDebug("Printing Instrumentation\n"); + while (v3_ringbuf_data_len(func_ring) >= sizeof(struct instrumented_func)) { + + v3_ringbuf_read(func_ring, (uchar_t *)&tmp_fn, sizeof(struct instrumented_func)); + + PrintDebug("CYG_PROF: %d %p %p %p\n", + tmp_fn.exiting, + (void *)(addr_t)(tmp_fn.time), + tmp_fn.called_fn, + tmp_fn.calling_fn); + } } + + #endif