X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_instrument.c;h=8146338e0e40124467bccce2c95b23a50d691857;hb=82b8b87c344fcd1eab22e3f3be5ad54cbb3f8f68;hp=a2074555aca06c9833779140ce9152952f87ca71;hpb=0e1c2f1eb7e964848d43824328205d5557bc7639;p=palacios.git diff --git a/palacios/src/palacios/vmm_instrument.c b/palacios/src/palacios/vmm_instrument.c index a207455..8146338 100644 --- a/palacios/src/palacios/vmm_instrument.c +++ b/palacios/src/palacios/vmm_instrument.c @@ -17,7 +17,7 @@ * redistribute, and modify it as specified in the file "V3VEE_LICENSE". */ -#ifdef INSTRUMENT_VMM + #include #include @@ -32,10 +32,10 @@ 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; + ullong_t time; + uint_t exiting; + void * called_fn; + void * calling_fn; } __attribute__((packed)); @@ -46,91 +46,90 @@ void __cyg_profile_func_enter(void * this, void * callsite) __attribute__((__n 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 + 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 } - __attribute__((__no_instrument_function__)) -void __cyg_profile_func_enter(void * this, void * callsite) { +__attribute__((__no_instrument_function__)) + void __cyg_profile_func_enter(void * this, void * callsite) { - if (func_ring != NULL) { + if (func_ring != NULL) { - struct instrumented_func tmp_fn; - ullong_t now = 0; + struct instrumented_func tmp_fn; + ullong_t now = 0; - rdtscll(now); + rdtscll(now); - //PrintDebug("Entering Function\n"); + //PrintDebug("Entering Function\n"); - if (v3_ringbuf_avail_space(func_ring) < sizeof(struct instrumented_func)) { - print_instrumentation(); - } + 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 + 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)); + // 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); - } + rdtscll(last); + } } - __attribute__((__no_instrument_function__)) -void __cyg_profile_func_exit(void * this, void * callsite){ +__attribute__((__no_instrument_function__)) + void __cyg_profile_func_exit(void * this, void * callsite){ - if (func_ring != NULL) { + if (func_ring != NULL) { - struct instrumented_func tmp_fn; - ullong_t now = 0; + struct instrumented_func tmp_fn; + ullong_t now = 0; - rdtscll(now); + rdtscll(now); - // PrintDebug("Exiting Function\n"); + // PrintDebug("Exiting Function\n"); - if (v3_ringbuf_avail_space(func_ring) < sizeof(struct instrumented_func)) { - print_instrumentation(); - } + 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)); + 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); - } + rdtscll(last); + } } static void print_instrumentation() { - struct instrumented_func tmp_fn; + struct instrumented_func tmp_fn; - // PrintDebug("Printing Instrumentation\n"); - while (v3_ringbuf_data_len(func_ring) >= sizeof(struct instrumented_func)) { + // 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)); + 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); - } + 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