X86_64 perf counter plugin

Change-Id: Ie5a00c15ee9536cc61afab57f6cadc1aa1972f3c
Signed-off-by: Dave Barach <dave@barachs.net>
diff --git a/src/vlib/node_cli.c b/src/vlib/node_cli.c
index 2523b41..062854a 100644
--- a/src/vlib/node_cli.c
+++ b/src/vlib/node_cli.c
@@ -148,19 +148,25 @@
   f64 maxc, maxcn;
   u32 maxn;
   u32 indent;
+  u64 pmc_ticks;
+  f64 pmc_ticks_per_packet;
 
   if (!n)
     {
       if (max)
-	return format (s,
-		       "%=30s%=17s%=16s%=16s%=16s%=16s",
-		       "Name", "Max Node Clocks", "Vectors at Max",
-		       "Max Clocks", "Avg Clocks", "Avg Vectors/Call");
+	s = format (s,
+		    "%=30s%=17s%=16s%=16s%=16s%=16s",
+		    "Name", "Max Node Clocks", "Vectors at Max",
+		    "Max Clocks", "Avg Clocks", "Avg Vectors/Call");
       else
-	return format (s,
-		       "%=30s%=12s%=16s%=16s%=16s%=16s%=16s",
-		       "Name", "State", "Calls", "Vectors", "Suspends",
-		       "Clocks", "Vectors/Call");
+	s = format (s,
+		    "%=30s%=12s%=16s%=16s%=16s%=16s%=16s",
+		    "Name", "State", "Calls", "Vectors", "Suspends",
+		    "Clocks", "Vectors/Call");
+      if (vm->perf_counter_id)
+	s = format (s, "%=16s", "Perf Ticks");
+
+      return s;
     }
 
   indent = format_get_indent (s);
@@ -176,6 +182,13 @@
   else
     maxcn = 0.0;
 
+  pmc_ticks = n->stats_total.perf_counter_ticks -
+    n->stats_last_clear.perf_counter_ticks;
+  if (p > 0)
+    pmc_ticks_per_packet = (f64) pmc_ticks / (f64) p;
+  else
+    pmc_ticks_per_packet = 0.0;
+
   /* Clocks per packet, per call or per suspend. */
   x = 0;
   if (p > 0)
@@ -208,6 +221,9 @@
     s = format (s, "%-30v%=12U%16Ld%16Ld%16Ld%16.2e%16.2f", ns,
 		format_vlib_node_state, vm, n, c, p, d, x, v);
 
+  if (pmc_ticks_per_packet > 0.0)
+    s = format (s, "%16.2e", pmc_ticks_per_packet);
+
   if (ns != n->name)
     vec_free (ns);