/**
* @file daemon/opd_trans.h
* Processing the sample buffer
*
* @remark Copyright 2002 OProfile authors
* @remark Read the file COPYING
*
* @author John Levon
* @author Philippe Elie
*
* Modified by Maynard Johnson <maynardj@us.ibm.com>
* These modifications are:
* (C) Copyright IBM Corporation 2007
*/
#ifndef OPD_TRANS_H
#define OPD_TRANS_H
#include "opd_cookie.h"
#include "op_types.h"
#include <stdint.h>
struct sfile;
struct anon_mapping;
enum tracing_type {
TRACING_OFF,
TRACING_START,
TRACING_ON
};
/**
* Transient values used for parsing the event buffer.
* Note that these are reset for each buffer read, but
* that should be ok as in the kernel, cpu_buffer_reset()
* ensures that a correct context starts off the buffer.
*/
struct transient {
char const * buffer;
size_t remaining;
enum tracing_type tracing;
struct sfile * current;
struct sfile * last;
struct anon_mapping * anon;
struct anon_mapping * last_anon;
cookie_t cookie;
cookie_t app_cookie;
vma_t pc;
vma_t last_pc;
unsigned long event;
int in_kernel;
unsigned long cpu;
pid_t tid;
pid_t tgid;
uint64_t embedded_offset;
void * ext;
};
typedef void (*handler_t)(struct transient *);
extern handler_t handlers[];
uint64_t pop_buffer_value(struct transient * trans);
int enough_remaining(struct transient * trans, size_t size);
static inline void update_trans_last(struct transient * trans)
{
trans->last = trans->current;
trans->last_anon = trans->anon;
trans->last_pc = trans->pc;
}
extern size_t kernel_pointer_size;
static inline int is_escape_code(uint64_t code)
{
return kernel_pointer_size == 4 ? code == ~0LU : code == ~0LLU;
}
void opd_process_samples(char const * buffer, size_t count);
/** used when we need to clear data that's been freed */
void clear_trans_last(struct transient * trans);
/** used when we need to clear data that's been freed */
void clear_trans_current(struct transient * trans);
#endif /* OPD_TRANS_H */