Merge branch 'dev' 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_task_event_info (struct task_struct *task, probe_id_t probe_id,
61                 record_type_t record_type, const char *fmt, ...);
62 #define pack_event_info(probe_id, record_type, fmt, ...) \
63         pack_task_event_info(current, probe_id, record_type, fmt, __VA_ARGS__)
64
65 /* Set most links from us_proc_info to data in the bundle */
66 int link_bundle(void);
67
68 /* Undo the actions of link_bundle() */
69 void unlink_bundle(void);
70
71 /*
72     Adds non-predefined kernel probe to the list.
73 */
74 extern int add_probe_to_list (unsigned long addr, kernel_probe_t ** pprobe);
75
76 /*
77     Removes non-predefined kernel probe from the list.
78 */
79 extern int remove_probe_from_list (unsigned long addr);
80
81 /*
82     Searches non-predefined kernel probe in the list.
83 */
84 extern kernel_probe_t *find_probe (unsigned long addr);
85
86 /*
87     Copies event from user space to buffer and updates its pid/tid/cpu/time.
88 */
89 extern int put_us_event (char *data, unsigned long len);
90
91 /*
92     Sets event mask.
93 */
94 extern int set_event_mask (int new_mask);
95
96 /*
97     Gets event mask.
98 */
99 extern int get_event_mask (int *mask);
100
101 /*
102     Sets predefined user space probes info.
103 */
104 extern int set_predef_uprobes (ioctl_predef_uprobes_info_t *data);
105 /*
106     Gets predefined user space probes info length.
107 */
108 extern int get_predef_uprobes_size(int *size);
109 /*
110     Gets predefined user space probes info.
111 */
112 extern int get_predef_uprobes(ioctl_predef_uprobes_info_t *data);
113
114
115 // internal bookkeeping of storage
116 extern char *p_buffer;
117
118 // list of selected non-predefined kernel probes
119 extern struct hlist_head kernel_probes;
120
121 // multiple handlers stuff
122 /*struct dbi_modules_handlers {
123         struct list_head        modules_handlers;
124         spinlock_t              lock;
125 };
126
127 struct dbi_modules_handlers_info {
128         struct module           *dbi_module;
129         struct handler_map      *dbi_handlers;
130         int                     dbi_nr_handlers;
131         struct list_head        dbi_list_head;
132 };
133
134 extern int dbi_register_handlers_module(struct dbi_modules_handlers_info *dbi_mhi);
135 extern int dbi_unregister_handlers_module(struct dbi_modules_handlers_info *dbi_mhi);
136 //unsigned long get_dbi_modules_handlers(void);*/
137
138 /* list of on-the-go installed kernel probes */
139 extern struct hlist_head otg_kernel_probes;
140
141 // event mask
142 extern int event_mask;
143
144 // process pid to instrument
145 extern unsigned int inst_pid;
146
147 typedef struct
148 {
149         struct list_head list;
150         char *name;
151         int installed;
152         struct jprobe jprobe;
153         struct kretprobe retprobe;
154         unsigned long offset;
155         unsigned long got_addr;
156
157         unsigned flag_retprobe:1;
158         unsigned flag_got:1;
159 } us_proc_ip_t;
160
161 struct us_ip {
162         struct list_head list;
163
164         struct jprobe jprobe;
165         struct kretprobe retprobe;
166
167         unsigned long offset;
168         unsigned long got_addr;
169
170         unsigned flag_retprobe:1;
171         unsigned flag_got:1;
172 };
173
174 typedef struct
175 {
176         int installed;
177         struct jprobe jprobe;
178         unsigned long addr;
179         struct list_head list;
180 } us_proc_vtp_t;
181
182 typedef struct
183 {
184         char *name;
185         char type;
186         unsigned long size;
187         signed char reg;        // -1 - memory, 0..127 - register number
188         long off;
189         struct list_head list;
190 } us_proc_vtp_data_t;
191
192 typedef struct
193 {
194         unsigned func_addr;
195         unsigned got_addr;
196         unsigned real_func_addr;
197 } us_proc_plt_t;
198
199 typedef struct
200 {
201         char *path;
202         char *path_dyn;
203         struct dentry *m_f_dentry;
204         unsigned ips_count;
205         us_proc_ip_t *p_ips;
206         unsigned vtps_count;
207         us_proc_vtp_t *p_vtps;
208         int loaded;
209         unsigned plt_count;
210         us_proc_plt_t *p_plt;
211         unsigned long vma_start;
212         unsigned long vma_end;
213         unsigned vma_flag;
214 } us_proc_lib_t;
215
216
217 typedef struct
218 {
219         char *path;
220         struct dentry *m_f_dentry;
221         pid_t tgid;
222         unsigned unres_ips_count;
223         unsigned unres_vtps_count;
224         //kprobe_opcode_t *mapped_codelets;
225         int is_plt;
226         unsigned libs_count;
227         us_proc_lib_t *p_libs;
228 #ifdef __ANDROID
229         unsigned long libdvm_start;
230         unsigned long libdvm_end;
231         us_proc_ip_t libdvm_entry_ip;
232         us_proc_ip_t libdvm_return_ip;
233 #endif /* __ANDROID */
234
235         // new_dpf
236         struct proc_probes *pp;
237 } inst_us_proc_t;
238
239 typedef struct
240 {
241         unsigned int addr;
242         unsigned int inst_type;
243         char *name;
244         char *class_name;
245         char *method_name;
246         char *prototype;
247
248 }dex_proc_ip_t;
249
250 typedef struct
251 {
252         char *path;
253         unsigned ips_count;
254         dex_proc_ip_t *p_ips;
255
256 }inst_dex_proc_t;
257
258
259 struct cond {
260         /* cond data itself */
261         struct event_tmpl tmpl;
262         /* linked list */
263         struct list_head list;
264         /* has been applied (for start and stop conditions) */
265         int applied;
266 };
267
268 extern struct cond cond_list;
269
270 /* macros for testing flags */
271 #define ET_FIELD_CLR(flags, field) (flags &= ~field)
272 #define ET_FIELD_SET(flags, field) (flags |= field)
273 #define ET_FIELD_ISSET(flags, field) ((flags & field) != 0)
274
275 extern inst_us_proc_t us_proc_info;
276 extern inst_dex_proc_t dex_proc_info;
277
278 #endif /* !defined(__STORAGE_H__) */