* redistribute, and modify it as specified in the file "V3VEE_LICENSE".
*/
-#ifdef INSTRUMENT_VMM
-
+
+
#include <palacios/svm_handler.h>
#include <palacios/vmm_instrument.h>
+
+#define NO_INSTRUMENTATION
#include <palacios/vmm_ringbuffer.h>
-
-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
- v3_Inst_RingBuff_init (&ring_buff, 2048); //dequeue at every 4095
-
- instrument_start = 1;
-
-}
-static void inline __attribute__((__no_instrument_function__)) read_cyg_profiler (){
+static void print_instrumentation() __attribute__((__no_instrument_function__));
- while( v3_Inst_RingBuff_data_size(ring_buff) > 0) {
+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__));
- 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);
-
- }
+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
}
-void __attribute__((__no_instrument_function__))
-__cyg_profile_func_enter( void *this, void *callsite )
-{
-
- if(instrument_start > 0) {
+
+
+__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);
-
- 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);
+ //PrintDebug("Entering Function\n");
- rdtscll(now);
- last = now;
+ 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_exit( void *this, void *callsite )
-{
- if(instrument_start > 0 ) {
+
+__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_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;
+ 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);
+ }
}
-#endif
+
+
+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);
+ }
+}
+
+
+