Return bool from reset_alarm_* apis.
[akaros.git] / kern / src / oprofile / cpu_buffer.c
index 8f40616..5036d7a 100644 (file)
@@ -34,7 +34,7 @@ static struct queue *opq;
 /* this is run from core 0 for all cpu buffers. */
 static void wq_sync_buffer(void);
 unsigned long oprofile_cpu_buffer_size = 65536;
-unsigned long oprofile_backtrace_depth = 8;
+unsigned long oprofile_backtrace_depth = 16;
 
 #define DEFAULT_TIMER_EXPIRE (HZ / 10)
 static int work_enabled;
@@ -145,7 +145,6 @@ int alloc_cpu_buffers(void)
        /* we *really* don't want to block. Losing data is better. */
        qnoblock(opq, 1);
        if (!op_cpu_buffer) {
-               printk("ALlocate %d bytes\n", sizeof(*op_cpu_buffer) * num_cpus);
                op_cpu_buffer =
                        kzmalloc(sizeof(*op_cpu_buffer) * num_cpus, KMALLOC_WAIT);
                if (!op_cpu_buffer)
@@ -683,7 +682,7 @@ void oprofile_add_backtrace(uintptr_t pc, uintptr_t fp)
        uint64_t event = nsec();
 
        uintptr_t bt_pcs[oprofile_backtrace_depth];
-       
+
        int nr_pcs;
        nr_pcs = backtrace_list(pc, fp, bt_pcs, oprofile_backtrace_depth);
 
@@ -714,6 +713,30 @@ fail:
        return;
 }
 
+void oprofile_add_userpc(uintptr_t pc)
+{
+       struct oprofile_cpu_buffer *cpu_buf;
+       uint32_t pcoreid = core_id();
+       struct op_entry entry;
+       struct block *b;
+       uint64_t descriptor = (0xee01ULL << 48) | (pcoreid << 16) | 1;
+
+       if (!op_cpu_buffer)
+               return;
+       cpu_buf = &op_cpu_buffer[pcoreid];
+       if (!cpu_buf->tracing)
+               return;
+       /* write_reserve always assumes passed-in-size + 2.  need room for 1 PC. */
+       b = op_cpu_buffer_write_reserve(cpu_buf, &entry, 1);
+       if (!b)
+               return;
+       entry.sample->eip = descriptor;
+       entry.sample->event = nsec();
+       /* entry.sample->data == entry.data */
+       assert(entry.sample->data == entry.data);
+       *entry.sample->data = pc;
+}
+
 int
 oproflen(void)
 {