Merge commit 'cc09f10e84d5' into kernel
[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 <dbi_kprobes.h>
26 #include "picl.h"
27 #include "ec_ioctl.h"
28 #include "ec_probe.h"
29 #include "probes_manager.h"
30 #include "probes.h"
31 #include "event_tmpl.h"
32 #include "error_storage.h"
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 /* Undo the actions of link_bundle() */
68 void unlink_bundle(void);
69
70 void dbi_find_and_set_handler_for_probe(unsigned long addr,
71                                         unsigned long *pre_entry,
72                                         unsigned long *jp_handler,
73                                         unsigned long *rp_handler);
74
75 /*
76     Copies event from user space to buffer and updates its pid/tid/cpu/time.
77 */
78 extern int put_us_event (char *data, unsigned long len);
79
80 /*
81     Sets event mask.
82 */
83 extern int set_event_mask (int new_mask);
84
85 /*
86     Gets event mask.
87 */
88 extern int get_event_mask (int *mask);
89
90 /*
91     Sets predefined user space probes info.
92 */
93 extern int set_predef_uprobes (ioctl_predef_uprobes_info_t *data);
94 /*
95     Gets predefined user space probes info length.
96 */
97 extern int get_predef_uprobes_size(int *size);
98 /*
99     Gets predefined user space probes info.
100 */
101 extern int get_predef_uprobes(ioctl_predef_uprobes_info_t *data);
102
103
104 // internal bookkeeping of storage
105 extern char *p_buffer;
106
107 // multiple handlers stuff
108 /*struct dbi_modules_handlers {
109         struct list_head        modules_handlers;
110         spinlock_t              lock;
111 };
112
113 struct dbi_modules_handlers_info {
114         struct module           *dbi_module;
115         struct handler_map      *dbi_handlers;
116         int                     dbi_nr_handlers;
117         struct list_head        dbi_list_head;
118 };
119
120 extern int dbi_register_handlers_module(struct dbi_modules_handlers_info *dbi_mhi);
121 extern int dbi_unregister_handlers_module(struct dbi_modules_handlers_info *dbi_mhi);
122 //unsigned long get_dbi_modules_handlers(void);*/
123
124 // event mask
125 extern int event_mask;
126
127 // process pid to instrument
128 extern unsigned int inst_pid;
129
130 typedef struct
131 {
132         struct list_head list;
133         char *name;
134         int installed;
135         struct jprobe jprobe;
136         struct kretprobe retprobe;
137         unsigned long offset;
138         unsigned long got_addr;
139
140         unsigned flag_retprobe:1;
141         unsigned flag_got:1;
142 } us_proc_ip_t;
143
144 typedef struct
145 {
146         int installed;
147         struct jprobe jprobe;
148         unsigned long addr;
149         struct list_head list;
150 } us_proc_vtp_t;
151
152 typedef struct
153 {
154         char *name;
155         char type;
156         unsigned long size;
157         signed char reg;        // -1 - memory, 0..127 - register number
158         long off;
159         struct list_head list;
160 } us_proc_vtp_data_t;
161
162 typedef struct
163 {
164         unsigned func_addr;
165         unsigned got_addr;
166         unsigned real_func_addr;
167 } us_proc_plt_t;
168
169 typedef struct
170 {
171         char *path;
172         char *path_dyn;
173         struct dentry *m_f_dentry;
174         unsigned ips_count;
175         us_proc_ip_t *p_ips;
176         unsigned vtps_count;
177         us_proc_vtp_t *p_vtps;
178         int loaded;
179         unsigned plt_count;
180         us_proc_plt_t *p_plt;
181         unsigned long vma_start;
182         unsigned long vma_end;
183         unsigned vma_flag;
184 } us_proc_lib_t;
185
186
187 typedef struct
188 {
189         char *path;
190         struct dentry *m_f_dentry;
191         pid_t tgid;
192         unsigned unres_ips_count;
193         unsigned unres_vtps_count;
194         //kprobe_opcode_t *mapped_codelets;
195         int is_plt;
196         unsigned libs_count;
197         us_proc_lib_t *p_libs;
198
199         // new_dpf
200         struct sspt_proc *pp;
201 } inst_us_proc_t;
202
203 typedef struct
204 {
205         unsigned int addr;
206         unsigned int inst_type;
207         char *name;
208         char *class_name;
209         char *method_name;
210         char *prototype;
211
212 }dex_proc_ip_t;
213
214 typedef struct
215 {
216         char *path;
217         unsigned ips_count;
218         dex_proc_ip_t *p_ips;
219
220 }inst_dex_proc_t;
221
222
223 struct cond {
224         /* cond data itself */
225         struct event_tmpl tmpl;
226         /* linked list */
227         struct list_head list;
228         /* has been applied (for start and stop conditions) */
229         int applied;
230 };
231
232 extern struct cond cond_list;
233
234 /* macros for testing flags */
235 #define ET_FIELD_CLR(flags, field) (flags &= ~field)
236 #define ET_FIELD_SET(flags, field) (flags |= field)
237 #define ET_FIELD_ISSET(flags, field) ((flags & field) != 0)
238
239 extern inst_us_proc_t us_proc_info;
240 extern inst_dex_proc_t dex_proc_info;
241
242 #endif /* !defined(__STORAGE_H__) */