#include <linux/init.h>
#include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/proc_fs.h>
#include <linux/types.h>
#include <asm/ptrace.h>
#include <asm/uaccess.h>

#define SAMPLE_BUFFER_SIZE 8192

static char* sample_buffer;
static char* sample_buffer_pos;
static int prof_running = 0;

void
cris_profile_sample(struct pt_regs* regs)
{
  if (!prof_running)
    return;
  if (user_mode(regs))
    *(unsigned int*)sample_buffer_pos = current->pid;
  else
    *(unsigned int*)sample_buffer_pos = 0;
  *(unsigned int*)(sample_buffer_pos + 4) = instruction_pointer(regs);
  sample_buffer_pos += 8;
  if (sample_buffer_pos == sample_buffer + SAMPLE_BUFFER_SIZE)
    sample_buffer_pos = sample_buffer;
}

static ssize_t
read_cris_profile(struct file *file, char __user *buf, size_t count, loff_t *ppos)
{
  unsigned long p = *ppos;
  if (p > SAMPLE_BUFFER_SIZE)
    return 0;
  if (p + count > SAMPLE_BUFFER_SIZE)
    count = SAMPLE_BUFFER_SIZE - p;
  if (copy_to_user(buf, sample_buffer + p,count))
		return -EFAULT;
  memset(sample_buffer + p, 0, count);
  *ppos += count;
  return count;
}

static ssize_t
write_cris_profile(struct file *file, const char __user *buf,
              size_t count, loff_t *ppos)
{
  sample_buffer_pos = sample_buffer;
  memset(sample_buffer, 0, SAMPLE_BUFFER_SIZE);
}

static struct file_operations cris_proc_profile_operations = {
	.read		= read_cris_profile,
	.write		= write_cris_profile,
};

static int
__init init_cris_profile(void)
{
  struct proc_dir_entry *entry;
  sample_buffer = (char*)kmalloc(SAMPLE_BUFFER_SIZE, GFP_KERNEL);
  sample_buffer_pos = sample_buffer;
  entry = create_proc_entry("system_profile", S_IWUSR | S_IRUGO, NULL);
  if (entry) {
    entry->proc_fops = &cris_proc_profile_operations;
    entry->size = SAMPLE_BUFFER_SIZE;
  }
  prof_running = 1;
  return 0;
}

__initcall(init_cris_profile);
