1 /** 2 * @file daemon/opd_trans.h 3 * Processing the sample buffer 4 * 5 * @remark Copyright 2002 OProfile authors 6 * @remark Read the file COPYING 7 * 8 * @author John Levon 9 * @author Philippe Elie 10 * 11 * Modified by Maynard Johnson <maynardj (at) us.ibm.com> 12 * These modifications are: 13 * (C) Copyright IBM Corporation 2007 14 */ 15 16 #ifndef OPD_TRANS_H 17 #define OPD_TRANS_H 18 19 #include "opd_cookie.h" 20 #include "op_types.h" 21 22 #include <stdint.h> 23 24 struct sfile; 25 struct anon_mapping; 26 27 enum tracing_type { 28 TRACING_OFF, 29 TRACING_START, 30 TRACING_ON 31 }; 32 33 /** 34 * Transient values used for parsing the event buffer. 35 * Note that these are reset for each buffer read, but 36 * that should be ok as in the kernel, cpu_buffer_reset() 37 * ensures that a correct context starts off the buffer. 38 */ 39 struct transient { 40 char const * buffer; 41 size_t remaining; 42 enum tracing_type tracing; 43 struct sfile * current; 44 struct sfile * last; 45 struct anon_mapping * anon; 46 struct anon_mapping * last_anon; 47 cookie_t cookie; 48 cookie_t app_cookie; 49 vma_t pc; 50 vma_t last_pc; 51 unsigned long event; 52 int in_kernel; 53 unsigned long cpu; 54 pid_t tid; 55 pid_t tgid; 56 uint64_t embedded_offset; 57 void * ext; 58 }; 59 60 typedef void (*handler_t)(struct transient *); 61 extern handler_t handlers[]; 62 63 uint64_t pop_buffer_value(struct transient * trans); 64 int enough_remaining(struct transient * trans, size_t size); 65 static inline void update_trans_last(struct transient * trans) 66 { 67 trans->last = trans->current; 68 trans->last_anon = trans->anon; 69 trans->last_pc = trans->pc; 70 } 71 72 extern size_t kernel_pointer_size; 73 static inline int is_escape_code(uint64_t code) 74 { 75 return kernel_pointer_size == 4 ? code == ~0LU : code == ~0LLU; 76 } 77 78 void opd_process_samples(char const * buffer, size_t count); 79 80 /** used when we need to clear data that's been freed */ 81 void clear_trans_last(struct transient * trans); 82 83 /** used when we need to clear data that's been freed */ 84 void clear_trans_current(struct transient * trans); 85 86 #endif /* OPD_TRANS_H */ 87