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