Merge branch 'dev' of 106.109.8.71:/srv/git/dbi into new_dpf
[kernel/swap-modules.git] / driver / storage.h
1 ////////////////////////////////////////////////////////////////////////////////////
2 //
3 //      FILE:           storage.h
4 //
5 //      DESCRIPTION:
6 //      This file is C source for SWAP.
7 //
8 //      SEE ALSO:       storage.c
9 //      AUTHOR:         L.Komkov, S.Dianov, A.Gerenkov
10 //      COMPANY NAME:   Samsung Research Center in Moscow
11 //      DEPT NAME:      Advanced Software Group
12 //      CREATED:        2008.02.15
13 //      VERSION:        1.0
14 //      REVISION DATE:  2008.12.03
15 //
16 ////////////////////////////////////////////////////////////////////////////////////
17
18 #if !defined(__STORAGE_H__)
19 #define __STORAGE_H__
20
21 #include <linux/mount.h>
22 #include <linux/module.h>
23 #include <linux/list.h>
24 #include <linux/spinlock.h>
25 #include "picl.h"
26 #include "ec_ioctl.h"
27 #include "ec_probe.h"
28 #include "probes_manager.h"
29 #include "probes.h"
30 #include "event_tmpl.h"
31
32 ///////////////////////////////////////////////////////////////////////////////////////////////////
33
34 extern int EnableContinuousRetrieval(void);
35 extern int DisableContinuousRetrieval(void);
36
37 ///////////////////////////////////////////////////////////////////////////////////////////////////
38
39 extern unsigned int GetBufferSize(void);
40 extern int SetBufferSize(unsigned int nSize);
41 extern int ResetBuffer(void);
42
43 extern int SetPid(unsigned int pid);
44
45 //extern spinlock_t buffer_spinlock;
46
47 ///////////////////////////////////////////////////////////////////////////////////////////////////
48
49 /*
50     Functions "storage_init()" and "storage_down()" are for initialization and
51     shutdown respectively.
52 */
53 extern int storage_init (void);
54 extern void storage_down (void);
55
56 /*
57     Function "pack_event_info()" saves information about event into buffer. It
58     is used in 'probes' to pack and save event data.
59 */
60 extern void pack_event_info (probe_id_t probe_id, record_type_t record_type, const char *fmt, ...);
61
62 /* Set most links from us_proc_info to data in the bundle */
63 int link_bundle(void);
64
65 /* Undo the actions of link_bundle() */
66 void unlink_bundle(void);
67
68 /*
69     Adds non-predefined kernel probe to the list.
70 */
71 extern int add_probe_to_list (unsigned long addr, kernel_probe_t ** pprobe);
72
73 /*
74     Removes non-predefined kernel probe from the list.
75 */
76 extern int remove_probe_from_list (unsigned long addr);
77
78 /*
79     Searches non-predefined kernel probe in the list.
80 */
81 extern kernel_probe_t *find_probe (unsigned long addr);
82
83 /*
84     Copies event from user space to buffer and updates its pid/tid/cpu/time.
85 */
86 extern int put_us_event (char *data, unsigned long len);
87
88 /*
89     Sets event mask.
90 */
91 extern int set_event_mask (int new_mask);
92
93 /*
94     Gets event mask.
95 */
96 extern int get_event_mask (int *mask);
97
98 /*
99     Sets predefined user space probes info.
100 */
101 extern int set_predef_uprobes (ioctl_predef_uprobes_info_t *data);
102 /*
103     Gets predefined user space probes info length.
104 */
105 extern int get_predef_uprobes_size(int *size);
106 /*
107     Gets predefined user space probes info.
108 */
109 extern int get_predef_uprobes(ioctl_predef_uprobes_info_t *data);
110
111
112 // internal bookkeeping of storage
113 extern char *p_buffer;
114
115 // list of selected non-predefined kernel probes
116 extern struct hlist_head kernel_probes;
117
118 // multiple handlers stuff
119 /*struct dbi_modules_handlers {
120         struct list_head        modules_handlers;
121         spinlock_t              lock;
122 };
123
124 struct dbi_modules_handlers_info {
125         struct module           *dbi_module;
126         struct handler_map      *dbi_handlers;
127         int                     dbi_nr_handlers;
128         struct list_head        dbi_list_head;
129 };
130
131 extern int dbi_register_handlers_module(struct dbi_modules_handlers_info *dbi_mhi);
132 extern int dbi_unregister_handlers_module(struct dbi_modules_handlers_info *dbi_mhi);
133 //unsigned long get_dbi_modules_handlers(void);*/
134
135 /* list of on-the-go installed kernel probes */
136 extern struct hlist_head otg_kernel_probes;
137
138 // event mask
139 extern int event_mask;
140
141 // process pid to instrument
142 extern unsigned int inst_pid;
143
144 typedef struct
145 {
146         struct list_head list;
147         char *name;
148         int installed;
149         struct jprobe jprobe;
150         struct kretprobe retprobe;
151         unsigned long offset;
152         unsigned long got_addr;
153
154         unsigned flag_retprobe:1;
155         unsigned flag_got:1;
156 } us_proc_ip_t;
157
158 struct us_ip {
159         struct list_head list;
160
161         struct jprobe jprobe;
162         struct kretprobe retprobe;
163
164         unsigned long offset;
165         unsigned long got_addr;
166
167         unsigned flag_retprobe:1;
168         unsigned flag_got:1;
169 };
170
171 typedef struct
172 {
173         int installed;
174         struct jprobe jprobe;
175         unsigned long addr;
176         struct list_head list;
177 } us_proc_vtp_t;
178
179 typedef struct
180 {
181         char *name;
182         char type;
183         unsigned long size;
184         signed char reg;        // -1 - memory, 0..127 - register number
185         long off;
186         struct list_head list;
187 } us_proc_vtp_data_t;
188
189 typedef struct
190 {
191         unsigned func_addr;
192         unsigned got_addr;
193         unsigned real_func_addr;
194 } us_proc_plt_t;
195
196 typedef struct
197 {
198         char *path;
199         char *path_dyn;
200         struct dentry *m_f_dentry;
201         unsigned ips_count;
202         us_proc_ip_t *p_ips;
203         unsigned vtps_count;
204         us_proc_vtp_t *p_vtps;
205         int loaded;
206         unsigned plt_count;
207         us_proc_plt_t *p_plt;
208         unsigned long vma_start;
209         unsigned long vma_end;
210         unsigned vma_flag;
211 } us_proc_lib_t;
212
213
214 typedef struct
215 {
216         char *path;
217         struct dentry *m_f_dentry;
218         pid_t tgid;
219         unsigned unres_ips_count;
220         unsigned unres_vtps_count;
221         //kprobe_opcode_t *mapped_codelets;
222         int is_plt;
223         unsigned libs_count;
224         us_proc_lib_t *p_libs;
225 #ifdef __ANDROID
226         unsigned long libdvm_start;
227         unsigned long libdvm_end;
228         us_proc_ip_t libdvm_entry_ip;
229         us_proc_ip_t libdvm_return_ip;
230 #endif /* __ANDROID */
231
232         // new_dpf
233         struct proc_probes *pp;
234 } inst_us_proc_t;
235
236 typedef struct
237 {
238         unsigned int addr;
239         unsigned int inst_type;
240         char *name;
241         char *class_name;
242         char *method_name;
243         char *prototype;
244
245 }dex_proc_ip_t;
246
247 typedef struct
248 {
249         char *path;
250         unsigned ips_count;
251         dex_proc_ip_t *p_ips;
252
253 }inst_dex_proc_t;
254
255
256 struct cond {
257         /* cond data itself */
258         struct event_tmpl tmpl;
259         /* linked list */
260         struct list_head list;
261         /* has been applied (for start and stop conditions) */
262         int applied;
263 };
264
265 extern struct cond cond_list;
266
267 /* macros for testing flags */
268 #define ET_FIELD_CLR(flags, field) (flags &= ~field)
269 #define ET_FIELD_SET(flags, field) (flags |= field)
270 #define ET_FIELD_ISSET(flags, field) ((flags & field) != 0)
271
272 extern inst_us_proc_t us_proc_info;
273 extern inst_dex_proc_t dex_proc_info;
274
275 #endif /* !defined(__STORAGE_H__) */