/* Copyright (c) 2015 Google Inc
 * Davide Libenzi <dlibenzi@google.com>
 * See LICENSE for details.
 */

#pragma once

#include <stdio.h>
#include <ros/profiler_records.h>

struct hw_trapframe;
struct proc;
struct file;
struct cmdbuf;

int profiler_configure(struct cmdbuf *cb);
void profiler_append_configure_usage(char *msgbuf, size_t buflen);
void profiler_init(void);
void profiler_setup(void);
void profiler_cleanup(void);
void profiler_start(void);
void profiler_stop(void);
void profiler_push_kernel_backtrace(uintptr_t *pc_list, size_t nr_pcs,
                                    uint64_t info);
void profiler_push_user_backtrace(uintptr_t *pc_list, size_t nr_pcs,
                                  uint64_t info);
void profiler_trace_data_flush(void);
int profiler_size(void);
int profiler_read(void *va, int n);
void profiler_notify_mmap(struct proc *p, uintptr_t addr, size_t size, int prot,
						  int flags, struct file *f, size_t offset);
void profiler_notify_new_process(struct proc *p);
