Imported Upstream version 0.9.8
[platform/upstream/oprofile.git] / daemon / opd_trans.h
1 /**
2  * @file daemon/opd_trans.h
3  * Processing the sample buffer
4  *
5  * @remark Copyright 2002 OProfile authors
6  * @remark Read the file COPYING
7  *
8  * @author John Levon
9  * @author Philippe Elie
10  *
11  * Modified by Maynard Johnson <maynardj@us.ibm.com>
12  * These modifications are:
13  * (C) Copyright IBM Corporation 2007
14  */
15
16 #ifndef OPD_TRANS_H
17 #define OPD_TRANS_H
18
19 #include "opd_cookie.h"
20 #include "op_types.h"
21
22 #include <stdint.h>
23
24 struct sfile;
25 struct anon_mapping;
26
27 enum tracing_type {
28         TRACING_OFF,
29         TRACING_START,
30         TRACING_ON
31 };
32
33 /**
34  * Transient values used for parsing the event buffer.
35  * Note that these are reset for each buffer read, but
36  * that should be ok as in the kernel, cpu_buffer_reset()
37  * ensures that a correct context starts off the buffer.
38  */
39 struct transient {
40         char const * buffer;
41         size_t remaining;
42         enum tracing_type tracing;
43         struct sfile * current;
44         struct sfile * last;
45         struct anon_mapping * anon;
46         struct anon_mapping * last_anon;
47         cookie_t cookie;
48         cookie_t app_cookie;
49         vma_t pc;
50         vma_t last_pc;
51         unsigned long event;
52         int in_kernel;
53         unsigned long cpu;
54         pid_t tid;
55         pid_t tgid;
56         uint64_t embedded_offset;
57         void * ext;
58 };
59
60 typedef void (*handler_t)(struct transient *);
61 extern handler_t handlers[];
62
63 uint64_t pop_buffer_value(struct transient * trans);
64 int enough_remaining(struct transient * trans, size_t size);
65 static inline void update_trans_last(struct transient * trans)
66 {
67         trans->last = trans->current;
68         trans->last_anon = trans->anon;
69         trans->last_pc = trans->pc;
70 }
71
72 extern size_t kernel_pointer_size;
73 static inline int is_escape_code(uint64_t code)
74 {
75         return kernel_pointer_size == 4 ? code == ~0LU : code == ~0LLU;
76 }
77
78 void opd_process_samples(char const * buffer, size_t count);
79
80 /** used when we need to clear data that's been freed */
81 void clear_trans_last(struct transient * trans);
82
83 /** used when we need to clear data that's been freed */
84 void clear_trans_current(struct transient * trans);
85
86 #endif /* OPD_TRANS_H */