00001
00011
00012
00013 #if !defined (_TYPES_AND_CONSTANTS_HH)
00014 #define _TYPES_AND_CONSTANTS_HH
00015
00016
00017
00018
00019
00020
00021 #include <hash_map.h>
00022 #include <list.h>
00023
00024
00025
00026
00027
00028
00029
00030 struct Task;
00031 struct Process;
00032
00033
00034
00035
00036
00037
00038
00041 typedef char tag_t;
00042
00044 typedef unsigned long long int timestamp_t;
00045
00047 typedef unsigned long int virtual_address_t;
00048
00050 typedef unsigned short int length_t;
00051
00058 typedef unsigned long int context_ID_t;
00059
00067 typedef unsigned long int virtual_page_ID_t;
00068
00070 typedef unsigned long int canonical_page_ID_t;
00071
00073 typedef unsigned short int task_ID_t;
00074
00076 typedef unsigned int process_ID_t;
00077
00080 typedef unsigned long int inode_ID_t;
00081
00084 typedef unsigned short int device_ID_t;
00085
00087 typedef unsigned long int shm_ID_t;
00088
00091 typedef unsigned long int offset_t;
00092
00094 typedef unsigned long long int file_offset_t;
00095
00098 typedef char page_type_t;
00099
00100
00101
00102
00103
00104
00105
00107 #define BUFFER_SIZE 256
00108
00114 #define PAGE_SIZE_ORDER 12;
00115
00116
00117 #define TAG_USER_READ 'r'
00118 #define TAG_KERNEL_READ 'R'
00119 #define TAG_USER_WRITE 'w'
00120 #define TAG_KERNEL_WRITE 'W'
00121 #define TAG_USER_INSTRUCTION_FETCH 'i'
00122 #define TAG_KERNEL_EVENT 'K'
00123 #define TAG_KERNEL_INSTRUCTION_FETCH 'I'
00124
00125
00126 #define TAG_SCHEDULE 'S'
00127 #define TAG_FORK 'F'
00128 #define TAG_EXEC 'X'
00129 #define TAG_EXIT 'T'
00130 #define TAG_CONTEXT_ASSIGNMENT 'A'
00131 #define TAG_DUPLICATE_RANGE 'D'
00132 #define TAG_MMAP_FILE 'M'
00133 #define TAG_MMAP_ANONYMOUS 'm'
00134 #define TAG_MUNMAP 'U'
00135 #define TAG_COMPLETE_UNMAP 'u'
00136 #define TAG_IPC_SHMAT 's'
00137 #define TAG_IPC_SHMDT 'd'
00138 #define TAG_COW_UNMAP 'C'
00139 #define TAG_BUFFER_ALLOCATION 'B'
00140 #define TAG_BUFFER_DEALLOCATION 'b'
00141 #define TAG_FILE_CACHE_ALLOCATION 'P'
00142 #define TAG_FILE_CACHE_DEALLOCATION 'p'
00143 #define TAG_FILE_OPEN '('
00144 #define TAG_FILE_CLOSE ')'
00145 #define TAG_FILE_READ '<'
00146 #define TAG_FILE_WRITE '>'
00147 #define TAG_FILE_DELETE '-'
00148 #define TAG_ACCEPT 'a'
00149 #define TAG_END_OF_TRACE 'e'
00150
00151
00152
00159 #define TYPE_ANONYMOUS 'A'
00160
00162 #define TYPE_FILE_CACHE 'F'
00163
00166 #define TYPE_IPC_SHM_SEGMENT 'S'
00167
00176 #define TYPE_ZERO_PAGE 'Z'
00177
00179 #define TYPE_BUFFER_CACHE 'B'
00180
00188 #define KERNEL_CONTEXT 0x101
00189
00191 #define KERNEL_PROCESS_ID 0
00192
00195 #define KERNEL_VIRTUAL_PAGE_OFFSET 0xc0000
00196
00206 #define KERNEL_CANONICAL_PAGE_OFFSET 0xfffc0000
00207
00208
00209
00210
00211
00212
00213
00216 struct virtual_page_s {
00217
00218 context_ID_t context_ID;
00219 virtual_page_ID_t page_ID;
00220
00221 };
00222
00225 struct canonical_page_s {
00226
00227 canonical_page_ID_t page;
00228 unsigned int reference_count;
00229 page_type_t type;
00230 shm_ID_t shm_ID;
00233 };
00234
00236 struct file_ID_s {
00237
00238 device_ID_t major;
00239 device_ID_t minor;
00240 inode_ID_t inode_ID;
00242 };
00243
00246 struct equal_virtual_page_ID_s {
00247 bool operator() (const virtual_page_ID_t x,
00248 const virtual_page_ID_t y) const {
00249 return (x == y);
00250 }
00251 };
00252
00255 typedef hash_map<virtual_page_ID_t,
00256 canonical_page_s*,
00257 hash<virtual_page_ID_t>,
00258 equal_virtual_page_ID_s> virtual_to_canonical_map_t;
00259
00262 struct equal_task_ID_s {
00263 bool operator() (const task_ID_t x, const task_ID_t y) {
00264 return (x == y);
00265 }
00266 };
00267
00270 struct equal_context_ID_s {
00271 bool operator() (const context_ID_t x, const context_ID_t y) const {
00272 return (x == y);
00273 }
00274 };
00275
00278 struct equal_file_ID_s {
00279 bool operator() (const file_ID_s& x, const file_ID_s& y) const {
00280 return ((x.major == y.major) &&
00281 (x.minor == y.minor) &&
00282 (x.inode_ID == y.inode_ID));
00283 }
00284 };
00285
00288 struct equal_shm_ID_s {
00289 bool operator() (const shm_ID_t x, const shm_ID_t y) const {
00290 return (x == y);
00291 }
00292 };
00293
00300 struct file_ID_hash_s {
00301
00302 size_t operator() (const file_ID_s& id) const {
00303
00304
00305
00306
00307 unsigned long int h = 0;
00308 char* s = (char*)&id;
00309 for (unsigned int i = 0; i < sizeof(file_ID_s); i++) {
00310 h = (5 * h) + *s;
00311 s++;
00312 }
00313
00314 return (size_t)h;
00315 }
00316
00317 };
00318
00321 typedef hash_map<task_ID_t,
00322 bool,
00323 hash<task_ID_t>,
00324 equal_task_ID_s> live_map_t;
00325
00328 typedef hash_map<file_ID_s,
00329 virtual_to_canonical_map_t*,
00330 file_ID_hash_s,
00331 equal_file_ID_s> file_ID_to_V2C_map_t;
00332
00335 typedef hash_map<shm_ID_t,
00336 virtual_to_canonical_map_t*,
00337 hash<shm_ID_t>,
00338 equal_shm_ID_s> shm_ID_to_V2C_map_t;
00339
00342 typedef hash_map<shm_ID_t,
00343 bool,
00344 hash<shm_ID_t>,
00345 equal_shm_ID_s> defunct_shm_ID_map_t;
00346
00348 typedef hash_map<task_ID_t,
00349 Task*,
00350 hash<task_ID_t>,
00351 equal_task_ID_s> task_ID_to_Task_map_t;
00352
00354 typedef hash_map<context_ID_t,
00355 Process*,
00356 hash<context_ID_t>,
00357 equal_context_ID_s> context_ID_to_Process_map_t;
00358
00361 struct reference_record_s {
00362
00363 tag_t tag;
00364 timestamp_t cycle_timestamp;
00366 timestamp_t instruction_timestamp;
00368 timestamp_t reference_timestamp;
00370 length_t length;
00371 virtual_address_t virtual_address;
00373 virtual_page_s virtual_page;
00375 };
00376
00383 struct kernel_record_s {
00384
00385 tag_t tag;
00386 timestamp_t cycle_timestamp;
00388 task_ID_t task_ID;
00390 task_ID_t parent_task_ID;
00393 context_ID_t context_ID;
00395 context_ID_t duplicate_context_ID;
00399 virtual_page_ID_t starting_page;
00401 virtual_page_ID_t ending_page;
00404 file_ID_s file_ID;
00406 virtual_page_ID_t file_starting_page;
00409 virtual_page_ID_t file_ending_page;
00412 shm_ID_t shm_ID;
00414 char filename[BUFFER_SIZE];
00420 };
00421
00422
00423
00424
00425
00426 #endif // _TYPES_AND_CONSTANTS_HH
00427